From 1c58f0e79f2129b9e84f06958b4694db292f3d06 Mon Sep 17 00:00:00 2001 From: dixitadusara Date: Tue, 27 Jun 2017 14:32:45 +0530 Subject: [PATCH 001/984] Title and Alt tag added in the PhotoSwipe enlarged product image --- templates/single-product/product-image.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/templates/single-product/product-image.php b/templates/single-product/product-image.php index 1fe188f78ac..7aac4ef6f07 100644 --- a/templates/single-product/product-image.php +++ b/templates/single-product/product-image.php @@ -25,7 +25,7 @@ $columns = apply_filters( 'woocommerce_product_thumbnails_columns', 4 $thumbnail_size = apply_filters( 'woocommerce_product_thumbnails_large_size', 'full' ); $post_thumbnail_id = get_post_thumbnail_id( $post->ID ); $full_size_image = wp_get_attachment_image_src( $post_thumbnail_id, $thumbnail_size ); -$image_title = get_post_field( 'post_excerpt', $post_thumbnail_id ); +$image_title = get_post_field( 'post_title', $post_thumbnail_id ); $placeholder = has_post_thumbnail() ? 'with-images' : 'without-images'; $wrapper_classes = apply_filters( 'woocommerce_single_product_image_gallery_classes', array( 'woocommerce-product-gallery', @@ -39,6 +39,7 @@ $wrapper_classes = apply_filters( 'woocommerce_single_product_image_gallery_cl $image_title, + 'alt' => $image_title, 'data-src' => $full_size_image[0], 'data-large_image' => $full_size_image[0], 'data-large_image_width' => $full_size_image[1], From 8df6fda8f145204266234d1bac07e3963b1584ef Mon Sep 17 00:00:00 2001 From: dixitadusara Date: Thu, 13 Jul 2017 12:09:33 +0530 Subject: [PATCH 002/984] Fix minor content changes in CONTRIBUTING.md --- .github/CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 97fcc742bbd..edc7a22d5cd 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -15,7 +15,7 @@ GitHub is for _bug reports and contributions only_ - if you have a support quest ### Reporting Issues -Reporting issues is a great way to became a contributor as it doesn't require technical skills. In fact you don't even need to know a programming language or to be able to check the code itself, you just need to make sure that everything works as expected and [submit an issue report](https://github.com/woocommerce/woocommerce/issues/new) if you spot a bug. Sound like something you're up for? Go for it! +Reporting issues is a great way to become a contributor as it doesn't require technical skills. In fact, you don't even need to know a programming language or to be able to check the code itself, you just need to make sure that everything works as expected and [submit an issue report](https://github.com/woocommerce/woocommerce/issues/new) if you spot a bug. Sound like something you're up for? Go for it! #### How To Submit An Issue Report @@ -44,7 +44,7 @@ If you think something could be improved and you're able to do so, make your cha * Please **don't** modify the changelog - this will be maintained by the WooCommerce developers. * Please **don't** add your localizations or update the .pot files - these will also be maintained by the WooCommerce developers. To contribute to the localization of WooCommerce, please join the [translate.wordpress.org project](https://translate.wordpress.org/projects/wp-plugins/woocommerce). This is much needed, if you speak a language that needs translating consider yourself officially invited to the party. -After you follow the step above, the next stage will be waiting on us to merge your Pull Request. We review them all, and make suggestions and changes as and if necessary. +After you follow the step above, the next stage will be waiting for us to merge your Pull Request. We review them all, and make suggestions and changes as and if necessary. ## Contribute To Localizing WooCommerce From 413ae3941109c6427079adb87a043facceefd73a Mon Sep 17 00:00:00 2001 From: dixitadusara Date: Fri, 14 Jul 2017 14:31:58 +0530 Subject: [PATCH 003/984] Revert "Merge pull request #16113 from woocommerce/fix/cod-shipping-logic" This reverts commit 8aa27015141ad50ec0006a2b831a011f3beb130f, reversing changes made to 940019f2456a92b70057aba110e55b51a1206a1d. --- .../gateways/cod/class-wc-gateway-cod.php | 45 ++++++++++++++++--- includes/wc-formatting-functions.php | 14 ------ 2 files changed, 38 insertions(+), 21 deletions(-) diff --git a/includes/gateways/cod/class-wc-gateway-cod.php b/includes/gateways/cod/class-wc-gateway-cod.php index d03893e01c8..d1746222916 100644 --- a/includes/gateways/cod/class-wc-gateway-cod.php +++ b/includes/gateways/cod/class-wc-gateway-cod.php @@ -150,17 +150,48 @@ class WC_Gateway_COD extends WC_Payment_Gateway { return false; } - // Only apply if all packages are being shipped via chosen method, or order is virtual. + // Check methods if ( ! empty( $this->enable_for_methods ) && $needs_shipping ) { - $chosen_shipping_methods = array(); - if ( is_object( $order ) ) { - $chosen_shipping_methods = array_unique( array_map( 'wc_get_string_before_colon', $order->get_shipping_methods() ) ); - } elseif ( $chosen_shipping_methods_session = WC()->session->get( 'chosen_shipping_methods' ) ) { - $chosen_shipping_methods = array_unique( array_map( 'wc_get_string_before_colon', $chosen_shipping_methods_session ) ); + // Only apply if all packages are being shipped via chosen methods, or order is virtual + $chosen_shipping_methods_session = WC()->session->get( 'chosen_shipping_methods' ); + + if ( isset( $chosen_shipping_methods_session ) ) { + $chosen_shipping_methods = array_unique( $chosen_shipping_methods_session ); + } else { + $chosen_shipping_methods = array(); } - if ( 0 < count( array_diff( $chosen_shipping_methods, $this->enable_for_methods ) ) ) { + $check_method = false; + + if ( is_object( $order ) ) { + if ( $order->get_shipping_method() ) { + $check_method = $order->get_shipping_method(); + } + } elseif ( empty( $chosen_shipping_methods ) || sizeof( $chosen_shipping_methods ) > 1 ) { + $check_method = false; + } elseif ( sizeof( $chosen_shipping_methods ) == 1 ) { + $check_method = $chosen_shipping_methods[0]; + } + + if ( ! $check_method ) { + return false; + } + + if ( strstr( $check_method, ':' ) ) { + $check_method = current( explode( ':', $check_method ) ); + } + + $found = false; + + foreach ( $this->enable_for_methods as $method_id ) { + if ( $check_method === $method_id ) { + $found = true; + break; + } + } + + if ( ! $found ) { return false; } } diff --git a/includes/wc-formatting-functions.php b/includes/wc-formatting-functions.php index c4e7bbc98e4..023eb96c2fa 100644 --- a/includes/wc-formatting-functions.php +++ b/includes/wc-formatting-functions.php @@ -1139,17 +1139,3 @@ function wc_do_oembeds( $content ) { return $content; } - -/** - * Get part of a string before :. - * - * Used for example in shipping methods ids where they take the format - * method_id:instance_id - * - * @since 3.2.0 - * @param string $string - * @return string - */ -function wc_get_string_before_colon( $string ) { - return trim( current( explode( ':', (string) $string ) ) ); -} From 7f1679d994ff420ec0e25b964acae6f29aca0a00 Mon Sep 17 00:00:00 2001 From: Claudio Sanches Date: Thu, 17 May 2018 11:27:53 +0100 Subject: [PATCH 004/984] Move REST API v2 to a new directory --- .../class-wc-rest-coupons-v2-controller.php | 542 +++++ ...-rest-customer-downloads-v2-controller.php | 165 ++ .../class-wc-rest-customers-v2-controller.php | 364 +++ ...s-wc-rest-network-orders-v2-controller.php | 159 ++ ...lass-wc-rest-order-notes-v2-controller.php | 182 ++ ...ss-wc-rest-order-refunds-v2-controller.php | 583 +++++ .../v2/class-wc-rest-orders-v2-controller.php | 1687 +++++++++++++ ...wc-rest-payment-gateways-v2-controller.php | 466 ++++ ...-product-attribute-terms-v2-controller.php | 27 + ...-rest-product-attributes-v2-controller.php | 27 + ...-rest-product-categories-v2-controller.php | 212 ++ ...-wc-rest-product-reviews-v2-controller.php | 199 ++ ...product-shipping-classes-v2-controller.php | 27 + ...ass-wc-rest-product-tags-v2-controller.php | 27 + ...-rest-product-variations-v2-controller.php | 1003 ++++++++ .../class-wc-rest-products-v2-controller.php | 2145 +++++++++++++++++ ...ass-wc-rest-report-sales-v2-controller.php | 27 + ...-rest-report-top-sellers-v2-controller.php | 27 + .../class-wc-rest-reports-v2-controller.php | 27 + ...-wc-rest-setting-options-v2-controller.php | 581 +++++ .../class-wc-rest-settings-v2-controller.php | 232 ++ ...wc-rest-shipping-methods-v2-controller.php | 231 ++ ...-shipping-zone-locations-v2-controller.php | 190 ++ ...st-shipping-zone-methods-v2-controller.php | 541 +++++ ...s-wc-rest-shipping-zones-v2-controller.php | 304 +++ ...rest-system-status-tools-v2-controller.php | 557 +++++ ...ss-wc-rest-system-status-v2-controller.php | 1067 ++++++++ ...lass-wc-rest-tax-classes-v2-controller.php | 27 + .../v2/class-wc-rest-taxes-v2-controller.php | 27 + ...-rest-webhook-deliveries-v2-controller.php | 153 ++ .../class-wc-rest-webhooks-v2-controller.php | 185 ++ 31 files changed, 11991 insertions(+) create mode 100644 includes/api/v2/class-wc-rest-coupons-v2-controller.php create mode 100644 includes/api/v2/class-wc-rest-customer-downloads-v2-controller.php create mode 100644 includes/api/v2/class-wc-rest-customers-v2-controller.php create mode 100644 includes/api/v2/class-wc-rest-network-orders-v2-controller.php create mode 100644 includes/api/v2/class-wc-rest-order-notes-v2-controller.php create mode 100644 includes/api/v2/class-wc-rest-order-refunds-v2-controller.php create mode 100644 includes/api/v2/class-wc-rest-orders-v2-controller.php create mode 100644 includes/api/v2/class-wc-rest-payment-gateways-v2-controller.php create mode 100644 includes/api/v2/class-wc-rest-product-attribute-terms-v2-controller.php create mode 100644 includes/api/v2/class-wc-rest-product-attributes-v2-controller.php create mode 100644 includes/api/v2/class-wc-rest-product-categories-v2-controller.php create mode 100644 includes/api/v2/class-wc-rest-product-reviews-v2-controller.php create mode 100644 includes/api/v2/class-wc-rest-product-shipping-classes-v2-controller.php create mode 100644 includes/api/v2/class-wc-rest-product-tags-v2-controller.php create mode 100644 includes/api/v2/class-wc-rest-product-variations-v2-controller.php create mode 100644 includes/api/v2/class-wc-rest-products-v2-controller.php create mode 100644 includes/api/v2/class-wc-rest-report-sales-v2-controller.php create mode 100644 includes/api/v2/class-wc-rest-report-top-sellers-v2-controller.php create mode 100644 includes/api/v2/class-wc-rest-reports-v2-controller.php create mode 100644 includes/api/v2/class-wc-rest-setting-options-v2-controller.php create mode 100644 includes/api/v2/class-wc-rest-settings-v2-controller.php create mode 100644 includes/api/v2/class-wc-rest-shipping-methods-v2-controller.php create mode 100644 includes/api/v2/class-wc-rest-shipping-zone-locations-v2-controller.php create mode 100644 includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php create mode 100644 includes/api/v2/class-wc-rest-shipping-zones-v2-controller.php create mode 100644 includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php create mode 100644 includes/api/v2/class-wc-rest-system-status-v2-controller.php create mode 100644 includes/api/v2/class-wc-rest-tax-classes-v2-controller.php create mode 100644 includes/api/v2/class-wc-rest-taxes-v2-controller.php create mode 100644 includes/api/v2/class-wc-rest-webhook-deliveries-v2-controller.php create mode 100644 includes/api/v2/class-wc-rest-webhooks-v2-controller.php diff --git a/includes/api/v2/class-wc-rest-coupons-v2-controller.php b/includes/api/v2/class-wc-rest-coupons-v2-controller.php new file mode 100644 index 00000000000..8a437b7195e --- /dev/null +++ b/includes/api/v2/class-wc-rest-coupons-v2-controller.php @@ -0,0 +1,542 @@ +namespace, '/' . $this->rest_base, array( + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_items' ), + 'permission_callback' => array( $this, 'get_items_permissions_check' ), + 'args' => $this->get_collection_params(), + ), + array( + 'methods' => WP_REST_Server::CREATABLE, + 'callback' => array( $this, 'create_item' ), + 'permission_callback' => array( $this, 'create_item_permissions_check' ), + 'args' => array_merge( + $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ), array( + 'code' => array( + 'description' => __( 'Coupon code.', 'woocommerce' ), + 'required' => true, + 'type' => 'string', + ), + ) + ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + + register_rest_route( + $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)', array( + 'args' => array( + 'id' => array( + 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), + 'type' => 'integer', + ), + ), + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_item' ), + 'permission_callback' => array( $this, 'get_item_permissions_check' ), + 'args' => array( + 'context' => $this->get_context_param( array( 'default' => 'view' ) ), + ), + ), + array( + 'methods' => WP_REST_Server::EDITABLE, + 'callback' => array( $this, 'update_item' ), + 'permission_callback' => array( $this, 'update_item_permissions_check' ), + 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), + ), + array( + 'methods' => WP_REST_Server::DELETABLE, + 'callback' => array( $this, 'delete_item' ), + 'permission_callback' => array( $this, 'delete_item_permissions_check' ), + 'args' => array( + 'force' => array( + 'default' => false, + 'type' => 'boolean', + 'description' => __( 'Whether to bypass trash and force deletion.', 'woocommerce' ), + ), + ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + + register_rest_route( + $this->namespace, '/' . $this->rest_base . '/batch', array( + array( + 'methods' => WP_REST_Server::EDITABLE, + 'callback' => array( $this, 'batch_items' ), + 'permission_callback' => array( $this, 'batch_items_permissions_check' ), + 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), + ), + 'schema' => array( $this, 'get_public_batch_schema' ), + ) + ); + } + + /** + * Get object. + * + * @since 3.0.0 + * @param int $id Object ID. + * @return WC_Data + */ + protected function get_object( $id ) { + return new WC_Coupon( $id ); + } + + /** + * Get formatted item data. + * + * @since 3.0.0 + * @param WC_Data $object WC_Data instance. + * @return array + */ + protected function get_formatted_item_data( $object ) { + $data = $object->get_data(); + + $format_decimal = array( 'amount', 'minimum_amount', 'maximum_amount' ); + $format_date = array( 'date_created', 'date_modified', 'date_expires' ); + $format_null = array( 'usage_limit', 'usage_limit_per_user', 'limit_usage_to_x_items' ); + + // Format decimal values. + foreach ( $format_decimal as $key ) { + $data[ $key ] = wc_format_decimal( $data[ $key ], 2 ); + } + + // Format date values. + foreach ( $format_date as $key ) { + $datetime = $data[ $key ]; + $data[ $key ] = wc_rest_prepare_date_response( $datetime, false ); + $data[ $key . '_gmt' ] = wc_rest_prepare_date_response( $datetime ); + } + + // Format null values. + foreach ( $format_null as $key ) { + $data[ $key ] = $data[ $key ] ? $data[ $key ] : null; + } + + return array( + 'id' => $object->get_id(), + 'code' => $data['code'], + 'amount' => $data['amount'], + 'date_created' => $data['date_created'], + 'date_created_gmt' => $data['date_created_gmt'], + 'date_modified' => $data['date_modified'], + 'date_modified_gmt' => $data['date_modified_gmt'], + 'discount_type' => $data['discount_type'], + 'description' => $data['description'], + 'date_expires' => $data['date_expires'], + 'date_expires_gmt' => $data['date_expires_gmt'], + 'usage_count' => $data['usage_count'], + 'individual_use' => $data['individual_use'], + 'product_ids' => $data['product_ids'], + 'excluded_product_ids' => $data['excluded_product_ids'], + 'usage_limit' => $data['usage_limit'], + 'usage_limit_per_user' => $data['usage_limit_per_user'], + 'limit_usage_to_x_items' => $data['limit_usage_to_x_items'], + 'free_shipping' => $data['free_shipping'], + 'product_categories' => $data['product_categories'], + 'excluded_product_categories' => $data['excluded_product_categories'], + 'exclude_sale_items' => $data['exclude_sale_items'], + 'minimum_amount' => $data['minimum_amount'], + 'maximum_amount' => $data['maximum_amount'], + 'email_restrictions' => $data['email_restrictions'], + 'used_by' => $data['used_by'], + 'meta_data' => $data['meta_data'], + ); + } + + /** + * Prepare a single coupon output for response. + * + * @since 3.0.0 + * @param WC_Data $object Object data. + * @param WP_REST_Request $request Request object. + * @return WP_REST_Response + */ + public function prepare_object_for_response( $object, $request ) { + $data = $this->get_formatted_item_data( $object ); + $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; + $data = $this->add_additional_fields_to_object( $data, $request ); + $data = $this->filter_response_by_context( $data, $context ); + $response = rest_ensure_response( $data ); + $response->add_links( $this->prepare_links( $object, $request ) ); + + /** + * Filter the data for a response. + * + * The dynamic portion of the hook name, $this->post_type, + * refers to object type being prepared for the response. + * + * @param WP_REST_Response $response The response object. + * @param WC_Data $object Object data. + * @param WP_REST_Request $request Request object. + */ + return apply_filters( "woocommerce_rest_prepare_{$this->post_type}_object", $response, $object, $request ); + } + + /** + * Prepare objects query. + * + * @since 3.0.0 + * @param WP_REST_Request $request Full details about the request. + * @return array + */ + protected function prepare_objects_query( $request ) { + $args = parent::prepare_objects_query( $request ); + + if ( ! empty( $request['code'] ) ) { + $id = wc_get_coupon_id_by_code( $request['code'] ); + $args['post__in'] = array( $id ); + } + + // Get only ids. + $args['fields'] = 'ids'; + + return $args; + } + + /** + * Only return writable props from schema. + * + * @param array $schema Schema. + * @return bool + */ + protected function filter_writable_props( $schema ) { + return empty( $schema['readonly'] ); + } + + /** + * Prepare a single coupon for create or update. + * + * @param WP_REST_Request $request Request object. + * @param bool $creating If is creating a new object. + * @return WP_Error|WC_Data + */ + protected function prepare_object_for_database( $request, $creating = false ) { + $id = isset( $request['id'] ) ? absint( $request['id'] ) : 0; + $coupon = new WC_Coupon( $id ); + $schema = $this->get_item_schema(); + $data_keys = array_keys( array_filter( $schema['properties'], array( $this, 'filter_writable_props' ) ) ); + + // Validate required POST fields. + if ( $creating && empty( $request['code'] ) ) { + return new WP_Error( 'woocommerce_rest_empty_coupon_code', sprintf( __( 'The coupon code cannot be empty.', 'woocommerce' ), 'code' ), array( 'status' => 400 ) ); + } + + // Handle all writable props. + foreach ( $data_keys as $key ) { + $value = $request[ $key ]; + + if ( ! is_null( $value ) ) { + switch ( $key ) { + case 'code': + $coupon_code = wc_format_coupon_code( $value ); + $id = $coupon->get_id() ? $coupon->get_id() : 0; + $id_from_code = wc_get_coupon_id_by_code( $coupon_code, $id ); + + if ( $id_from_code ) { + return new WP_Error( 'woocommerce_rest_coupon_code_already_exists', __( 'The coupon code already exists', 'woocommerce' ), array( 'status' => 400 ) ); + } + + $coupon->set_code( $coupon_code ); + break; + case 'meta_data': + if ( is_array( $value ) ) { + foreach ( $value as $meta ) { + $coupon->update_meta_data( $meta['key'], $meta['value'], isset( $meta['id'] ) ? $meta['id'] : '' ); + } + } + break; + case 'description': + $coupon->set_description( wp_filter_post_kses( $value ) ); + break; + default: + if ( is_callable( array( $coupon, "set_{$key}" ) ) ) { + $coupon->{"set_{$key}"}( $value ); + } + break; + } + } + } + + /** + * Filters an object before it is inserted via the REST API. + * + * The dynamic portion of the hook name, `$this->post_type`, + * refers to the object type slug. + * + * @param WC_Data $coupon Object object. + * @param WP_REST_Request $request Request object. + * @param bool $creating If is creating a new object. + */ + return apply_filters( "woocommerce_rest_pre_insert_{$this->post_type}_object", $coupon, $request, $creating ); + } + + /** + * Get the Coupon's schema, conforming to JSON Schema. + * + * @return array + */ + public function get_item_schema() { + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => $this->post_type, + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Unique identifier for the object.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'code' => array( + 'description' => __( 'Coupon code.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'amount' => array( + 'description' => __( 'The amount of discount. Should always be numeric, even if setting a percentage.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'date_created' => array( + 'description' => __( "The date the coupon was created, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_created_gmt' => array( + 'description' => __( 'The date the coupon was created, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_modified' => array( + 'description' => __( "The date the coupon was last modified, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_modified_gmt' => array( + 'description' => __( 'The date the coupon was last modified, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'discount_type' => array( + 'description' => __( 'Determines the type of discount that will be applied.', 'woocommerce' ), + 'type' => 'string', + 'default' => 'fixed_cart', + 'enum' => array_keys( wc_get_coupon_types() ), + 'context' => array( 'view', 'edit' ), + ), + 'description' => array( + 'description' => __( 'Coupon description.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'date_expires' => array( + 'description' => __( "The date the coupon expires, in the site's timezone.", 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'date_expires_gmt' => array( + 'description' => __( 'The date the coupon expires, as GMT.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'usage_count' => array( + 'description' => __( 'Number of times the coupon has been used already.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'individual_use' => array( + 'description' => __( 'If true, the coupon can only be used individually. Other applied coupons will be removed from the cart.', 'woocommerce' ), + 'type' => 'boolean', + 'default' => false, + 'context' => array( 'view', 'edit' ), + ), + 'product_ids' => array( + 'description' => __( 'List of product IDs the coupon can be used on.', 'woocommerce' ), + 'type' => 'array', + 'items' => array( + 'type' => 'integer', + ), + 'context' => array( 'view', 'edit' ), + ), + 'excluded_product_ids' => array( + 'description' => __( 'List of product IDs the coupon cannot be used on.', 'woocommerce' ), + 'type' => 'array', + 'items' => array( + 'type' => 'integer', + ), + 'context' => array( 'view', 'edit' ), + ), + 'usage_limit' => array( + 'description' => __( 'How many times the coupon can be used in total.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'usage_limit_per_user' => array( + 'description' => __( 'How many times the coupon can be used per customer.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'limit_usage_to_x_items' => array( + 'description' => __( 'Max number of items in the cart the coupon can be applied to.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'free_shipping' => array( + 'description' => __( 'If true and if the free shipping method requires a coupon, this coupon will enable free shipping.', 'woocommerce' ), + 'type' => 'boolean', + 'default' => false, + 'context' => array( 'view', 'edit' ), + ), + 'product_categories' => array( + 'description' => __( 'List of category IDs the coupon applies to.', 'woocommerce' ), + 'type' => 'array', + 'items' => array( + 'type' => 'integer', + ), + 'context' => array( 'view', 'edit' ), + ), + 'excluded_product_categories' => array( + 'description' => __( 'List of category IDs the coupon does not apply to.', 'woocommerce' ), + 'type' => 'array', + 'items' => array( + 'type' => 'integer', + ), + 'context' => array( 'view', 'edit' ), + ), + 'exclude_sale_items' => array( + 'description' => __( 'If true, this coupon will not be applied to items that have sale prices.', 'woocommerce' ), + 'type' => 'boolean', + 'default' => false, + 'context' => array( 'view', 'edit' ), + ), + 'minimum_amount' => array( + 'description' => __( 'Minimum order amount that needs to be in the cart before coupon applies.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'maximum_amount' => array( + 'description' => __( 'Maximum order amount allowed when using the coupon.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'email_restrictions' => array( + 'description' => __( 'List of email addresses that can use this coupon.', 'woocommerce' ), + 'type' => 'array', + 'items' => array( + 'type' => 'string', + ), + 'context' => array( 'view', 'edit' ), + ), + 'used_by' => array( + 'description' => __( 'List of user IDs (or guest email addresses) that have used the coupon.', 'woocommerce' ), + 'type' => 'array', + 'items' => array( + 'type' => 'integer', + ), + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'meta_data' => array( + 'description' => __( 'Meta data.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Meta ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'key' => array( + 'description' => __( 'Meta key.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'value' => array( + 'description' => __( 'Meta value.', 'woocommerce' ), + 'type' => 'mixed', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + ), + ), + ); + return $this->add_additional_fields_schema( $schema ); + } + + /** + * Get the query params for collections of attachments. + * + * @return array + */ + public function get_collection_params() { + $params = parent::get_collection_params(); + + $params['code'] = array( + 'description' => __( 'Limit result set to resources with a specific code.', 'woocommerce' ), + 'type' => 'string', + 'sanitize_callback' => 'sanitize_text_field', + 'validate_callback' => 'rest_validate_request_arg', + ); + + return $params; + } +} diff --git a/includes/api/v2/class-wc-rest-customer-downloads-v2-controller.php b/includes/api/v2/class-wc-rest-customer-downloads-v2-controller.php new file mode 100644 index 00000000000..887761e074b --- /dev/null +++ b/includes/api/v2/class-wc-rest-customer-downloads-v2-controller.php @@ -0,0 +1,165 @@ +/downloads endpoint. + * + * @package WooCommerce/API + * @since 2.6.0 + */ + +defined( 'ABSPATH' ) || exit; + +/** + * REST API Customers controller class. + * + * @package WooCommerce/API + * @extends WC_REST_Customer_Downloads_V1_Controller + */ +class WC_REST_Customer_Downloads_V2_Controller extends WC_REST_Customer_Downloads_V1_Controller { + + /** + * Endpoint namespace. + * + * @var string + */ + protected $namespace = 'wc/v2'; + + /** + * Prepare a single download output for response. + * + * @param stdClass $download Download object. + * @param WP_REST_Request $request Request object. + * @return WP_REST_Response $response Response data. + */ + public function prepare_item_for_response( $download, $request ) { + $data = array( + 'download_id' => $download->download_id, + 'download_url' => $download->download_url, + 'product_id' => $download->product_id, + 'product_name' => $download->product_name, + 'download_name' => $download->download_name, + 'order_id' => $download->order_id, + 'order_key' => $download->order_key, + 'downloads_remaining' => '' === $download->downloads_remaining ? 'unlimited' : $download->downloads_remaining, + 'access_expires' => $download->access_expires ? wc_rest_prepare_date_response( $download->access_expires ) : 'never', + 'access_expires_gmt' => $download->access_expires ? wc_rest_prepare_date_response( get_gmt_from_date( $download->access_expires ) ) : 'never', + 'file' => $download->file, + ); + + $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; + $data = $this->add_additional_fields_to_object( $data, $request ); + $data = $this->filter_response_by_context( $data, $context ); + + // Wrap the data in a response object. + $response = rest_ensure_response( $data ); + + $response->add_links( $this->prepare_links( $download, $request ) ); + + /** + * Filter customer download data returned from the REST API. + * + * @param WP_REST_Response $response The response object. + * @param stdClass $download Download object used to create response. + * @param WP_REST_Request $request Request object. + */ + return apply_filters( 'woocommerce_rest_prepare_customer_download', $response, $download, $request ); + } + + /** + * Get the Customer Download's schema, conforming to JSON Schema. + * + * @return array + */ + public function get_item_schema() { + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => 'customer_download', + 'type' => 'object', + 'properties' => array( + 'download_id' => array( + 'description' => __( 'Download ID.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'download_url' => array( + 'description' => __( 'Download file URL.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'product_id' => array( + 'description' => __( 'Downloadable product ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'product_name' => array( + 'description' => __( 'Product name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'download_name' => array( + 'description' => __( 'Downloadable file name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'order_id' => array( + 'description' => __( 'Order ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'order_key' => array( + 'description' => __( 'Order key.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'downloads_remaining' => array( + 'description' => __( 'Number of downloads remaining.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'access_expires' => array( + 'description' => __( "The date when download access expires, in the site's timezone.", 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'access_expires_gmt' => array( + 'description' => __( 'The date when download access expires, as GMT.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'file' => array( + 'description' => __( 'File details.', 'woocommerce' ), + 'type' => 'object', + 'context' => array( 'view' ), + 'readonly' => true, + 'properties' => array( + 'name' => array( + 'description' => __( 'File name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'file' => array( + 'description' => __( 'File URL.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + ), + ), + ), + ); + + return $this->add_additional_fields_schema( $schema ); + } +} diff --git a/includes/api/v2/class-wc-rest-customers-v2-controller.php b/includes/api/v2/class-wc-rest-customers-v2-controller.php new file mode 100644 index 00000000000..cbb3d22afff --- /dev/null +++ b/includes/api/v2/class-wc-rest-customers-v2-controller.php @@ -0,0 +1,364 @@ +get_data(); + $format_date = array( 'date_created', 'date_modified' ); + + // Format date values. + foreach ( $format_date as $key ) { + $datetime = $data[ $key ]; + $data[ $key ] = wc_rest_prepare_date_response( $datetime, false ); + $data[ $key . '_gmt' ] = wc_rest_prepare_date_response( $datetime ); + } + + return array( + 'id' => $object->get_id(), + 'date_created' => $data['date_created'], + 'date_created_gmt' => $data['date_created_gmt'], + 'date_modified' => $data['date_modified'], + 'date_modified_gmt' => $data['date_modified_gmt'], + 'email' => $data['email'], + 'first_name' => $data['first_name'], + 'last_name' => $data['last_name'], + 'role' => $data['role'], + 'username' => $data['username'], + 'billing' => $data['billing'], + 'shipping' => $data['shipping'], + 'is_paying_customer' => $data['is_paying_customer'], + 'orders_count' => $object->get_order_count(), + 'total_spent' => $object->get_total_spent(), + 'avatar_url' => $object->get_avatar_url(), + 'meta_data' => $data['meta_data'], + ); + } + + /** + * Prepare a single customer output for response. + * + * @param WP_User $user_data User object. + * @param WP_REST_Request $request Request object. + * @return WP_REST_Response $response Response data. + */ + public function prepare_item_for_response( $user_data, $request ) { + $customer = new WC_Customer( $user_data->ID ); + $data = $this->get_formatted_item_data( $customer ); + $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; + $data = $this->add_additional_fields_to_object( $data, $request ); + $data = $this->filter_response_by_context( $data, $context ); + $response = rest_ensure_response( $data ); + $response->add_links( $this->prepare_links( $user_data ) ); + + /** + * Filter customer data returned from the REST API. + * + * @param WP_REST_Response $response The response object. + * @param WP_User $user_data User object used to create response. + * @param WP_REST_Request $request Request object. + */ + return apply_filters( 'woocommerce_rest_prepare_customer', $response, $user_data, $request ); + } + + /** + * Update customer meta fields. + * + * @param WC_Customer $customer Customer data. + * @param WP_REST_Request $request Request data. + */ + protected function update_customer_meta_fields( $customer, $request ) { + parent::update_customer_meta_fields( $customer, $request ); + + // Meta data. + if ( isset( $request['meta_data'] ) ) { + if ( is_array( $request['meta_data'] ) ) { + foreach ( $request['meta_data'] as $meta ) { + $customer->update_meta_data( $meta['key'], $meta['value'], isset( $meta['id'] ) ? $meta['id'] : '' ); + } + } + } + } + + /** + * Get the Customer's schema, conforming to JSON Schema. + * + * @return array + */ + public function get_item_schema() { + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => 'customer', + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_created' => array( + 'description' => __( "The date the customer was created, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_created_gmt' => array( + 'description' => __( 'The date the order was created, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_modified' => array( + 'description' => __( "The date the customer was last modified, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_modified_gmt' => array( + 'description' => __( 'The date the customer was last modified, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'email' => array( + 'description' => __( 'The email address for the customer.', 'woocommerce' ), + 'type' => 'string', + 'format' => 'email', + 'context' => array( 'view', 'edit' ), + ), + 'first_name' => array( + 'description' => __( 'Customer first name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'arg_options' => array( + 'sanitize_callback' => 'sanitize_text_field', + ), + ), + 'last_name' => array( + 'description' => __( 'Customer last name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'arg_options' => array( + 'sanitize_callback' => 'sanitize_text_field', + ), + ), + 'role' => array( + 'description' => __( 'Customer role.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'username' => array( + 'description' => __( 'Customer login name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'arg_options' => array( + 'sanitize_callback' => 'sanitize_user', + ), + ), + 'password' => array( + 'description' => __( 'Customer password.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'edit' ), + ), + 'billing' => array( + 'description' => __( 'List of billing address data.', 'woocommerce' ), + 'type' => 'object', + 'context' => array( 'view', 'edit' ), + 'properties' => array( + 'first_name' => array( + 'description' => __( 'First name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'last_name' => array( + 'description' => __( 'Last name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'company' => array( + 'description' => __( 'Company name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'address_1' => array( + 'description' => __( 'Address line 1', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'address_2' => array( + 'description' => __( 'Address line 2', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'city' => array( + 'description' => __( 'City name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'state' => array( + 'description' => __( 'ISO code or name of the state, province or district.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'postcode' => array( + 'description' => __( 'Postal code.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'country' => array( + 'description' => __( 'ISO code of the country.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'email' => array( + 'description' => __( 'Email address.', 'woocommerce' ), + 'type' => 'string', + 'format' => 'email', + 'context' => array( 'view', 'edit' ), + ), + 'phone' => array( + 'description' => __( 'Phone number.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + 'shipping' => array( + 'description' => __( 'List of shipping address data.', 'woocommerce' ), + 'type' => 'object', + 'context' => array( 'view', 'edit' ), + 'properties' => array( + 'first_name' => array( + 'description' => __( 'First name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'last_name' => array( + 'description' => __( 'Last name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'company' => array( + 'description' => __( 'Company name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'address_1' => array( + 'description' => __( 'Address line 1', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'address_2' => array( + 'description' => __( 'Address line 2', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'city' => array( + 'description' => __( 'City name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'state' => array( + 'description' => __( 'ISO code or name of the state, province or district.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'postcode' => array( + 'description' => __( 'Postal code.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'country' => array( + 'description' => __( 'ISO code of the country.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + 'is_paying_customer' => array( + 'description' => __( 'Is the customer a paying customer?', 'woocommerce' ), + 'type' => 'bool', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'orders_count' => array( + 'description' => __( 'Quantity of orders made by the customer.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'total_spent' => array( + 'description' => __( 'Total amount spent.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'avatar_url' => array( + 'description' => __( 'Avatar URL.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'meta_data' => array( + 'description' => __( 'Meta data.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Meta ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'key' => array( + 'description' => __( 'Meta key.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'value' => array( + 'description' => __( 'Meta value.', 'woocommerce' ), + 'type' => 'mixed', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + ), + ), + ); + + return $this->add_additional_fields_schema( $schema ); + } +} diff --git a/includes/api/v2/class-wc-rest-network-orders-v2-controller.php b/includes/api/v2/class-wc-rest-network-orders-v2-controller.php new file mode 100644 index 00000000000..0a2981d7667 --- /dev/null +++ b/includes/api/v2/class-wc-rest-network-orders-v2-controller.php @@ -0,0 +1,159 @@ +namespace, '/' . $this->rest_base . '/network', array( + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'network_orders' ), + 'permission_callback' => array( $this, 'network_orders_permissions_check' ), + 'args' => $this->get_collection_params(), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + } + } + + /** + * Retrieves the item's schema for display / public consumption purposes. + * + * @access public + * + * @return array Public item schema data. + */ + public function get_public_item_schema() { + $schema = parent::get_public_item_schema(); + + $schema['properties']['blog'] = array( + 'description' => __( 'Blog id of the record on the multisite.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view' ), + 'readonly' => true, + ); + $schema['properties']['edit_url'] = array( + 'description' => __( 'URL to edit the order', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ); + $schema['properties']['customer'][] = array( + 'description' => __( 'Name of the customer for the order', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ); + $schema['properties']['status_name'][] = array( + 'description' => __( 'Order Status', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ); + $schema['properties']['formatted_total'][] = array( + 'description' => __( 'Order total formatted for locale', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ); + + return $schema; + } + + /** + * Does a permissions check for the proper requested blog + * + * @param WP_REST_Request $request Full details about the request. + * + * @return bool $permission + */ + public function network_orders_permissions_check( $request ) { + $blog_id = $request->get_param( 'blog_id' ); + $blog_id = ! empty( $blog_id ) ? $blog_id : get_current_blog_id(); + + switch_to_blog( $blog_id ); + + $permission = $this->get_items_permissions_check( $request ); + + restore_current_blog(); + + return $permission; + } + + /** + * Get a collection of orders from the requested blog id + * + * @param WP_REST_Request $request Full details about the request. + * + * @return WP_REST_Response + */ + public function network_orders( $request ) { + $blog_id = $request->get_param( 'blog_id' ); + $blog_id = ! empty( $blog_id ) ? $blog_id : get_current_blog_id(); + + switch_to_blog( $blog_id ); + + add_filter( 'woocommerce_rest_orders_prepare_object_query', array( $this, 'network_orders_filter_args' ) ); + $items = $this->get_items( $request ); + remove_filter( 'woocommerce_rest_orders_prepare_object_query', array( $this, 'network_orders_filter_args' ) ); + + foreach ( $items->data as &$current_order ) { + $order = wc_get_order( $current_order['id'] ); + + $current_order['blog'] = get_blog_details( get_current_blog_id() ); + $current_order['edit_url'] = get_admin_url( $blog_id, 'post.php?post=' . absint( $order->get_id() ) . '&action=edit' ); + /* translators: 1: first name 2: last name */ + $current_order['customer'] = trim( sprintf( _x( '%1$s %2$s', 'full name', 'woocommerce' ), $order->get_billing_first_name(), $order->get_billing_last_name() ) ); + $current_order['status_name'] = wc_get_order_status_name( $order->get_status() ); + $current_order['formatted_total'] = $order->get_formatted_order_total(); + } + + restore_current_blog(); + + return $items; + } + + /** + * Filters the post statuses to on hold and processing for the network order query. + * + * @param array $args Query args. + * + * @return array + */ + public function network_orders_filter_args( $args ) { + $args['post_status'] = array( + 'wc-on-hold', + 'wc-processing', + ); + + return $args; + } +} diff --git a/includes/api/v2/class-wc-rest-order-notes-v2-controller.php b/includes/api/v2/class-wc-rest-order-notes-v2-controller.php new file mode 100644 index 00000000000..99fed68d523 --- /dev/null +++ b/includes/api/v2/class-wc-rest-order-notes-v2-controller.php @@ -0,0 +1,182 @@ +/notes endpoint. + * + * @package WooCommerce/API + * @since 2.6.0 + */ + +defined( 'ABSPATH' ) || exit; + +/** + * REST API Order Notes controller class. + * + * @package WooCommerce/API + * @extends WC_REST_ControllerWC_REST_Order_Notes_V1_Controller + */ +class WC_REST_Order_Notes_V2_Controller extends WC_REST_Order_Notes_V1_Controller { + + /** + * Endpoint namespace. + * + * @var string + */ + protected $namespace = 'wc/v2'; + + /** + * Get order notes from an order. + * + * @param WP_REST_Request $request Request data. + * + * @return array|WP_Error + */ + public function get_items( $request ) { + $order = wc_get_order( (int) $request['order_id'] ); + + if ( ! $order || $this->post_type !== $order->get_type() ) { + return new WP_Error( "woocommerce_rest_{$this->post_type}_invalid_id", __( 'Invalid order ID.', 'woocommerce' ), array( 'status' => 404 ) ); + } + + $args = array( + 'post_id' => $order->get_id(), + 'approve' => 'approve', + 'type' => 'order_note', + ); + + // Allow filter by order note type. + if ( 'customer' === $request['type'] ) { + $args['meta_query'] = array( // WPCS: slow query ok. + array( + 'key' => 'is_customer_note', + 'value' => 1, + 'compare' => '=', + ), + ); + } elseif ( 'internal' === $request['type'] ) { + $args['meta_query'] = array( // WPCS: slow query ok. + array( + 'key' => 'is_customer_note', + 'compare' => 'NOT EXISTS', + ), + ); + } + + remove_filter( 'comments_clauses', array( 'WC_Comments', 'exclude_order_comments' ), 10, 1 ); + + $notes = get_comments( $args ); + + add_filter( 'comments_clauses', array( 'WC_Comments', 'exclude_order_comments' ), 10, 1 ); + + $data = array(); + foreach ( $notes as $note ) { + $order_note = $this->prepare_item_for_response( $note, $request ); + $order_note = $this->prepare_response_for_collection( $order_note ); + $data[] = $order_note; + } + + return rest_ensure_response( $data ); + } + + /** + * Prepare a single order note output for response. + * + * @param WP_Comment $note Order note object. + * @param WP_REST_Request $request Request object. + * @return WP_REST_Response $response Response data. + */ + public function prepare_item_for_response( $note, $request ) { + $data = array( + 'id' => (int) $note->comment_ID, + 'date_created' => wc_rest_prepare_date_response( $note->comment_date ), + 'date_created_gmt' => wc_rest_prepare_date_response( $note->comment_date_gmt ), + 'note' => $note->comment_content, + 'customer_note' => (bool) get_comment_meta( $note->comment_ID, 'is_customer_note', true ), + ); + + $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; + $data = $this->add_additional_fields_to_object( $data, $request ); + $data = $this->filter_response_by_context( $data, $context ); + + // Wrap the data in a response object. + $response = rest_ensure_response( $data ); + + $response->add_links( $this->prepare_links( $note ) ); + + /** + * Filter order note object returned from the REST API. + * + * @param WP_REST_Response $response The response object. + * @param WP_Comment $note Order note object used to create response. + * @param WP_REST_Request $request Request object. + */ + return apply_filters( 'woocommerce_rest_prepare_order_note', $response, $note, $request ); + } + + /** + * Get the Order Notes schema, conforming to JSON Schema. + * + * @return array + */ + public function get_item_schema() { + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => 'order_note', + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_created' => array( + 'description' => __( "The date the order note was created, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_created_gmt' => array( + 'description' => __( 'The date the order note was created, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'note' => array( + 'description' => __( 'Order note content.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'customer_note' => array( + 'description' => __( 'If true, the note will be shown to customers and they will be notified. If false, the note will be for admin reference only.', 'woocommerce' ), + 'type' => 'boolean', + 'default' => false, + 'context' => array( 'view', 'edit' ), + ), + ), + ); + + return $this->add_additional_fields_schema( $schema ); + } + + /** + * Get the query params for collections. + * + * @return array + */ + public function get_collection_params() { + $params = array(); + $params['context'] = $this->get_context_param( array( 'default' => 'view' ) ); + $params['type'] = array( + 'default' => 'any', + 'description' => __( 'Limit result to customers or internal notes.', 'woocommerce' ), + 'type' => 'string', + 'enum' => array( 'any', 'customer', 'internal' ), + 'sanitize_callback' => 'sanitize_key', + 'validate_callback' => 'rest_validate_request_arg', + ); + + return $params; + } +} diff --git a/includes/api/v2/class-wc-rest-order-refunds-v2-controller.php b/includes/api/v2/class-wc-rest-order-refunds-v2-controller.php new file mode 100644 index 00000000000..8fb549acc61 --- /dev/null +++ b/includes/api/v2/class-wc-rest-order-refunds-v2-controller.php @@ -0,0 +1,583 @@ +/refunds endpoint. + * + * @package WooCommerce/API + * @since 2.6.0 + */ + +defined( 'ABSPATH' ) || exit; + +/** + * REST API Order Refunds controller class. + * + * @package WooCommerce/API + * @extends WC_REST_Orders_Controller + */ +class WC_REST_Order_Refunds_V2_Controller extends WC_REST_Orders_Controller { + + /** + * Endpoint namespace. + * + * @var string + */ + protected $namespace = 'wc/v2'; + + /** + * Route base. + * + * @var string + */ + protected $rest_base = 'orders/(?P[\d]+)/refunds'; + + /** + * Post type. + * + * @var string + */ + protected $post_type = 'shop_order_refund'; + + /** + * Stores the request. + * + * @var array + */ + protected $request = array(); + + /** + * Order refunds actions. + */ + public function __construct() { + add_filter( "woocommerce_rest_{$this->post_type}_object_trashable", '__return_false' ); + } + + /** + * Register the routes for order refunds. + */ + public function register_routes() { + register_rest_route( + $this->namespace, '/' . $this->rest_base, array( + 'args' => array( + 'order_id' => array( + 'description' => __( 'The order ID.', 'woocommerce' ), + 'type' => 'integer', + ), + ), + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_items' ), + 'permission_callback' => array( $this, 'get_items_permissions_check' ), + 'args' => $this->get_collection_params(), + ), + array( + 'methods' => WP_REST_Server::CREATABLE, + 'callback' => array( $this, 'create_item' ), + 'permission_callback' => array( $this, 'create_item_permissions_check' ), + 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + + register_rest_route( + $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)', array( + 'args' => array( + 'order_id' => array( + 'description' => __( 'The order ID.', 'woocommerce' ), + 'type' => 'integer', + ), + 'id' => array( + 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), + 'type' => 'integer', + ), + ), + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_item' ), + 'permission_callback' => array( $this, 'get_item_permissions_check' ), + 'args' => array( + 'context' => $this->get_context_param( array( 'default' => 'view' ) ), + ), + ), + array( + 'methods' => WP_REST_Server::DELETABLE, + 'callback' => array( $this, 'delete_item' ), + 'permission_callback' => array( $this, 'delete_item_permissions_check' ), + 'args' => array( + 'force' => array( + 'default' => true, + 'type' => 'boolean', + 'description' => __( 'Required to be true, as resource does not support trashing.', 'woocommerce' ), + ), + ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + } + + /** + * Get object. + * + * @since 3.0.0 + * @param int $id Object ID. + * @return WC_Data + */ + protected function get_object( $id ) { + return wc_get_order( $id ); + } + + /** + * Get formatted item data. + * + * @since 3.0.0 + * @param WC_Data $object WC_Data instance. + * @return array + */ + protected function get_formatted_item_data( $object ) { + $data = $object->get_data(); + $format_decimal = array( 'amount' ); + $format_date = array( 'date_created' ); + $format_line_items = array( 'line_items' ); + + // Format decimal values. + foreach ( $format_decimal as $key ) { + $data[ $key ] = wc_format_decimal( $data[ $key ], $this->request['dp'] ); + } + + // Format date values. + foreach ( $format_date as $key ) { + $datetime = $data[ $key ]; + $data[ $key ] = wc_rest_prepare_date_response( $datetime, false ); + $data[ $key . '_gmt' ] = wc_rest_prepare_date_response( $datetime ); + } + + // Format line items. + foreach ( $format_line_items as $key ) { + $data[ $key ] = array_values( array_map( array( $this, 'get_order_item_data' ), $data[ $key ] ) ); + } + + return array( + 'id' => $object->get_id(), + 'date_created' => $data['date_created'], + 'date_created_gmt' => $data['date_created_gmt'], + 'amount' => $data['amount'], + 'reason' => $data['reason'], + 'refunded_by' => $data['refunded_by'], + 'refunded_payment' => $data['refunded_payment'], + 'meta_data' => $data['meta_data'], + 'line_items' => $data['line_items'], + ); + } + + /** + * Prepare a single order output for response. + * + * @since 3.0.0 + * + * @param WC_Data $object Object data. + * @param WP_REST_Request $request Request object. + * + * @return WP_Error|WP_REST_Response + */ + public function prepare_object_for_response( $object, $request ) { + $this->request = $request; + $this->request['dp'] = is_null( $this->request['dp'] ) ? wc_get_price_decimals() : absint( $this->request['dp'] ); + $order = wc_get_order( (int) $request['order_id'] ); + + if ( ! $order ) { + return new WP_Error( 'woocommerce_rest_invalid_order_id', __( 'Invalid order ID.', 'woocommerce' ), 404 ); + } + + if ( ! $object || $object->get_parent_id() !== $order->get_id() ) { + return new WP_Error( 'woocommerce_rest_invalid_order_refund_id', __( 'Invalid order refund ID.', 'woocommerce' ), 404 ); + } + + $data = $this->get_formatted_item_data( $object ); + $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; + $data = $this->add_additional_fields_to_object( $data, $request ); + $data = $this->filter_response_by_context( $data, $context ); + + // Wrap the data in a response object. + $response = rest_ensure_response( $data ); + + $response->add_links( $this->prepare_links( $object, $request ) ); + + /** + * Filter the data for a response. + * + * The dynamic portion of the hook name, $this->post_type, + * refers to object type being prepared for the response. + * + * @param WP_REST_Response $response The response object. + * @param WC_Data $object Object data. + * @param WP_REST_Request $request Request object. + */ + return apply_filters( "woocommerce_rest_prepare_{$this->post_type}_object", $response, $object, $request ); + } + + /** + * Prepare links for the request. + * + * @param WC_Data $object Object data. + * @param WP_REST_Request $request Request object. + * @return array Links for the given post. + */ + protected function prepare_links( $object, $request ) { + $base = str_replace( '(?P[\d]+)', $object->get_parent_id(), $this->rest_base ); + $links = array( + 'self' => array( + 'href' => rest_url( sprintf( '/%s/%s/%d', $this->namespace, $base, $object->get_id() ) ), + ), + 'collection' => array( + 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $base ) ), + ), + 'up' => array( + 'href' => rest_url( sprintf( '/%s/orders/%d', $this->namespace, $object->get_parent_id() ) ), + ), + ); + + return $links; + } + + /** + * Prepare objects query. + * + * @since 3.0.0 + * @param WP_REST_Request $request Full details about the request. + * @return array + */ + protected function prepare_objects_query( $request ) { + $args = parent::prepare_objects_query( $request ); + + $args['post_status'] = array_keys( wc_get_order_statuses() ); + $args['post_parent__in'] = array( absint( $request['order_id'] ) ); + + return $args; + } + + /** + * Prepares one object for create or update operation. + * + * @since 3.0.0 + * @param WP_REST_Request $request Request object. + * @param bool $creating If is creating a new object. + * @return WP_Error|WC_Data The prepared item, or WP_Error object on failure. + */ + protected function prepare_object_for_database( $request, $creating = false ) { + $order = wc_get_order( (int) $request['order_id'] ); + + if ( ! $order ) { + return new WP_Error( 'woocommerce_rest_invalid_order_id', __( 'Invalid order ID.', 'woocommerce' ), 404 ); + } + + if ( 0 > $request['amount'] ) { + return new WP_Error( 'woocommerce_rest_invalid_order_refund', __( 'Refund amount must be greater than zero.', 'woocommerce' ), 400 ); + } + + // Create the refund. + $refund = wc_create_refund( + array( + 'order_id' => $order->get_id(), + 'amount' => $request['amount'], + 'reason' => empty( $request['reason'] ) ? null : $request['reason'], + 'refund_payment' => is_bool( $request['api_refund'] ) ? $request['api_refund'] : true, + 'restock_items' => true, + ) + ); + + if ( is_wp_error( $refund ) ) { + return new WP_Error( 'woocommerce_rest_cannot_create_order_refund', $refund->get_error_message(), 500 ); + } + + if ( ! $refund ) { + return new WP_Error( 'woocommerce_rest_cannot_create_order_refund', __( 'Cannot create order refund, please try again.', 'woocommerce' ), 500 ); + } + + if ( ! empty( $request['meta_data'] ) && is_array( $request['meta_data'] ) ) { + foreach ( $request['meta_data'] as $meta ) { + $refund->update_meta_data( $meta['key'], $meta['value'], isset( $meta['id'] ) ? $meta['id'] : '' ); + } + $refund->save_meta_data(); + } + + /** + * Filters an object before it is inserted via the REST API. + * + * The dynamic portion of the hook name, `$this->post_type`, + * refers to the object type slug. + * + * @param WC_Data $coupon Object object. + * @param WP_REST_Request $request Request object. + * @param bool $creating If is creating a new object. + */ + return apply_filters( "woocommerce_rest_pre_insert_{$this->post_type}_object", $refund, $request, $creating ); + } + + /** + * Save an object data. + * + * @since 3.0.0 + * @param WP_REST_Request $request Full details about the request. + * @param bool $creating If is creating a new object. + * @return WC_Data|WP_Error + */ + protected function save_object( $request, $creating = false ) { + try { + $object = $this->prepare_object_for_database( $request, $creating ); + + if ( is_wp_error( $object ) ) { + return $object; + } + + return $this->get_object( $object->get_id() ); + } catch ( WC_Data_Exception $e ) { + return new WP_Error( $e->getErrorCode(), $e->getMessage(), $e->getErrorData() ); + } catch ( WC_REST_Exception $e ) { + return new WP_Error( $e->getErrorCode(), $e->getMessage(), array( 'status' => $e->getCode() ) ); + } + } + + /** + * Get the Order's schema, conforming to JSON Schema. + * + * @return array + */ + public function get_item_schema() { + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => $this->post_type, + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_created' => array( + 'description' => __( "The date the order refund was created, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_created_gmt' => array( + 'description' => __( 'The date the order refund was created, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'amount' => array( + 'description' => __( 'Refund amount.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'reason' => array( + 'description' => __( 'Reason for refund.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'refunded_by' => array( + 'description' => __( 'User ID of user who created the refund.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'refunded_payment' => array( + 'description' => __( 'If the payment was refunded via the API.', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view' ), + ), + 'meta_data' => array( + 'description' => __( 'Meta data.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Meta ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'key' => array( + 'description' => __( 'Meta key.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'value' => array( + 'description' => __( 'Meta value.', 'woocommerce' ), + 'type' => 'mixed', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + ), + 'line_items' => array( + 'description' => __( 'Line items data.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Item ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'name' => array( + 'description' => __( 'Product name.', 'woocommerce' ), + 'type' => 'mixed', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'product_id' => array( + 'description' => __( 'Product ID.', 'woocommerce' ), + 'type' => 'mixed', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'variation_id' => array( + 'description' => __( 'Variation ID, if applicable.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'quantity' => array( + 'description' => __( 'Quantity ordered.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'tax_class' => array( + 'description' => __( 'Tax class of product.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'subtotal' => array( + 'description' => __( 'Line subtotal (before discounts).', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'subtotal_tax' => array( + 'description' => __( 'Line subtotal tax (before discounts).', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'total' => array( + 'description' => __( 'Line total (after discounts).', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'total_tax' => array( + 'description' => __( 'Line total tax (after discounts).', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'taxes' => array( + 'description' => __( 'Line taxes.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Tax rate ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'total' => array( + 'description' => __( 'Tax total.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'subtotal' => array( + 'description' => __( 'Tax subtotal.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + ), + ), + ), + 'meta_data' => array( + 'description' => __( 'Meta data.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Meta ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'key' => array( + 'description' => __( 'Meta key.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'value' => array( + 'description' => __( 'Meta value.', 'woocommerce' ), + 'type' => 'mixed', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + ), + ), + ), + 'sku' => array( + 'description' => __( 'Product SKU.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'price' => array( + 'description' => __( 'Product price.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + ), + ), + ), + 'api_refund' => array( + 'description' => __( 'When true, the payment gateway API is used to generate the refund.', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'edit' ), + 'default' => true, + ), + ), + ); + + return $this->add_additional_fields_schema( $schema ); + } + + /** + * Get the query params for collections. + * + * @return array + */ + public function get_collection_params() { + $params = parent::get_collection_params(); + + unset( $params['status'], $params['customer'], $params['product'] ); + + return $params; + } +} diff --git a/includes/api/v2/class-wc-rest-orders-v2-controller.php b/includes/api/v2/class-wc-rest-orders-v2-controller.php new file mode 100644 index 00000000000..cea7794706d --- /dev/null +++ b/includes/api/v2/class-wc-rest-orders-v2-controller.php @@ -0,0 +1,1687 @@ +namespace, '/' . $this->rest_base, array( + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_items' ), + 'permission_callback' => array( $this, 'get_items_permissions_check' ), + 'args' => $this->get_collection_params(), + ), + array( + 'methods' => WP_REST_Server::CREATABLE, + 'callback' => array( $this, 'create_item' ), + 'permission_callback' => array( $this, 'create_item_permissions_check' ), + 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + + register_rest_route( + $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)', array( + 'args' => array( + 'id' => array( + 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), + 'type' => 'integer', + ), + ), + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_item' ), + 'permission_callback' => array( $this, 'get_item_permissions_check' ), + 'args' => array( + 'context' => $this->get_context_param( array( 'default' => 'view' ) ), + ), + ), + array( + 'methods' => WP_REST_Server::EDITABLE, + 'callback' => array( $this, 'update_item' ), + 'permission_callback' => array( $this, 'update_item_permissions_check' ), + 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), + ), + array( + 'methods' => WP_REST_Server::DELETABLE, + 'callback' => array( $this, 'delete_item' ), + 'permission_callback' => array( $this, 'delete_item_permissions_check' ), + 'args' => array( + 'force' => array( + 'default' => false, + 'type' => 'boolean', + 'description' => __( 'Whether to bypass trash and force deletion.', 'woocommerce' ), + ), + ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + + register_rest_route( + $this->namespace, '/' . $this->rest_base . '/batch', array( + array( + 'methods' => WP_REST_Server::EDITABLE, + 'callback' => array( $this, 'batch_items' ), + 'permission_callback' => array( $this, 'batch_items_permissions_check' ), + 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), + ), + 'schema' => array( $this, 'get_public_batch_schema' ), + ) + ); + } + + /** + * Get object. + * + * @since 3.0.0 + * @param int $id Object ID. + * @return WC_Data + */ + protected function get_object( $id ) { + return wc_get_order( $id ); + } + + /** + * Expands an order item to get its data. + * + * @param WC_Order_item $item Order item data. + * @return array + */ + protected function get_order_item_data( $item ) { + $data = $item->get_data(); + $format_decimal = array( 'subtotal', 'subtotal_tax', 'total', 'total_tax', 'tax_total', 'shipping_tax_total' ); + + // Format decimal values. + foreach ( $format_decimal as $key ) { + if ( isset( $data[ $key ] ) ) { + $data[ $key ] = wc_format_decimal( $data[ $key ], $this->request['dp'] ); + } + } + + // Add SKU and PRICE to products. + if ( is_callable( array( $item, 'get_product' ) ) ) { + $data['sku'] = $item->get_product() ? $item->get_product()->get_sku() : null; + $data['price'] = $item->get_quantity() ? $item->get_total() / $item->get_quantity() : 0; + } + + // Format taxes. + if ( ! empty( $data['taxes']['total'] ) ) { + $taxes = array(); + + foreach ( $data['taxes']['total'] as $tax_rate_id => $tax ) { + $taxes[] = array( + 'id' => $tax_rate_id, + 'total' => $tax, + 'subtotal' => isset( $data['taxes']['subtotal'][ $tax_rate_id ] ) ? $data['taxes']['subtotal'][ $tax_rate_id ] : '', + ); + } + $data['taxes'] = $taxes; + } elseif ( isset( $data['taxes'] ) ) { + $data['taxes'] = array(); + } + + // Remove names for coupons, taxes and shipping. + if ( isset( $data['code'] ) || isset( $data['rate_code'] ) || isset( $data['method_title'] ) ) { + unset( $data['name'] ); + } + + // Remove props we don't want to expose. + unset( $data['order_id'] ); + unset( $data['type'] ); + + return $data; + } + + /** + * Get formatted item data. + * + * @since 3.0.0 + * @param WC_Data $object WC_Data instance. + * @return array + */ + protected function get_formatted_item_data( $object ) { + $data = $object->get_data(); + $format_decimal = array( 'discount_total', 'discount_tax', 'shipping_total', 'shipping_tax', 'shipping_total', 'shipping_tax', 'cart_tax', 'total', 'total_tax' ); + $format_date = array( 'date_created', 'date_modified', 'date_completed', 'date_paid' ); + $format_line_items = array( 'line_items', 'tax_lines', 'shipping_lines', 'fee_lines', 'coupon_lines' ); + + // Format decimal values. + foreach ( $format_decimal as $key ) { + $data[ $key ] = wc_format_decimal( $data[ $key ], $this->request['dp'] ); + } + + // Format date values. + foreach ( $format_date as $key ) { + $datetime = $data[ $key ]; + $data[ $key ] = wc_rest_prepare_date_response( $datetime, false ); + $data[ $key . '_gmt' ] = wc_rest_prepare_date_response( $datetime ); + } + + // Format the order status. + $data['status'] = 'wc-' === substr( $data['status'], 0, 3 ) ? substr( $data['status'], 3 ) : $data['status']; + + // Format line items. + foreach ( $format_line_items as $key ) { + $data[ $key ] = array_values( array_map( array( $this, 'get_order_item_data' ), $data[ $key ] ) ); + } + + // Refunds. + $data['refunds'] = array(); + foreach ( $object->get_refunds() as $refund ) { + $data['refunds'][] = array( + 'id' => $refund->get_id(), + 'reason' => $refund->get_reason() ? $refund->get_reason() : '', + 'total' => '-' . wc_format_decimal( $refund->get_amount(), $this->request['dp'] ), + ); + } + + return array( + 'id' => $object->get_id(), + 'parent_id' => $data['parent_id'], + 'number' => $data['number'], + 'order_key' => $data['order_key'], + 'created_via' => $data['created_via'], + 'version' => $data['version'], + 'status' => $data['status'], + 'currency' => $data['currency'], + 'date_created' => $data['date_created'], + 'date_created_gmt' => $data['date_created_gmt'], + 'date_modified' => $data['date_modified'], + 'date_modified_gmt' => $data['date_modified_gmt'], + 'discount_total' => $data['discount_total'], + 'discount_tax' => $data['discount_tax'], + 'shipping_total' => $data['shipping_total'], + 'shipping_tax' => $data['shipping_tax'], + 'cart_tax' => $data['cart_tax'], + 'total' => $data['total'], + 'total_tax' => $data['total_tax'], + 'prices_include_tax' => $data['prices_include_tax'], + 'customer_id' => $data['customer_id'], + 'customer_ip_address' => $data['customer_ip_address'], + 'customer_user_agent' => $data['customer_user_agent'], + 'customer_note' => $data['customer_note'], + 'billing' => $data['billing'], + 'shipping' => $data['shipping'], + 'payment_method' => $data['payment_method'], + 'payment_method_title' => $data['payment_method_title'], + 'transaction_id' => $data['transaction_id'], + 'date_paid' => $data['date_paid'], + 'date_paid_gmt' => $data['date_paid_gmt'], + 'date_completed' => $data['date_completed'], + 'date_completed_gmt' => $data['date_completed_gmt'], + 'cart_hash' => $data['cart_hash'], + 'meta_data' => $data['meta_data'], + 'line_items' => $data['line_items'], + 'tax_lines' => $data['tax_lines'], + 'shipping_lines' => $data['shipping_lines'], + 'fee_lines' => $data['fee_lines'], + 'coupon_lines' => $data['coupon_lines'], + 'refunds' => $data['refunds'], + ); + } + + /** + * Prepare a single order output for response. + * + * @since 3.0.0 + * @param WC_Data $object Object data. + * @param WP_REST_Request $request Request object. + * @return WP_REST_Response + */ + public function prepare_object_for_response( $object, $request ) { + $this->request = $request; + $this->request['dp'] = is_null( $this->request['dp'] ) ? wc_get_price_decimals() : absint( $this->request['dp'] ); + $data = $this->get_formatted_item_data( $object ); + $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; + $data = $this->add_additional_fields_to_object( $data, $request ); + $data = $this->filter_response_by_context( $data, $context ); + $response = rest_ensure_response( $data ); + $response->add_links( $this->prepare_links( $object, $request ) ); + + /** + * Filter the data for a response. + * + * The dynamic portion of the hook name, $this->post_type, + * refers to object type being prepared for the response. + * + * @param WP_REST_Response $response The response object. + * @param WC_Data $object Object data. + * @param WP_REST_Request $request Request object. + */ + return apply_filters( "woocommerce_rest_prepare_{$this->post_type}_object", $response, $object, $request ); + } + + /** + * Prepare links for the request. + * + * @param WC_Data $object Object data. + * @param WP_REST_Request $request Request object. + * @return array Links for the given post. + */ + protected function prepare_links( $object, $request ) { + $links = array( + 'self' => array( + 'href' => rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $object->get_id() ) ), + ), + 'collection' => array( + 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ), + ), + ); + + if ( 0 !== (int) $object->get_customer_id() ) { + $links['customer'] = array( + 'href' => rest_url( sprintf( '/%s/customers/%d', $this->namespace, $object->get_customer_id() ) ), + ); + } + + if ( 0 !== (int) $object->get_parent_id() ) { + $links['up'] = array( + 'href' => rest_url( sprintf( '/%s/orders/%d', $this->namespace, $object->get_parent_id() ) ), + ); + } + + return $links; + } + + /** + * Prepare objects query. + * + * @since 3.0.0 + * @param WP_REST_Request $request Full details about the request. + * @return array + */ + protected function prepare_objects_query( $request ) { + global $wpdb; + + $args = parent::prepare_objects_query( $request ); + + // Set post_status. + if ( 'any' !== $request['status'] ) { + $args['post_status'] = 'wc-' . $request['status']; + } else { + $args['post_status'] = 'any'; + } + + if ( isset( $request['customer'] ) ) { + if ( ! empty( $args['meta_query'] ) ) { + $args['meta_query'] = array(); // WPCS: slow query ok. + } + + $args['meta_query'][] = array( + 'key' => '_customer_user', + 'value' => $request['customer'], + 'type' => 'NUMERIC', + ); + } + + // Search by product. + if ( ! empty( $request['product'] ) ) { + $order_ids = $wpdb->get_col( + $wpdb->prepare( + " + SELECT order_id + FROM {$wpdb->prefix}woocommerce_order_items + WHERE order_item_id IN ( SELECT order_item_id FROM {$wpdb->prefix}woocommerce_order_itemmeta WHERE meta_key = '_product_id' AND meta_value = %d ) + AND order_item_type = 'line_item' + ", $request['product'] + ) + ); + + // Force WP_Query return empty if don't found any order. + $order_ids = ! empty( $order_ids ) ? $order_ids : array( 0 ); + + $args['post__in'] = $order_ids; + } + + // Search. + if ( ! empty( $args['s'] ) ) { + $order_ids = wc_order_search( $args['s'] ); + + if ( ! empty( $order_ids ) ) { + unset( $args['s'] ); + $args['post__in'] = array_merge( $order_ids, array( 0 ) ); + } + } + + /** + * Filter the query arguments for a request. + * + * Enables adding extra arguments or setting defaults for an order collection request. + * + * @param array $args Key value array of query var to query value. + * @param WP_REST_Request $request The request used. + */ + $args = apply_filters( 'woocommerce_rest_orders_prepare_object_query', $args, $request ); + + return $args; + } + + /** + * Only return writable props from schema. + * + * @param array $schema Schema. + * @return bool + */ + protected function filter_writable_props( $schema ) { + return empty( $schema['readonly'] ); + } + + /** + * Prepare a single order for create or update. + * + * @param WP_REST_Request $request Request object. + * @param bool $creating If is creating a new object. + * @return WP_Error|WC_Data + */ + protected function prepare_object_for_database( $request, $creating = false ) { + $id = isset( $request['id'] ) ? absint( $request['id'] ) : 0; + $order = new WC_Order( $id ); + $schema = $this->get_item_schema(); + $data_keys = array_keys( array_filter( $schema['properties'], array( $this, 'filter_writable_props' ) ) ); + + // Handle all writable props. + foreach ( $data_keys as $key ) { + $value = $request[ $key ]; + + if ( ! is_null( $value ) ) { + switch ( $key ) { + case 'status': + // Status change should be done later so transitions have new data. + break; + case 'billing': + case 'shipping': + $this->update_address( $order, $value, $key ); + break; + case 'line_items': + case 'shipping_lines': + case 'fee_lines': + case 'coupon_lines': + if ( is_array( $value ) ) { + foreach ( $value as $item ) { + if ( is_array( $item ) ) { + if ( $this->item_is_null( $item ) || ( isset( $item['quantity'] ) && 0 === $item['quantity'] ) ) { + $order->remove_item( $item['id'] ); + } else { + $this->set_item( $order, $key, $item ); + } + } + } + } + break; + case 'meta_data': + if ( is_array( $value ) ) { + foreach ( $value as $meta ) { + $order->update_meta_data( $meta['key'], $meta['value'], isset( $meta['id'] ) ? $meta['id'] : '' ); + } + } + break; + default: + if ( is_callable( array( $order, "set_{$key}" ) ) ) { + $order->{"set_{$key}"}( $value ); + } + break; + } + } + } + + /** + * Filters an object before it is inserted via the REST API. + * + * The dynamic portion of the hook name, `$this->post_type`, + * refers to the object type slug. + * + * @param WC_Data $order Object object. + * @param WP_REST_Request $request Request object. + * @param bool $creating If is creating a new object. + */ + return apply_filters( "woocommerce_rest_pre_insert_{$this->post_type}_object", $order, $request, $creating ); + } + + /** + * Save an object data. + * + * @since 3.0.0 + * @throws WC_REST_Exception But all errors are validated before returning any data. + * @param WP_REST_Request $request Full details about the request. + * @param bool $creating If is creating a new object. + * @return WC_Data|WP_Error + */ + protected function save_object( $request, $creating = false ) { + try { + $object = $this->prepare_object_for_database( $request, $creating ); + + if ( is_wp_error( $object ) ) { + return $object; + } + + // Make sure gateways are loaded so hooks from gateways fire on save/create. + WC()->payment_gateways(); + + if ( ! is_null( $request['customer_id'] ) && 0 !== $request['customer_id'] ) { + // Make sure customer exists. + if ( false === get_user_by( 'id', $request['customer_id'] ) ) { + throw new WC_REST_Exception( 'woocommerce_rest_invalid_customer_id', __( 'Customer ID is invalid.', 'woocommerce' ), 400 ); + } + + // Make sure customer is part of blog. + if ( is_multisite() && ! is_user_member_of_blog( $request['customer_id'] ) ) { + throw new WC_REST_Exception( 'woocommerce_rest_invalid_customer_id_network', __( 'Customer ID does not belong to this site.', 'woocommerce' ), 400 ); + } + } + + if ( $creating ) { + $object->set_created_via( 'rest-api' ); + $object->set_prices_include_tax( 'yes' === get_option( 'woocommerce_prices_include_tax' ) ); + $object->calculate_totals(); + } else { + // If items have changed, recalculate order totals. + if ( isset( $request['billing'] ) || isset( $request['shipping'] ) || isset( $request['line_items'] ) || isset( $request['shipping_lines'] ) || isset( $request['fee_lines'] ) || isset( $request['coupon_lines'] ) ) { + $object->calculate_totals(); + } + } + + // Set status. + if ( ! empty( $request['status'] ) ) { + $object->set_status( $request['status'] ); + } + + $object->save(); + + // Actions for after the order is saved. + if ( true === $request['set_paid'] ) { + if ( $creating || $object->needs_payment() ) { + $object->payment_complete( $request['transaction_id'] ); + } + } + + return $this->get_object( $object->get_id() ); + } catch ( WC_Data_Exception $e ) { + return new WP_Error( $e->getErrorCode(), $e->getMessage(), $e->getErrorData() ); + } catch ( WC_REST_Exception $e ) { + return new WP_Error( $e->getErrorCode(), $e->getMessage(), array( 'status' => $e->getCode() ) ); + } + } + + /** + * Update address. + * + * @param WC_Order $order Order data. + * @param array $posted Posted data. + * @param string $type Address type. + */ + protected function update_address( $order, $posted, $type = 'billing' ) { + foreach ( $posted as $key => $value ) { + if ( is_callable( array( $order, "set_{$type}_{$key}" ) ) ) { + $order->{"set_{$type}_{$key}"}( $value ); + } + } + } + + /** + * Gets the product ID from the SKU or posted ID. + * + * @throws WC_REST_Exception When SKU or ID is not valid. + * @param array $posted Request data. + * @return int + */ + protected function get_product_id( $posted ) { + if ( ! empty( $posted['sku'] ) ) { + $product_id = (int) wc_get_product_id_by_sku( $posted['sku'] ); + } elseif ( ! empty( $posted['product_id'] ) && empty( $posted['variation_id'] ) ) { + $product_id = (int) $posted['product_id']; + } elseif ( ! empty( $posted['variation_id'] ) ) { + $product_id = (int) $posted['variation_id']; + } else { + throw new WC_REST_Exception( 'woocommerce_rest_required_product_reference', __( 'Product ID or SKU is required.', 'woocommerce' ), 400 ); + } + return $product_id; + } + + /** + * Maybe set an item prop if the value was posted. + * + * @param WC_Order_Item $item Order item. + * @param string $prop Order property. + * @param array $posted Request data. + */ + protected function maybe_set_item_prop( $item, $prop, $posted ) { + if ( isset( $posted[ $prop ] ) ) { + $item->{"set_$prop"}( $posted[ $prop ] ); + } + } + + /** + * Maybe set item props if the values were posted. + * + * @param WC_Order_Item $item Order item data. + * @param string[] $props Properties. + * @param array $posted Request data. + */ + protected function maybe_set_item_props( $item, $props, $posted ) { + foreach ( $props as $prop ) { + $this->maybe_set_item_prop( $item, $prop, $posted ); + } + } + + /** + * Maybe set item meta if posted. + * + * @param WC_Order_Item $item Order item data. + * @param array $posted Request data. + */ + protected function maybe_set_item_meta_data( $item, $posted ) { + if ( ! empty( $posted['meta_data'] ) && is_array( $posted['meta_data'] ) ) { + foreach ( $posted['meta_data'] as $meta ) { + if ( isset( $meta['key'] ) ) { + $value = isset( $meta['value'] ) ? $meta['value'] : null; + $item->update_meta_data( $meta['key'], $value, isset( $meta['id'] ) ? $meta['id'] : '' ); + } + } + } + } + + /** + * Create or update a line item. + * + * @param array $posted Line item data. + * @param string $action 'create' to add line item or 'update' to update it. + * @param object $item Passed when updating an item. Null during creation. + * @return WC_Order_Item_Product + * @throws WC_REST_Exception Invalid data, server error. + */ + protected function prepare_line_items( $posted, $action = 'create', $item = null ) { + $item = is_null( $item ) ? new WC_Order_Item_Product( ! empty( $posted['id'] ) ? $posted['id'] : '' ) : $item; + $product = wc_get_product( $this->get_product_id( $posted ) ); + + if ( $product !== $item->get_product() ) { + $item->set_product( $product ); + + if ( 'create' === $action ) { + $quantity = isset( $posted['quantity'] ) ? $posted['quantity'] : 1; + $total = wc_get_price_excluding_tax( $product, array( 'qty' => $quantity ) ); + $item->set_total( $total ); + $item->set_subtotal( $total ); + } + } + + $this->maybe_set_item_props( $item, array( 'name', 'quantity', 'total', 'subtotal', 'tax_class' ), $posted ); + $this->maybe_set_item_meta_data( $item, $posted ); + + return $item; + } + + /** + * Create or update an order shipping method. + * + * @param array $posted $shipping Item data. + * @param string $action 'create' to add shipping or 'update' to update it. + * @param object $item Passed when updating an item. Null during creation. + * @return WC_Order_Item_Shipping + * @throws WC_REST_Exception Invalid data, server error. + */ + protected function prepare_shipping_lines( $posted, $action = 'create', $item = null ) { + $item = is_null( $item ) ? new WC_Order_Item_Shipping( ! empty( $posted['id'] ) ? $posted['id'] : '' ) : $item; + + if ( 'create' === $action ) { + if ( empty( $posted['method_id'] ) ) { + throw new WC_REST_Exception( 'woocommerce_rest_invalid_shipping_item', __( 'Shipping method ID is required.', 'woocommerce' ), 400 ); + } + } + + $this->maybe_set_item_props( $item, array( 'method_id', 'method_title', 'total' ), $posted ); + $this->maybe_set_item_meta_data( $item, $posted ); + + return $item; + } + + /** + * Create or update an order fee. + * + * @param array $posted Item data. + * @param string $action 'create' to add fee or 'update' to update it. + * @param object $item Passed when updating an item. Null during creation. + * @return WC_Order_Item_Fee + * @throws WC_REST_Exception Invalid data, server error. + */ + protected function prepare_fee_lines( $posted, $action = 'create', $item = null ) { + $item = is_null( $item ) ? new WC_Order_Item_Fee( ! empty( $posted['id'] ) ? $posted['id'] : '' ) : $item; + + if ( 'create' === $action ) { + if ( empty( $posted['name'] ) ) { + throw new WC_REST_Exception( 'woocommerce_rest_invalid_fee_item', __( 'Fee name is required.', 'woocommerce' ), 400 ); + } + } + + $this->maybe_set_item_props( $item, array( 'name', 'tax_class', 'tax_status', 'total' ), $posted ); + $this->maybe_set_item_meta_data( $item, $posted ); + + return $item; + } + + /** + * Create or update an order coupon. + * + * @param array $posted Item data. + * @param string $action 'create' to add coupon or 'update' to update it. + * @param object $item Passed when updating an item. Null during creation. + * @return WC_Order_Item_Coupon + * @throws WC_REST_Exception Invalid data, server error. + */ + protected function prepare_coupon_lines( $posted, $action = 'create', $item = null ) { + $item = is_null( $item ) ? new WC_Order_Item_Coupon( ! empty( $posted['id'] ) ? $posted['id'] : '' ) : $item; + + if ( 'create' === $action ) { + if ( empty( $posted['code'] ) ) { + throw new WC_REST_Exception( 'woocommerce_rest_invalid_coupon_coupon', __( 'Coupon code is required.', 'woocommerce' ), 400 ); + } + } + + $this->maybe_set_item_props( $item, array( 'code', 'discount' ), $posted ); + $this->maybe_set_item_meta_data( $item, $posted ); + + return $item; + } + + /** + * Wrapper method to create/update order items. + * When updating, the item ID provided is checked to ensure it is associated + * with the order. + * + * @param WC_Order $order order object. + * @param string $item_type The item type. + * @param array $posted item provided in the request body. + * @throws WC_REST_Exception If item ID is not associated with order. + */ + protected function set_item( $order, $item_type, $posted ) { + global $wpdb; + + if ( ! empty( $posted['id'] ) ) { + $action = 'update'; + } else { + $action = 'create'; + } + + $method = 'prepare_' . $item_type; + $item = null; + + // Verify provided line item ID is associated with order. + if ( 'update' === $action ) { + $item = $order->get_item( absint( $posted['id'] ), false ); + + if ( ! $item ) { + throw new WC_REST_Exception( 'woocommerce_rest_invalid_item_id', __( 'Order item ID provided is not associated with order.', 'woocommerce' ), 400 ); + } + } + + // Prepare item data. + $item = $this->$method( $posted, $action, $item ); + + do_action( 'woocommerce_rest_set_order_item', $item, $posted ); + + // If creating the order, add the item to it. + if ( 'create' === $action ) { + $order->add_item( $item ); + } else { + $item->save(); + } + } + + /** + * Helper method to check if the resource ID associated with the provided item is null. + * Items can be deleted by setting the resource ID to null. + * + * @param array $item Item provided in the request body. + * @return bool True if the item resource ID is null, false otherwise. + */ + protected function item_is_null( $item ) { + $keys = array( 'product_id', 'method_id', 'method_title', 'name', 'code' ); + + foreach ( $keys as $key ) { + if ( array_key_exists( $key, $item ) && is_null( $item[ $key ] ) ) { + return true; + } + } + + return false; + } + + /** + * Get order statuses without prefixes. + * + * @return array + */ + protected function get_order_statuses() { + $order_statuses = array(); + + foreach ( array_keys( wc_get_order_statuses() ) as $status ) { + $order_statuses[] = str_replace( 'wc-', '', $status ); + } + + return $order_statuses; + } + + /** + * Get the Order's schema, conforming to JSON Schema. + * + * @return array + */ + public function get_item_schema() { + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => $this->post_type, + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'parent_id' => array( + 'description' => __( 'Parent order ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'number' => array( + 'description' => __( 'Order number.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'order_key' => array( + 'description' => __( 'Order key.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'created_via' => array( + 'description' => __( 'Shows where the order was created.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'version' => array( + 'description' => __( 'Version of WooCommerce which last updated the order.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'status' => array( + 'description' => __( 'Order status.', 'woocommerce' ), + 'type' => 'string', + 'default' => 'pending', + 'enum' => $this->get_order_statuses(), + 'context' => array( 'view', 'edit' ), + ), + 'currency' => array( + 'description' => __( 'Currency the order was created with, in ISO format.', 'woocommerce' ), + 'type' => 'string', + 'default' => get_woocommerce_currency(), + 'enum' => array_keys( get_woocommerce_currencies() ), + 'context' => array( 'view', 'edit' ), + ), + 'date_created' => array( + 'description' => __( "The date the order was created, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_created_gmt' => array( + 'description' => __( 'The date the order was created, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_modified' => array( + 'description' => __( "The date the order was last modified, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_modified_gmt' => array( + 'description' => __( 'The date the order was last modified, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'discount_total' => array( + 'description' => __( 'Total discount amount for the order.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'discount_tax' => array( + 'description' => __( 'Total discount tax amount for the order.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'shipping_total' => array( + 'description' => __( 'Total shipping amount for the order.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'shipping_tax' => array( + 'description' => __( 'Total shipping tax amount for the order.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'cart_tax' => array( + 'description' => __( 'Sum of line item taxes only.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'total' => array( + 'description' => __( 'Grand total.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'total_tax' => array( + 'description' => __( 'Sum of all taxes.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'prices_include_tax' => array( + 'description' => __( 'True the prices included tax during checkout.', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'customer_id' => array( + 'description' => __( 'User ID who owns the order. 0 for guests.', 'woocommerce' ), + 'type' => 'integer', + 'default' => 0, + 'context' => array( 'view', 'edit' ), + ), + 'customer_ip_address' => array( + 'description' => __( "Customer's IP address.", 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'customer_user_agent' => array( + 'description' => __( 'User agent of the customer.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'customer_note' => array( + 'description' => __( 'Note left by customer during checkout.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'billing' => array( + 'description' => __( 'Billing address.', 'woocommerce' ), + 'type' => 'object', + 'context' => array( 'view', 'edit' ), + 'properties' => array( + 'first_name' => array( + 'description' => __( 'First name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'last_name' => array( + 'description' => __( 'Last name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'company' => array( + 'description' => __( 'Company name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'address_1' => array( + 'description' => __( 'Address line 1', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'address_2' => array( + 'description' => __( 'Address line 2', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'city' => array( + 'description' => __( 'City name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'state' => array( + 'description' => __( 'ISO code or name of the state, province or district.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'postcode' => array( + 'description' => __( 'Postal code.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'country' => array( + 'description' => __( 'Country code in ISO 3166-1 alpha-2 format.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'email' => array( + 'description' => __( 'Email address.', 'woocommerce' ), + 'type' => 'string', + 'format' => 'email', + 'context' => array( 'view', 'edit' ), + ), + 'phone' => array( + 'description' => __( 'Phone number.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + 'shipping' => array( + 'description' => __( 'Shipping address.', 'woocommerce' ), + 'type' => 'object', + 'context' => array( 'view', 'edit' ), + 'properties' => array( + 'first_name' => array( + 'description' => __( 'First name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'last_name' => array( + 'description' => __( 'Last name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'company' => array( + 'description' => __( 'Company name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'address_1' => array( + 'description' => __( 'Address line 1', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'address_2' => array( + 'description' => __( 'Address line 2', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'city' => array( + 'description' => __( 'City name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'state' => array( + 'description' => __( 'ISO code or name of the state, province or district.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'postcode' => array( + 'description' => __( 'Postal code.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'country' => array( + 'description' => __( 'Country code in ISO 3166-1 alpha-2 format.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + 'payment_method' => array( + 'description' => __( 'Payment method ID.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'payment_method_title' => array( + 'description' => __( 'Payment method title.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'transaction_id' => array( + 'description' => __( 'Unique transaction ID.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'date_paid' => array( + 'description' => __( "The date the order was paid, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_paid_gmt' => array( + 'description' => __( 'The date the order was paid, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_completed' => array( + 'description' => __( "The date the order was completed, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_completed_gmt' => array( + 'description' => __( 'The date the order was completed, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'cart_hash' => array( + 'description' => __( 'MD5 hash of cart items to ensure orders are not modified.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'meta_data' => array( + 'description' => __( 'Meta data.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Meta ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'key' => array( + 'description' => __( 'Meta key.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'value' => array( + 'description' => __( 'Meta value.', 'woocommerce' ), + 'type' => 'mixed', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + ), + 'line_items' => array( + 'description' => __( 'Line items data.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Item ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'name' => array( + 'description' => __( 'Product name.', 'woocommerce' ), + 'type' => 'mixed', + 'context' => array( 'view', 'edit' ), + ), + 'product_id' => array( + 'description' => __( 'Product ID.', 'woocommerce' ), + 'type' => 'mixed', + 'context' => array( 'view', 'edit' ), + ), + 'variation_id' => array( + 'description' => __( 'Variation ID, if applicable.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'quantity' => array( + 'description' => __( 'Quantity ordered.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'tax_class' => array( + 'description' => __( 'Tax class of product.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'subtotal' => array( + 'description' => __( 'Line subtotal (before discounts).', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'subtotal_tax' => array( + 'description' => __( 'Line subtotal tax (before discounts).', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'total' => array( + 'description' => __( 'Line total (after discounts).', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'total_tax' => array( + 'description' => __( 'Line total tax (after discounts).', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'taxes' => array( + 'description' => __( 'Line taxes.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Tax rate ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'total' => array( + 'description' => __( 'Tax total.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'subtotal' => array( + 'description' => __( 'Tax subtotal.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + ), + 'meta_data' => array( + 'description' => __( 'Meta data.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Meta ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'key' => array( + 'description' => __( 'Meta key.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'value' => array( + 'description' => __( 'Meta value.', 'woocommerce' ), + 'type' => 'mixed', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + ), + 'sku' => array( + 'description' => __( 'Product SKU.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'price' => array( + 'description' => __( 'Product price.', 'woocommerce' ), + 'type' => 'number', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + ), + ), + ), + 'tax_lines' => array( + 'description' => __( 'Tax lines data.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Item ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'rate_code' => array( + 'description' => __( 'Tax rate code.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'rate_id' => array( + 'description' => __( 'Tax rate ID.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'label' => array( + 'description' => __( 'Tax rate label.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'compound' => array( + 'description' => __( 'Show if is a compound tax rate.', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'tax_total' => array( + 'description' => __( 'Tax total (not including shipping taxes).', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'shipping_tax_total' => array( + 'description' => __( 'Shipping tax total.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'meta_data' => array( + 'description' => __( 'Meta data.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Meta ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'key' => array( + 'description' => __( 'Meta key.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'value' => array( + 'description' => __( 'Meta value.', 'woocommerce' ), + 'type' => 'mixed', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + ), + ), + ), + ), + 'shipping_lines' => array( + 'description' => __( 'Shipping lines data.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Item ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'method_title' => array( + 'description' => __( 'Shipping method name.', 'woocommerce' ), + 'type' => 'mixed', + 'context' => array( 'view', 'edit' ), + ), + 'method_id' => array( + 'description' => __( 'Shipping method ID.', 'woocommerce' ), + 'type' => 'mixed', + 'context' => array( 'view', 'edit' ), + ), + 'total' => array( + 'description' => __( 'Line total (after discounts).', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'total_tax' => array( + 'description' => __( 'Line total tax (after discounts).', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'taxes' => array( + 'description' => __( 'Line taxes.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Tax rate ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'total' => array( + 'description' => __( 'Tax total.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + ), + ), + ), + 'meta_data' => array( + 'description' => __( 'Meta data.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Meta ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'key' => array( + 'description' => __( 'Meta key.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'value' => array( + 'description' => __( 'Meta value.', 'woocommerce' ), + 'type' => 'mixed', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + ), + ), + ), + ), + 'fee_lines' => array( + 'description' => __( 'Fee lines data.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Item ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'name' => array( + 'description' => __( 'Fee name.', 'woocommerce' ), + 'type' => 'mixed', + 'context' => array( 'view', 'edit' ), + ), + 'tax_class' => array( + 'description' => __( 'Tax class of fee.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'tax_status' => array( + 'description' => __( 'Tax status of fee.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'enum' => array( 'taxable', 'none' ), + ), + 'total' => array( + 'description' => __( 'Line total (after discounts).', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'total_tax' => array( + 'description' => __( 'Line total tax (after discounts).', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'taxes' => array( + 'description' => __( 'Line taxes.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Tax rate ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'total' => array( + 'description' => __( 'Tax total.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'subtotal' => array( + 'description' => __( 'Tax subtotal.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + ), + ), + ), + 'meta_data' => array( + 'description' => __( 'Meta data.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Meta ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'key' => array( + 'description' => __( 'Meta key.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'value' => array( + 'description' => __( 'Meta value.', 'woocommerce' ), + 'type' => 'mixed', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + ), + ), + ), + ), + 'coupon_lines' => array( + 'description' => __( 'Coupons line data.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Item ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'code' => array( + 'description' => __( 'Coupon code.', 'woocommerce' ), + 'type' => 'mixed', + 'context' => array( 'view', 'edit' ), + ), + 'discount' => array( + 'description' => __( 'Discount total.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'discount_tax' => array( + 'description' => __( 'Discount total tax.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'meta_data' => array( + 'description' => __( 'Meta data.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Meta ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'key' => array( + 'description' => __( 'Meta key.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'value' => array( + 'description' => __( 'Meta value.', 'woocommerce' ), + 'type' => 'mixed', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + ), + ), + ), + ), + 'refunds' => array( + 'description' => __( 'List of refunds.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Refund ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'reason' => array( + 'description' => __( 'Refund reason.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'total' => array( + 'description' => __( 'Refund total.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + ), + ), + ), + 'set_paid' => array( + 'description' => __( 'Define if the order is paid. It will set the status to processing and reduce stock items.', 'woocommerce' ), + 'type' => 'boolean', + 'default' => false, + 'context' => array( 'edit' ), + ), + ), + ); + + return $this->add_additional_fields_schema( $schema ); + } + + /** + * Get the query params for collections. + * + * @return array + */ + public function get_collection_params() { + $params = parent::get_collection_params(); + + $params['status'] = array( + 'default' => 'any', + 'description' => __( 'Limit result set to orders assigned a specific status.', 'woocommerce' ), + 'type' => 'string', + 'enum' => array_merge( array( 'any' ), $this->get_order_statuses() ), + 'sanitize_callback' => 'sanitize_key', + 'validate_callback' => 'rest_validate_request_arg', + ); + $params['customer'] = array( + 'description' => __( 'Limit result set to orders assigned a specific customer.', 'woocommerce' ), + 'type' => 'integer', + 'sanitize_callback' => 'absint', + 'validate_callback' => 'rest_validate_request_arg', + ); + $params['product'] = array( + 'description' => __( 'Limit result set to orders assigned a specific product.', 'woocommerce' ), + 'type' => 'integer', + 'sanitize_callback' => 'absint', + 'validate_callback' => 'rest_validate_request_arg', + ); + $params['dp'] = array( + 'default' => wc_get_price_decimals(), + 'description' => __( 'Number of decimal points to use in each resource.', 'woocommerce' ), + 'type' => 'integer', + 'sanitize_callback' => 'absint', + 'validate_callback' => 'rest_validate_request_arg', + ); + + return $params; + } +} diff --git a/includes/api/v2/class-wc-rest-payment-gateways-v2-controller.php b/includes/api/v2/class-wc-rest-payment-gateways-v2-controller.php new file mode 100644 index 00000000000..02e71571126 --- /dev/null +++ b/includes/api/v2/class-wc-rest-payment-gateways-v2-controller.php @@ -0,0 +1,466 @@ + + */ + public function register_routes() { + register_rest_route( + $this->namespace, '/' . $this->rest_base, array( + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_items' ), + 'permission_callback' => array( $this, 'get_items_permissions_check' ), + 'args' => $this->get_collection_params(), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + register_rest_route( + $this->namespace, '/' . $this->rest_base . '/(?P[\w-]+)', array( + 'args' => array( + 'id' => array( + 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), + 'type' => 'string', + ), + ), + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_item' ), + 'permission_callback' => array( $this, 'get_item_permissions_check' ), + 'args' => array( + 'context' => $this->get_context_param( array( 'default' => 'view' ) ), + ), + ), + array( + 'methods' => WP_REST_Server::EDITABLE, + 'callback' => array( $this, 'update_item' ), + 'permission_callback' => array( $this, 'update_items_permissions_check' ), + 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + } + + /** + * Check whether a given request has permission to view payment gateways. + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_Error|boolean + */ + public function get_items_permissions_check( $request ) { + if ( ! wc_rest_check_manager_permissions( 'payment_gateways', 'read' ) ) { + return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot list resources.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); + } + return true; + } + + /** + * Check if a given request has access to read a payment gateway. + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_Error|boolean + */ + public function get_item_permissions_check( $request ) { + if ( ! wc_rest_check_manager_permissions( 'payment_gateways', 'read' ) ) { + return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot view this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); + } + return true; + } + + /** + * Check whether a given request has permission to edit payment gateways. + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_Error|boolean + */ + public function update_items_permissions_check( $request ) { + if ( ! wc_rest_check_manager_permissions( 'payment_gateways', 'edit' ) ) { + return new WP_Error( 'woocommerce_rest_cannot_edit', __( 'Sorry, you are not allowed to edit this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); + } + return true; + } + + /** + * Get payment gateways. + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_Error|WP_REST_Response + */ + public function get_items( $request ) { + $payment_gateways = WC()->payment_gateways->payment_gateways(); + $response = array(); + foreach ( $payment_gateways as $payment_gateway_id => $payment_gateway ) { + $payment_gateway->id = $payment_gateway_id; + $gateway = $this->prepare_item_for_response( $payment_gateway, $request ); + $gateway = $this->prepare_response_for_collection( $gateway ); + $response[] = $gateway; + } + return rest_ensure_response( $response ); + } + + /** + * Get a single payment gateway. + * + * @param WP_REST_Request $request Request data. + * @return WP_REST_Response|WP_Error + */ + public function get_item( $request ) { + $gateway = $this->get_gateway( $request ); + + if ( is_null( $gateway ) ) { + return new WP_Error( 'woocommerce_rest_payment_gateway_invalid', __( 'Resource does not exist.', 'woocommerce' ), array( 'status' => 404 ) ); + } + + $gateway = $this->prepare_item_for_response( $gateway, $request ); + return rest_ensure_response( $gateway ); + } + + /** + * Update A Single Payment Method. + * + * @param WP_REST_Request $request Request data. + * @return WP_REST_Response|WP_Error + */ + public function update_item( $request ) { + $gateway = $this->get_gateway( $request ); + + if ( is_null( $gateway ) ) { + return new WP_Error( 'woocommerce_rest_payment_gateway_invalid', __( 'Resource does not exist.', 'woocommerce' ), array( 'status' => 404 ) ); + } + + // Get settings. + $gateway->init_form_fields(); + $settings = $gateway->settings; + + // Update settings. + if ( isset( $request['settings'] ) ) { + $errors_found = false; + foreach ( $gateway->form_fields as $key => $field ) { + if ( isset( $request['settings'][ $key ] ) ) { + if ( is_callable( array( $this, 'validate_setting_' . $field['type'] . '_field' ) ) ) { + $value = $this->{'validate_setting_' . $field['type'] . '_field'}( $request['settings'][ $key ], $field ); + } else { + $value = $this->validate_setting_text_field( $request['settings'][ $key ], $field ); + } + if ( is_wp_error( $value ) ) { + $errors_found = true; + break; + } + $settings[ $key ] = $value; + } + } + + if ( $errors_found ) { + return new WP_Error( 'rest_setting_value_invalid', __( 'An invalid setting value was passed.', 'woocommerce' ), array( 'status' => 400 ) ); + } + } + + // Update if this method is enabled or not. + if ( isset( $request['enabled'] ) ) { + $settings['enabled'] = wc_bool_to_string( $request['enabled'] ); + $gateway->enabled = $settings['enabled']; + } + + // Update title. + if ( isset( $request['title'] ) ) { + $settings['title'] = $request['title']; + $gateway->title = $settings['title']; + } + + // Update description. + if ( isset( $request['description'] ) ) { + $settings['description'] = $request['description']; + $gateway->description = $settings['description']; + } + + // Update options. + $gateway->settings = $settings; + update_option( $gateway->get_option_key(), apply_filters( 'woocommerce_gateway_' . $gateway->id . '_settings_values', $settings, $gateway ) ); + + // Update order. + if ( isset( $request['order'] ) ) { + $order = (array) get_option( 'woocommerce_gateway_order' ); + $order[ $gateway->id ] = $request['order']; + update_option( 'woocommerce_gateway_order', $order ); + $gateway->order = absint( $request['order'] ); + } + + $gateway = $this->prepare_item_for_response( $gateway, $request ); + return rest_ensure_response( $gateway ); + } + + /** + * Get a gateway based on the current request object. + * + * @param WP_REST_Request $request Request data. + * @return WP_REST_Response|null + */ + public function get_gateway( $request ) { + $gateway = null; + $payment_gateways = WC()->payment_gateways->payment_gateways(); + foreach ( $payment_gateways as $payment_gateway_id => $payment_gateway ) { + if ( $request['id'] !== $payment_gateway_id ) { + continue; + } + $payment_gateway->id = $payment_gateway_id; + $gateway = $payment_gateway; + } + return $gateway; + } + + /** + * Prepare a payment gateway for response. + * + * @param WC_Payment_Gateway $gateway Payment gateway object. + * @param WP_REST_Request $request Request object. + * @return WP_REST_Response $response Response data. + */ + public function prepare_item_for_response( $gateway, $request ) { + $order = (array) get_option( 'woocommerce_gateway_order' ); + $item = array( + 'id' => $gateway->id, + 'title' => $gateway->title, + 'description' => $gateway->description, + 'order' => isset( $order[ $gateway->id ] ) ? $order[ $gateway->id ] : '', + 'enabled' => ( 'yes' === $gateway->enabled ), + 'method_title' => $gateway->get_method_title(), + 'method_description' => $gateway->get_method_description(), + 'settings' => $this->get_settings( $gateway ), + ); + + $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; + $data = $this->add_additional_fields_to_object( $item, $request ); + $data = $this->filter_response_by_context( $data, $context ); + + $response = rest_ensure_response( $data ); + $response->add_links( $this->prepare_links( $gateway, $request ) ); + + /** + * Filter payment gateway objects returned from the REST API. + * + * @param WP_REST_Response $response The response object. + * @param WC_Payment_Gateway $gateway Payment gateway object. + * @param WP_REST_Request $request Request object. + */ + return apply_filters( 'woocommerce_rest_prepare_payment_gateway', $response, $gateway, $request ); + } + + /** + * Return settings associated with this payment gateway. + * + * @param WC_Payment_Gateway $gateway Gateway data. + * + * @return array + */ + public function get_settings( $gateway ) { + $settings = array(); + $gateway->init_form_fields(); + foreach ( $gateway->form_fields as $id => $field ) { + // Make sure we at least have a title and type. + if ( empty( $field['title'] ) || empty( $field['type'] ) ) { + continue; + } + // Ignore 'title' settings/fields -- they are UI only. + if ( 'title' === $field['type'] ) { + continue; + } + // Ignore 'enabled' and 'description' which get included elsewhere. + if ( in_array( $id, array( 'enabled', 'description' ), true ) ) { + continue; + } + $data = array( + 'id' => $id, + 'label' => empty( $field['label'] ) ? $field['title'] : $field['label'], + 'description' => empty( $field['description'] ) ? '' : $field['description'], + 'type' => $field['type'], + 'value' => empty( $gateway->settings[ $id ] ) ? '' : $gateway->settings[ $id ], + 'default' => empty( $field['default'] ) ? '' : $field['default'], + 'tip' => empty( $field['description'] ) ? '' : $field['description'], + 'placeholder' => empty( $field['placeholder'] ) ? '' : $field['placeholder'], + ); + if ( ! empty( $field['options'] ) ) { + $data['options'] = $field['options']; + } + $settings[ $id ] = $data; + } + return $settings; + } + + /** + * Prepare links for the request. + * + * @param WC_Payment_Gateway $gateway Payment gateway object. + * @param WP_REST_Request $request Request object. + * @return array + */ + protected function prepare_links( $gateway, $request ) { + $links = array( + 'self' => array( + 'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $this->rest_base, $gateway->id ) ), + ), + 'collection' => array( + 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ), + ), + ); + + return $links; + } + + /** + * Get the payment gateway schema, conforming to JSON Schema. + * + * @return array + */ + public function get_item_schema() { + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => 'payment_gateway', + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Payment gateway ID.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'title' => array( + 'description' => __( 'Payment gateway title on checkout.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'description' => array( + 'description' => __( 'Payment gateway description on checkout.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'order' => array( + 'description' => __( 'Payment gateway sort order.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'arg_options' => array( + 'sanitize_callback' => 'absint', + ), + ), + 'enabled' => array( + 'description' => __( 'Payment gateway enabled status.', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view', 'edit' ), + ), + 'method_title' => array( + 'description' => __( 'Payment gateway method title.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'method_description' => array( + 'description' => __( 'Payment gateway method description.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'settings' => array( + 'description' => __( 'Payment gateway settings.', 'woocommerce' ), + 'type' => 'object', + 'context' => array( 'view', 'edit' ), + 'properties' => array( + 'id' => array( + 'description' => __( 'A unique identifier for the setting.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'label' => array( + 'description' => __( 'A human readable label for the setting used in interfaces.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'description' => array( + 'description' => __( 'A human readable description for the setting used in interfaces.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'type' => array( + 'description' => __( 'Type of setting.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'enum' => array( 'text', 'email', 'number', 'color', 'password', 'textarea', 'select', 'multiselect', 'radio', 'image_width', 'checkbox' ), + 'readonly' => true, + ), + 'value' => array( + 'description' => __( 'Setting value.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'default' => array( + 'description' => __( 'Default value for the setting.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'tip' => array( + 'description' => __( 'Additional help text shown to the user about the setting.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'placeholder' => array( + 'description' => __( 'Placeholder text to be displayed in text inputs.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + ), + ), + ), + ); + + return $this->add_additional_fields_schema( $schema ); + } + + /** + * Get any query params needed. + * + * @return array + */ + public function get_collection_params() { + return array( + 'context' => $this->get_context_param( array( 'default' => 'view' ) ), + ); + } + +} diff --git a/includes/api/v2/class-wc-rest-product-attribute-terms-v2-controller.php b/includes/api/v2/class-wc-rest-product-attribute-terms-v2-controller.php new file mode 100644 index 00000000000..23ad5e14d9c --- /dev/null +++ b/includes/api/v2/class-wc-rest-product-attribute-terms-v2-controller.php @@ -0,0 +1,27 @@ +/terms endpoint. + * + * @package WooCommerce/API + * @since 2.6.0 + */ + +defined( 'ABSPATH' ) || exit; + +/** + * REST API Product Attribute Terms controller class. + * + * @package WooCommerce/API + * @extends WC_REST_Product_Attribute_Terms_V1_Controller + */ +class WC_REST_Product_Attribute_Terms_V2_Controller extends WC_REST_Product_Attribute_Terms_V1_Controller { + + /** + * Endpoint namespace. + * + * @var string + */ + protected $namespace = 'wc/v2'; +} diff --git a/includes/api/v2/class-wc-rest-product-attributes-v2-controller.php b/includes/api/v2/class-wc-rest-product-attributes-v2-controller.php new file mode 100644 index 00000000000..59d5416b52e --- /dev/null +++ b/includes/api/v2/class-wc-rest-product-attributes-v2-controller.php @@ -0,0 +1,27 @@ +term_id, 'display_type' ); + + // Get category order. + $menu_order = get_woocommerce_term_meta( $item->term_id, 'order' ); + + $data = array( + 'id' => (int) $item->term_id, + 'name' => $item->name, + 'slug' => $item->slug, + 'parent' => (int) $item->parent, + 'description' => $item->description, + 'display' => $display_type ? $display_type : 'default', + 'image' => null, + 'menu_order' => (int) $menu_order, + 'count' => (int) $item->count, + ); + + // Get category image. + $image_id = get_woocommerce_term_meta( $item->term_id, 'thumbnail_id' ); + if ( $image_id ) { + $attachment = get_post( $image_id ); + + $data['image'] = array( + 'id' => (int) $image_id, + 'date_created' => wc_rest_prepare_date_response( $attachment->post_date ), + 'date_created_gmt' => wc_rest_prepare_date_response( $attachment->post_date_gmt ), + 'date_modified' => wc_rest_prepare_date_response( $attachment->post_modified ), + 'date_modified_gmt' => wc_rest_prepare_date_response( $attachment->post_modified_gmt ), + 'src' => wp_get_attachment_url( $image_id ), + 'title' => get_the_title( $attachment ), + 'alt' => get_post_meta( $image_id, '_wp_attachment_image_alt', true ), + ); + } + + $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; + $data = $this->add_additional_fields_to_object( $data, $request ); + $data = $this->filter_response_by_context( $data, $context ); + + $response = rest_ensure_response( $data ); + + $response->add_links( $this->prepare_links( $item, $request ) ); + + /** + * Filter a term item returned from the API. + * + * Allows modification of the term data right before it is returned. + * + * @param WP_REST_Response $response The response object. + * @param object $item The original term object. + * @param WP_REST_Request $request Request used to generate the response. + */ + return apply_filters( "woocommerce_rest_prepare_{$this->taxonomy}", $response, $item, $request ); + } + + /** + * Get the Category schema, conforming to JSON Schema. + * + * @return array + */ + public function get_item_schema() { + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => $this->taxonomy, + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'name' => array( + 'description' => __( 'Category name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'arg_options' => array( + 'sanitize_callback' => 'sanitize_text_field', + ), + ), + 'slug' => array( + 'description' => __( 'An alphanumeric identifier for the resource unique to its type.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'arg_options' => array( + 'sanitize_callback' => 'sanitize_title', + ), + ), + 'parent' => array( + 'description' => __( 'The ID for the parent of the resource.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'description' => array( + 'description' => __( 'HTML description of the resource.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'arg_options' => array( + 'sanitize_callback' => 'wp_filter_post_kses', + ), + ), + 'display' => array( + 'description' => __( 'Category archive display type.', 'woocommerce' ), + 'type' => 'string', + 'default' => 'default', + 'enum' => array( 'default', 'products', 'subcategories', 'both' ), + 'context' => array( 'view', 'edit' ), + ), + 'image' => array( + 'description' => __( 'Image data.', 'woocommerce' ), + 'type' => 'object', + 'context' => array( 'view', 'edit' ), + 'properties' => array( + 'id' => array( + 'description' => __( 'Image ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'date_created' => array( + 'description' => __( "The date the image was created, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_created_gmt' => array( + 'description' => __( 'The date the image was created, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_modified' => array( + 'description' => __( "The date the image was last modified, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_modified_gmt' => array( + 'description' => __( 'The date the image was last modified, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'src' => array( + 'description' => __( 'Image URL.', 'woocommerce' ), + 'type' => 'string', + 'format' => 'uri', + 'context' => array( 'view', 'edit' ), + ), + 'title' => array( + 'description' => __( 'Image name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'alt' => array( + 'description' => __( 'Image alternative text.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + 'menu_order' => array( + 'description' => __( 'Menu order, used to custom sort the resource.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'count' => array( + 'description' => __( 'Number of published products for the resource.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + ), + ); + + return $this->add_additional_fields_schema( $schema ); + } +} diff --git a/includes/api/v2/class-wc-rest-product-reviews-v2-controller.php b/includes/api/v2/class-wc-rest-product-reviews-v2-controller.php new file mode 100644 index 00000000000..5eb6ca0ab07 --- /dev/null +++ b/includes/api/v2/class-wc-rest-product-reviews-v2-controller.php @@ -0,0 +1,199 @@ +/reviews. + * + * @package WooCommerce/API + * @since 2.6.0 + */ + +defined( 'ABSPATH' ) || exit; + +/** + * REST API Product Reviews Controller Class. + * + * @package WooCommerce/API + * @extends WC_REST_Product_Reviews_V1_Controller + */ +class WC_REST_Product_Reviews_V2_Controller extends WC_REST_Product_Reviews_V1_Controller { + + /** + * Endpoint namespace. + * + * @var string + */ + protected $namespace = 'wc/v2'; + + /** + * Route base. + * + * @var string + */ + protected $rest_base = 'products/(?P[\d]+)/reviews'; + + /** + * Register the routes for product reviews. + */ + public function register_routes() { + parent::register_routes(); + + register_rest_route( + $this->namespace, '/' . $this->rest_base . '/batch', array( + 'args' => array( + 'product_id' => array( + 'description' => __( 'Unique identifier for the variable product.', 'woocommerce' ), + 'type' => 'integer', + ), + ), + array( + 'methods' => WP_REST_Server::EDITABLE, + 'callback' => array( $this, 'batch_items' ), + 'permission_callback' => array( $this, 'batch_items_permissions_check' ), + 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), + ), + 'schema' => array( $this, 'get_public_batch_schema' ), + ) + ); + } + + /** + * Check if a given request has access to batch manage product reviews. + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_Error|boolean + */ + public function batch_items_permissions_check( $request ) { + if ( ! wc_rest_check_post_permissions( 'product', 'batch' ) ) { + return new WP_Error( 'woocommerce_rest_cannot_edit', __( 'Sorry, you are not allowed to batch manipulate this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); + } + return true; + } + + /** + * Prepare a single product review output for response. + * + * @param WP_Comment $review Product review object. + * @param WP_REST_Request $request Request object. + * @return WP_REST_Response $response Response data. + */ + public function prepare_item_for_response( $review, $request ) { + $data = array( + 'id' => (int) $review->comment_ID, + 'date_created' => wc_rest_prepare_date_response( $review->comment_date ), + 'date_created_gmt' => wc_rest_prepare_date_response( $review->comment_date_gmt ), + 'review' => $review->comment_content, + 'rating' => (int) get_comment_meta( $review->comment_ID, 'rating', true ), + 'name' => $review->comment_author, + 'email' => $review->comment_author_email, + 'verified' => wc_review_is_from_verified_owner( $review->comment_ID ), + ); + + $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; + $data = $this->add_additional_fields_to_object( $data, $request ); + $data = $this->filter_response_by_context( $data, $context ); + + // Wrap the data in a response object. + $response = rest_ensure_response( $data ); + + $response->add_links( $this->prepare_links( $review, $request ) ); + + /** + * Filter product reviews object returned from the REST API. + * + * @param WP_REST_Response $response The response object. + * @param WP_Comment $review Product review object used to create response. + * @param WP_REST_Request $request Request object. + */ + return apply_filters( 'woocommerce_rest_prepare_product_review', $response, $review, $request ); + } + + + /** + * Bulk create, update and delete items. + * + * @since 3.0.0 + * @param WP_REST_Request $request Full details about the request. + * @return array Of WP_Error or WP_REST_Response. + */ + public function batch_items( $request ) { + $items = array_filter( $request->get_params() ); + $params = $request->get_url_params(); + $product_id = $params['product_id']; + $body_params = array(); + + foreach ( array( 'update', 'create', 'delete' ) as $batch_type ) { + if ( ! empty( $items[ $batch_type ] ) ) { + $injected_items = array(); + foreach ( $items[ $batch_type ] as $item ) { + $injected_items[] = is_array( $item ) ? array_merge( array( 'product_id' => $product_id ), $item ) : $item; + } + $body_params[ $batch_type ] = $injected_items; + } + } + + $request = new WP_REST_Request( $request->get_method() ); + $request->set_body_params( $body_params ); + + return parent::batch_items( $request ); + } + + /** + * Get the Product Review's schema, conforming to JSON Schema. + * + * @return array + */ + public function get_item_schema() { + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => 'product_review', + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'review' => array( + 'description' => __( 'The content of the review.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'date_created' => array( + 'description' => __( "The date the review was created, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + ), + 'date_created_gmt' => array( + 'description' => __( 'The date the review was created, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + ), + 'rating' => array( + 'description' => __( 'Review rating (0 to 5).', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'name' => array( + 'description' => __( 'Reviewer name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'email' => array( + 'description' => __( 'Reviewer email.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'verified' => array( + 'description' => __( 'Shows if the reviewer bought the product or not.', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + ), + ); + + return $this->add_additional_fields_schema( $schema ); + } +} diff --git a/includes/api/v2/class-wc-rest-product-shipping-classes-v2-controller.php b/includes/api/v2/class-wc-rest-product-shipping-classes-v2-controller.php new file mode 100644 index 00000000000..1eeec0041df --- /dev/null +++ b/includes/api/v2/class-wc-rest-product-shipping-classes-v2-controller.php @@ -0,0 +1,27 @@ +/variations endpoints. + * + * @package WooCommerce\API + * @since 3.0.0 + */ + +defined( 'ABSPATH' ) || exit; + +/** + * REST API variations controller class. + * + * @package WooCommerce/API + * @extends WC_REST_Products_Controller + */ +class WC_REST_Product_Variations_V2_Controller extends WC_REST_Products_Controller { + + /** + * Endpoint namespace. + * + * @var string + */ + protected $namespace = 'wc/v2'; + + /** + * Route base. + * + * @var string + */ + protected $rest_base = 'products/(?P[\d]+)/variations'; + + /** + * Post type. + * + * @var string + */ + protected $post_type = 'product_variation'; + + /** + * Initialize product actions (parent). + */ + public function __construct() { + add_filter( "woocommerce_rest_{$this->post_type}_query", array( $this, 'add_product_id' ), 9, 2 ); + parent::__construct(); + } + + /** + * Register the routes for products. + */ + public function register_routes() { + register_rest_route( + $this->namespace, '/' . $this->rest_base, array( + 'args' => array( + 'product_id' => array( + 'description' => __( 'Unique identifier for the variable product.', 'woocommerce' ), + 'type' => 'integer', + ), + ), + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_items' ), + 'permission_callback' => array( $this, 'get_items_permissions_check' ), + 'args' => $this->get_collection_params(), + ), + array( + 'methods' => WP_REST_Server::CREATABLE, + 'callback' => array( $this, 'create_item' ), + 'permission_callback' => array( $this, 'create_item_permissions_check' ), + 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + register_rest_route( + $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)', array( + 'args' => array( + 'product_id' => array( + 'description' => __( 'Unique identifier for the variable product.', 'woocommerce' ), + 'type' => 'integer', + ), + 'id' => array( + 'description' => __( 'Unique identifier for the variation.', 'woocommerce' ), + 'type' => 'integer', + ), + ), + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_item' ), + 'permission_callback' => array( $this, 'get_item_permissions_check' ), + 'args' => array( + 'context' => $this->get_context_param( + array( + 'default' => 'view', + ) + ), + ), + ), + array( + 'methods' => WP_REST_Server::EDITABLE, + 'callback' => array( $this, 'update_item' ), + 'permission_callback' => array( $this, 'update_item_permissions_check' ), + 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), + ), + array( + 'methods' => WP_REST_Server::DELETABLE, + 'callback' => array( $this, 'delete_item' ), + 'permission_callback' => array( $this, 'delete_item_permissions_check' ), + 'args' => array( + 'force' => array( + 'default' => false, + 'type' => 'boolean', + 'description' => __( 'Whether to bypass trash and force deletion.', 'woocommerce' ), + ), + ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + register_rest_route( + $this->namespace, '/' . $this->rest_base . '/batch', array( + 'args' => array( + 'product_id' => array( + 'description' => __( 'Unique identifier for the variable product.', 'woocommerce' ), + 'type' => 'integer', + ), + ), + array( + 'methods' => WP_REST_Server::EDITABLE, + 'callback' => array( $this, 'batch_items' ), + 'permission_callback' => array( $this, 'batch_items_permissions_check' ), + 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), + ), + 'schema' => array( $this, 'get_public_batch_schema' ), + ) + ); + } + + /** + * Get object. + * + * @since 3.0.0 + * @param int $id Object ID. + * @return WC_Data + */ + protected function get_object( $id ) { + return wc_get_product( $id ); + } + + /** + * Check if a given request has access to update an item. + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_Error|boolean + */ + public function update_item_permissions_check( $request ) { + $object = $this->get_object( (int) $request['id'] ); + + if ( $object && 0 !== $object->get_id() && ! wc_rest_check_post_permissions( $this->post_type, 'edit', $object->get_id() ) ) { + return new WP_Error( 'woocommerce_rest_cannot_edit', __( 'Sorry, you are not allowed to edit this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); + } + + // Check if variation belongs to the correct parent product. + if ( $object && 0 !== $object->get_parent_id() && absint( $request['product_id'] ) !== $object->get_parent_id() ) { + return new WP_Error( 'woocommerce_rest_cannot_edit', __( 'Parent product does not match current variation.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); + } + + return true; + } + + /** + * Prepare a single variation output for response. + * + * @since 3.0.0 + * @param WC_Data $object Object data. + * @param WP_REST_Request $request Request object. + * @return WP_REST_Response + */ + public function prepare_object_for_response( $object, $request ) { + $data = array( + 'id' => $object->get_id(), + 'date_created' => wc_rest_prepare_date_response( $object->get_date_created(), false ), + 'date_created_gmt' => wc_rest_prepare_date_response( $object->get_date_created() ), + 'date_modified' => wc_rest_prepare_date_response( $object->get_date_modified(), false ), + 'date_modified_gmt' => wc_rest_prepare_date_response( $object->get_date_modified() ), + 'description' => wc_format_content( $object->get_description() ), + 'permalink' => $object->get_permalink(), + 'sku' => $object->get_sku(), + 'price' => $object->get_price(), + 'regular_price' => $object->get_regular_price(), + 'sale_price' => $object->get_sale_price(), + 'date_on_sale_from' => wc_rest_prepare_date_response( $object->get_date_on_sale_from(), false ), + 'date_on_sale_from_gmt' => wc_rest_prepare_date_response( $object->get_date_on_sale_from() ), + 'date_on_sale_to' => wc_rest_prepare_date_response( $object->get_date_on_sale_to(), false ), + 'date_on_sale_to_gmt' => wc_rest_prepare_date_response( $object->get_date_on_sale_to() ), + 'on_sale' => $object->is_on_sale(), + 'visible' => $object->is_visible(), + 'purchasable' => $object->is_purchasable(), + 'virtual' => $object->is_virtual(), + 'downloadable' => $object->is_downloadable(), + 'downloads' => $this->get_downloads( $object ), + 'download_limit' => '' !== $object->get_download_limit() ? (int) $object->get_download_limit() : -1, + 'download_expiry' => '' !== $object->get_download_expiry() ? (int) $object->get_download_expiry() : -1, + 'tax_status' => $object->get_tax_status(), + 'tax_class' => $object->get_tax_class(), + 'manage_stock' => $object->managing_stock(), + 'stock_quantity' => $object->get_stock_quantity(), + 'in_stock' => $object->is_in_stock(), + 'backorders' => $object->get_backorders(), + 'backorders_allowed' => $object->backorders_allowed(), + 'backordered' => $object->is_on_backorder(), + 'weight' => $object->get_weight(), + 'dimensions' => array( + 'length' => $object->get_length(), + 'width' => $object->get_width(), + 'height' => $object->get_height(), + ), + 'shipping_class' => $object->get_shipping_class(), + 'shipping_class_id' => $object->get_shipping_class_id(), + 'image' => current( $this->get_images( $object ) ), + 'attributes' => $this->get_attributes( $object ), + 'menu_order' => $object->get_menu_order(), + 'meta_data' => $object->get_meta_data(), + ); + + $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; + $data = $this->add_additional_fields_to_object( $data, $request ); + $data = $this->filter_response_by_context( $data, $context ); + $response = rest_ensure_response( $data ); + $response->add_links( $this->prepare_links( $object, $request ) ); + + /** + * Filter the data for a response. + * + * The dynamic portion of the hook name, $this->post_type, + * refers to object type being prepared for the response. + * + * @param WP_REST_Response $response The response object. + * @param WC_Data $object Object data. + * @param WP_REST_Request $request Request object. + */ + return apply_filters( "woocommerce_rest_prepare_{$this->post_type}_object", $response, $object, $request ); + } + + /** + * Prepare objects query. + * + * @since 3.0.0 + * @param WP_REST_Request $request Full details about the request. + * @return array + */ + protected function prepare_objects_query( $request ) { + $args = parent::prepare_objects_query( $request ); + + $args['post_parent'] = $request['product_id']; + + return $args; + } + + /** + * Prepare a single variation for create or update. + * + * @param WP_REST_Request $request Request object. + * @param bool $creating If is creating a new object. + * @return WP_Error|WC_Data + */ + protected function prepare_object_for_database( $request, $creating = false ) { + if ( isset( $request['id'] ) ) { + $variation = wc_get_product( absint( $request['id'] ) ); + } else { + $variation = new WC_Product_Variation(); + } + + // Update parent ID just once. + if ( 0 === $variation->get_parent_id() ) { + $variation->set_parent_id( absint( $request['product_id'] ) ); + } + + // Status. + if ( isset( $request['visible'] ) ) { + $variation->set_status( false === $request['visible'] ? 'private' : 'publish' ); + } + + // SKU. + if ( isset( $request['sku'] ) ) { + $variation->set_sku( wc_clean( $request['sku'] ) ); + } + + // Thumbnail. + if ( isset( $request['image'] ) ) { + if ( is_array( $request['image'] ) && ! empty( $request['image'] ) ) { + $image = $request['image']; + if ( is_array( $image ) ) { + $image['position'] = 0; + } + + $variation = $this->set_product_images( $variation, array( $image ) ); + } else { + $variation->set_image_id( '' ); + } + } + + // Virtual variation. + if ( isset( $request['virtual'] ) ) { + $variation->set_virtual( $request['virtual'] ); + } + + // Downloadable variation. + if ( isset( $request['downloadable'] ) ) { + $variation->set_downloadable( $request['downloadable'] ); + } + + // Downloads. + if ( $variation->get_downloadable() ) { + // Downloadable files. + if ( isset( $request['downloads'] ) && is_array( $request['downloads'] ) ) { + $variation = $this->save_downloadable_files( $variation, $request['downloads'] ); + } + + // Download limit. + if ( isset( $request['download_limit'] ) ) { + $variation->set_download_limit( $request['download_limit'] ); + } + + // Download expiry. + if ( isset( $request['download_expiry'] ) ) { + $variation->set_download_expiry( $request['download_expiry'] ); + } + } + + // Shipping data. + $variation = $this->save_product_shipping_data( $variation, $request ); + + // Stock handling. + if ( isset( $request['manage_stock'] ) ) { + if ( 'parent' === $request['manage_stock'] ) { + $variation->set_manage_stock( false ); // This just indicates the variation does not manage stock, but the parent does. + } else { + $variation->set_manage_stock( wc_string_to_bool( $request['manage_stock'] ) ); + } + } + + if ( isset( $request['in_stock'] ) ) { + $variation->set_stock_status( true === $request['in_stock'] ? 'instock' : 'outofstock' ); + } + + if ( isset( $request['backorders'] ) ) { + $variation->set_backorders( $request['backorders'] ); + } + + if ( $variation->get_manage_stock() ) { + if ( isset( $request['stock_quantity'] ) ) { + $variation->set_stock_quantity( $request['stock_quantity'] ); + } elseif ( isset( $request['inventory_delta'] ) ) { + $stock_quantity = wc_stock_amount( $variation->get_stock_quantity() ); + $stock_quantity += wc_stock_amount( $request['inventory_delta'] ); + $variation->set_stock_quantity( $stock_quantity ); + } + } else { + $variation->set_backorders( 'no' ); + $variation->set_stock_quantity( '' ); + } + + // Regular Price. + if ( isset( $request['regular_price'] ) ) { + $variation->set_regular_price( $request['regular_price'] ); + } + + // Sale Price. + if ( isset( $request['sale_price'] ) ) { + $variation->set_sale_price( $request['sale_price'] ); + } + + if ( isset( $request['date_on_sale_from'] ) ) { + $variation->set_date_on_sale_from( $request['date_on_sale_from'] ); + } + + if ( isset( $request['date_on_sale_from_gmt'] ) ) { + $variation->set_date_on_sale_from( $request['date_on_sale_from_gmt'] ? strtotime( $request['date_on_sale_from_gmt'] ) : null ); + } + + if ( isset( $request['date_on_sale_to'] ) ) { + $variation->set_date_on_sale_to( $request['date_on_sale_to'] ); + } + + if ( isset( $request['date_on_sale_to_gmt'] ) ) { + $variation->set_date_on_sale_to( $request['date_on_sale_to_gmt'] ? strtotime( $request['date_on_sale_to_gmt'] ) : null ); + } + + // Tax class. + if ( isset( $request['tax_class'] ) ) { + $variation->set_tax_class( $request['tax_class'] ); + } + + // Description. + if ( isset( $request['description'] ) ) { + $variation->set_description( wp_kses_post( $request['description'] ) ); + } + + // Update taxonomies. + if ( isset( $request['attributes'] ) ) { + $attributes = array(); + $parent = wc_get_product( $variation->get_parent_id() ); + $parent_attributes = $parent->get_attributes(); + + foreach ( $request['attributes'] as $attribute ) { + $attribute_id = 0; + $attribute_name = ''; + + // Check ID for global attributes or name for product attributes. + if ( ! empty( $attribute['id'] ) ) { + $attribute_id = absint( $attribute['id'] ); + $raw_attribute_name = wc_attribute_taxonomy_name_by_id( $attribute_id ); + } elseif ( ! empty( $attribute['name'] ) ) { + $raw_attribute_name = sanitize_title( $attribute['name'] ); + } + + if ( ! $attribute_id && ! $raw_attribute_name ) { + continue; + } + + $attribute_name = sanitize_title( $raw_attribute_name ); + + if ( ! isset( $parent_attributes[ $attribute_name ] ) || ! $parent_attributes[ $attribute_name ]->get_variation() ) { + continue; + } + + $attribute_key = sanitize_title( $parent_attributes[ $attribute_name ]->get_name() ); + $attribute_value = isset( $attribute['option'] ) ? wc_clean( stripslashes( $attribute['option'] ) ) : ''; + + if ( $parent_attributes[ $attribute_name ]->is_taxonomy() ) { + // If dealing with a taxonomy, we need to get the slug from the name posted to the API. + $term = get_term_by( 'name', $attribute_value, $raw_attribute_name ); // @codingStandardsIgnoreLine + + if ( $term && ! is_wp_error( $term ) ) { + $attribute_value = $term->slug; + } else { + $attribute_value = sanitize_title( $attribute_value ); + } + } + + $attributes[ $attribute_key ] = $attribute_value; + } + + $variation->set_attributes( $attributes ); + } + + // Menu order. + if ( $request['menu_order'] ) { + $variation->set_menu_order( $request['menu_order'] ); + } + + // Meta data. + if ( is_array( $request['meta_data'] ) ) { + foreach ( $request['meta_data'] as $meta ) { + $variation->update_meta_data( $meta['key'], $meta['value'], isset( $meta['id'] ) ? $meta['id'] : '' ); + } + } + + /** + * Filters an object before it is inserted via the REST API. + * + * The dynamic portion of the hook name, `$this->post_type`, + * refers to the object type slug. + * + * @param WC_Data $variation Object object. + * @param WP_REST_Request $request Request object. + * @param bool $creating If is creating a new object. + */ + return apply_filters( "woocommerce_rest_pre_insert_{$this->post_type}_object", $variation, $request, $creating ); + } + + /** + * Clear caches here so in sync with any new variations. + * + * @param WC_Data $object Object data. + */ + public function clear_transients( $object ) { + wc_delete_product_transients( $object->get_parent_id() ); + wp_cache_delete( 'product-' . $object->get_parent_id(), 'products' ); + } + + /** + * Delete a variation. + * + * @param WP_REST_Request $request Full details about the request. + * + * @return bool|WP_Error|WP_REST_Response + */ + public function delete_item( $request ) { + $force = (bool) $request['force']; + $object = $this->get_object( (int) $request['id'] ); + $result = false; + + if ( ! $object || 0 === $object->get_id() ) { + return new WP_Error( + "woocommerce_rest_{$this->post_type}_invalid_id", __( 'Invalid ID.', 'woocommerce' ), array( + 'status' => 404, + ) + ); + } + + $supports_trash = EMPTY_TRASH_DAYS > 0 && is_callable( array( $object, 'get_status' ) ); + + /** + * Filter whether an object is trashable. + * + * Return false to disable trash support for the object. + * + * @param boolean $supports_trash Whether the object type support trashing. + * @param WC_Data $object The object being considered for trashing support. + */ + $supports_trash = apply_filters( "woocommerce_rest_{$this->post_type}_object_trashable", $supports_trash, $object ); + + if ( ! wc_rest_check_post_permissions( $this->post_type, 'delete', $object->get_id() ) ) { + return new WP_Error( + /* translators: %s: post type */ + "woocommerce_rest_user_cannot_delete_{$this->post_type}", sprintf( __( 'Sorry, you are not allowed to delete %s.', 'woocommerce' ), $this->post_type ), array( + 'status' => rest_authorization_required_code(), + ) + ); + } + + $request->set_param( 'context', 'edit' ); + $response = $this->prepare_object_for_response( $object, $request ); + + // If we're forcing, then delete permanently. + if ( $force ) { + $object->delete( true ); + $result = 0 === $object->get_id(); + } else { + // If we don't support trashing for this type, error out. + if ( ! $supports_trash ) { + return new WP_Error( + /* translators: %s: post type */ + 'woocommerce_rest_trash_not_supported', sprintf( __( 'The %s does not support trashing.', 'woocommerce' ), $this->post_type ), array( + 'status' => 501, + ) + ); + } + + // Otherwise, only trash if we haven't already. + if ( is_callable( array( $object, 'get_status' ) ) ) { + if ( 'trash' === $object->get_status() ) { + return new WP_Error( + /* translators: %s: post type */ + 'woocommerce_rest_already_trashed', sprintf( __( 'The %s has already been deleted.', 'woocommerce' ), $this->post_type ), array( + 'status' => 410, + ) + ); + } + + $object->delete(); + $result = 'trash' === $object->get_status(); + } + } + + if ( ! $result ) { + return new WP_Error( + /* translators: %s: post type */ + 'woocommerce_rest_cannot_delete', sprintf( __( 'The %s cannot be deleted.', 'woocommerce' ), $this->post_type ), array( + 'status' => 500, + ) + ); + } + + // Delete parent product transients. + if ( 0 !== $object->get_parent_id() ) { + wc_delete_product_transients( $object->get_parent_id() ); + } + + /** + * Fires after a single object is deleted or trashed via the REST API. + * + * @param WC_Data $object The deleted or trashed object. + * @param WP_REST_Response $response The response data. + * @param WP_REST_Request $request The request sent to the API. + */ + do_action( "woocommerce_rest_delete_{$this->post_type}_object", $object, $response, $request ); + + return $response; + } + + /** + * Bulk create, update and delete items. + * + * @since 3.0.0 + * @param WP_REST_Request $request Full details about the request. + * @return array Of WP_Error or WP_REST_Response. + */ + public function batch_items( $request ) { + $items = array_filter( $request->get_params() ); + $params = $request->get_url_params(); + $product_id = $params['product_id']; + $body_params = array(); + + foreach ( array( 'update', 'create', 'delete' ) as $batch_type ) { + if ( ! empty( $items[ $batch_type ] ) ) { + $injected_items = array(); + foreach ( $items[ $batch_type ] as $item ) { + $injected_items[] = is_array( $item ) ? array_merge( + array( + 'product_id' => $product_id, + ), $item + ) : $item; + } + $body_params[ $batch_type ] = $injected_items; + } + } + + $request = new WP_REST_Request( $request->get_method() ); + $request->set_body_params( $body_params ); + + return parent::batch_items( $request ); + } + + /** + * Prepare links for the request. + * + * @param WC_Data $object Object data. + * @param WP_REST_Request $request Request object. + * @return array Links for the given post. + */ + protected function prepare_links( $object, $request ) { + $product_id = (int) $request['product_id']; + $base = str_replace( '(?P[\d]+)', $product_id, $this->rest_base ); + $links = array( + 'self' => array( + 'href' => rest_url( sprintf( '/%s/%s/%d', $this->namespace, $base, $object->get_id() ) ), + ), + 'collection' => array( + 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $base ) ), + ), + 'up' => array( + 'href' => rest_url( sprintf( '/%s/products/%d', $this->namespace, $product_id ) ), + ), + ); + return $links; + } + + /** + * Get the Variation's schema, conforming to JSON Schema. + * + * @return array + */ + public function get_item_schema() { + $weight_unit = get_option( 'woocommerce_weight_unit' ); + $dimension_unit = get_option( 'woocommerce_dimension_unit' ); + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => $this->post_type, + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_created' => array( + 'description' => __( "The date the variation was created, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_modified' => array( + 'description' => __( "The date the variation was last modified, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'description' => array( + 'description' => __( 'Variation description.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'permalink' => array( + 'description' => __( 'Variation URL.', 'woocommerce' ), + 'type' => 'string', + 'format' => 'uri', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'sku' => array( + 'description' => __( 'Unique identifier.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'price' => array( + 'description' => __( 'Current variation price.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'regular_price' => array( + 'description' => __( 'Variation regular price.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'sale_price' => array( + 'description' => __( 'Variation sale price.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'date_on_sale_from' => array( + 'description' => __( "Start date of sale price, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + ), + 'date_on_sale_from_gmt' => array( + 'description' => __( 'Start date of sale price, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + ), + 'date_on_sale_to' => array( + 'description' => __( "End date of sale price, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + ), + 'date_on_sale_to_gmt' => array( + 'description' => __( 'End date of sale price, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + ), + 'on_sale' => array( + 'description' => __( 'Shows if the variation is on sale.', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'visible' => array( + 'description' => __( "Define if the variation is visible on the product's page.", 'woocommerce' ), + 'type' => 'boolean', + 'default' => true, + 'context' => array( 'view', 'edit' ), + ), + 'purchasable' => array( + 'description' => __( 'Shows if the variation can be bought.', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'virtual' => array( + 'description' => __( 'If the variation is virtual.', 'woocommerce' ), + 'type' => 'boolean', + 'default' => false, + 'context' => array( 'view', 'edit' ), + ), + 'downloadable' => array( + 'description' => __( 'If the variation is downloadable.', 'woocommerce' ), + 'type' => 'boolean', + 'default' => false, + 'context' => array( 'view', 'edit' ), + ), + 'downloads' => array( + 'description' => __( 'List of downloadable files.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'File MD5 hash.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'name' => array( + 'description' => __( 'File name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'file' => array( + 'description' => __( 'File URL.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + ), + 'download_limit' => array( + 'description' => __( 'Number of times downloadable files can be downloaded after purchase.', 'woocommerce' ), + 'type' => 'integer', + 'default' => -1, + 'context' => array( 'view', 'edit' ), + ), + 'download_expiry' => array( + 'description' => __( 'Number of days until access to downloadable files expires.', 'woocommerce' ), + 'type' => 'integer', + 'default' => -1, + 'context' => array( 'view', 'edit' ), + ), + 'tax_status' => array( + 'description' => __( 'Tax status.', 'woocommerce' ), + 'type' => 'string', + 'default' => 'taxable', + 'enum' => array( 'taxable', 'shipping', 'none' ), + 'context' => array( 'view', 'edit' ), + ), + 'tax_class' => array( + 'description' => __( 'Tax class.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'manage_stock' => array( + 'description' => __( 'Stock management at variation level.', 'woocommerce' ), + 'type' => 'mixed', + 'default' => false, + 'context' => array( 'view', 'edit' ), + ), + 'stock_quantity' => array( + 'description' => __( 'Stock quantity.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'in_stock' => array( + 'description' => __( 'Controls whether or not the variation is listed as "in stock" or "out of stock" on the frontend.', 'woocommerce' ), + 'type' => 'boolean', + 'default' => true, + 'context' => array( 'view', 'edit' ), + ), + 'backorders' => array( + 'description' => __( 'If managing stock, this controls if backorders are allowed.', 'woocommerce' ), + 'type' => 'string', + 'default' => 'no', + 'enum' => array( 'no', 'notify', 'yes' ), + 'context' => array( 'view', 'edit' ), + ), + 'backorders_allowed' => array( + 'description' => __( 'Shows if backorders are allowed.', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'backordered' => array( + 'description' => __( 'Shows if the variation is on backordered.', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'weight' => array( + /* translators: %s: weight unit */ + 'description' => sprintf( __( 'Variation weight (%s).', 'woocommerce' ), $weight_unit ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'dimensions' => array( + 'description' => __( 'Variation dimensions.', 'woocommerce' ), + 'type' => 'object', + 'context' => array( 'view', 'edit' ), + 'properties' => array( + 'length' => array( + /* translators: %s: dimension unit */ + 'description' => sprintf( __( 'Variation length (%s).', 'woocommerce' ), $dimension_unit ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'width' => array( + /* translators: %s: dimension unit */ + 'description' => sprintf( __( 'Variation width (%s).', 'woocommerce' ), $dimension_unit ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'height' => array( + /* translators: %s: dimension unit */ + 'description' => sprintf( __( 'Variation height (%s).', 'woocommerce' ), $dimension_unit ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + 'shipping_class' => array( + 'description' => __( 'Shipping class slug.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'shipping_class_id' => array( + 'description' => __( 'Shipping class ID.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'image' => array( + 'description' => __( 'Variation image data.', 'woocommerce' ), + 'type' => 'object', + 'context' => array( 'view', 'edit' ), + 'properties' => array( + 'id' => array( + 'description' => __( 'Image ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'date_created' => array( + 'description' => __( "The date the image was created, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_created_gmt' => array( + 'description' => __( 'The date the image was created, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_modified' => array( + 'description' => __( "The date the image was last modified, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_modified_gmt' => array( + 'description' => __( 'The date the image was last modified, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'src' => array( + 'description' => __( 'Image URL.', 'woocommerce' ), + 'type' => 'string', + 'format' => 'uri', + 'context' => array( 'view', 'edit' ), + ), + 'name' => array( + 'description' => __( 'Image name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'alt' => array( + 'description' => __( 'Image alternative text.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'position' => array( + 'description' => __( 'Image position. 0 means that the image is featured.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + 'attributes' => array( + 'description' => __( 'List of attributes.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Attribute ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'name' => array( + 'description' => __( 'Attribute name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'option' => array( + 'description' => __( 'Selected attribute term name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + ), + 'menu_order' => array( + 'description' => __( 'Menu order, used to custom sort products.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'meta_data' => array( + 'description' => __( 'Meta data.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Meta ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'key' => array( + 'description' => __( 'Meta key.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'value' => array( + 'description' => __( 'Meta value.', 'woocommerce' ), + 'type' => 'mixed', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + ), + ), + ); + + return $this->add_additional_fields_schema( $schema ); + } +} diff --git a/includes/api/v2/class-wc-rest-products-v2-controller.php b/includes/api/v2/class-wc-rest-products-v2-controller.php new file mode 100644 index 00000000000..522b18c7f3a --- /dev/null +++ b/includes/api/v2/class-wc-rest-products-v2-controller.php @@ -0,0 +1,2145 @@ +post_type}_object", array( $this, 'clear_transients' ) ); + } + + /** + * Register the routes for products. + */ + public function register_routes() { + register_rest_route( + $this->namespace, '/' . $this->rest_base, array( + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_items' ), + 'permission_callback' => array( $this, 'get_items_permissions_check' ), + 'args' => $this->get_collection_params(), + ), + array( + 'methods' => WP_REST_Server::CREATABLE, + 'callback' => array( $this, 'create_item' ), + 'permission_callback' => array( $this, 'create_item_permissions_check' ), + 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + + register_rest_route( + $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)', array( + 'args' => array( + 'id' => array( + 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), + 'type' => 'integer', + ), + ), + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_item' ), + 'permission_callback' => array( $this, 'get_item_permissions_check' ), + 'args' => array( + 'context' => $this->get_context_param( + array( + 'default' => 'view', + ) + ), + ), + ), + array( + 'methods' => WP_REST_Server::EDITABLE, + 'callback' => array( $this, 'update_item' ), + 'permission_callback' => array( $this, 'update_item_permissions_check' ), + 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), + ), + array( + 'methods' => WP_REST_Server::DELETABLE, + 'callback' => array( $this, 'delete_item' ), + 'permission_callback' => array( $this, 'delete_item_permissions_check' ), + 'args' => array( + 'force' => array( + 'default' => false, + 'description' => __( 'Whether to bypass trash and force deletion.', 'woocommerce' ), + 'type' => 'boolean', + ), + ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + + register_rest_route( + $this->namespace, '/' . $this->rest_base . '/batch', array( + array( + 'methods' => WP_REST_Server::EDITABLE, + 'callback' => array( $this, 'batch_items' ), + 'permission_callback' => array( $this, 'batch_items_permissions_check' ), + 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), + ), + 'schema' => array( $this, 'get_public_batch_schema' ), + ) + ); + } + + /** + * Get object. + * + * @since 3.0.0 + * @param int $id Object ID. + * @return WC_Data + */ + protected function get_object( $id ) { + return wc_get_product( $id ); + } + + /** + * Prepare a single product output for response. + * + * @since 3.0.0 + * @param WC_Data $object Object data. + * @param WP_REST_Request $request Request object. + * @return WP_REST_Response + */ + public function prepare_object_for_response( $object, $request ) { + $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; + $data = $this->get_product_data( $object, $context ); + + // Add variations to variable products. + if ( $object->is_type( 'variable' ) && $object->has_child() ) { + $data['variations'] = $object->get_children(); + } + + // Add grouped products data. + if ( $object->is_type( 'grouped' ) && $object->has_child() ) { + $data['grouped_products'] = $object->get_children(); + } + + $data = $this->add_additional_fields_to_object( $data, $request ); + $data = $this->filter_response_by_context( $data, $context ); + $response = rest_ensure_response( $data ); + $response->add_links( $this->prepare_links( $object, $request ) ); + + /** + * Filter the data for a response. + * + * The dynamic portion of the hook name, $this->post_type, + * refers to object type being prepared for the response. + * + * @param WP_REST_Response $response The response object. + * @param WC_Data $object Object data. + * @param WP_REST_Request $request Request object. + */ + return apply_filters( "woocommerce_rest_prepare_{$this->post_type}_object", $response, $object, $request ); + } + + /** + * Prepare objects query. + * + * @since 3.0.0 + * @param WP_REST_Request $request Full details about the request. + * @return array + */ + protected function prepare_objects_query( $request ) { + $args = parent::prepare_objects_query( $request ); + + // Set post_status. + $args['post_status'] = $request['status']; + + // Taxonomy query to filter products by type, category, + // tag, shipping class, and attribute. + $tax_query = array(); + + // Map between taxonomy name and arg's key. + $taxonomies = array( + 'product_cat' => 'category', + 'product_tag' => 'tag', + 'product_shipping_class' => 'shipping_class', + ); + + // Set tax_query for each passed arg. + foreach ( $taxonomies as $taxonomy => $key ) { + if ( ! empty( $request[ $key ] ) ) { + $tax_query[] = array( + 'taxonomy' => $taxonomy, + 'field' => 'term_id', + 'terms' => $request[ $key ], + ); + } + } + + // Filter product type by slug. + if ( ! empty( $request['type'] ) ) { + $tax_query[] = array( + 'taxonomy' => 'product_type', + 'field' => 'slug', + 'terms' => $request['type'], + ); + } + + // Filter by attribute and term. + if ( ! empty( $request['attribute'] ) && ! empty( $request['attribute_term'] ) ) { + if ( in_array( $request['attribute'], wc_get_attribute_taxonomy_names(), true ) ) { + $tax_query[] = array( + 'taxonomy' => $request['attribute'], + 'field' => 'term_id', + 'terms' => $request['attribute_term'], + ); + } + } + + if ( ! empty( $tax_query ) ) { + $args['tax_query'] = $tax_query; // WPCS: slow query ok. + } + + // Filter featured. + if ( is_bool( $request['featured'] ) ) { + $args['tax_query'][] = array( + 'taxonomy' => 'product_visibility', + 'field' => 'name', + 'terms' => 'featured', + 'operator' => true === $request['featured'] ? 'IN' : 'NOT IN', + ); + } + + // Filter by sku. + if ( ! empty( $request['sku'] ) ) { + $skus = explode( ',', $request['sku'] ); + // Include the current string as a SKU too. + if ( 1 < count( $skus ) ) { + $skus[] = $request['sku']; + } + + $args['meta_query'] = $this->add_meta_query( // WPCS: slow query ok. + $args, array( + 'key' => '_sku', + 'value' => $skus, + 'compare' => 'IN', + ) + ); + } + + // Filter by tax class. + if ( ! empty( $request['tax_class'] ) ) { + $args['meta_query'] = $this->add_meta_query( // WPCS: slow query ok. + $args, array( + 'key' => '_tax_class', + 'value' => 'standard' !== $request['tax_class'] ? $request['tax_class'] : '', + ) + ); + } + + // Price filter. + if ( ! empty( $request['min_price'] ) || ! empty( $request['max_price'] ) ) { + $args['meta_query'] = $this->add_meta_query( $args, wc_get_min_max_price_meta_query( $request ) ); // WPCS: slow query ok. + } + + // Filter product in stock or out of stock. + if ( is_bool( $request['in_stock'] ) ) { + $args['meta_query'] = $this->add_meta_query( // WPCS: slow query ok. + $args, array( + 'key' => '_stock_status', + 'value' => true === $request['in_stock'] ? 'instock' : 'outofstock', + ) + ); + } + + // Filter by on sale products. + if ( is_bool( $request['on_sale'] ) ) { + $on_sale_key = $request['on_sale'] ? 'post__in' : 'post__not_in'; + $on_sale_ids = wc_get_product_ids_on_sale(); + + // Use 0 when there's no on sale products to avoid return all products. + $on_sale_ids = empty( $on_sale_ids ) ? array( 0 ) : $on_sale_ids; + + $args[ $on_sale_key ] += $on_sale_ids; + } + + // Force the post_type argument, since it's not a user input variable. + if ( ! empty( $request['sku'] ) ) { + $args['post_type'] = array( 'product', 'product_variation' ); + } else { + $args['post_type'] = $this->post_type; + } + + return $args; + } + + /** + * Get the downloads for a product or product variation. + * + * @param WC_Product|WC_Product_Variation $product Product instance. + * @return array + */ + protected function get_downloads( $product ) { + $downloads = array(); + + if ( $product->is_downloadable() ) { + foreach ( $product->get_downloads() as $file_id => $file ) { + $downloads[] = array( + 'id' => $file_id, // MD5 hash. + 'name' => $file['name'], + 'file' => $file['file'], + ); + } + } + + return $downloads; + } + + /** + * Get taxonomy terms. + * + * @param WC_Product $product Product instance. + * @param string $taxonomy Taxonomy slug. + * @return array + */ + protected function get_taxonomy_terms( $product, $taxonomy = 'cat' ) { + $terms = array(); + + foreach ( wc_get_object_terms( $product->get_id(), 'product_' . $taxonomy ) as $term ) { + $terms[] = array( + 'id' => $term->term_id, + 'name' => $term->name, + 'slug' => $term->slug, + ); + } + + return $terms; + } + + /** + * Get the images for a product or product variation. + * + * @param WC_Product|WC_Product_Variation $product Product instance. + * @return array + */ + protected function get_images( $product ) { + $images = array(); + $attachment_ids = array(); + + // Add featured image. + if ( has_post_thumbnail( $product->get_id() ) ) { + $attachment_ids[] = $product->get_image_id(); + } + + // Add gallery images. + $attachment_ids = array_merge( $attachment_ids, $product->get_gallery_image_ids() ); + + // Build image data. + foreach ( $attachment_ids as $position => $attachment_id ) { + $attachment_post = get_post( $attachment_id ); + if ( is_null( $attachment_post ) ) { + continue; + } + + $attachment = wp_get_attachment_image_src( $attachment_id, 'full' ); + if ( ! is_array( $attachment ) ) { + continue; + } + + $images[] = array( + 'id' => (int) $attachment_id, + 'date_created' => wc_rest_prepare_date_response( $attachment_post->post_date, false ), + 'date_created_gmt' => wc_rest_prepare_date_response( strtotime( $attachment_post->post_date_gmt ) ), + 'date_modified' => wc_rest_prepare_date_response( $attachment_post->post_modified, false ), + 'date_modified_gmt' => wc_rest_prepare_date_response( strtotime( $attachment_post->post_modified_gmt ) ), + 'src' => current( $attachment ), + 'name' => get_the_title( $attachment_id ), + 'alt' => get_post_meta( $attachment_id, '_wp_attachment_image_alt', true ), + 'position' => (int) $position, + ); + } + + // Set a placeholder image if the product has no images set. + if ( empty( $images ) ) { + $images[] = array( + 'id' => 0, + 'date_created' => wc_rest_prepare_date_response( current_time( 'mysql' ), false ), // Default to now. + 'date_created_gmt' => wc_rest_prepare_date_response( current_time( 'timestamp', true ) ), // Default to now. + 'date_modified' => wc_rest_prepare_date_response( current_time( 'mysql' ), false ), + 'date_modified_gmt' => wc_rest_prepare_date_response( current_time( 'timestamp', true ) ), + 'src' => wc_placeholder_img_src(), + 'name' => __( 'Placeholder', 'woocommerce' ), + 'alt' => __( 'Placeholder', 'woocommerce' ), + 'position' => 0, + ); + } + + return $images; + } + + /** + * Get attribute taxonomy label. + * + * @deprecated 3.0.0 + * + * @param string $name Taxonomy name. + * @return string + */ + protected function get_attribute_taxonomy_label( $name ) { + $tax = get_taxonomy( $name ); + $labels = get_taxonomy_labels( $tax ); + + return $labels->singular_name; + } + + /** + * Get product attribute taxonomy name. + * + * @since 3.0.0 + * @param string $slug Taxonomy name. + * @param WC_Product $product Product data. + * @return string + */ + protected function get_attribute_taxonomy_name( $slug, $product ) { + $attributes = $product->get_attributes(); + + if ( ! isset( $attributes[ $slug ] ) ) { + return str_replace( 'pa_', '', $slug ); + } + + $attribute = $attributes[ $slug ]; + + // Taxonomy attribute name. + if ( $attribute->is_taxonomy() ) { + $taxonomy = $attribute->get_taxonomy_object(); + return $taxonomy->attribute_label; + } + + // Custom product attribute name. + return $attribute->get_name(); + } + + /** + * Get default attributes. + * + * @param WC_Product $product Product instance. + * @return array + */ + protected function get_default_attributes( $product ) { + $default = array(); + + if ( $product->is_type( 'variable' ) ) { + foreach ( array_filter( (array) $product->get_default_attributes(), 'strlen' ) as $key => $value ) { + if ( 0 === strpos( $key, 'pa_' ) ) { + $default[] = array( + 'id' => wc_attribute_taxonomy_id_by_name( $key ), + 'name' => $this->get_attribute_taxonomy_name( $key, $product ), + 'option' => $value, + ); + } else { + $default[] = array( + 'id' => 0, + 'name' => $this->get_attribute_taxonomy_name( $key, $product ), + 'option' => $value, + ); + } + } + } + + return $default; + } + + /** + * Get attribute options. + * + * @param int $product_id Product ID. + * @param array $attribute Attribute data. + * @return array + */ + protected function get_attribute_options( $product_id, $attribute ) { + if ( isset( $attribute['is_taxonomy'] ) && $attribute['is_taxonomy'] ) { + return wc_get_product_terms( + $product_id, $attribute['name'], array( + 'fields' => 'names', + ) + ); + } elseif ( isset( $attribute['value'] ) ) { + return array_map( 'trim', explode( '|', $attribute['value'] ) ); + } + + return array(); + } + + /** + * Get the attributes for a product or product variation. + * + * @param WC_Product|WC_Product_Variation $product Product instance. + * @return array + */ + protected function get_attributes( $product ) { + $attributes = array(); + + if ( $product->is_type( 'variation' ) ) { + $_product = wc_get_product( $product->get_parent_id() ); + foreach ( $product->get_variation_attributes() as $attribute_name => $attribute ) { + $name = str_replace( 'attribute_', '', $attribute_name ); + + if ( ! $attribute ) { + continue; + } + + // Taxonomy-based attributes are prefixed with `pa_`, otherwise simply `attribute_`. + if ( 0 === strpos( $attribute_name, 'attribute_pa_' ) ) { + $option_term = get_term_by( 'slug', $attribute, $name ); + $attributes[] = array( + 'id' => wc_attribute_taxonomy_id_by_name( $name ), + 'name' => $this->get_attribute_taxonomy_name( $name, $_product ), + 'option' => $option_term && ! is_wp_error( $option_term ) ? $option_term->name : $attribute, + ); + } else { + $attributes[] = array( + 'id' => 0, + 'name' => $this->get_attribute_taxonomy_name( $name, $_product ), + 'option' => $attribute, + ); + } + } + } else { + foreach ( $product->get_attributes() as $attribute ) { + $attributes[] = array( + 'id' => $attribute['is_taxonomy'] ? wc_attribute_taxonomy_id_by_name( $attribute['name'] ) : 0, + 'name' => $this->get_attribute_taxonomy_name( $attribute['name'], $product ), + 'position' => (int) $attribute['position'], + 'visible' => (bool) $attribute['is_visible'], + 'variation' => (bool) $attribute['is_variation'], + 'options' => $this->get_attribute_options( $product->get_id(), $attribute ), + ); + } + } + + return $attributes; + } + + /** + * Get product data. + * + * @param WC_Product $product Product instance. + * @param string $context Request context. + * Options: 'view' and 'edit'. + * @return array + */ + protected function get_product_data( $product, $context = 'view' ) { + $data = array( + 'id' => $product->get_id(), + 'name' => $product->get_name( $context ), + 'slug' => $product->get_slug( $context ), + 'permalink' => $product->get_permalink(), + 'date_created' => wc_rest_prepare_date_response( $product->get_date_created( $context ), false ), + 'date_created_gmt' => wc_rest_prepare_date_response( $product->get_date_created( $context ) ), + 'date_modified' => wc_rest_prepare_date_response( $product->get_date_modified( $context ), false ), + 'date_modified_gmt' => wc_rest_prepare_date_response( $product->get_date_modified( $context ) ), + 'type' => $product->get_type(), + 'status' => $product->get_status( $context ), + 'featured' => $product->is_featured(), + 'catalog_visibility' => $product->get_catalog_visibility( $context ), + 'description' => 'view' === $context ? wpautop( do_shortcode( $product->get_description() ) ) : $product->get_description( $context ), + 'short_description' => 'view' === $context ? apply_filters( 'woocommerce_short_description', $product->get_short_description() ) : $product->get_short_description( $context ), + 'sku' => $product->get_sku( $context ), + 'price' => $product->get_price( $context ), + 'regular_price' => $product->get_regular_price( $context ), + 'sale_price' => $product->get_sale_price( $context ) ? $product->get_sale_price( $context ) : '', + 'date_on_sale_from' => wc_rest_prepare_date_response( $product->get_date_on_sale_from( $context ), false ), + 'date_on_sale_from_gmt' => wc_rest_prepare_date_response( $product->get_date_on_sale_from( $context ) ), + 'date_on_sale_to' => wc_rest_prepare_date_response( $product->get_date_on_sale_to( $context ), false ), + 'date_on_sale_to_gmt' => wc_rest_prepare_date_response( $product->get_date_on_sale_to( $context ) ), + 'price_html' => $product->get_price_html(), + 'on_sale' => $product->is_on_sale( $context ), + 'purchasable' => $product->is_purchasable(), + 'total_sales' => $product->get_total_sales( $context ), + 'virtual' => $product->is_virtual(), + 'downloadable' => $product->is_downloadable(), + 'downloads' => $this->get_downloads( $product ), + 'download_limit' => $product->get_download_limit( $context ), + 'download_expiry' => $product->get_download_expiry( $context ), + 'external_url' => $product->is_type( 'external' ) ? $product->get_product_url( $context ) : '', + 'button_text' => $product->is_type( 'external' ) ? $product->get_button_text( $context ) : '', + 'tax_status' => $product->get_tax_status( $context ), + 'tax_class' => $product->get_tax_class( $context ), + 'manage_stock' => $product->managing_stock(), + 'stock_quantity' => $product->get_stock_quantity( $context ), + 'in_stock' => $product->is_in_stock(), + 'backorders' => $product->get_backorders( $context ), + 'backorders_allowed' => $product->backorders_allowed(), + 'backordered' => $product->is_on_backorder(), + 'sold_individually' => $product->is_sold_individually(), + 'weight' => $product->get_weight( $context ), + 'dimensions' => array( + 'length' => $product->get_length( $context ), + 'width' => $product->get_width( $context ), + 'height' => $product->get_height( $context ), + ), + 'shipping_required' => $product->needs_shipping(), + 'shipping_taxable' => $product->is_shipping_taxable(), + 'shipping_class' => $product->get_shipping_class(), + 'shipping_class_id' => $product->get_shipping_class_id( $context ), + 'reviews_allowed' => $product->get_reviews_allowed( $context ), + 'average_rating' => 'view' === $context ? wc_format_decimal( $product->get_average_rating(), 2 ) : $product->get_average_rating( $context ), + 'rating_count' => $product->get_rating_count(), + 'related_ids' => array_map( 'absint', array_values( wc_get_related_products( $product->get_id() ) ) ), + 'upsell_ids' => array_map( 'absint', $product->get_upsell_ids( $context ) ), + 'cross_sell_ids' => array_map( 'absint', $product->get_cross_sell_ids( $context ) ), + 'parent_id' => $product->get_parent_id( $context ), + 'purchase_note' => 'view' === $context ? wpautop( do_shortcode( wp_kses_post( $product->get_purchase_note() ) ) ) : $product->get_purchase_note( $context ), + 'categories' => $this->get_taxonomy_terms( $product ), + 'tags' => $this->get_taxonomy_terms( $product, 'tag' ), + 'images' => $this->get_images( $product ), + 'attributes' => $this->get_attributes( $product ), + 'default_attributes' => $this->get_default_attributes( $product ), + 'variations' => array(), + 'grouped_products' => array(), + 'menu_order' => $product->get_menu_order( $context ), + 'meta_data' => $product->get_meta_data(), + ); + + return $data; + } + + /** + * Prepare links for the request. + * + * @param WC_Data $object Object data. + * @param WP_REST_Request $request Request object. + * @return array Links for the given post. + */ + protected function prepare_links( $object, $request ) { + $links = array( + 'self' => array( + 'href' => rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $object->get_id() ) ), + ), + 'collection' => array( + 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ), + ), + ); + + if ( $object->get_parent_id() ) { + $links['up'] = array( + 'href' => rest_url( sprintf( '/%s/products/%d', $this->namespace, $object->get_parent_id() ) ), + ); + } + + return $links; + } + + /** + * Prepare a single product for create or update. + * + * @param WP_REST_Request $request Request object. + * @param bool $creating If is creating a new object. + * @return WP_Error|WC_Data + */ + protected function prepare_object_for_database( $request, $creating = false ) { + $id = isset( $request['id'] ) ? absint( $request['id'] ) : 0; + + // Type is the most important part here because we need to be using the correct class and methods. + if ( isset( $request['type'] ) ) { + $classname = WC_Product_Factory::get_classname_from_product_type( $request['type'] ); + + if ( ! class_exists( $classname ) ) { + $classname = 'WC_Product_Simple'; + } + + $product = new $classname( $id ); + } elseif ( isset( $request['id'] ) ) { + $product = wc_get_product( $id ); + } else { + $product = new WC_Product_Simple(); + } + + if ( 'variation' === $product->get_type() ) { + return new WP_Error( + "woocommerce_rest_invalid_{$this->post_type}_id", __( 'To manipulate product variations you should use the /products/<product_id>/variations/<id> endpoint.', 'woocommerce' ), array( + 'status' => 404, + ) + ); + } + + // Post title. + if ( isset( $request['name'] ) ) { + $product->set_name( wp_filter_post_kses( $request['name'] ) ); + } + + // Post content. + if ( isset( $request['description'] ) ) { + $product->set_description( wp_filter_post_kses( $request['description'] ) ); + } + + // Post excerpt. + if ( isset( $request['short_description'] ) ) { + $product->set_short_description( wp_filter_post_kses( $request['short_description'] ) ); + } + + // Post status. + if ( isset( $request['status'] ) ) { + $product->set_status( get_post_status_object( $request['status'] ) ? $request['status'] : 'draft' ); + } + + // Post slug. + if ( isset( $request['slug'] ) ) { + $product->set_slug( $request['slug'] ); + } + + // Menu order. + if ( isset( $request['menu_order'] ) ) { + $product->set_menu_order( $request['menu_order'] ); + } + + // Comment status. + if ( isset( $request['reviews_allowed'] ) ) { + $product->set_reviews_allowed( $request['reviews_allowed'] ); + } + + // Virtual. + if ( isset( $request['virtual'] ) ) { + $product->set_virtual( $request['virtual'] ); + } + + // Tax status. + if ( isset( $request['tax_status'] ) ) { + $product->set_tax_status( $request['tax_status'] ); + } + + // Tax Class. + if ( isset( $request['tax_class'] ) ) { + $product->set_tax_class( $request['tax_class'] ); + } + + // Catalog Visibility. + if ( isset( $request['catalog_visibility'] ) ) { + $product->set_catalog_visibility( $request['catalog_visibility'] ); + } + + // Purchase Note. + if ( isset( $request['purchase_note'] ) ) { + $product->set_purchase_note( wp_kses_post( wp_unslash( $request['purchase_note'] ) ) ); + } + + // Featured Product. + if ( isset( $request['featured'] ) ) { + $product->set_featured( $request['featured'] ); + } + + // Shipping data. + $product = $this->save_product_shipping_data( $product, $request ); + + // SKU. + if ( isset( $request['sku'] ) ) { + $product->set_sku( wc_clean( $request['sku'] ) ); + } + + // Attributes. + if ( isset( $request['attributes'] ) ) { + $attributes = array(); + + foreach ( $request['attributes'] as $attribute ) { + $attribute_id = 0; + $attribute_name = ''; + + // Check ID for global attributes or name for product attributes. + if ( ! empty( $attribute['id'] ) ) { + $attribute_id = absint( $attribute['id'] ); + $attribute_name = wc_attribute_taxonomy_name_by_id( $attribute_id ); + } elseif ( ! empty( $attribute['name'] ) ) { + $attribute_name = wc_clean( $attribute['name'] ); + } + + if ( ! $attribute_id && ! $attribute_name ) { + continue; + } + + if ( $attribute_id ) { + + if ( isset( $attribute['options'] ) ) { + $options = $attribute['options']; + + if ( ! is_array( $attribute['options'] ) ) { + // Text based attributes - Posted values are term names. + $options = explode( WC_DELIMITER, $options ); + } + + $values = array_map( 'wc_sanitize_term_text_based', $options ); + $values = array_filter( $values, 'strlen' ); + } else { + $values = array(); + } + + if ( ! empty( $values ) ) { + // Add attribute to array, but don't set values. + $attribute_object = new WC_Product_Attribute(); + $attribute_object->set_id( $attribute_id ); + $attribute_object->set_name( $attribute_name ); + $attribute_object->set_options( $values ); + $attribute_object->set_position( isset( $attribute['position'] ) ? (string) absint( $attribute['position'] ) : '0' ); + $attribute_object->set_visible( ( isset( $attribute['visible'] ) && $attribute['visible'] ) ? 1 : 0 ); + $attribute_object->set_variation( ( isset( $attribute['variation'] ) && $attribute['variation'] ) ? 1 : 0 ); + $attributes[] = $attribute_object; + } + } elseif ( isset( $attribute['options'] ) ) { + // Custom attribute - Add attribute to array and set the values. + if ( is_array( $attribute['options'] ) ) { + $values = $attribute['options']; + } else { + $values = explode( WC_DELIMITER, $attribute['options'] ); + } + $attribute_object = new WC_Product_Attribute(); + $attribute_object->set_name( $attribute_name ); + $attribute_object->set_options( $values ); + $attribute_object->set_position( isset( $attribute['position'] ) ? (string) absint( $attribute['position'] ) : '0' ); + $attribute_object->set_visible( ( isset( $attribute['visible'] ) && $attribute['visible'] ) ? 1 : 0 ); + $attribute_object->set_variation( ( isset( $attribute['variation'] ) && $attribute['variation'] ) ? 1 : 0 ); + $attributes[] = $attribute_object; + } + } + $product->set_attributes( $attributes ); + } + + // Sales and prices. + if ( in_array( $product->get_type(), array( 'variable', 'grouped' ), true ) ) { + $product->set_regular_price( '' ); + $product->set_sale_price( '' ); + $product->set_date_on_sale_to( '' ); + $product->set_date_on_sale_from( '' ); + $product->set_price( '' ); + } else { + // Regular Price. + if ( isset( $request['regular_price'] ) ) { + $product->set_regular_price( $request['regular_price'] ); + } + + // Sale Price. + if ( isset( $request['sale_price'] ) ) { + $product->set_sale_price( $request['sale_price'] ); + } + + if ( isset( $request['date_on_sale_from'] ) ) { + $product->set_date_on_sale_from( $request['date_on_sale_from'] ); + } + + if ( isset( $request['date_on_sale_from_gmt'] ) ) { + $product->set_date_on_sale_from( $request['date_on_sale_from_gmt'] ? strtotime( $request['date_on_sale_from_gmt'] ) : null ); + } + + if ( isset( $request['date_on_sale_to'] ) ) { + $product->set_date_on_sale_to( $request['date_on_sale_to'] ); + } + + if ( isset( $request['date_on_sale_to_gmt'] ) ) { + $product->set_date_on_sale_to( $request['date_on_sale_to_gmt'] ? strtotime( $request['date_on_sale_to_gmt'] ) : null ); + } + } + + // Product parent ID for groups. + if ( isset( $request['parent_id'] ) ) { + $product->set_parent_id( $request['parent_id'] ); + } + + // Sold individually. + if ( isset( $request['sold_individually'] ) ) { + $product->set_sold_individually( $request['sold_individually'] ); + } + + // Stock status. + if ( isset( $request['in_stock'] ) ) { + $stock_status = true === $request['in_stock'] ? 'instock' : 'outofstock'; + } else { + $stock_status = $product->get_stock_status(); + } + + // Stock data. + if ( 'yes' === get_option( 'woocommerce_manage_stock' ) ) { + // Manage stock. + if ( isset( $request['manage_stock'] ) ) { + $product->set_manage_stock( $request['manage_stock'] ); + } + + // Backorders. + if ( isset( $request['backorders'] ) ) { + $product->set_backorders( $request['backorders'] ); + } + + if ( $product->is_type( 'grouped' ) ) { + $product->set_manage_stock( 'no' ); + $product->set_backorders( 'no' ); + $product->set_stock_quantity( '' ); + $product->set_stock_status( $stock_status ); + } elseif ( $product->is_type( 'external' ) ) { + $product->set_manage_stock( 'no' ); + $product->set_backorders( 'no' ); + $product->set_stock_quantity( '' ); + $product->set_stock_status( 'instock' ); + } elseif ( $product->get_manage_stock() ) { + // Stock status is always determined by children so sync later. + if ( ! $product->is_type( 'variable' ) ) { + $product->set_stock_status( $stock_status ); + } + + // Stock quantity. + if ( isset( $request['stock_quantity'] ) ) { + $product->set_stock_quantity( wc_stock_amount( $request['stock_quantity'] ) ); + } elseif ( isset( $request['inventory_delta'] ) ) { + $stock_quantity = wc_stock_amount( $product->get_stock_quantity() ); + $stock_quantity += wc_stock_amount( $request['inventory_delta'] ); + $product->set_stock_quantity( wc_stock_amount( $stock_quantity ) ); + } + } else { + // Don't manage stock. + $product->set_manage_stock( 'no' ); + $product->set_stock_quantity( '' ); + $product->set_stock_status( $stock_status ); + } + } elseif ( ! $product->is_type( 'variable' ) ) { + $product->set_stock_status( $stock_status ); + } + + // Upsells. + if ( isset( $request['upsell_ids'] ) ) { + $upsells = array(); + $ids = $request['upsell_ids']; + + if ( ! empty( $ids ) ) { + foreach ( $ids as $id ) { + if ( $id && $id > 0 ) { + $upsells[] = $id; + } + } + } + + $product->set_upsell_ids( $upsells ); + } + + // Cross sells. + if ( isset( $request['cross_sell_ids'] ) ) { + $crosssells = array(); + $ids = $request['cross_sell_ids']; + + if ( ! empty( $ids ) ) { + foreach ( $ids as $id ) { + if ( $id && $id > 0 ) { + $crosssells[] = $id; + } + } + } + + $product->set_cross_sell_ids( $crosssells ); + } + + // Product categories. + if ( isset( $request['categories'] ) && is_array( $request['categories'] ) ) { + $product = $this->save_taxonomy_terms( $product, $request['categories'] ); + } + + // Product tags. + if ( isset( $request['tags'] ) && is_array( $request['tags'] ) ) { + $product = $this->save_taxonomy_terms( $product, $request['tags'], 'tag' ); + } + + // Downloadable. + if ( isset( $request['downloadable'] ) ) { + $product->set_downloadable( $request['downloadable'] ); + } + + // Downloadable options. + if ( $product->get_downloadable() ) { + + // Downloadable files. + if ( isset( $request['downloads'] ) && is_array( $request['downloads'] ) ) { + $product = $this->save_downloadable_files( $product, $request['downloads'] ); + } + + // Download limit. + if ( isset( $request['download_limit'] ) ) { + $product->set_download_limit( $request['download_limit'] ); + } + + // Download expiry. + if ( isset( $request['download_expiry'] ) ) { + $product->set_download_expiry( $request['download_expiry'] ); + } + } + + // Product url and button text for external products. + if ( $product->is_type( 'external' ) ) { + if ( isset( $request['external_url'] ) ) { + $product->set_product_url( $request['external_url'] ); + } + + if ( isset( $request['button_text'] ) ) { + $product->set_button_text( $request['button_text'] ); + } + } + + // Save default attributes for variable products. + if ( $product->is_type( 'variable' ) ) { + $product = $this->save_default_attributes( $product, $request ); + } + + // Set children for a grouped product. + if ( $product->is_type( 'grouped' ) && isset( $request['grouped_products'] ) ) { + $product->set_children( $request['grouped_products'] ); + } + + // Check for featured/gallery images, upload it and set it. + if ( isset( $request['images'] ) ) { + $product = $this->set_product_images( $product, $request['images'] ); + } + + // Allow set meta_data. + if ( is_array( $request['meta_data'] ) ) { + foreach ( $request['meta_data'] as $meta ) { + $product->update_meta_data( $meta['key'], $meta['value'], isset( $meta['id'] ) ? $meta['id'] : '' ); + } + } + + /** + * Filters an object before it is inserted via the REST API. + * + * The dynamic portion of the hook name, `$this->post_type`, + * refers to the object type slug. + * + * @param WC_Data $product Object object. + * @param WP_REST_Request $request Request object. + * @param bool $creating If is creating a new object. + */ + return apply_filters( "woocommerce_rest_pre_insert_{$this->post_type}_object", $product, $request, $creating ); + } + + /** + * Set product images. + * + * @throws WC_REST_Exception REST API exceptions. + * @param WC_Product $product Product instance. + * @param array $images Images data. + * @return WC_Product + */ + protected function set_product_images( $product, $images ) { + $images = is_array( $images ) ? array_filter( $images ) : array(); + + if ( ! empty( $images ) ) { + $gallery = array(); + + foreach ( $images as $image ) { + $attachment_id = isset( $image['id'] ) ? absint( $image['id'] ) : 0; + + if ( 0 === $attachment_id && isset( $image['src'] ) ) { + $upload = wc_rest_upload_image_from_url( esc_url_raw( $image['src'] ) ); + + if ( is_wp_error( $upload ) ) { + if ( ! apply_filters( 'woocommerce_rest_suppress_image_upload_error', false, $upload, $product->get_id(), $images ) ) { + throw new WC_REST_Exception( 'woocommerce_product_image_upload_error', $upload->get_error_message(), 400 ); + } else { + continue; + } + } + + $attachment_id = wc_rest_set_uploaded_image_as_attachment( $upload, $product->get_id() ); + } + + if ( ! wp_attachment_is_image( $attachment_id ) ) { + /* translators: %s: attachment id */ + throw new WC_REST_Exception( 'woocommerce_product_invalid_image_id', sprintf( __( '#%s is an invalid image ID.', 'woocommerce' ), $attachment_id ), 400 ); + } + + if ( isset( $image['position'] ) && 0 === absint( $image['position'] ) ) { + $product->set_image_id( $attachment_id ); + } else { + $gallery[] = $attachment_id; + } + + // Set the image alt if present. + if ( ! empty( $image['alt'] ) ) { + update_post_meta( $attachment_id, '_wp_attachment_image_alt', wc_clean( $image['alt'] ) ); + } + + // Set the image name if present. + if ( ! empty( $image['name'] ) ) { + wp_update_post( + array( + 'ID' => $attachment_id, + 'post_title' => $image['name'], + ) + ); + } + + // Set the image source if present, for future reference. + if ( ! empty( $image['src'] ) ) { + update_post_meta( $attachment_id, '_wc_attachment_source', esc_url_raw( $image['src'] ) ); + } + } + + $product->set_gallery_image_ids( $gallery ); + } else { + $product->set_image_id( '' ); + $product->set_gallery_image_ids( array() ); + } + + return $product; + } + + /** + * Save product shipping data. + * + * @param WC_Product $product Product instance. + * @param array $data Shipping data. + * @return WC_Product + */ + protected function save_product_shipping_data( $product, $data ) { + // Virtual. + if ( isset( $data['virtual'] ) && true === $data['virtual'] ) { + $product->set_weight( '' ); + $product->set_height( '' ); + $product->set_length( '' ); + $product->set_width( '' ); + } else { + if ( isset( $data['weight'] ) ) { + $product->set_weight( $data['weight'] ); + } + + // Height. + if ( isset( $data['dimensions']['height'] ) ) { + $product->set_height( $data['dimensions']['height'] ); + } + + // Width. + if ( isset( $data['dimensions']['width'] ) ) { + $product->set_width( $data['dimensions']['width'] ); + } + + // Length. + if ( isset( $data['dimensions']['length'] ) ) { + $product->set_length( $data['dimensions']['length'] ); + } + } + + // Shipping class. + if ( isset( $data['shipping_class'] ) ) { + $data_store = $product->get_data_store(); + $shipping_class_id = $data_store->get_shipping_class_id_by_slug( wc_clean( $data['shipping_class'] ) ); + $product->set_shipping_class_id( $shipping_class_id ); + } + + return $product; + } + + /** + * Save downloadable files. + * + * @param WC_Product $product Product instance. + * @param array $downloads Downloads data. + * @param int $deprecated Deprecated since 3.0. + * @return WC_Product + */ + protected function save_downloadable_files( $product, $downloads, $deprecated = 0 ) { + if ( $deprecated ) { + wc_deprecated_argument( 'variation_id', '3.0', 'save_downloadable_files() not requires a variation_id anymore.' ); + } + + $files = array(); + foreach ( $downloads as $key => $file ) { + if ( empty( $file['file'] ) ) { + continue; + } + + $download = new WC_Product_Download(); + $download->set_id( $file['id'] ? $file['id'] : wp_generate_uuid4() ); + $download->set_name( $file['name'] ? $file['name'] : wc_get_filename_from_url( $file['file'] ) ); + $download->set_file( apply_filters( 'woocommerce_file_download_path', $file['file'], $product, $key ) ); + $files[] = $download; + } + $product->set_downloads( $files ); + + return $product; + } + + /** + * Save taxonomy terms. + * + * @param WC_Product $product Product instance. + * @param array $terms Terms data. + * @param string $taxonomy Taxonomy name. + * @return WC_Product + */ + protected function save_taxonomy_terms( $product, $terms, $taxonomy = 'cat' ) { + $term_ids = wp_list_pluck( $terms, 'id' ); + + if ( 'cat' === $taxonomy ) { + $product->set_category_ids( $term_ids ); + } elseif ( 'tag' === $taxonomy ) { + $product->set_tag_ids( $term_ids ); + } + + return $product; + } + + /** + * Save default attributes. + * + * @since 3.0.0 + * + * @param WC_Product $product Product instance. + * @param WP_REST_Request $request Request data. + * @return WC_Product + */ + protected function save_default_attributes( $product, $request ) { + if ( isset( $request['default_attributes'] ) && is_array( $request['default_attributes'] ) ) { + + $attributes = $product->get_attributes(); + $default_attributes = array(); + + foreach ( $request['default_attributes'] as $attribute ) { + $attribute_id = 0; + $attribute_name = ''; + + // Check ID for global attributes or name for product attributes. + if ( ! empty( $attribute['id'] ) ) { + $attribute_id = absint( $attribute['id'] ); + $attribute_name = wc_attribute_taxonomy_name_by_id( $attribute_id ); + } elseif ( ! empty( $attribute['name'] ) ) { + $attribute_name = sanitize_title( $attribute['name'] ); + } + + if ( ! $attribute_id && ! $attribute_name ) { + continue; + } + + if ( isset( $attributes[ $attribute_name ] ) ) { + $_attribute = $attributes[ $attribute_name ]; + + if ( $_attribute['is_variation'] ) { + $value = isset( $attribute['option'] ) ? wc_clean( stripslashes( $attribute['option'] ) ) : ''; + + if ( ! empty( $_attribute['is_taxonomy'] ) ) { + // If dealing with a taxonomy, we need to get the slug from the name posted to the API. + $term = get_term_by( 'name', $value, $attribute_name ); + + if ( $term && ! is_wp_error( $term ) ) { + $value = $term->slug; + } else { + $value = sanitize_title( $value ); + } + } + + if ( $value ) { + $default_attributes[ $attribute_name ] = $value; + } + } + } + } + + $product->set_default_attributes( $default_attributes ); + } + + return $product; + } + + /** + * Clear caches here so in sync with any new variations/children. + * + * @param WC_Data $object Object data. + */ + public function clear_transients( $object ) { + wc_delete_product_transients( $object->get_id() ); + wp_cache_delete( 'product-' . $object->get_id(), 'products' ); + } + + /** + * Delete a single item. + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_REST_Response|WP_Error + */ + public function delete_item( $request ) { + $id = (int) $request['id']; + $force = (bool) $request['force']; + $object = $this->get_object( (int) $request['id'] ); + $result = false; + + if ( ! $object || 0 === $object->get_id() ) { + return new WP_Error( + "woocommerce_rest_{$this->post_type}_invalid_id", __( 'Invalid ID.', 'woocommerce' ), array( + 'status' => 404, + ) + ); + } + + if ( 'variation' === $object->get_type() ) { + return new WP_Error( + "woocommerce_rest_invalid_{$this->post_type}_id", __( 'To manipulate product variations you should use the /products/<product_id>/variations/<id> endpoint.', 'woocommerce' ), array( + 'status' => 404, + ) + ); + } + + $supports_trash = EMPTY_TRASH_DAYS > 0 && is_callable( array( $object, 'get_status' ) ); + + /** + * Filter whether an object is trashable. + * + * Return false to disable trash support for the object. + * + * @param boolean $supports_trash Whether the object type support trashing. + * @param WC_Data $object The object being considered for trashing support. + */ + $supports_trash = apply_filters( "woocommerce_rest_{$this->post_type}_object_trashable", $supports_trash, $object ); + + if ( ! wc_rest_check_post_permissions( $this->post_type, 'delete', $object->get_id() ) ) { + return new WP_Error( + /* translators: %s: post type */ + "woocommerce_rest_user_cannot_delete_{$this->post_type}", sprintf( __( 'Sorry, you are not allowed to delete %s.', 'woocommerce' ), $this->post_type ), array( + 'status' => rest_authorization_required_code(), + ) + ); + } + + $request->set_param( 'context', 'edit' ); + $response = $this->prepare_object_for_response( $object, $request ); + + // If we're forcing, then delete permanently. + if ( $force ) { + if ( $object->is_type( 'variable' ) ) { + foreach ( $object->get_children() as $child_id ) { + $child = wc_get_product( $child_id ); + $child->delete( true ); + } + } elseif ( $object->is_type( 'grouped' ) ) { + foreach ( $object->get_children() as $child_id ) { + $child = wc_get_product( $child_id ); + $child->set_parent_id( 0 ); + $child->save(); + } + } + + $object->delete( true ); + $result = 0 === $object->get_id(); + } else { + // If we don't support trashing for this type, error out. + if ( ! $supports_trash ) { + return new WP_Error( + /* translators: %s: post type */ + 'woocommerce_rest_trash_not_supported', sprintf( __( 'The %s does not support trashing.', 'woocommerce' ), $this->post_type ), array( + 'status' => 501, + ) + ); + } + + // Otherwise, only trash if we haven't already. + if ( is_callable( array( $object, 'get_status' ) ) ) { + if ( 'trash' === $object->get_status() ) { + return new WP_Error( + /* translators: %s: post type */ + 'woocommerce_rest_already_trashed', sprintf( __( 'The %s has already been deleted.', 'woocommerce' ), $this->post_type ), array( + 'status' => 410, + ) + ); + } + + $object->delete(); + $result = 'trash' === $object->get_status(); + } + } + + if ( ! $result ) { + return new WP_Error( + /* translators: %s: post type */ + 'woocommerce_rest_cannot_delete', sprintf( __( 'The %s cannot be deleted.', 'woocommerce' ), $this->post_type ), array( + 'status' => 500, + ) + ); + } + + // Delete parent product transients. + if ( 0 !== $object->get_parent_id() ) { + wc_delete_product_transients( $object->get_parent_id() ); + } + + /** + * Fires after a single object is deleted or trashed via the REST API. + * + * @param WC_Data $object The deleted or trashed object. + * @param WP_REST_Response $response The response data. + * @param WP_REST_Request $request The request sent to the API. + */ + do_action( "woocommerce_rest_delete_{$this->post_type}_object", $object, $response, $request ); + + return $response; + } + + /** + * Get the Product's schema, conforming to JSON Schema. + * + * @return array + */ + public function get_item_schema() { + $weight_unit = get_option( 'woocommerce_weight_unit' ); + $dimension_unit = get_option( 'woocommerce_dimension_unit' ); + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => $this->post_type, + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'name' => array( + 'description' => __( 'Product name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'slug' => array( + 'description' => __( 'Product slug.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'permalink' => array( + 'description' => __( 'Product URL.', 'woocommerce' ), + 'type' => 'string', + 'format' => 'uri', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_created' => array( + 'description' => __( "The date the product was created, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_created_gmt' => array( + 'description' => __( 'The date the product was created, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_modified' => array( + 'description' => __( "The date the product was last modified, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_modified_gmt' => array( + 'description' => __( 'The date the product was last modified, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'type' => array( + 'description' => __( 'Product type.', 'woocommerce' ), + 'type' => 'string', + 'default' => 'simple', + 'enum' => array_keys( wc_get_product_types() ), + 'context' => array( 'view', 'edit' ), + ), + 'status' => array( + 'description' => __( 'Product status (post status).', 'woocommerce' ), + 'type' => 'string', + 'default' => 'publish', + 'enum' => array_keys( get_post_statuses() ), + 'context' => array( 'view', 'edit' ), + ), + 'featured' => array( + 'description' => __( 'Featured product.', 'woocommerce' ), + 'type' => 'boolean', + 'default' => false, + 'context' => array( 'view', 'edit' ), + ), + 'catalog_visibility' => array( + 'description' => __( 'Catalog visibility.', 'woocommerce' ), + 'type' => 'string', + 'default' => 'visible', + 'enum' => array( 'visible', 'catalog', 'search', 'hidden' ), + 'context' => array( 'view', 'edit' ), + ), + 'description' => array( + 'description' => __( 'Product description.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'short_description' => array( + 'description' => __( 'Product short description.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'sku' => array( + 'description' => __( 'Unique identifier.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'price' => array( + 'description' => __( 'Current product price.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'regular_price' => array( + 'description' => __( 'Product regular price.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'sale_price' => array( + 'description' => __( 'Product sale price.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'date_on_sale_from' => array( + 'description' => __( "Start date of sale price, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + ), + 'date_on_sale_from_gmt' => array( + 'description' => __( 'Start date of sale price, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + ), + 'date_on_sale_to' => array( + 'description' => __( "End date of sale price, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + ), + 'date_on_sale_to_gmt' => array( + 'description' => __( 'End date of sale price, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + ), + 'price_html' => array( + 'description' => __( 'Price formatted in HTML.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'on_sale' => array( + 'description' => __( 'Shows if the product is on sale.', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'purchasable' => array( + 'description' => __( 'Shows if the product can be bought.', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'total_sales' => array( + 'description' => __( 'Amount of sales.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'virtual' => array( + 'description' => __( 'If the product is virtual.', 'woocommerce' ), + 'type' => 'boolean', + 'default' => false, + 'context' => array( 'view', 'edit' ), + ), + 'downloadable' => array( + 'description' => __( 'If the product is downloadable.', 'woocommerce' ), + 'type' => 'boolean', + 'default' => false, + 'context' => array( 'view', 'edit' ), + ), + 'downloads' => array( + 'description' => __( 'List of downloadable files.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'File MD5 hash.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'name' => array( + 'description' => __( 'File name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'file' => array( + 'description' => __( 'File URL.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + ), + 'download_limit' => array( + 'description' => __( 'Number of times downloadable files can be downloaded after purchase.', 'woocommerce' ), + 'type' => 'integer', + 'default' => -1, + 'context' => array( 'view', 'edit' ), + ), + 'download_expiry' => array( + 'description' => __( 'Number of days until access to downloadable files expires.', 'woocommerce' ), + 'type' => 'integer', + 'default' => -1, + 'context' => array( 'view', 'edit' ), + ), + 'external_url' => array( + 'description' => __( 'Product external URL. Only for external products.', 'woocommerce' ), + 'type' => 'string', + 'format' => 'uri', + 'context' => array( 'view', 'edit' ), + ), + 'button_text' => array( + 'description' => __( 'Product external button text. Only for external products.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'tax_status' => array( + 'description' => __( 'Tax status.', 'woocommerce' ), + 'type' => 'string', + 'default' => 'taxable', + 'enum' => array( 'taxable', 'shipping', 'none' ), + 'context' => array( 'view', 'edit' ), + ), + 'tax_class' => array( + 'description' => __( 'Tax class.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'manage_stock' => array( + 'description' => __( 'Stock management at product level.', 'woocommerce' ), + 'type' => 'boolean', + 'default' => false, + 'context' => array( 'view', 'edit' ), + ), + 'stock_quantity' => array( + 'description' => __( 'Stock quantity.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'in_stock' => array( + 'description' => __( 'Controls whether or not the product is listed as "in stock" or "out of stock" on the frontend.', 'woocommerce' ), + 'type' => 'boolean', + 'default' => true, + 'context' => array( 'view', 'edit' ), + ), + 'backorders' => array( + 'description' => __( 'If managing stock, this controls if backorders are allowed.', 'woocommerce' ), + 'type' => 'string', + 'default' => 'no', + 'enum' => array( 'no', 'notify', 'yes' ), + 'context' => array( 'view', 'edit' ), + ), + 'backorders_allowed' => array( + 'description' => __( 'Shows if backorders are allowed.', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'backordered' => array( + 'description' => __( 'Shows if the product is on backordered.', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'sold_individually' => array( + 'description' => __( 'Allow one item to be bought in a single order.', 'woocommerce' ), + 'type' => 'boolean', + 'default' => false, + 'context' => array( 'view', 'edit' ), + ), + 'weight' => array( + /* translators: %s: weight unit */ + 'description' => sprintf( __( 'Product weight (%s).', 'woocommerce' ), $weight_unit ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'dimensions' => array( + 'description' => __( 'Product dimensions.', 'woocommerce' ), + 'type' => 'object', + 'context' => array( 'view', 'edit' ), + 'properties' => array( + 'length' => array( + /* translators: %s: dimension unit */ + 'description' => sprintf( __( 'Product length (%s).', 'woocommerce' ), $dimension_unit ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'width' => array( + /* translators: %s: dimension unit */ + 'description' => sprintf( __( 'Product width (%s).', 'woocommerce' ), $dimension_unit ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'height' => array( + /* translators: %s: dimension unit */ + 'description' => sprintf( __( 'Product height (%s).', 'woocommerce' ), $dimension_unit ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + 'shipping_required' => array( + 'description' => __( 'Shows if the product need to be shipped.', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'shipping_taxable' => array( + 'description' => __( 'Shows whether or not the product shipping is taxable.', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'shipping_class' => array( + 'description' => __( 'Shipping class slug.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'shipping_class_id' => array( + 'description' => __( 'Shipping class ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'reviews_allowed' => array( + 'description' => __( 'Allow reviews.', 'woocommerce' ), + 'type' => 'boolean', + 'default' => true, + 'context' => array( 'view', 'edit' ), + ), + 'average_rating' => array( + 'description' => __( 'Reviews average rating.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'rating_count' => array( + 'description' => __( 'Amount of reviews that the product have.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'related_ids' => array( + 'description' => __( 'List of related products IDs.', 'woocommerce' ), + 'type' => 'array', + 'items' => array( + 'type' => 'integer', + ), + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'upsell_ids' => array( + 'description' => __( 'List of up-sell products IDs.', 'woocommerce' ), + 'type' => 'array', + 'items' => array( + 'type' => 'integer', + ), + 'context' => array( 'view', 'edit' ), + ), + 'cross_sell_ids' => array( + 'description' => __( 'List of cross-sell products IDs.', 'woocommerce' ), + 'type' => 'array', + 'items' => array( + 'type' => 'integer', + ), + 'context' => array( 'view', 'edit' ), + ), + 'parent_id' => array( + 'description' => __( 'Product parent ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'purchase_note' => array( + 'description' => __( 'Optional note to send the customer after purchase.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'categories' => array( + 'description' => __( 'List of categories.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Category ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'name' => array( + 'description' => __( 'Category name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'slug' => array( + 'description' => __( 'Category slug.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + ), + ), + ), + 'tags' => array( + 'description' => __( 'List of tags.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Tag ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'name' => array( + 'description' => __( 'Tag name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'slug' => array( + 'description' => __( 'Tag slug.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + ), + ), + ), + 'images' => array( + 'description' => __( 'List of images.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Image ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'date_created' => array( + 'description' => __( "The date the image was created, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_created_gmt' => array( + 'description' => __( 'The date the image was created, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_modified' => array( + 'description' => __( "The date the image was last modified, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_modified_gmt' => array( + 'description' => __( 'The date the image was last modified, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'src' => array( + 'description' => __( 'Image URL.', 'woocommerce' ), + 'type' => 'string', + 'format' => 'uri', + 'context' => array( 'view', 'edit' ), + ), + 'name' => array( + 'description' => __( 'Image name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'alt' => array( + 'description' => __( 'Image alternative text.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'position' => array( + 'description' => __( 'Image position. 0 means that the image is featured.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + ), + 'attributes' => array( + 'description' => __( 'List of attributes.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Attribute ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'name' => array( + 'description' => __( 'Attribute name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'position' => array( + 'description' => __( 'Attribute position.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'visible' => array( + 'description' => __( "Define if the attribute is visible on the \"Additional information\" tab in the product's page.", 'woocommerce' ), + 'type' => 'boolean', + 'default' => false, + 'context' => array( 'view', 'edit' ), + ), + 'variation' => array( + 'description' => __( 'Define if the attribute can be used as variation.', 'woocommerce' ), + 'type' => 'boolean', + 'default' => false, + 'context' => array( 'view', 'edit' ), + ), + 'options' => array( + 'description' => __( 'List of available term names of the attribute.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'string', + ), + ), + ), + ), + ), + 'default_attributes' => array( + 'description' => __( 'Defaults variation attributes.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Attribute ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'name' => array( + 'description' => __( 'Attribute name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'option' => array( + 'description' => __( 'Selected attribute term name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + ), + 'variations' => array( + 'description' => __( 'List of variations IDs.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'integer', + ), + 'readonly' => true, + ), + 'grouped_products' => array( + 'description' => __( 'List of grouped products ID.', 'woocommerce' ), + 'type' => 'array', + 'items' => array( + 'type' => 'integer', + ), + 'context' => array( 'view', 'edit' ), + ), + 'menu_order' => array( + 'description' => __( 'Menu order, used to custom sort products.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'meta_data' => array( + 'description' => __( 'Meta data.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Meta ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'key' => array( + 'description' => __( 'Meta key.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'value' => array( + 'description' => __( 'Meta value.', 'woocommerce' ), + 'type' => 'mixed', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + ), + ), + ); + + return $this->add_additional_fields_schema( $schema ); + } + + /** + * Get the query params for collections of attachments. + * + * @return array + */ + public function get_collection_params() { + $params = parent::get_collection_params(); + + $params['slug'] = array( + 'description' => __( 'Limit result set to products with a specific slug.', 'woocommerce' ), + 'type' => 'string', + 'validate_callback' => 'rest_validate_request_arg', + ); + $params['status'] = array( + 'default' => 'any', + 'description' => __( 'Limit result set to products assigned a specific status.', 'woocommerce' ), + 'type' => 'string', + 'enum' => array_merge( array( 'any' ), array_keys( get_post_statuses() ) ), + 'sanitize_callback' => 'sanitize_key', + 'validate_callback' => 'rest_validate_request_arg', + ); + $params['type'] = array( + 'description' => __( 'Limit result set to products assigned a specific type.', 'woocommerce' ), + 'type' => 'string', + 'enum' => array_keys( wc_get_product_types() ), + 'sanitize_callback' => 'sanitize_key', + 'validate_callback' => 'rest_validate_request_arg', + ); + $params['sku'] = array( + 'description' => __( 'Limit result set to products with specific SKU(s). Use commas to separate.', 'woocommerce' ), + 'type' => 'string', + 'sanitize_callback' => 'sanitize_text_field', + 'validate_callback' => 'rest_validate_request_arg', + ); + $params['featured'] = array( + 'description' => __( 'Limit result set to featured products.', 'woocommerce' ), + 'type' => 'boolean', + 'sanitize_callback' => 'wc_string_to_bool', + 'validate_callback' => 'rest_validate_request_arg', + ); + $params['category'] = array( + 'description' => __( 'Limit result set to products assigned a specific category ID.', 'woocommerce' ), + 'type' => 'string', + 'sanitize_callback' => 'wp_parse_id_list', + 'validate_callback' => 'rest_validate_request_arg', + ); + $params['tag'] = array( + 'description' => __( 'Limit result set to products assigned a specific tag ID.', 'woocommerce' ), + 'type' => 'string', + 'sanitize_callback' => 'wp_parse_id_list', + 'validate_callback' => 'rest_validate_request_arg', + ); + $params['shipping_class'] = array( + 'description' => __( 'Limit result set to products assigned a specific shipping class ID.', 'woocommerce' ), + 'type' => 'string', + 'sanitize_callback' => 'wp_parse_id_list', + 'validate_callback' => 'rest_validate_request_arg', + ); + $params['attribute'] = array( + 'description' => __( 'Limit result set to products with a specific attribute. Use the taxonomy name/attribute slug.', 'woocommerce' ), + 'type' => 'string', + 'sanitize_callback' => 'sanitize_text_field', + 'validate_callback' => 'rest_validate_request_arg', + ); + $params['attribute_term'] = array( + 'description' => __( 'Limit result set to products with a specific attribute term ID (required an assigned attribute).', 'woocommerce' ), + 'type' => 'string', + 'sanitize_callback' => 'wp_parse_id_list', + 'validate_callback' => 'rest_validate_request_arg', + ); + + if ( wc_tax_enabled() ) { + $params['tax_class'] = array( + 'description' => __( 'Limit result set to products with a specific tax class.', 'woocommerce' ), + 'type' => 'string', + 'enum' => array_merge( array( 'standard' ), WC_Tax::get_tax_class_slugs() ), + 'sanitize_callback' => 'sanitize_text_field', + 'validate_callback' => 'rest_validate_request_arg', + ); + } + + $params['in_stock'] = array( + 'description' => __( 'Limit result set to products in stock or out of stock.', 'woocommerce' ), + 'type' => 'boolean', + 'sanitize_callback' => 'wc_string_to_bool', + 'validate_callback' => 'rest_validate_request_arg', + ); + $params['on_sale'] = array( + 'description' => __( 'Limit result set to products on sale.', 'woocommerce' ), + 'type' => 'boolean', + 'sanitize_callback' => 'wc_string_to_bool', + 'validate_callback' => 'rest_validate_request_arg', + ); + $params['min_price'] = array( + 'description' => __( 'Limit result set to products based on a minimum price.', 'woocommerce' ), + 'type' => 'string', + 'sanitize_callback' => 'sanitize_text_field', + 'validate_callback' => 'rest_validate_request_arg', + ); + $params['max_price'] = array( + 'description' => __( 'Limit result set to products based on a maximum price.', 'woocommerce' ), + 'type' => 'string', + 'sanitize_callback' => 'sanitize_text_field', + 'validate_callback' => 'rest_validate_request_arg', + ); + + return $params; + } +} diff --git a/includes/api/v2/class-wc-rest-report-sales-v2-controller.php b/includes/api/v2/class-wc-rest-report-sales-v2-controller.php new file mode 100644 index 00000000000..14b2e52077b --- /dev/null +++ b/includes/api/v2/class-wc-rest-report-sales-v2-controller.php @@ -0,0 +1,27 @@ +[\w-]+)'; + + /** + * Register routes. + * + * @since 3.0.0 + */ + public function register_routes() { + register_rest_route( + $this->namespace, '/' . $this->rest_base, array( + 'args' => array( + 'group' => array( + 'description' => __( 'Settings group ID.', 'woocommerce' ), + 'type' => 'string', + ), + ), + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_items' ), + 'permission_callback' => array( $this, 'get_items_permissions_check' ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + + register_rest_route( + $this->namespace, '/' . $this->rest_base . '/batch', array( + 'args' => array( + 'group' => array( + 'description' => __( 'Settings group ID.', 'woocommerce' ), + 'type' => 'string', + ), + ), + array( + 'methods' => WP_REST_Server::EDITABLE, + 'callback' => array( $this, 'batch_items' ), + 'permission_callback' => array( $this, 'update_items_permissions_check' ), + 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), + ), + 'schema' => array( $this, 'get_public_batch_schema' ), + ) + ); + + register_rest_route( + $this->namespace, '/' . $this->rest_base . '/(?P[\w-]+)', array( + 'args' => array( + 'group' => array( + 'description' => __( 'Settings group ID.', 'woocommerce' ), + 'type' => 'string', + ), + 'id' => array( + 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), + 'type' => 'string', + ), + ), + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_item' ), + 'permission_callback' => array( $this, 'get_items_permissions_check' ), + ), + array( + 'methods' => WP_REST_Server::EDITABLE, + 'callback' => array( $this, 'update_item' ), + 'permission_callback' => array( $this, 'update_items_permissions_check' ), + 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + } + + /** + * Return a single setting. + * + * @since 3.0.0 + * @param WP_REST_Request $request Request data. + * @return WP_Error|WP_REST_Response + */ + public function get_item( $request ) { + $setting = $this->get_setting( $request['group_id'], $request['id'] ); + + if ( is_wp_error( $setting ) ) { + return $setting; + } + + $response = $this->prepare_item_for_response( $setting, $request ); + + return rest_ensure_response( $response ); + } + + /** + * Return all settings in a group. + * + * @since 3.0.0 + * @param WP_REST_Request $request Request data. + * @return WP_Error|WP_REST_Response + */ + public function get_items( $request ) { + $settings = $this->get_group_settings( $request['group_id'] ); + + if ( is_wp_error( $settings ) ) { + return $settings; + } + + $data = array(); + + foreach ( $settings as $setting_obj ) { + $setting = $this->prepare_item_for_response( $setting_obj, $request ); + $setting = $this->prepare_response_for_collection( $setting ); + if ( $this->is_setting_type_valid( $setting['type'] ) ) { + $data[] = $setting; + } + } + + return rest_ensure_response( $data ); + } + + /** + * Get all settings in a group. + * + * @since 3.0.0 + * @param string $group_id Group ID. + * @return array|WP_Error + */ + public function get_group_settings( $group_id ) { + if ( empty( $group_id ) ) { + return new WP_Error( 'rest_setting_setting_group_invalid', __( 'Invalid setting group.', 'woocommerce' ), array( 'status' => 404 ) ); + } + + $settings = apply_filters( 'woocommerce_settings-' . $group_id, array() ); + + if ( empty( $settings ) ) { + return new WP_Error( 'rest_setting_setting_group_invalid', __( 'Invalid setting group.', 'woocommerce' ), array( 'status' => 404 ) ); + } + + $filtered_settings = array(); + foreach ( $settings as $setting ) { + $option_key = $setting['option_key']; + $setting = $this->filter_setting( $setting ); + $default = isset( $setting['default'] ) ? $setting['default'] : ''; + // Get the option value. + if ( is_array( $option_key ) ) { + $option = get_option( $option_key[0] ); + $setting['value'] = isset( $option[ $option_key[1] ] ) ? $option[ $option_key[1] ] : $default; + } else { + $admin_setting_value = WC_Admin_Settings::get_option( $option_key, $default ); + $setting['value'] = $admin_setting_value; + } + + if ( 'multi_select_countries' === $setting['type'] ) { + $setting['options'] = WC()->countries->get_countries(); + $setting['type'] = 'multiselect'; + } elseif ( 'single_select_country' === $setting['type'] ) { + $setting['type'] = 'select'; + $setting['options'] = $this->get_countries_and_states(); + } + + $filtered_settings[] = $setting; + } + + return $filtered_settings; + } + + /** + * Returns a list of countries and states for use in the base location setting. + * + * @since 3.0.7 + * @return array Array of states and countries. + */ + private function get_countries_and_states() { + $countries = WC()->countries->get_countries(); + if ( ! $countries ) { + return array(); + } + + $output = array(); + + foreach ( $countries as $key => $value ) { + $states = WC()->countries->get_states( $key ); + if ( $states ) { + foreach ( $states as $state_key => $state_value ) { + $output[ $key . ':' . $state_key ] = $value . ' - ' . $state_value; + } + } else { + $output[ $key ] = $value; + } + } + + return $output; + } + + /** + * Get setting data. + * + * @since 3.0.0 + * @param string $group_id Group ID. + * @param string $setting_id Setting ID. + * @return stdClass|WP_Error + */ + public function get_setting( $group_id, $setting_id ) { + if ( empty( $setting_id ) ) { + return new WP_Error( 'rest_setting_setting_invalid', __( 'Invalid setting.', 'woocommerce' ), array( 'status' => 404 ) ); + } + + $settings = $this->get_group_settings( $group_id ); + + if ( is_wp_error( $settings ) ) { + return $settings; + } + + $array_key = array_keys( wp_list_pluck( $settings, 'id' ), $setting_id ); + + if ( empty( $array_key ) ) { + return new WP_Error( 'rest_setting_setting_invalid', __( 'Invalid setting.', 'woocommerce' ), array( 'status' => 404 ) ); + } + + $setting = $settings[ $array_key[0] ]; + + if ( ! $this->is_setting_type_valid( $setting['type'] ) ) { + return new WP_Error( 'rest_setting_setting_invalid', __( 'Invalid setting.', 'woocommerce' ), array( 'status' => 404 ) ); + } + + return $setting; + } + + /** + * Bulk create, update and delete items. + * + * @since 3.0.0 + * @param WP_REST_Request $request Full details about the request. + * @return array Of WP_Error or WP_REST_Response. + */ + public function batch_items( $request ) { + // Get the request params. + $items = array_filter( $request->get_params() ); + + /* + * Since our batch settings update is group-specific and matches based on the route, + * we inject the URL parameters (containing group) into the batch items + */ + if ( ! empty( $items['update'] ) ) { + $to_update = array(); + foreach ( $items['update'] as $item ) { + $to_update[] = array_merge( $request->get_url_params(), $item ); + } + $request = new WP_REST_Request( $request->get_method() ); + $request->set_body_params( array( 'update' => $to_update ) ); + } + + return parent::batch_items( $request ); + } + + /** + * Update a single setting in a group. + * + * @since 3.0.0 + * @param WP_REST_Request $request Request data. + * @return WP_Error|WP_REST_Response + */ + public function update_item( $request ) { + $setting = $this->get_setting( $request['group_id'], $request['id'] ); + + if ( is_wp_error( $setting ) ) { + return $setting; + } + + if ( is_callable( array( $this, 'validate_setting_' . $setting['type'] . '_field' ) ) ) { + $value = $this->{'validate_setting_' . $setting['type'] . '_field'}( $request['value'], $setting ); + } else { + $value = $this->validate_setting_text_field( $request['value'], $setting ); + } + + if ( is_wp_error( $value ) ) { + return $value; + } + + if ( is_array( $setting['option_key'] ) ) { + $setting['value'] = $value; + $option_key = $setting['option_key']; + $prev = get_option( $option_key[0] ); + $prev[ $option_key[1] ] = $request['value']; + update_option( $option_key[0], $prev ); + } else { + $update_data = array(); + $update_data[ $setting['option_key'] ] = $value; + $setting['value'] = $value; + WC_Admin_Settings::save_fields( array( $setting ), $update_data ); + } + + $response = $this->prepare_item_for_response( $setting, $request ); + + return rest_ensure_response( $response ); + } + + /** + * Prepare a single setting object for response. + * + * @since 3.0.0 + * @param object $item Setting object. + * @param WP_REST_Request $request Request object. + * @return WP_REST_Response $response Response data. + */ + public function prepare_item_for_response( $item, $request ) { + unset( $item['option_key'] ); + $data = $this->filter_setting( $item ); + $data = $this->add_additional_fields_to_object( $data, $request ); + $data = $this->filter_response_by_context( $data, empty( $request['context'] ) ? 'view' : $request['context'] ); + $response = rest_ensure_response( $data ); + $response->add_links( $this->prepare_links( $data['id'], $request['group_id'] ) ); + return $response; + } + + /** + * Prepare links for the request. + * + * @since 3.0.0 + * @param string $setting_id Setting ID. + * @param string $group_id Group ID. + * @return array Links for the given setting. + */ + protected function prepare_links( $setting_id, $group_id ) { + $base = str_replace( '(?P[\w-]+)', $group_id, $this->rest_base ); + $links = array( + 'self' => array( + 'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $base, $setting_id ) ), + ), + 'collection' => array( + 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $base ) ), + ), + ); + + return $links; + } + + /** + * Makes sure the current user has access to READ the settings APIs. + * + * @since 3.0.0 + * @param WP_REST_Request $request Full data about the request. + * @return WP_Error|boolean + */ + public function get_items_permissions_check( $request ) { + if ( ! wc_rest_check_manager_permissions( 'settings', 'read' ) ) { + return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot list resources.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); + } + + return true; + } + + /** + * Makes sure the current user has access to WRITE the settings APIs. + * + * @since 3.0.0 + * @param WP_REST_Request $request Full data about the request. + * @return WP_Error|boolean + */ + public function update_items_permissions_check( $request ) { + if ( ! wc_rest_check_manager_permissions( 'settings', 'edit' ) ) { + return new WP_Error( 'woocommerce_rest_cannot_edit', __( 'Sorry, you cannot edit this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); + } + + return true; + } + + /** + * Filters out bad values from the settings array/filter so we + * only return known values via the API. + * + * @since 3.0.0 + * @param array $setting Settings. + * @return array + */ + public function filter_setting( $setting ) { + $setting = array_intersect_key( + $setting, + array_flip( array_filter( array_keys( $setting ), array( $this, 'allowed_setting_keys' ) ) ) + ); + + if ( empty( $setting['options'] ) ) { + unset( $setting['options'] ); + } + + if ( 'image_width' === $setting['type'] ) { + $setting = $this->cast_image_width( $setting ); + } + + return $setting; + } + + /** + * For image_width, Crop can return "0" instead of false -- so we want + * to make sure we return these consistently the same we accept them. + * + * @todo remove in 4.0 + * @since 3.0.0 + * @param array $setting Settings. + * @return array + */ + public function cast_image_width( $setting ) { + foreach ( array( 'default', 'value' ) as $key ) { + if ( isset( $setting[ $key ] ) ) { + $setting[ $key ]['width'] = intval( $setting[ $key ]['width'] ); + $setting[ $key ]['height'] = intval( $setting[ $key ]['height'] ); + $setting[ $key ]['crop'] = (bool) $setting[ $key ]['crop']; + } + } + return $setting; + } + + /** + * Callback for allowed keys for each setting response. + * + * @since 3.0.0 + * @param string $key Key to check. + * @return boolean + */ + public function allowed_setting_keys( $key ) { + return in_array( + $key, array( + 'id', + 'label', + 'description', + 'default', + 'tip', + 'placeholder', + 'type', + 'options', + 'value', + 'option_key', + ) + ); + } + + /** + * Boolean for if a setting type is a valid supported setting type. + * + * @since 3.0.0 + * @param string $type Type. + * @return bool + */ + public function is_setting_type_valid( $type ) { + return in_array( + $type, array( + 'text', // Validates with validate_setting_text_field. + 'email', // Validates with validate_setting_text_field. + 'number', // Validates with validate_setting_text_field. + 'color', // Validates with validate_setting_text_field. + 'password', // Validates with validate_setting_text_field. + 'textarea', // Validates with validate_setting_textarea_field. + 'select', // Validates with validate_setting_select_field. + 'multiselect', // Validates with validate_setting_multiselect_field. + 'radio', // Validates with validate_setting_radio_field (-> validate_setting_select_field). + 'checkbox', // Validates with validate_setting_checkbox_field. + 'image_width', // Validates with validate_setting_image_width_field. + 'thumbnail_cropping', // Validates with validate_setting_text_field. + ) + ); + } + + /** + * Get the settings schema, conforming to JSON Schema. + * + * @since 3.0.0 + * @return array + */ + public function get_item_schema() { + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => 'setting', + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'A unique identifier for the setting.', 'woocommerce' ), + 'type' => 'string', + 'arg_options' => array( + 'sanitize_callback' => 'sanitize_title', + ), + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'label' => array( + 'description' => __( 'A human readable label for the setting used in interfaces.', 'woocommerce' ), + 'type' => 'string', + 'arg_options' => array( + 'sanitize_callback' => 'sanitize_text_field', + ), + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'description' => array( + 'description' => __( 'A human readable description for the setting used in interfaces.', 'woocommerce' ), + 'type' => 'string', + 'arg_options' => array( + 'sanitize_callback' => 'sanitize_text_field', + ), + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'value' => array( + 'description' => __( 'Setting value.', 'woocommerce' ), + 'type' => 'mixed', + 'context' => array( 'view', 'edit' ), + ), + 'default' => array( + 'description' => __( 'Default value for the setting.', 'woocommerce' ), + 'type' => 'mixed', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'tip' => array( + 'description' => __( 'Additional help text shown to the user about the setting.', 'woocommerce' ), + 'type' => 'string', + 'arg_options' => array( + 'sanitize_callback' => 'sanitize_text_field', + ), + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'placeholder' => array( + 'description' => __( 'Placeholder text to be displayed in text inputs.', 'woocommerce' ), + 'type' => 'string', + 'arg_options' => array( + 'sanitize_callback' => 'sanitize_text_field', + ), + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'type' => array( + 'description' => __( 'Type of setting.', 'woocommerce' ), + 'type' => 'string', + 'arg_options' => array( + 'sanitize_callback' => 'sanitize_text_field', + ), + 'context' => array( 'view', 'edit' ), + 'enum' => array( 'text', 'email', 'number', 'color', 'password', 'textarea', 'select', 'multiselect', 'radio', 'image_width', 'checkbox', 'thumbnail_cropping' ), + 'readonly' => true, + ), + 'options' => array( + 'description' => __( 'Array of options (key value pairs) for inputs such as select, multiselect, and radio buttons.', 'woocommerce' ), + 'type' => 'object', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + ), + ); + + return $this->add_additional_fields_schema( $schema ); + } +} diff --git a/includes/api/v2/class-wc-rest-settings-v2-controller.php b/includes/api/v2/class-wc-rest-settings-v2-controller.php new file mode 100644 index 00000000000..f8f33f2e4bc --- /dev/null +++ b/includes/api/v2/class-wc-rest-settings-v2-controller.php @@ -0,0 +1,232 @@ +namespace, '/' . $this->rest_base, array( + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_items' ), + 'permission_callback' => array( $this, 'get_items_permissions_check' ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + } + + /** + * Get all settings groups items. + * + * @since 3.0.0 + * @param WP_REST_Request $request Request data. + * @return WP_Error|WP_REST_Response + */ + public function get_items( $request ) { + $groups = apply_filters( 'woocommerce_settings_groups', array() ); + if ( empty( $groups ) ) { + return new WP_Error( 'rest_setting_groups_empty', __( 'No setting groups have been registered.', 'woocommerce' ), array( 'status' => 500 ) ); + } + + $defaults = $this->group_defaults(); + $filtered_groups = array(); + foreach ( $groups as $group ) { + $sub_groups = array(); + foreach ( $groups as $_group ) { + if ( ! empty( $_group['parent_id'] ) && $group['id'] === $_group['parent_id'] ) { + $sub_groups[] = $_group['id']; + } + } + $group['sub_groups'] = $sub_groups; + + $group = wp_parse_args( $group, $defaults ); + if ( ! is_null( $group['id'] ) && ! is_null( $group['label'] ) ) { + $group_obj = $this->filter_group( $group ); + $group_data = $this->prepare_item_for_response( $group_obj, $request ); + $group_data = $this->prepare_response_for_collection( $group_data ); + + $filtered_groups[] = $group_data; + } + } + + $response = rest_ensure_response( $filtered_groups ); + return $response; + } + + /** + * Prepare links for the request. + * + * @param string $group_id Group ID. + * @return array Links for the given group. + */ + protected function prepare_links( $group_id ) { + $base = '/' . $this->namespace . '/' . $this->rest_base; + $links = array( + 'options' => array( + 'href' => rest_url( trailingslashit( $base ) . $group_id ), + ), + ); + + return $links; + } + + /** + * Prepare a report sales object for serialization. + * + * @since 3.0.0 + * @param array $item Group object. + * @param WP_REST_Request $request Request object. + * @return WP_REST_Response $response Response data. + */ + public function prepare_item_for_response( $item, $request ) { + $context = empty( $request['context'] ) ? 'view' : $request['context']; + $data = $this->add_additional_fields_to_object( $item, $request ); + $data = $this->filter_response_by_context( $data, $context ); + + $response = rest_ensure_response( $data ); + + $response->add_links( $this->prepare_links( $item['id'] ) ); + + return $response; + } + + /** + * Filters out bad values from the groups array/filter so we + * only return known values via the API. + * + * @since 3.0.0 + * @param array $group Group. + * @return array + */ + public function filter_group( $group ) { + return array_intersect_key( + $group, + array_flip( array_filter( array_keys( $group ), array( $this, 'allowed_group_keys' ) ) ) + ); + } + + /** + * Callback for allowed keys for each group response. + * + * @since 3.0.0 + * @param string $key Key to check. + * @return boolean + */ + public function allowed_group_keys( $key ) { + return in_array( $key, array( 'id', 'label', 'description', 'parent_id', 'sub_groups' ) ); + } + + /** + * Returns default settings for groups. null means the field is required. + * + * @since 3.0.0 + * @return array + */ + protected function group_defaults() { + return array( + 'id' => null, + 'label' => null, + 'description' => '', + 'parent_id' => '', + 'sub_groups' => array(), + ); + } + + /** + * Makes sure the current user has access to READ the settings APIs. + * + * @since 3.0.0 + * @param WP_REST_Request $request Full data about the request. + * @return WP_Error|boolean + */ + public function get_items_permissions_check( $request ) { + if ( ! wc_rest_check_manager_permissions( 'settings', 'read' ) ) { + return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot list resources.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); + } + + return true; + } + + /** + * Get the groups schema, conforming to JSON Schema. + * + * @since 3.0.0 + * @return array + */ + public function get_item_schema() { + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => 'setting_group', + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'A unique identifier that can be used to link settings together.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'label' => array( + 'description' => __( 'A human readable label for the setting used in interfaces.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'description' => array( + 'description' => __( 'A human readable description for the setting used in interfaces.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'parent_id' => array( + 'description' => __( 'ID of parent grouping.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'sub_groups' => array( + 'description' => __( 'IDs for settings sub groups.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + ), + ); + + return $this->add_additional_fields_schema( $schema ); + } +} diff --git a/includes/api/v2/class-wc-rest-shipping-methods-v2-controller.php b/includes/api/v2/class-wc-rest-shipping-methods-v2-controller.php new file mode 100644 index 00000000000..78df57ece6e --- /dev/null +++ b/includes/api/v2/class-wc-rest-shipping-methods-v2-controller.php @@ -0,0 +1,231 @@ + + */ + public function register_routes() { + register_rest_route( + $this->namespace, '/' . $this->rest_base, array( + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_items' ), + 'permission_callback' => array( $this, 'get_items_permissions_check' ), + 'args' => $this->get_collection_params(), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + register_rest_route( + $this->namespace, '/' . $this->rest_base . '/(?P[\w-]+)', array( + 'args' => array( + 'id' => array( + 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), + 'type' => 'string', + ), + ), + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_item' ), + 'permission_callback' => array( $this, 'get_item_permissions_check' ), + 'args' => array( + 'context' => $this->get_context_param( array( 'default' => 'view' ) ), + ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + } + + /** + * Check whether a given request has permission to view shipping methods. + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_Error|boolean + */ + public function get_items_permissions_check( $request ) { + if ( ! wc_rest_check_manager_permissions( 'shipping_methods', 'read' ) ) { + return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot list resources.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); + } + return true; + } + + /** + * Check if a given request has access to read a shipping method. + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_Error|boolean + */ + public function get_item_permissions_check( $request ) { + if ( ! wc_rest_check_manager_permissions( 'shipping_methods', 'read' ) ) { + return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot view this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); + } + return true; + } + + /** + * Get shipping methods. + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_Error|WP_REST_Response + */ + public function get_items( $request ) { + $wc_shipping = WC_Shipping::instance(); + $response = array(); + foreach ( $wc_shipping->get_shipping_methods() as $id => $shipping_method ) { + $method = $this->prepare_item_for_response( $shipping_method, $request ); + $method = $this->prepare_response_for_collection( $method ); + $response[] = $method; + } + return rest_ensure_response( $response ); + } + + /** + * Get a single Shipping Method. + * + * @param WP_REST_Request $request Request data. + * @return WP_REST_Response|WP_Error + */ + public function get_item( $request ) { + $wc_shipping = WC_Shipping::instance(); + $methods = $wc_shipping->get_shipping_methods(); + if ( empty( $methods[ $request['id'] ] ) ) { + return new WP_Error( 'woocommerce_rest_shipping_method_invalid', __( 'Resource does not exist.', 'woocommerce' ), array( 'status' => 404 ) ); + } + + $method = $methods[ $request['id'] ]; + $response = $this->prepare_item_for_response( $method, $request ); + + return rest_ensure_response( $response ); + } + + /** + * Prepare a shipping method for response. + * + * @param WC_Shipping_Method $method Shipping method object. + * @param WP_REST_Request $request Request object. + * @return WP_REST_Response $response Response data. + */ + public function prepare_item_for_response( $method, $request ) { + $data = array( + 'id' => $method->id, + 'title' => $method->method_title, + 'description' => $method->method_description, + ); + + $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; + $data = $this->add_additional_fields_to_object( $data, $request ); + $data = $this->filter_response_by_context( $data, $context ); + + // Wrap the data in a response object. + $response = rest_ensure_response( $data ); + + $response->add_links( $this->prepare_links( $method, $request ) ); + + /** + * Filter shipping methods object returned from the REST API. + * + * @param WP_REST_Response $response The response object. + * @param WC_Shipping_Method $method Shipping method object used to create response. + * @param WP_REST_Request $request Request object. + */ + return apply_filters( 'woocommerce_rest_prepare_shipping_method', $response, $method, $request ); + } + + /** + * Prepare links for the request. + * + * @param WC_Shipping_Method $method Shipping method object. + * @param WP_REST_Request $request Request object. + * @return array + */ + protected function prepare_links( $method, $request ) { + $links = array( + 'self' => array( + 'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $this->rest_base, $method->id ) ), + ), + 'collection' => array( + 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ), + ), + ); + + return $links; + } + + /** + * Get the shipping method schema, conforming to JSON Schema. + * + * @return array + */ + public function get_item_schema() { + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => 'shipping_method', + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Method ID.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'title' => array( + 'description' => __( 'Shipping method title.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'description' => array( + 'description' => __( 'Shipping method description.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + ), + ); + + return $this->add_additional_fields_schema( $schema ); + } + + /** + * Get any query params needed. + * + * @return array + */ + public function get_collection_params() { + return array( + 'context' => $this->get_context_param( array( 'default' => 'view' ) ), + ); + } +} diff --git a/includes/api/v2/class-wc-rest-shipping-zone-locations-v2-controller.php b/includes/api/v2/class-wc-rest-shipping-zone-locations-v2-controller.php new file mode 100644 index 00000000000..77d85143209 --- /dev/null +++ b/includes/api/v2/class-wc-rest-shipping-zone-locations-v2-controller.php @@ -0,0 +1,190 @@ +/locations endpoint. + * + * @package WooCommerce/API + * @since 3.0.0 + */ + +defined( 'ABSPATH' ) || exit; + +/** + * REST API Shipping Zone Locations class. + * + * @package WooCommerce/API + * @extends WC_REST_Shipping_Zones_Controller_Base + */ +class WC_REST_Shipping_Zone_Locations_V2_Controller extends WC_REST_Shipping_Zones_Controller_Base { + + /** + * Register the routes for Shipping Zone Locations. + */ + public function register_routes() { + register_rest_route( + $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)/locations', array( + 'args' => array( + 'id' => array( + 'description' => __( 'Unique ID for the resource.', 'woocommerce' ), + 'type' => 'integer', + ), + ), + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_items' ), + 'permission_callback' => array( $this, 'get_items_permissions_check' ), + ), + array( + 'methods' => WP_REST_Server::EDITABLE, + 'callback' => array( $this, 'update_items' ), + 'permission_callback' => array( $this, 'update_items_permissions_check' ), + 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + } + + /** + * Get all Shipping Zone Locations. + * + * @param WP_REST_Request $request Request data. + * @return WP_REST_Response|WP_Error + */ + public function get_items( $request ) { + $zone = $this->get_zone( (int) $request['id'] ); + + if ( is_wp_error( $zone ) ) { + return $zone; + } + + $locations = $zone->get_zone_locations(); + $data = array(); + + foreach ( $locations as $location_obj ) { + $location = $this->prepare_item_for_response( $location_obj, $request ); + $location = $this->prepare_response_for_collection( $location ); + $data[] = $location; + } + + return rest_ensure_response( $data ); + } + + /** + * Update all Shipping Zone Locations. + * + * @param WP_REST_Request $request Request data. + * @return WP_REST_Response|WP_Error + */ + public function update_items( $request ) { + $zone = $this->get_zone( (int) $request['id'] ); + + if ( is_wp_error( $zone ) ) { + return $zone; + } + + if ( 0 === $zone->get_id() ) { + return new WP_Error( 'woocommerce_rest_shipping_zone_locations_invalid_zone', __( 'The "locations not covered by your other zones" zone cannot be updated.', 'woocommerce' ), array( 'status' => 403 ) ); + } + + $raw_locations = $request->get_json_params(); + $locations = array(); + + foreach ( (array) $raw_locations as $raw_location ) { + if ( empty( $raw_location['code'] ) ) { + continue; + } + + $type = ! empty( $raw_location['type'] ) ? sanitize_text_field( $raw_location['type'] ) : 'country'; + + if ( ! in_array( $type, array( 'postcode', 'state', 'country', 'continent' ), true ) ) { + continue; + } + + $locations[] = array( + 'code' => sanitize_text_field( $raw_location['code'] ), + 'type' => sanitize_text_field( $type ), + ); + } + + $zone->set_locations( $locations ); + $zone->save(); + + return $this->get_items( $request ); + } + + /** + * Prepare the Shipping Zone Location for the REST response. + * + * @param array $item Shipping Zone Location. + * @param WP_REST_Request $request Request object. + * @return WP_REST_Response $response + */ + public function prepare_item_for_response( $item, $request ) { + $context = empty( $request['context'] ) ? 'view' : $request['context']; + $data = $this->add_additional_fields_to_object( $item, $request ); + $data = $this->filter_response_by_context( $data, $context ); + + // Wrap the data in a response object. + $response = rest_ensure_response( $data ); + + $response->add_links( $this->prepare_links( (int) $request['id'] ) ); + + return $response; + } + + /** + * Prepare links for the request. + * + * @param int $zone_id Given Shipping Zone ID. + * @return array Links for the given Shipping Zone Location. + */ + protected function prepare_links( $zone_id ) { + $base = '/' . $this->namespace . '/' . $this->rest_base . '/' . $zone_id; + $links = array( + 'collection' => array( + 'href' => rest_url( $base . '/locations' ), + ), + 'describes' => array( + 'href' => rest_url( $base ), + ), + ); + + return $links; + } + + /** + * Get the Shipping Zone Locations schema, conforming to JSON Schema + * + * @return array + */ + public function get_item_schema() { + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => 'shipping_zone_location', + 'type' => 'object', + 'properties' => array( + 'code' => array( + 'description' => __( 'Shipping zone location code.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'type' => array( + 'description' => __( 'Shipping zone location type.', 'woocommerce' ), + 'type' => 'string', + 'default' => 'country', + 'enum' => array( + 'postcode', + 'state', + 'country', + 'continent', + ), + 'context' => array( 'view', 'edit' ), + ), + ), + ); + + return $this->add_additional_fields_schema( $schema ); + } +} diff --git a/includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php b/includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php new file mode 100644 index 00000000000..69fdc4b87db --- /dev/null +++ b/includes/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php @@ -0,0 +1,541 @@ +/methods endpoint. + * + * @package WooCommerce/API + * @since 3.0.0 + */ + +defined( 'ABSPATH' ) || exit; + +/** + * REST API Shipping Zone Methods class. + * + * @package WooCommerce/API + * @extends WC_REST_Shipping_Zones_Controller_Base + */ +class WC_REST_Shipping_Zone_Methods_V2_Controller extends WC_REST_Shipping_Zones_Controller_Base { + + /** + * Register the routes for Shipping Zone Methods. + */ + public function register_routes() { + register_rest_route( + $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)/methods', array( + 'args' => array( + 'zone_id' => array( + 'description' => __( 'Unique ID for the zone.', 'woocommerce' ), + 'type' => 'integer', + ), + ), + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_items' ), + 'permission_callback' => array( $this, 'get_items_permissions_check' ), + ), + array( + 'methods' => WP_REST_Server::CREATABLE, + 'callback' => array( $this, 'create_item' ), + 'permission_callback' => array( $this, 'create_item_permissions_check' ), + 'args' => array_merge( + $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ), array( + 'method_id' => array( + 'required' => true, + 'readonly' => false, + 'description' => __( 'Shipping method ID.', 'woocommerce' ), + ), + ) + ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + + register_rest_route( + $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)/methods/(?P[\d]+)', array( + 'args' => array( + 'zone_id' => array( + 'description' => __( 'Unique ID for the zone.', 'woocommerce' ), + 'type' => 'integer', + ), + 'instance_id' => array( + 'description' => __( 'Unique ID for the instance.', 'woocommerce' ), + 'type' => 'integer', + ), + ), + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_item' ), + 'permission_callback' => array( $this, 'get_items_permissions_check' ), + ), + array( + 'methods' => WP_REST_Server::EDITABLE, + 'callback' => array( $this, 'update_item' ), + 'permission_callback' => array( $this, 'update_items_permissions_check' ), + 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), + ), + array( + 'methods' => WP_REST_Server::DELETABLE, + 'callback' => array( $this, 'delete_item' ), + 'permission_callback' => array( $this, 'delete_items_permissions_check' ), + 'args' => array( + 'force' => array( + 'default' => false, + 'type' => 'boolean', + 'description' => __( 'Whether to bypass trash and force deletion.', 'woocommerce' ), + ), + ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + } + + /** + * Get a single Shipping Zone Method. + * + * @param WP_REST_Request $request Request data. + * @return WP_REST_Response|WP_Error + */ + public function get_item( $request ) { + $zone = $this->get_zone( $request['zone_id'] ); + + if ( is_wp_error( $zone ) ) { + return $zone; + } + + $instance_id = (int) $request['instance_id']; + $methods = $zone->get_shipping_methods(); + $method = false; + + foreach ( $methods as $method_obj ) { + if ( $instance_id === $method_obj->instance_id ) { + $method = $method_obj; + break; + } + } + + if ( false === $method ) { + return new WP_Error( 'woocommerce_rest_shipping_zone_method_invalid', __( 'Resource does not exist.', 'woocommerce' ), array( 'status' => 404 ) ); + } + + $data = $this->prepare_item_for_response( $method, $request ); + + return rest_ensure_response( $data ); + } + + /** + * Get all Shipping Zone Methods. + * + * @param WP_REST_Request $request Request data. + * @return WP_REST_Response|WP_Error + */ + public function get_items( $request ) { + $zone = $this->get_zone( $request['zone_id'] ); + + if ( is_wp_error( $zone ) ) { + return $zone; + } + + $methods = $zone->get_shipping_methods(); + $data = array(); + + foreach ( $methods as $method_obj ) { + $method = $this->prepare_item_for_response( $method_obj, $request ); + $data[] = $method; + } + + return rest_ensure_response( $data ); + } + + /** + * Create a new shipping zone method instance. + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_REST_Request|WP_Error + */ + public function create_item( $request ) { + $method_id = $request['method_id']; + $zone = $this->get_zone( $request['zone_id'] ); + if ( is_wp_error( $zone ) ) { + return $zone; + } + + $instance_id = $zone->add_shipping_method( $method_id ); + $methods = $zone->get_shipping_methods(); + $method = false; + foreach ( $methods as $method_obj ) { + if ( $instance_id === $method_obj->instance_id ) { + $method = $method_obj; + break; + } + } + + if ( false === $method ) { + return new WP_Error( 'woocommerce_rest_shipping_zone_not_created', __( 'Resource cannot be created.', 'woocommerce' ), array( 'status' => 500 ) ); + } + + $method = $this->update_fields( $instance_id, $method, $request ); + if ( is_wp_error( $method ) ) { + return $method; + } + + $data = $this->prepare_item_for_response( $method, $request ); + return rest_ensure_response( $data ); + } + + /** + * Delete a shipping method instance. + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_Error|boolean + */ + public function delete_item( $request ) { + $zone = $this->get_zone( $request['zone_id'] ); + if ( is_wp_error( $zone ) ) { + return $zone; + } + + $instance_id = (int) $request['instance_id']; + $force = $request['force']; + + $methods = $zone->get_shipping_methods(); + $method = false; + + foreach ( $methods as $method_obj ) { + if ( $instance_id === $method_obj->instance_id ) { + $method = $method_obj; + break; + } + } + + if ( false === $method ) { + return new WP_Error( 'woocommerce_rest_shipping_zone_method_invalid', __( 'Resource does not exist.', 'woocommerce' ), array( 'status' => 404 ) ); + } + + $method = $this->update_fields( $instance_id, $method, $request ); + if ( is_wp_error( $method ) ) { + return $method; + } + + $request->set_param( 'context', 'view' ); + $response = $this->prepare_item_for_response( $method, $request ); + + // Actually delete. + if ( $force ) { + $zone->delete_shipping_method( $instance_id ); + } else { + return new WP_Error( 'rest_trash_not_supported', __( 'Shipping methods do not support trashing.', 'woocommerce' ), array( 'status' => 501 ) ); + } + + /** + * Fires after a product review is deleted via the REST API. + * + * @param object $method + * @param WP_REST_Response $response The response data. + * @param WP_REST_Request $request The request sent to the API. + */ + do_action( 'rest_delete_product_review', $method, $response, $request ); + + return $response; + } + + /** + * Update A Single Shipping Zone Method. + * + * @param WP_REST_Request $request Request data. + * @return WP_REST_Response|WP_Error + */ + public function update_item( $request ) { + $zone = $this->get_zone( $request['zone_id'] ); + if ( is_wp_error( $zone ) ) { + return $zone; + } + + $instance_id = (int) $request['instance_id']; + $methods = $zone->get_shipping_methods(); + $method = false; + + foreach ( $methods as $method_obj ) { + if ( $instance_id === $method_obj->instance_id ) { + $method = $method_obj; + break; + } + } + + if ( false === $method ) { + return new WP_Error( 'woocommerce_rest_shipping_zone_method_invalid', __( 'Resource does not exist.', 'woocommerce' ), array( 'status' => 404 ) ); + } + + $method = $this->update_fields( $instance_id, $method, $request ); + if ( is_wp_error( $method ) ) { + return $method; + } + + $data = $this->prepare_item_for_response( $method, $request ); + return rest_ensure_response( $data ); + } + + /** + * Updates settings, order, and enabled status on create. + * + * @param int $instance_id Instance ID. + * @param WC_Shipping_Method $method Shipping method data. + * @param WP_REST_Request $request Request data. + * + * @return WC_Shipping_Method + */ + public function update_fields( $instance_id, $method, $request ) { + global $wpdb; + + // Update settings if present. + if ( isset( $request['settings'] ) ) { + $method->init_instance_settings(); + $instance_settings = $method->instance_settings; + $errors_found = false; + foreach ( $method->get_instance_form_fields() as $key => $field ) { + if ( isset( $request['settings'][ $key ] ) ) { + if ( is_callable( array( $this, 'validate_setting_' . $field['type'] . '_field' ) ) ) { + $value = $this->{'validate_setting_' . $field['type'] . '_field'}( $request['settings'][ $key ], $field ); + } else { + $value = $this->validate_setting_text_field( $request['settings'][ $key ], $field ); + } + if ( is_wp_error( $value ) ) { + $errors_found = true; + break; + } + $instance_settings[ $key ] = $value; + } + } + + if ( $errors_found ) { + return new WP_Error( 'rest_setting_value_invalid', __( 'An invalid setting value was passed.', 'woocommerce' ), array( 'status' => 400 ) ); + } + + update_option( $method->get_instance_option_key(), apply_filters( 'woocommerce_shipping_' . $method->id . '_instance_settings_values', $instance_settings, $method ) ); + } + + // Update order. + if ( isset( $request['order'] ) ) { + $wpdb->update( "{$wpdb->prefix}woocommerce_shipping_zone_methods", array( 'method_order' => absint( $request['order'] ) ), array( 'instance_id' => absint( $instance_id ) ) ); + $method->method_order = absint( $request['order'] ); + } + + // Update if this method is enabled or not. + if ( isset( $request['enabled'] ) ) { + if ( $wpdb->update( "{$wpdb->prefix}woocommerce_shipping_zone_methods", array( 'is_enabled' => $request['enabled'] ), array( 'instance_id' => absint( $instance_id ) ) ) ) { + do_action( 'woocommerce_shipping_zone_method_status_toggled', $instance_id, $method->id, $request['zone_id'], $request['enabled'] ); + $method->enabled = ( true === $request['enabled'] ? 'yes' : 'no' ); + } + } + + return $method; + } + + /** + * Prepare the Shipping Zone Method for the REST response. + * + * @param array $item Shipping Zone Method. + * @param WP_REST_Request $request Request object. + * @return WP_REST_Response $response + */ + public function prepare_item_for_response( $item, $request ) { + $method = array( + 'id' => $item->instance_id, + 'instance_id' => $item->instance_id, + 'title' => $item->instance_settings['title'], + 'order' => $item->method_order, + 'enabled' => ( 'yes' === $item->enabled ), + 'method_id' => $item->id, + 'method_title' => $item->method_title, + 'method_description' => $item->method_description, + 'settings' => $this->get_settings( $item ), + ); + + $context = empty( $request['context'] ) ? 'view' : $request['context']; + $data = $this->add_additional_fields_to_object( $method, $request ); + $data = $this->filter_response_by_context( $data, $context ); + + // Wrap the data in a response object. + $response = rest_ensure_response( $data ); + + $response->add_links( $this->prepare_links( $request['zone_id'], $item->instance_id ) ); + + $response = $this->prepare_response_for_collection( $response ); + + return $response; + } + + /** + * Return settings associated with this shipping zone method instance. + * + * @param WC_Shipping_Method $item Shipping method data. + * + * @return array + */ + public function get_settings( $item ) { + $item->init_instance_settings(); + $settings = array(); + foreach ( $item->get_instance_form_fields() as $id => $field ) { + $data = array( + 'id' => $id, + 'label' => $field['title'], + 'description' => empty( $field['description'] ) ? '' : $field['description'], + 'type' => $field['type'], + 'value' => $item->instance_settings[ $id ], + 'default' => empty( $field['default'] ) ? '' : $field['default'], + 'tip' => empty( $field['description'] ) ? '' : $field['description'], + 'placeholder' => empty( $field['placeholder'] ) ? '' : $field['placeholder'], + ); + if ( ! empty( $field['options'] ) ) { + $data['options'] = $field['options']; + } + $settings[ $id ] = $data; + } + return $settings; + } + + /** + * Prepare links for the request. + * + * @param int $zone_id Given Shipping Zone ID. + * @param int $instance_id Given Shipping Zone Method Instance ID. + * @return array Links for the given Shipping Zone Method. + */ + protected function prepare_links( $zone_id, $instance_id ) { + $base = '/' . $this->namespace . '/' . $this->rest_base . '/' . $zone_id; + $links = array( + 'self' => array( + 'href' => rest_url( $base . '/methods/' . $instance_id ), + ), + 'collection' => array( + 'href' => rest_url( $base . '/methods' ), + ), + 'describes' => array( + 'href' => rest_url( $base ), + ), + ); + + return $links; + } + + /** + * Get the Shipping Zone Methods schema, conforming to JSON Schema + * + * @return array + */ + public function get_item_schema() { + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => 'shipping_zone_method', + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Shipping method instance ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'instance_id' => array( + 'description' => __( 'Shipping method instance ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'title' => array( + 'description' => __( 'Shipping method customer facing title.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'order' => array( + 'description' => __( 'Shipping method sort order.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'enabled' => array( + 'description' => __( 'Shipping method enabled status.', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view', 'edit' ), + ), + 'method_id' => array( + 'description' => __( 'Shipping method ID.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'method_title' => array( + 'description' => __( 'Shipping method title.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'method_description' => array( + 'description' => __( 'Shipping method description.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'settings' => array( + 'description' => __( 'Shipping method settings.', 'woocommerce' ), + 'type' => 'object', + 'context' => array( 'view', 'edit' ), + 'properties' => array( + 'id' => array( + 'description' => __( 'A unique identifier for the setting.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'label' => array( + 'description' => __( 'A human readable label for the setting used in interfaces.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'description' => array( + 'description' => __( 'A human readable description for the setting used in interfaces.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'type' => array( + 'description' => __( 'Type of setting.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'enum' => array( 'text', 'email', 'number', 'color', 'password', 'textarea', 'select', 'multiselect', 'radio', 'image_width', 'checkbox' ), + 'readonly' => true, + ), + 'value' => array( + 'description' => __( 'Setting value.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'default' => array( + 'description' => __( 'Default value for the setting.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'tip' => array( + 'description' => __( 'Additional help text shown to the user about the setting.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'placeholder' => array( + 'description' => __( 'Placeholder text to be displayed in text inputs.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + ), + ), + ), + ); + + return $this->add_additional_fields_schema( $schema ); + } +} diff --git a/includes/api/v2/class-wc-rest-shipping-zones-v2-controller.php b/includes/api/v2/class-wc-rest-shipping-zones-v2-controller.php new file mode 100644 index 00000000000..6071f6edb26 --- /dev/null +++ b/includes/api/v2/class-wc-rest-shipping-zones-v2-controller.php @@ -0,0 +1,304 @@ +namespace, '/' . $this->rest_base, array( + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_items' ), + 'permission_callback' => array( $this, 'get_items_permissions_check' ), + ), + array( + 'methods' => WP_REST_Server::CREATABLE, + 'callback' => array( $this, 'create_item' ), + 'permission_callback' => array( $this, 'create_item_permissions_check' ), + 'args' => array_merge( + $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ), array( + 'name' => array( + 'required' => true, + 'type' => 'string', + 'description' => __( 'Shipping zone name.', 'woocommerce' ), + ), + ) + ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + + register_rest_route( + $this->namespace, '/' . $this->rest_base . '/(?P[\d-]+)', array( + 'args' => array( + 'id' => array( + 'description' => __( 'Unique ID for the resource.', 'woocommerce' ), + 'type' => 'integer', + ), + ), + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_item' ), + 'permission_callback' => array( $this, 'get_items_permissions_check' ), + ), + array( + 'methods' => WP_REST_Server::EDITABLE, + 'callback' => array( $this, 'update_item' ), + 'permission_callback' => array( $this, 'update_items_permissions_check' ), + 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), + ), + array( + 'methods' => WP_REST_Server::DELETABLE, + 'callback' => array( $this, 'delete_item' ), + 'permission_callback' => array( $this, 'delete_items_permissions_check' ), + 'args' => array( + 'force' => array( + 'default' => false, + 'type' => 'boolean', + 'description' => __( 'Whether to bypass trash and force deletion.', 'woocommerce' ), + ), + ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + } + + /** + * Get a single Shipping Zone. + * + * @param WP_REST_Request $request Request data. + * @return WP_REST_Response|WP_Error + */ + public function get_item( $request ) { + $zone = $this->get_zone( $request->get_param( 'id' ) ); + + if ( is_wp_error( $zone ) ) { + return $zone; + } + + $data = $zone->get_data(); + $data = $this->prepare_item_for_response( $data, $request ); + $data = $this->prepare_response_for_collection( $data ); + + return rest_ensure_response( $data ); + } + + /** + * Get all Shipping Zones. + * + * @param WP_REST_Request $request Request data. + * @return WP_REST_Response + */ + public function get_items( $request ) { + $rest_of_the_world = WC_Shipping_Zones::get_zone_by( 'zone_id', 0 ); + + $zones = WC_Shipping_Zones::get_zones(); + array_unshift( $zones, $rest_of_the_world->get_data() ); + $data = array(); + + foreach ( $zones as $zone_obj ) { + $zone = $this->prepare_item_for_response( $zone_obj, $request ); + $zone = $this->prepare_response_for_collection( $zone ); + $data[] = $zone; + } + + return rest_ensure_response( $data ); + } + + /** + * Create a single Shipping Zone. + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_REST_Request|WP_Error + */ + public function create_item( $request ) { + $zone = new WC_Shipping_Zone( null ); + + if ( ! is_null( $request->get_param( 'name' ) ) ) { + $zone->set_zone_name( $request->get_param( 'name' ) ); + } + + if ( ! is_null( $request->get_param( 'order' ) ) ) { + $zone->set_zone_order( $request->get_param( 'order' ) ); + } + + $zone->save(); + + if ( $zone->get_id() !== 0 ) { + $request->set_param( 'id', $zone->get_id() ); + $response = $this->get_item( $request ); + $response->set_status( 201 ); + $response->header( 'Location', rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $zone->get_id() ) ) ); + return $response; + } else { + return new WP_Error( 'woocommerce_rest_shipping_zone_not_created', __( "Resource cannot be created. Check to make sure 'order' and 'name' are present.", 'woocommerce' ), array( 'status' => 500 ) ); + } + } + + /** + * Update a single Shipping Zone. + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_REST_Request|WP_Error + */ + public function update_item( $request ) { + $zone = $this->get_zone( $request->get_param( 'id' ) ); + + if ( is_wp_error( $zone ) ) { + return $zone; + } + + if ( 0 === $zone->get_id() ) { + return new WP_Error( 'woocommerce_rest_shipping_zone_invalid_zone', __( 'The "locations not covered by your other zones" zone cannot be updated.', 'woocommerce' ), array( 'status' => 403 ) ); + } + + $zone_changed = false; + + if ( ! is_null( $request->get_param( 'name' ) ) ) { + $zone->set_zone_name( $request->get_param( 'name' ) ); + $zone_changed = true; + } + + if ( ! is_null( $request->get_param( 'order' ) ) ) { + $zone->set_zone_order( $request->get_param( 'order' ) ); + $zone_changed = true; + } + + if ( $zone_changed ) { + $zone->save(); + } + + return $this->get_item( $request ); + } + + /** + * Delete a single Shipping Zone. + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_REST_Request|WP_Error + */ + public function delete_item( $request ) { + $zone = $this->get_zone( $request->get_param( 'id' ) ); + + if ( is_wp_error( $zone ) ) { + return $zone; + } + + $force = $request['force']; + + $response = $this->get_item( $request ); + + if ( $force ) { + $zone->delete(); + } else { + return new WP_Error( 'rest_trash_not_supported', __( 'Shipping zones do not support trashing.', 'woocommerce' ), array( 'status' => 501 ) ); + } + + return $response; + } + + /** + * Prepare the Shipping Zone for the REST response. + * + * @param array $item Shipping Zone. + * @param WP_REST_Request $request Request object. + * @return WP_REST_Response $response + */ + public function prepare_item_for_response( $item, $request ) { + $data = array( + 'id' => (int) $item['id'], + 'name' => $item['zone_name'], + 'order' => (int) $item['zone_order'], + ); + + $context = empty( $request['context'] ) ? 'view' : $request['context']; + $data = $this->add_additional_fields_to_object( $data, $request ); + $data = $this->filter_response_by_context( $data, $context ); + + // Wrap the data in a response object. + $response = rest_ensure_response( $data ); + + $response->add_links( $this->prepare_links( $data['id'] ) ); + + return $response; + } + + /** + * Prepare links for the request. + * + * @param int $zone_id Given Shipping Zone ID. + * @return array Links for the given Shipping Zone. + */ + protected function prepare_links( $zone_id ) { + $base = '/' . $this->namespace . '/' . $this->rest_base; + $links = array( + 'self' => array( + 'href' => rest_url( trailingslashit( $base ) . $zone_id ), + ), + 'collection' => array( + 'href' => rest_url( $base ), + ), + 'describedby' => array( + 'href' => rest_url( trailingslashit( $base ) . $zone_id . '/locations' ), + ), + ); + + return $links; + } + + /** + * Get the Shipping Zones schema, conforming to JSON Schema + * + * @return array + */ + public function get_item_schema() { + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => 'shipping_zone', + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'name' => array( + 'description' => __( 'Shipping zone name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'arg_options' => array( + 'sanitize_callback' => 'sanitize_text_field', + ), + ), + 'order' => array( + 'description' => __( 'Shipping zone order.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + ), + ); + + return $this->add_additional_fields_schema( $schema ); + } +} diff --git a/includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php b/includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php new file mode 100644 index 00000000000..fdae2190c8e --- /dev/null +++ b/includes/api/v2/class-wc-rest-system-status-tools-v2-controller.php @@ -0,0 +1,557 @@ +namespace, '/' . $this->rest_base, array( + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_items' ), + 'permission_callback' => array( $this, 'get_items_permissions_check' ), + 'args' => $this->get_collection_params(), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + + register_rest_route( + $this->namespace, '/' . $this->rest_base . '/(?P[\w-]+)', array( + 'args' => array( + 'id' => array( + 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), + 'type' => 'string', + ), + ), + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_item' ), + 'permission_callback' => array( $this, 'get_item_permissions_check' ), + ), + array( + 'methods' => WP_REST_Server::EDITABLE, + 'callback' => array( $this, 'update_item' ), + 'permission_callback' => array( $this, 'update_item_permissions_check' ), + 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + } + + /** + * Check whether a given request has permission to view system status tools. + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_Error|boolean + */ + public function get_items_permissions_check( $request ) { + if ( ! wc_rest_check_manager_permissions( 'system_status', 'read' ) ) { + return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot list resources.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); + } + return true; + } + + /** + * Check whether a given request has permission to view a specific system status tool. + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_Error|boolean + */ + public function get_item_permissions_check( $request ) { + if ( ! wc_rest_check_manager_permissions( 'system_status', 'read' ) ) { + return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot view this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); + } + return true; + } + + /** + * Check whether a given request has permission to execute a specific system status tool. + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_Error|boolean + */ + public function update_item_permissions_check( $request ) { + if ( ! wc_rest_check_manager_permissions( 'system_status', 'edit' ) ) { + return new WP_Error( 'woocommerce_rest_cannot_update', __( 'Sorry, you cannot update resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); + } + return true; + } + + /** + * A list of available tools for use in the system status section. + * 'button' becomes 'action' in the API. + * + * @return array + */ + public function get_tools() { + $tools = array( + 'clear_transients' => array( + 'name' => __( 'WooCommerce transients', 'woocommerce' ), + 'button' => __( 'Clear transients', 'woocommerce' ), + 'desc' => __( 'This tool will clear the product/shop transients cache.', 'woocommerce' ), + ), + 'clear_expired_transients' => array( + 'name' => __( 'Expired transients', 'woocommerce' ), + 'button' => __( 'Clear transients', 'woocommerce' ), + 'desc' => __( 'This tool will clear ALL expired transients from WordPress.', 'woocommerce' ), + ), + 'delete_orphaned_variations' => array( + 'name' => __( 'Orphaned variations', 'woocommerce' ), + 'button' => __( 'Delete orphaned variations', 'woocommerce' ), + 'desc' => __( 'This tool will delete all variations which have no parent.', 'woocommerce' ), + ), + 'clear_expired_download_permissions' => array( + 'name' => __( 'Used-up download permissions', 'woocommerce' ), + 'button' => __( 'Clean up download permissions', 'woocommerce' ), + 'desc' => __( 'This tool will delete expired download permissions and permissions with 0 remaining downloads.', 'woocommerce' ), + ), + 'add_order_indexes' => array( + 'name' => __( 'Order address indexes', 'woocommerce' ), + 'button' => __( 'Index orders', 'woocommerce' ), + 'desc' => __( 'This tool will add address indexes to orders that do not have them yet. This improves order search results.', 'woocommerce' ), + ), + 'recount_terms' => array( + 'name' => __( 'Term counts', 'woocommerce' ), + 'button' => __( 'Recount terms', 'woocommerce' ), + 'desc' => __( 'This tool will recount product terms - useful when changing your settings in a way which hides products from the catalog.', 'woocommerce' ), + ), + 'reset_roles' => array( + 'name' => __( 'Capabilities', 'woocommerce' ), + 'button' => __( 'Reset capabilities', 'woocommerce' ), + 'desc' => __( 'This tool will reset the admin, customer and shop_manager roles to default. Use this if your users cannot access all of the WooCommerce admin pages.', 'woocommerce' ), + ), + 'clear_sessions' => array( + 'name' => __( 'Clear customer sessions', 'woocommerce' ), + 'button' => __( 'Clear', 'woocommerce' ), + 'desc' => sprintf( + '%1$s %2$s', + __( 'Note:', 'woocommerce' ), + __( 'This tool will delete all customer session data from the database, including current carts and saved carts in the database.', 'woocommerce' ) + ), + ), + 'install_pages' => array( + 'name' => __( 'Create default WooCommerce pages', 'woocommerce' ), + 'button' => __( 'Create pages', 'woocommerce' ), + 'desc' => sprintf( + '%1$s %2$s', + __( 'Note:', 'woocommerce' ), + __( 'This tool will install all the missing WooCommerce pages. Pages already defined and set up will not be replaced.', 'woocommerce' ) + ), + ), + 'delete_taxes' => array( + 'name' => __( 'Delete WooCommerce tax rates', 'woocommerce' ), + 'button' => __( 'Delete tax rates', 'woocommerce' ), + 'desc' => sprintf( + '%1$s %2$s', + __( 'Note:', 'woocommerce' ), + __( 'This option will delete ALL of your tax rates, use with caution. This action cannot be reversed.', 'woocommerce' ) + ), + ), + 'reset_tracking' => array( + 'name' => __( 'Reset usage tracking', 'woocommerce' ), + 'button' => __( 'Reset', 'woocommerce' ), + 'desc' => __( 'This will reset your usage tracking settings, causing it to show the opt-in banner again and not sending any data.', 'woocommerce' ), + ), + 'regenerate_thumbnails' => array( + 'name' => __( 'Regenerate shop thumbnails', 'woocommerce' ), + 'button' => __( 'Regenerate', 'woocommerce' ), + 'desc' => __( 'This will regenerate all shop thumbnails to match your theme and/or image settings.', 'woocommerce' ), + ), + ); + + // Jetpack does the image resizing heavy lifting so you don't have to. + if ( ( class_exists( 'Jetpack' ) && Jetpack::is_module_active( 'photon' ) ) || ! apply_filters( 'woocommerce_background_image_regeneration', true ) ) { + unset( $tools['regenerate_thumbnails'] ); + } + + return apply_filters( 'woocommerce_debug_tools', $tools ); + } + + /** + * Get a list of system status tools. + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_Error|WP_REST_Response + */ + public function get_items( $request ) { + $tools = array(); + foreach ( $this->get_tools() as $id => $tool ) { + $tools[] = $this->prepare_response_for_collection( + $this->prepare_item_for_response( + array( + 'id' => $id, + 'name' => $tool['name'], + 'action' => $tool['button'], + 'description' => $tool['desc'], + ), $request + ) + ); + } + + $response = rest_ensure_response( $tools ); + return $response; + } + + /** + * Return a single tool. + * + * @param WP_REST_Request $request Request data. + * @return WP_Error|WP_REST_Response + */ + public function get_item( $request ) { + $tools = $this->get_tools(); + if ( empty( $tools[ $request['id'] ] ) ) { + return new WP_Error( 'woocommerce_rest_system_status_tool_invalid_id', __( 'Invalid tool ID.', 'woocommerce' ), array( 'status' => 404 ) ); + } + $tool = $tools[ $request['id'] ]; + return rest_ensure_response( + $this->prepare_item_for_response( + array( + 'id' => $request['id'], + 'name' => $tool['name'], + 'action' => $tool['button'], + 'description' => $tool['desc'], + ), $request + ) + ); + } + + /** + * Update (execute) a tool. + * + * @param WP_REST_Request $request Request data. + * @return WP_Error|WP_REST_Response + */ + public function update_item( $request ) { + $tools = $this->get_tools(); + if ( empty( $tools[ $request['id'] ] ) ) { + return new WP_Error( 'woocommerce_rest_system_status_tool_invalid_id', __( 'Invalid tool ID.', 'woocommerce' ), array( 'status' => 404 ) ); + } + + $tool = $tools[ $request['id'] ]; + $tool = array( + 'id' => $request['id'], + 'name' => $tool['name'], + 'action' => $tool['button'], + 'description' => $tool['desc'], + ); + + $execute_return = $this->execute_tool( $request['id'] ); + $tool = array_merge( $tool, $execute_return ); + + /** + * Fires after a WooCommerce REST system status tool has been executed. + * + * @param array $tool Details about the tool that has been executed. + * @param WP_REST_Request $request The current WP_REST_Request object. + */ + do_action( 'woocommerce_rest_insert_system_status_tool', $tool, $request ); + + $request->set_param( 'context', 'edit' ); + $response = $this->prepare_item_for_response( $tool, $request ); + return rest_ensure_response( $response ); + } + + /** + * Prepare a tool item for serialization. + * + * @param array $item Object. + * @param WP_REST_Request $request Request object. + * @return WP_REST_Response $response Response data. + */ + public function prepare_item_for_response( $item, $request ) { + $context = empty( $request['context'] ) ? 'view' : $request['context']; + $data = $this->add_additional_fields_to_object( $item, $request ); + $data = $this->filter_response_by_context( $data, $context ); + + $response = rest_ensure_response( $data ); + + $response->add_links( $this->prepare_links( $item['id'] ) ); + + return $response; + } + + /** + * Get the system status tools schema, conforming to JSON Schema. + * + * @return array + */ + public function get_item_schema() { + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => 'system_status_tool', + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'A unique identifier for the tool.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'arg_options' => array( + 'sanitize_callback' => 'sanitize_title', + ), + ), + 'name' => array( + 'description' => __( 'Tool name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'arg_options' => array( + 'sanitize_callback' => 'sanitize_text_field', + ), + ), + 'action' => array( + 'description' => __( 'What running the tool will do.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'arg_options' => array( + 'sanitize_callback' => 'sanitize_text_field', + ), + ), + 'description' => array( + 'description' => __( 'Tool description.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'arg_options' => array( + 'sanitize_callback' => 'sanitize_text_field', + ), + ), + 'success' => array( + 'description' => __( 'Did the tool run successfully?', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'edit' ), + ), + 'message' => array( + 'description' => __( 'Tool return message.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'edit' ), + 'arg_options' => array( + 'sanitize_callback' => 'sanitize_text_field', + ), + ), + ), + ); + + return $this->add_additional_fields_schema( $schema ); + } + + /** + * Prepare links for the request. + * + * @param string $id ID. + * @return array + */ + protected function prepare_links( $id ) { + $base = '/' . $this->namespace . '/' . $this->rest_base; + $links = array( + 'item' => array( + 'href' => rest_url( trailingslashit( $base ) . $id ), + 'embeddable' => true, + ), + ); + + return $links; + } + + /** + * Get any query params needed. + * + * @return array + */ + public function get_collection_params() { + return array( + 'context' => $this->get_context_param( array( 'default' => 'view' ) ), + ); + } + + /** + * Actually executes a tool. + * + * @param string $tool Tool. + * @return array + */ + public function execute_tool( $tool ) { + global $wpdb; + $ran = true; + switch ( $tool ) { + case 'clear_transients': + wc_delete_product_transients(); + wc_delete_shop_order_transients(); + WC_Cache_Helper::get_transient_version( 'shipping', true ); + $message = __( 'Product transients cleared', 'woocommerce' ); + break; + + case 'clear_expired_transients': + /* translators: %d: amount of expired transients */ + $message = sprintf( __( '%d transients rows cleared', 'woocommerce' ), wc_delete_expired_transients() ); + break; + + case 'delete_orphaned_variations': + // Delete orphans. + $result = absint( + $wpdb->query( + "DELETE products + FROM {$wpdb->posts} products + LEFT JOIN {$wpdb->posts} wp ON wp.ID = products.post_parent + WHERE wp.ID IS NULL AND products.post_type = 'product_variation';" + ) + ); + /* translators: %d: amount of orphaned variations */ + $message = sprintf( __( '%d orphaned variations deleted', 'woocommerce' ), $result ); + break; + + case 'clear_expired_download_permissions': + // Delete expired download permissions and ones with 0 downloads remaining. + $result = absint( + $wpdb->query( + $wpdb->prepare( + "DELETE FROM {$wpdb->prefix}woocommerce_downloadable_product_permissions + WHERE ( downloads_remaining != '' AND downloads_remaining = 0 ) OR ( access_expires IS NOT NULL AND access_expires < %s )", + date( 'Y-m-d', current_time( 'timestamp' ) ) + ) + ) + ); + /* translators: %d: amount of permissions */ + $message = sprintf( __( '%d permissions deleted', 'woocommerce' ), $result ); + break; + + case 'add_order_indexes': + /* + * Add billing and shipping address indexes containing the customer name for orders + * that don't have address indexes yet. + */ + $sql = "INSERT INTO {$wpdb->postmeta}( post_id, meta_key, meta_value ) + SELECT post_id, '%s', GROUP_CONCAT( meta_value SEPARATOR ' ' ) + FROM {$wpdb->postmeta} + WHERE meta_key IN ( '%s', '%s' ) + AND post_id IN ( SELECT DISTINCT post_id FROM {$wpdb->postmeta} + WHERE post_id NOT IN ( SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key='%s' ) + AND post_id IN ( SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key='%s' ) ) + GROUP BY post_id"; + $rows = $wpdb->query( $wpdb->prepare( $sql, '_billing_address_index', '_billing_first_name', '_billing_last_name', '_billing_address_index', '_billing_last_name' ) ); // WPCS: unprepared SQL ok. + $rows += $wpdb->query( $wpdb->prepare( $sql, '_shipping_address_index', '_shipping_first_name', '_shipping_last_name', '_shipping_address_index', '_shipping_last_name' ) ); // WPCS: unprepared SQL ok. + + /* translators: %d: amount of indexes */ + $message = sprintf( __( '%d indexes added', 'woocommerce' ), $rows ); + break; + + case 'reset_roles': + // Remove then re-add caps and roles. + WC_Install::remove_roles(); + WC_Install::create_roles(); + $message = __( 'Roles successfully reset', 'woocommerce' ); + break; + + case 'recount_terms': + $product_cats = get_terms( + 'product_cat', array( + 'hide_empty' => false, + 'fields' => 'id=>parent', + ) + ); + _wc_term_recount( $product_cats, get_taxonomy( 'product_cat' ), true, false ); + $product_tags = get_terms( + 'product_tag', array( + 'hide_empty' => false, + 'fields' => 'id=>parent', + ) + ); + _wc_term_recount( $product_tags, get_taxonomy( 'product_tag' ), true, false ); + $message = __( 'Terms successfully recounted', 'woocommerce' ); + break; + + case 'clear_sessions': + $wpdb->query( "TRUNCATE {$wpdb->prefix}woocommerce_sessions" ); + $result = absint( $wpdb->query( "DELETE FROM {$wpdb->usermeta} WHERE meta_key='_woocommerce_persistent_cart_" . get_current_blog_id() . "';" ) ); // WPCS: unprepared SQL ok. + wp_cache_flush(); + /* translators: %d: amount of sessions */ + $message = sprintf( __( 'Deleted all active sessions, and %d saved carts.', 'woocommerce' ), absint( $result ) ); + break; + + case 'install_pages': + WC_Install::create_pages(); + $message = __( 'All missing WooCommerce pages successfully installed', 'woocommerce' ); + break; + + case 'delete_taxes': + $wpdb->query( "TRUNCATE TABLE {$wpdb->prefix}woocommerce_tax_rates;" ); + $wpdb->query( "TRUNCATE TABLE {$wpdb->prefix}woocommerce_tax_rate_locations;" ); + WC_Cache_Helper::incr_cache_prefix( 'taxes' ); + $message = __( 'Tax rates successfully deleted', 'woocommerce' ); + break; + + case 'reset_tracking': + if ( ! class_exists( 'WC_Tracker' ) ) { + include_once WC_ABSPATH . 'includes/class-wc-tracker.php'; + } + WC_Tracker::opt_out_request(); + delete_option( 'woocommerce_allow_tracking' ); + WC_Admin_Notices::add_notice( 'tracking' ); + $message = __( 'Usage tracking settings successfully reset.', 'woocommerce' ); + break; + + case 'regenerate_thumbnails': + WC_Regenerate_Images::queue_image_regeneration(); + $message = __( 'Thumbnail regeneration has been scheduled to run in the background.', 'woocommerce' ); + break; + + default: + $tools = $this->get_tools(); + if ( isset( $tools[ $tool ]['callback'] ) ) { + $callback = $tools[ $tool ]['callback']; + $return = call_user_func( $callback ); + if ( is_string( $return ) ) { + $message = $return; + } elseif ( false === $return ) { + $callback_string = is_array( $callback ) ? get_class( $callback[0] ) . '::' . $callback[1] : $callback; + $ran = false; + /* translators: %s: callback string */ + $message = sprintf( __( 'There was an error calling %s', 'woocommerce' ), $callback_string ); + } else { + $message = __( 'Tool ran.', 'woocommerce' ); + } + } else { + $ran = false; + $message = __( 'There was an error calling this tool. There is no callback present.', 'woocommerce' ); + } + break; + } + + return array( + 'success' => $ran, + 'message' => $message, + ); + } +} diff --git a/includes/api/v2/class-wc-rest-system-status-v2-controller.php b/includes/api/v2/class-wc-rest-system-status-v2-controller.php new file mode 100644 index 00000000000..c891c9adb3f --- /dev/null +++ b/includes/api/v2/class-wc-rest-system-status-v2-controller.php @@ -0,0 +1,1067 @@ +namespace, '/' . $this->rest_base, + array( + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_items' ), + 'permission_callback' => array( $this, 'get_items_permissions_check' ), + 'args' => $this->get_collection_params(), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + } + + /** + * Check whether a given request has permission to view system status. + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_Error|boolean + */ + public function get_items_permissions_check( $request ) { + if ( ! wc_rest_check_manager_permissions( 'system_status', 'read' ) ) { + return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot list resources.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); + } + return true; + } + + /** + * Get a system status info, by section. + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_Error|WP_REST_Response + */ + public function get_items( $request ) { + $schema = $this->get_item_schema(); + $mappings = $this->get_item_mappings(); + $response = array(); + + foreach ( $mappings as $section => $values ) { + foreach ( $values as $key => $value ) { + if ( isset( $schema['properties'][ $section ]['properties'][ $key ]['type'] ) ) { + settype( $values[ $key ], $schema['properties'][ $section ]['properties'][ $key ]['type'] ); + } + } + settype( $values, $schema['properties'][ $section ]['type'] ); + $response[ $section ] = $values; + } + + $response = $this->prepare_item_for_response( $response, $request ); + + return rest_ensure_response( $response ); + } + + /** + * Get the system status schema, conforming to JSON Schema. + * + * @return array + */ + public function get_item_schema() { + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => 'system_status', + 'type' => 'object', + 'properties' => array( + 'environment' => array( + 'description' => __( 'Environment.', 'woocommerce' ), + 'type' => 'object', + 'context' => array( 'view' ), + 'readonly' => true, + 'properties' => array( + 'home_url' => array( + 'description' => __( 'Home URL.', 'woocommerce' ), + 'type' => 'string', + 'format' => 'uri', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'site_url' => array( + 'description' => __( 'Site URL.', 'woocommerce' ), + 'type' => 'string', + 'format' => 'uri', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'wc_version' => array( + 'description' => __( 'WooCommerce version.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'log_directory' => array( + 'description' => __( 'Log directory.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'log_directory_writable' => array( + 'description' => __( 'Is log directory writable?', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'wp_version' => array( + 'description' => __( 'WordPress version.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'wp_multisite' => array( + 'description' => __( 'Is WordPress multisite?', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'wp_memory_limit' => array( + 'description' => __( 'WordPress memory limit.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'wp_debug_mode' => array( + 'description' => __( 'Is WordPress debug mode active?', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'wp_cron' => array( + 'description' => __( 'Are WordPress cron jobs enabled?', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'language' => array( + 'description' => __( 'WordPress language.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'server_info' => array( + 'description' => __( 'Server info.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'php_version' => array( + 'description' => __( 'PHP version.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'php_post_max_size' => array( + 'description' => __( 'PHP post max size.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'php_max_execution_time' => array( + 'description' => __( 'PHP max execution time.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'php_max_input_vars' => array( + 'description' => __( 'PHP max input vars.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'curl_version' => array( + 'description' => __( 'cURL version.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'suhosin_installed' => array( + 'description' => __( 'Is SUHOSIN installed?', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'max_upload_size' => array( + 'description' => __( 'Max upload size.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'mysql_version' => array( + 'description' => __( 'MySQL version.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'default_timezone' => array( + 'description' => __( 'Default timezone.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'fsockopen_or_curl_enabled' => array( + 'description' => __( 'Is fsockopen/cURL enabled?', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'soapclient_enabled' => array( + 'description' => __( 'Is SoapClient class enabled?', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'domdocument_enabled' => array( + 'description' => __( 'Is DomDocument class enabled?', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'gzip_enabled' => array( + 'description' => __( 'Is GZip enabled?', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'mbstring_enabled' => array( + 'description' => __( 'Is mbstring enabled?', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'remote_post_successful' => array( + 'description' => __( 'Remote POST successful?', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'remote_post_response' => array( + 'description' => __( 'Remote POST response.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'remote_get_successful' => array( + 'description' => __( 'Remote GET successful?', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'remote_get_response' => array( + 'description' => __( 'Remote GET response.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + ), + ), + 'database' => array( + 'description' => __( 'Database.', 'woocommerce' ), + 'type' => 'object', + 'context' => array( 'view' ), + 'readonly' => true, + 'properties' => array( + 'wc_database_version' => array( + 'description' => __( 'WC database version.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'database_prefix' => array( + 'description' => __( 'Database prefix.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'maxmind_geoip_database' => array( + 'description' => __( 'MaxMind GeoIP database.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'database_tables' => array( + 'description' => __( 'Database tables.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view' ), + 'readonly' => true, + 'items' => array( + 'type' => 'string', + ), + ), + ), + ), + 'active_plugins' => array( + 'description' => __( 'Active plugins.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view' ), + 'readonly' => true, + 'items' => array( + 'type' => 'string', + ), + ), + 'theme' => array( + 'description' => __( 'Theme.', 'woocommerce' ), + 'type' => 'object', + 'context' => array( 'view' ), + 'readonly' => true, + 'properties' => array( + 'name' => array( + 'description' => __( 'Theme name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'version' => array( + 'description' => __( 'Theme version.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'version_latest' => array( + 'description' => __( 'Latest version of theme.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'author_url' => array( + 'description' => __( 'Theme author URL.', 'woocommerce' ), + 'type' => 'string', + 'format' => 'uri', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'is_child_theme' => array( + 'description' => __( 'Is this theme a child theme?', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'has_woocommerce_support' => array( + 'description' => __( 'Does the theme declare WooCommerce support?', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'has_woocommerce_file' => array( + 'description' => __( 'Does the theme have a woocommerce.php file?', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'has_outdated_templates' => array( + 'description' => __( 'Does this theme have outdated templates?', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'overrides' => array( + 'description' => __( 'Template overrides.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view' ), + 'readonly' => true, + 'items' => array( + 'type' => 'string', + ), + ), + 'parent_name' => array( + 'description' => __( 'Parent theme name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'parent_version' => array( + 'description' => __( 'Parent theme version.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'parent_author_url' => array( + 'description' => __( 'Parent theme author URL.', 'woocommerce' ), + 'type' => 'string', + 'format' => 'uri', + 'context' => array( 'view' ), + 'readonly' => true, + ), + ), + ), + 'settings' => array( + 'description' => __( 'Settings.', 'woocommerce' ), + 'type' => 'object', + 'context' => array( 'view' ), + 'readonly' => true, + 'properties' => array( + 'api_enabled' => array( + 'description' => __( 'REST API enabled?', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'force_ssl' => array( + 'description' => __( 'SSL forced?', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'currency' => array( + 'description' => __( 'Currency.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'currency_symbol' => array( + 'description' => __( 'Currency symbol.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'currency_position' => array( + 'description' => __( 'Currency position.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'thousand_separator' => array( + 'description' => __( 'Thousand separator.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'decimal_separator' => array( + 'description' => __( 'Decimal separator.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'number_of_decimals' => array( + 'description' => __( 'Number of decimals.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'geolocation_enabled' => array( + 'description' => __( 'Geolocation enabled?', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'taxonomies' => array( + 'description' => __( 'Taxonomy terms for product/order statuses.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view' ), + 'readonly' => true, + 'items' => array( + 'type' => 'string', + ), + ), + 'product_visibility_terms' => array( + 'description' => __( 'Terms in the product visibility taxonomy.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view' ), + 'readonly' => true, + 'items' => array( + 'type' => 'string', + ), + ), + ), + ), + 'security' => array( + 'description' => __( 'Security.', 'woocommerce' ), + 'type' => 'object', + 'context' => array( 'view' ), + 'readonly' => true, + 'properties' => array( + 'secure_connection' => array( + 'description' => __( 'Is the connection to your store secure?', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'hide_errors' => array( + 'description' => __( 'Hide errors from visitors?', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view' ), + 'readonly' => true, + ), + ), + ), + 'pages' => array( + 'description' => __( 'WooCommerce pages.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view' ), + 'readonly' => true, + 'items' => array( + 'type' => 'string', + ), + ), + ), + ); + + return $this->add_additional_fields_schema( $schema ); + } + + /** + * Return an array of sections and the data associated with each. + * + * @return array + */ + public function get_item_mappings() { + return array( + 'environment' => $this->get_environment_info(), + 'database' => $this->get_database_info(), + 'active_plugins' => $this->get_active_plugins(), + 'theme' => $this->get_theme_info(), + 'settings' => $this->get_settings(), + 'security' => $this->get_security_info(), + 'pages' => $this->get_pages(), + ); + } + + /** + * Get array of environment information. Includes thing like software + * versions, and various server settings. + * + * @return array + */ + public function get_environment_info() { + global $wpdb; + + // Figure out cURL version, if installed. + $curl_version = ''; + if ( function_exists( 'curl_version' ) ) { + $curl_version = curl_version(); + $curl_version = $curl_version['version'] . ', ' . $curl_version['ssl_version']; + } + + // WP memory limit. + $wp_memory_limit = wc_let_to_num( WP_MEMORY_LIMIT ); + if ( function_exists( 'memory_get_usage' ) ) { + $wp_memory_limit = max( $wp_memory_limit, wc_let_to_num( @ini_get( 'memory_limit' ) ) ); + } + + // Test POST requests. + $post_response = wp_safe_remote_post( + 'https://www.paypal.com/cgi-bin/webscr', + array( + 'timeout' => 10, + 'user-agent' => 'WooCommerce/' . WC()->version, + 'httpversion' => '1.1', + 'body' => array( + 'cmd' => '_notify-validate', + ), + ) + ); + $post_response_successful = false; + if ( ! is_wp_error( $post_response ) && $post_response['response']['code'] >= 200 && $post_response['response']['code'] < 300 ) { + $post_response_successful = true; + } + + // Test GET requests. + $get_response = wp_safe_remote_get( 'https://woocommerce.com/wc-api/product-key-api?request=ping&network=' . ( is_multisite() ? '1' : '0' ) ); + $get_response_successful = false; + if ( ! is_wp_error( $post_response ) && $post_response['response']['code'] >= 200 && $post_response['response']['code'] < 300 ) { + $get_response_successful = true; + } + + // Return all environment info. Described by JSON Schema. + return array( + 'home_url' => get_option( 'home' ), + 'site_url' => get_option( 'siteurl' ), + 'version' => WC()->version, + 'log_directory' => WC_LOG_DIR, + 'log_directory_writable' => (bool) @fopen( WC_LOG_DIR . 'test-log.log', 'a' ), + 'wp_version' => get_bloginfo( 'version' ), + 'wp_multisite' => is_multisite(), + 'wp_memory_limit' => $wp_memory_limit, + 'wp_debug_mode' => ( defined( 'WP_DEBUG' ) && WP_DEBUG ), + 'wp_cron' => ! ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON ), + 'language' => get_locale(), + 'external_object_cache' => wp_using_ext_object_cache(), + 'server_info' => isset( $_SERVER['SERVER_SOFTWARE'] ) ? wc_clean( wp_unslash( $_SERVER['SERVER_SOFTWARE'] ) ) : '', + 'php_version' => phpversion(), + 'php_post_max_size' => wc_let_to_num( ini_get( 'post_max_size' ) ), + 'php_max_execution_time' => ini_get( 'max_execution_time' ), + 'php_max_input_vars' => ini_get( 'max_input_vars' ), + 'curl_version' => $curl_version, + 'suhosin_installed' => extension_loaded( 'suhosin' ), + 'max_upload_size' => wp_max_upload_size(), + 'mysql_version' => ( ! empty( $wpdb->is_mysql ) ? $wpdb->db_version() : '' ), + 'default_timezone' => date_default_timezone_get(), + 'fsockopen_or_curl_enabled' => ( function_exists( 'fsockopen' ) || function_exists( 'curl_init' ) ), + 'soapclient_enabled' => class_exists( 'SoapClient' ), + 'domdocument_enabled' => class_exists( 'DOMDocument' ), + 'gzip_enabled' => is_callable( 'gzopen' ), + 'mbstring_enabled' => extension_loaded( 'mbstring' ), + 'remote_post_successful' => $post_response_successful, + 'remote_post_response' => ( is_wp_error( $post_response ) ? $post_response->get_error_message() : $post_response['response']['code'] ), + 'remote_get_successful' => $get_response_successful, + 'remote_get_response' => ( is_wp_error( $get_response ) ? $get_response->get_error_message() : $get_response['response']['code'] ), + ); + } + + /** + * Add prefix to table. + * + * @param string $table Table name. + * @return stromg + */ + protected function add_db_table_prefix( $table ) { + global $wpdb; + return $wpdb->prefix . $table; + } + + /** + * Get array of database information. Version, prefix, and table existence. + * + * @return array + */ + public function get_database_info() { + global $wpdb; + + $database_table_sizes = $wpdb->get_results( + $wpdb->prepare( + "SELECT + table_name AS 'name', + round( ( data_length / 1024 / 1024 ), 2 ) 'data', + round( ( index_length / 1024 / 1024 ), 2 ) 'index' + FROM information_schema.TABLES + WHERE table_schema = %s + ORDER BY name ASC;", + DB_NAME + ) + ); + + // WC Core tables to check existence of. + $core_tables = apply_filters( + 'woocommerce_database_tables', + array( + 'woocommerce_sessions', + 'woocommerce_api_keys', + 'woocommerce_attribute_taxonomies', + 'woocommerce_downloadable_product_permissions', + 'woocommerce_order_items', + 'woocommerce_order_itemmeta', + 'woocommerce_tax_rates', + 'woocommerce_tax_rate_locations', + 'woocommerce_shipping_zones', + 'woocommerce_shipping_zone_locations', + 'woocommerce_shipping_zone_methods', + 'woocommerce_payment_tokens', + 'woocommerce_payment_tokenmeta', + 'woocommerce_log', + ) + ); + + if ( get_option( 'db_version' ) < 34370 ) { + $core_tables[] = 'woocommerce_termmeta'; + } + + /** + * Adding the prefix to the tables array, for backwards compatibility. + * + * If we changed the tables above to include the prefix, then any filters against that table could break. + */ + $core_tables = array_map( array( $this, 'add_db_table_prefix' ), $core_tables ); + + /** + * Organize WooCommerce and non-WooCommerce tables separately for display purposes later. + * + * To ensure we include all WC tables, even if they do not exist, pre-populate the WC array with all the tables. + */ + $tables = array( + 'woocommerce' => array_fill_keys( $core_tables, false ), + 'other' => array(), + ); + + $database_size = array( + 'data' => 0, + 'index' => 0, + ); + + foreach ( $database_table_sizes as $table ) { + $table_type = in_array( $table->name, $core_tables ) ? 'woocommerce' : 'other'; + + $tables[ $table_type ][ $table->name ] = array( + 'data' => $table->data, + 'index' => $table->index, + ); + + $database_size['data'] += $table->data; + $database_size['index'] += $table->index; + } + + // Return all database info. Described by JSON Schema. + return array( + 'wc_database_version' => get_option( 'woocommerce_db_version' ), + 'database_prefix' => $wpdb->prefix, + 'maxmind_geoip_database' => WC_Geolocation::get_local_database_path(), + 'database_tables' => $tables, + 'database_size' => $database_size, + ); + } + + /** + * Get array of counts of objects. Orders, products, etc. + * + * @return array + */ + public function get_post_type_counts() { + global $wpdb; + + $post_type_counts = $wpdb->get_results( "SELECT post_type AS 'type', count(1) AS 'count' FROM {$wpdb->posts} GROUP BY post_type;" ); + + return is_array( $post_type_counts ) ? $post_type_counts : array(); + } + + /** + * Get a list of plugins active on the site. + * + * @return array + */ + public function get_active_plugins() { + require_once ABSPATH . 'wp-admin/includes/plugin.php'; + require_once ABSPATH . 'wp-admin/includes/update.php'; + + if ( ! function_exists( 'get_plugin_updates' ) ) { + return array(); + } + + // Get both site plugins and network plugins. + $active_plugins = (array) get_option( 'active_plugins', array() ); + if ( is_multisite() ) { + $network_activated_plugins = array_keys( get_site_option( 'active_sitewide_plugins', array() ) ); + $active_plugins = array_merge( $active_plugins, $network_activated_plugins ); + } + + $active_plugins_data = array(); + $available_updates = get_plugin_updates(); + + foreach ( $active_plugins as $plugin ) { + $data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin ); + $dirname = dirname( $plugin ); + $version_latest = ''; + $slug = explode( '/', $plugin ); + $slug = explode( '.', end( $slug ) ); + $slug = $slug[0]; + + if ( 'woocommerce' !== $slug && ( strstr( $data['PluginURI'], 'woothemes.com' ) || strstr( $data['PluginURI'], 'woocommerce.com' ) ) ) { + $version_data = get_transient( md5( $plugin ) . '_version_data' ); + if ( false === $version_data ) { + $changelog = wp_safe_remote_get( 'http://dzv365zjfbd8v.cloudfront.net/changelogs/' . $dirname . '/changelog.txt' ); + $cl_lines = explode( "\n", wp_remote_retrieve_body( $changelog ) ); + if ( ! empty( $cl_lines ) ) { + foreach ( $cl_lines as $line_num => $cl_line ) { + if ( preg_match( '/^[0-9]/', $cl_line ) ) { + $date = str_replace( '.', '-', trim( substr( $cl_line, 0, strpos( $cl_line, '-' ) ) ) ); + $version = preg_replace( '~[^0-9,.]~', '', stristr( $cl_line, 'version' ) ); + $update = trim( str_replace( '*', '', $cl_lines[ $line_num + 1 ] ) ); + $version_data = array( + 'date' => $date, + 'version' => $version, + 'update' => $update, + 'changelog' => $changelog, + ); + set_transient( md5( $plugin ) . '_version_data', $version_data, DAY_IN_SECONDS ); + break; + } + } + } + } + $version_latest = $version_data['version']; + } elseif ( isset( $available_updates[ $plugin ]->update->new_version ) ) { + $version_latest = $available_updates[ $plugin ]->update->new_version; + } + + // convert plugin data to json response format. + $active_plugins_data[] = array( + 'plugin' => $plugin, + 'name' => $data['Name'], + 'version' => $data['Version'], + 'version_latest' => $version_latest, + 'url' => $data['PluginURI'], + 'author_name' => $data['AuthorName'], + 'author_url' => esc_url_raw( $data['AuthorURI'] ), + 'network_activated' => $data['Network'], + ); + } + + return $active_plugins_data; + } + + /** + * Get info on the current active theme, info on parent theme (if presnet) + * and a list of template overrides. + * + * @return array + */ + public function get_theme_info() { + $active_theme = wp_get_theme(); + + // Get parent theme info if this theme is a child theme, otherwise + // pass empty info in the response. + if ( is_child_theme() ) { + $parent_theme = wp_get_theme( $active_theme->template ); + $parent_theme_info = array( + 'parent_name' => $parent_theme->name, + 'parent_version' => $parent_theme->version, + 'parent_version_latest' => WC_Admin_Status::get_latest_theme_version( $parent_theme ), + 'parent_author_url' => $parent_theme->{'Author URI'}, + ); + } else { + $parent_theme_info = array( + 'parent_name' => '', + 'parent_version' => '', + 'parent_version_latest' => '', + 'parent_author_url' => '', + ); + } + + /** + * Scan the theme directory for all WC templates to see if our theme + * overrides any of them. + */ + $override_files = array(); + $outdated_templates = false; + $scan_files = WC_Admin_Status::scan_template_files( WC()->plugin_path() . '/templates/' ); + foreach ( $scan_files as $file ) { + $located = apply_filters( 'wc_get_template', $file, $file, array(), WC()->template_path(), WC()->plugin_path() . '/templates/' ); + + if ( file_exists( $located ) ) { + $theme_file = $located; + } elseif ( file_exists( get_stylesheet_directory() . '/' . $file ) ) { + $theme_file = get_stylesheet_directory() . '/' . $file; + } elseif ( file_exists( get_stylesheet_directory() . '/' . WC()->template_path() . $file ) ) { + $theme_file = get_stylesheet_directory() . '/' . WC()->template_path() . $file; + } elseif ( file_exists( get_template_directory() . '/' . $file ) ) { + $theme_file = get_template_directory() . '/' . $file; + } elseif ( file_exists( get_template_directory() . '/' . WC()->template_path() . $file ) ) { + $theme_file = get_template_directory() . '/' . WC()->template_path() . $file; + } else { + $theme_file = false; + } + + if ( ! empty( $theme_file ) ) { + $core_version = WC_Admin_Status::get_file_version( WC()->plugin_path() . '/templates/' . $file ); + $theme_version = WC_Admin_Status::get_file_version( $theme_file ); + if ( $core_version && ( empty( $theme_version ) || version_compare( $theme_version, $core_version, '<' ) ) ) { + if ( ! $outdated_templates ) { + $outdated_templates = true; + } + } + $override_files[] = array( + 'file' => str_replace( WP_CONTENT_DIR . '/themes/', '', $theme_file ), + 'version' => $theme_version, + 'core_version' => $core_version, + ); + } + } + + $active_theme_info = array( + 'name' => $active_theme->name, + 'version' => $active_theme->version, + 'version_latest' => WC_Admin_Status::get_latest_theme_version( $active_theme ), + 'author_url' => esc_url_raw( $active_theme->{'Author URI'} ), + 'is_child_theme' => is_child_theme(), + 'has_woocommerce_support' => current_theme_supports( 'woocommerce' ), + 'has_woocommerce_file' => ( file_exists( get_stylesheet_directory() . '/woocommerce.php' ) || file_exists( get_template_directory() . '/woocommerce.php' ) ), + 'has_outdated_templates' => $outdated_templates, + 'overrides' => $override_files, + ); + + return array_merge( $active_theme_info, $parent_theme_info ); + } + + /** + * Get some setting values for the site that are useful for debugging + * purposes. For full settings access, use the settings api. + * + * @return array + */ + public function get_settings() { + // Get a list of terms used for product/order taxonomies. + $term_response = array(); + $terms = get_terms( 'product_type', array( 'hide_empty' => 0 ) ); + foreach ( $terms as $term ) { + $term_response[ $term->slug ] = strtolower( $term->name ); + } + + // Get a list of terms used for product visibility. + $product_visibility_terms = array(); + $terms = get_terms( 'product_visibility', array( 'hide_empty' => 0 ) ); + foreach ( $terms as $term ) { + $product_visibility_terms[ $term->slug ] = strtolower( $term->name ); + } + + // Return array of useful settings for debugging. + return array( + 'api_enabled' => 'yes' === get_option( 'woocommerce_api_enabled' ), + 'force_ssl' => 'yes' === get_option( 'woocommerce_force_ssl_checkout' ), + 'currency' => get_woocommerce_currency(), + 'currency_symbol' => get_woocommerce_currency_symbol(), + 'currency_position' => get_option( 'woocommerce_currency_pos' ), + 'thousand_separator' => wc_get_price_thousand_separator(), + 'decimal_separator' => wc_get_price_decimal_separator(), + 'number_of_decimals' => wc_get_price_decimals(), + 'geolocation_enabled' => in_array( get_option( 'woocommerce_default_customer_address' ), array( 'geolocation_ajax', 'geolocation' ) ), + 'taxonomies' => $term_response, + 'product_visibility_terms' => $product_visibility_terms, + ); + } + + /** + * Returns security tips. + * + * @return array + */ + public function get_security_info() { + $check_page = 0 < wc_get_page_id( 'shop' ) ? get_permalink( wc_get_page_id( 'shop' ) ) : get_home_url(); + return array( + 'secure_connection' => 'https' === substr( $check_page, 0, 5 ), + 'hide_errors' => ! ( defined( 'WP_DEBUG' ) && defined( 'WP_DEBUG_DISPLAY' ) && WP_DEBUG && WP_DEBUG_DISPLAY ) || 0 === intval( ini_get( 'display_errors' ) ), + ); + } + + /** + * Returns a mini-report on WC pages and if they are configured correctly: + * Present, visible, and including the correct shortcode. + * + * @return array + */ + public function get_pages() { + // WC pages to check against. + $check_pages = array( + _x( 'Shop base', 'Page setting', 'woocommerce' ) => array( + 'option' => 'woocommerce_shop_page_id', + 'shortcode' => '', + ), + _x( 'Cart', 'Page setting', 'woocommerce' ) => array( + 'option' => 'woocommerce_cart_page_id', + 'shortcode' => '[' . apply_filters( 'woocommerce_cart_shortcode_tag', 'woocommerce_cart' ) . ']', + ), + _x( 'Checkout', 'Page setting', 'woocommerce' ) => array( + 'option' => 'woocommerce_checkout_page_id', + 'shortcode' => '[' . apply_filters( 'woocommerce_checkout_shortcode_tag', 'woocommerce_checkout' ) . ']', + ), + _x( 'My account', 'Page setting', 'woocommerce' ) => array( + 'option' => 'woocommerce_myaccount_page_id', + 'shortcode' => '[' . apply_filters( 'woocommerce_my_account_shortcode_tag', 'woocommerce_my_account' ) . ']', + ), + _x( 'Terms and conditions', 'Page setting', 'woocommerce' ) => array( + 'option' => 'woocommerce_terms_page_id', + 'shortcode' => '', + ), + ); + + $pages_output = array(); + foreach ( $check_pages as $page_name => $values ) { + $page_id = get_option( $values['option'] ); + $page_set = false; + $page_exists = false; + $page_visible = false; + $shortcode_present = false; + $shortcode_required = false; + + // Page checks. + if ( $page_id ) { + $page_set = true; + } + if ( get_post( $page_id ) ) { + $page_exists = true; + } + if ( 'publish' === get_post_status( $page_id ) ) { + $page_visible = true; + } + + // Shortcode checks. + if ( $values['shortcode'] && get_post( $page_id ) ) { + $shortcode_required = true; + $page = get_post( $page_id ); + if ( strstr( $page->post_content, $values['shortcode'] ) ) { + $shortcode_present = true; + } + } + + // Wrap up our findings into an output array. + $pages_output[] = array( + 'page_name' => $page_name, + 'page_id' => $page_id, + 'page_set' => $page_set, + 'page_exists' => $page_exists, + 'page_visible' => $page_visible, + 'shortcode' => $values['shortcode'], + 'shortcode_required' => $shortcode_required, + 'shortcode_present' => $shortcode_present, + ); + } + + return $pages_output; + } + + /** + * Get any query params needed. + * + * @return array + */ + public function get_collection_params() { + return array( + 'context' => $this->get_context_param( array( 'default' => 'view' ) ), + ); + } + + /** + * Prepare the system status response + * + * @param array $system_status System status data. + * @param WP_REST_Request $request Request object. + * @return WP_REST_Response + */ + public function prepare_item_for_response( $system_status, $request ) { + $data = $this->add_additional_fields_to_object( $system_status, $request ); + $data = $this->filter_response_by_context( $data, 'view' ); + + $response = rest_ensure_response( $data ); + + /** + * Filter the system status returned from the REST API. + * + * @param WP_REST_Response $response The response object. + * @param mixed $system_status System status + * @param WP_REST_Request $request Request object. + */ + return apply_filters( 'woocommerce_rest_prepare_system_status', $response, $system_status, $request ); + } +} diff --git a/includes/api/v2/class-wc-rest-tax-classes-v2-controller.php b/includes/api/v2/class-wc-rest-tax-classes-v2-controller.php new file mode 100644 index 00000000000..cab4ad800ba --- /dev/null +++ b/includes/api/v2/class-wc-rest-tax-classes-v2-controller.php @@ -0,0 +1,27 @@ +/deliveries endpoint. + * + * @package WooCommerce/API + * @since 2.6.0 + */ + +defined( 'ABSPATH' ) || exit; + +/** + * REST API Webhook Deliveries controller class. + * + * @deprecated 3.3.0 Webhooks deliveries logs now uses logging system. + * @package WooCommerce/API + * @extends WC_REST_Webhook_Deliveries_V1_Controller + */ +class WC_REST_Webhook_Deliveries_V2_Controller extends WC_REST_Webhook_Deliveries_V1_Controller { + + /** + * Endpoint namespace. + * + * @var string + */ + protected $namespace = 'wc/v2'; + + /** + * Prepare a single webhook delivery output for response. + * + * @param stdClass $log Delivery log object. + * @param WP_REST_Request $request Request object. + * @return WP_REST_Response + */ + public function prepare_item_for_response( $log, $request ) { + $data = (array) $log; + + $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; + $data = $this->add_additional_fields_to_object( $data, $request ); + $data = $this->filter_response_by_context( $data, $context ); + + // Wrap the data in a response object. + $response = rest_ensure_response( $data ); + + $response->add_links( $this->prepare_links( $log ) ); + + /** + * Filter webhook delivery object returned from the REST API. + * + * @param WP_REST_Response $response The response object. + * @param stdClass $log Delivery log object used to create response. + * @param WP_REST_Request $request Request object. + */ + return apply_filters( 'woocommerce_rest_prepare_webhook_delivery', $response, $log, $request ); + } + + /** + * Get the Webhook's schema, conforming to JSON Schema. + * + * @return array + */ + public function get_item_schema() { + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => 'webhook_delivery', + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'duration' => array( + 'description' => __( 'The delivery duration, in seconds.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'summary' => array( + 'description' => __( 'A friendly summary of the response including the HTTP response code, message, and body.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'request_url' => array( + 'description' => __( 'The URL where the webhook was delivered.', 'woocommerce' ), + 'type' => 'string', + 'format' => 'uri', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'request_headers' => array( + 'description' => __( 'Request headers.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view' ), + 'readonly' => true, + 'items' => array( + 'type' => 'string', + ), + ), + 'request_body' => array( + 'description' => __( 'Request body.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'response_code' => array( + 'description' => __( 'The HTTP response code from the receiving server.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'response_message' => array( + 'description' => __( 'The HTTP response message from the receiving server.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'response_headers' => array( + 'description' => __( 'Array of the response headers from the receiving server.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view' ), + 'readonly' => true, + 'items' => array( + 'type' => 'string', + ), + ), + 'response_body' => array( + 'description' => __( 'The response body from the receiving server.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'date_created' => array( + 'description' => __( "The date the webhook delivery was logged, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_created_gmt' => array( + 'description' => __( 'The date the webhook delivery was logged, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + ), + ); + + return $this->add_additional_fields_schema( $schema ); + } +} diff --git a/includes/api/v2/class-wc-rest-webhooks-v2-controller.php b/includes/api/v2/class-wc-rest-webhooks-v2-controller.php new file mode 100644 index 00000000000..b50697913f2 --- /dev/null +++ b/includes/api/v2/class-wc-rest-webhooks-v2-controller.php @@ -0,0 +1,185 @@ +post_type}_invalid_id", __( 'ID is invalid.', 'woocommerce' ), array( 'status' => 400 ) ); + } + + $data = array( + 'id' => $webhook->get_id(), + 'name' => $webhook->get_name(), + 'status' => $webhook->get_status(), + 'topic' => $webhook->get_topic(), + 'resource' => $webhook->get_resource(), + 'event' => $webhook->get_event(), + 'hooks' => $webhook->get_hooks(), + 'delivery_url' => $webhook->get_delivery_url(), + 'date_created' => wc_rest_prepare_date_response( $webhook->get_date_created(), false ), + 'date_created_gmt' => wc_rest_prepare_date_response( $webhook->get_date_created() ), + 'date_modified' => wc_rest_prepare_date_response( $webhook->get_date_modified(), false ), + 'date_modified_gmt' => wc_rest_prepare_date_response( $webhook->get_date_modified() ), + ); + + $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; + $data = $this->add_additional_fields_to_object( $data, $request ); + $data = $this->filter_response_by_context( $data, $context ); + + // Wrap the data in a response object. + $response = rest_ensure_response( $data ); + + $response->add_links( $this->prepare_links( $webhook->get_id(), $request ) ); + + /** + * Filter webhook object returned from the REST API. + * + * @param WP_REST_Response $response The response object. + * @param WC_Webhook $webhook Webhook object used to create response. + * @param WP_REST_Request $request Request object. + */ + return apply_filters( "woocommerce_rest_prepare_{$this->post_type}", $response, $webhook, $request ); + } + + /** + * Get the default REST API version. + * + * @since 3.0.0 + * @return string + */ + protected function get_default_api_version() { + return 'wp_api_v2'; + } + + /** + * Get the Webhook's schema, conforming to JSON Schema. + * + * @return array + */ + public function get_item_schema() { + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => 'webhook', + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'name' => array( + 'description' => __( 'A friendly name for the webhook.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'status' => array( + 'description' => __( 'Webhook status.', 'woocommerce' ), + 'type' => 'string', + 'default' => 'active', + 'enum' => array( 'active', 'paused', 'disabled' ), + 'context' => array( 'view', 'edit' ), + 'arg_options' => array( + 'sanitize_callback' => 'wc_is_webhook_valid_topic', + ), + ), + 'topic' => array( + 'description' => __( 'Webhook topic.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'resource' => array( + 'description' => __( 'Webhook resource.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'event' => array( + 'description' => __( 'Webhook event.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'hooks' => array( + 'description' => __( 'WooCommerce action names associated with the webhook.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + 'items' => array( + 'type' => 'string', + ), + ), + 'delivery_url' => array( + 'description' => __( 'The URL where the webhook payload is delivered.', 'woocommerce' ), + 'type' => 'string', + 'format' => 'uri', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'secret' => array( + 'description' => __( "Secret key used to generate a hash of the delivered webhook and provided in the request headers. This will default to a MD5 hash from the current user's ID|username if not provided.", 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'edit' ), + ), + 'date_created' => array( + 'description' => __( "The date the webhook was created, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_created_gmt' => array( + 'description' => __( 'The date the webhook was created, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_modified' => array( + 'description' => __( "The date the webhook was last modified, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_modified_gmt' => array( + 'description' => __( 'The date the webhook was last modified, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + ), + ); + + return $this->add_additional_fields_schema( $schema ); + } +} From de38097b169e1420c4f43668b5e916ed030ffd92 Mon Sep 17 00:00:00 2001 From: Claudio Sanches Date: Thu, 17 May 2018 11:44:36 +0100 Subject: [PATCH 005/984] Fixed docblock --- includes/api/v2/class-wc-rest-order-notes-v2-controller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/api/v2/class-wc-rest-order-notes-v2-controller.php b/includes/api/v2/class-wc-rest-order-notes-v2-controller.php index 99fed68d523..b7f31d1ea79 100644 --- a/includes/api/v2/class-wc-rest-order-notes-v2-controller.php +++ b/includes/api/v2/class-wc-rest-order-notes-v2-controller.php @@ -14,7 +14,7 @@ defined( 'ABSPATH' ) || exit; * REST API Order Notes controller class. * * @package WooCommerce/API - * @extends WC_REST_ControllerWC_REST_Order_Notes_V1_Controller + * @extends WC_REST_Order_Notes_V1_Controller */ class WC_REST_Order_Notes_V2_Controller extends WC_REST_Order_Notes_V1_Controller { From f02e4e3088d732b070e3fa18e6ab6f8676aabdff Mon Sep 17 00:00:00 2001 From: Claudio Sanches Date: Thu, 17 May 2018 11:44:46 +0100 Subject: [PATCH 006/984] Initial REST API v3 files --- .../api/class-wc-rest-coupons-controller.php | 521 +--- ...-wc-rest-customer-downloads-controller.php | 144 +- .../class-wc-rest-customers-controller.php | 343 +-- ...lass-wc-rest-network-orders-controller.php | 141 +- .../class-wc-rest-order-notes-controller.php | 161 +- ...class-wc-rest-order-refunds-controller.php | 562 +---- .../api/class-wc-rest-orders-controller.php | 1666 +------------ ...ss-wc-rest-payment-gateways-controller.php | 445 +--- ...est-product-attribute-terms-controller.php | 6 +- ...-wc-rest-product-attributes-controller.php | 6 +- ...-wc-rest-product-categories-controller.php | 191 +- ...ass-wc-rest-product-reviews-controller.php | 178 +- ...st-product-shipping-classes-controller.php | 6 +- .../class-wc-rest-product-tags-controller.php | 6 +- ...-wc-rest-product-variations-controller.php | 982 +------- .../api/class-wc-rest-products-controller.php | 2124 +---------------- .../class-wc-rest-report-sales-controller.php | 27 - ...-wc-rest-report-top-sellers-controller.php | 27 - .../api/class-wc-rest-reports-controller.php | 13 +- ...ass-wc-rest-setting-options-controller.php | 562 +---- .../api/class-wc-rest-settings-controller.php | 213 +- ...ss-wc-rest-shipping-methods-controller.php | 210 +- ...est-shipping-zone-locations-controller.php | 173 +- ...-rest-shipping-zone-methods-controller.php | 526 +--- ...lass-wc-rest-shipping-zones-controller.php | 287 +-- ...class-wc-rest-system-status-controller.php | 1046 +------- ...wc-rest-system-status-tools-controller.php | 536 +---- .../class-wc-rest-tax-classes-controller.php | 6 +- .../api/class-wc-rest-taxes-controller.php | 8 +- ...-wc-rest-webhook-deliveries-controller.php | 153 -- .../api/class-wc-rest-webhooks-controller.php | 164 +- 31 files changed, 106 insertions(+), 11327 deletions(-) delete mode 100644 includes/api/class-wc-rest-report-sales-controller.php delete mode 100644 includes/api/class-wc-rest-report-top-sellers-controller.php delete mode 100644 includes/api/class-wc-rest-webhook-deliveries-controller.php diff --git a/includes/api/class-wc-rest-coupons-controller.php b/includes/api/class-wc-rest-coupons-controller.php index 1b8c8aad677..6fc216b11e9 100644 --- a/includes/api/class-wc-rest-coupons-controller.php +++ b/includes/api/class-wc-rest-coupons-controller.php @@ -14,529 +14,14 @@ defined( 'ABSPATH' ) || exit; * REST API Coupons controller class. * * @package WooCommerce/API - * @extends WC_REST_CRUD_Controller + * @extends WC_REST_Coupons_V2_Controller */ -class WC_REST_Coupons_Controller extends WC_REST_Legacy_Coupons_Controller { +class WC_REST_Coupons_Controller extends WC_REST_Coupons_V2_Controller { /** * Endpoint namespace. * * @var string */ - protected $namespace = 'wc/v2'; - - /** - * Route base. - * - * @var string - */ - protected $rest_base = 'coupons'; - - /** - * Post type. - * - * @var string - */ - protected $post_type = 'shop_coupon'; - - /** - * Register the routes for coupons. - */ - public function register_routes() { - register_rest_route( - $this->namespace, '/' . $this->rest_base, array( - array( - 'methods' => WP_REST_Server::READABLE, - 'callback' => array( $this, 'get_items' ), - 'permission_callback' => array( $this, 'get_items_permissions_check' ), - 'args' => $this->get_collection_params(), - ), - array( - 'methods' => WP_REST_Server::CREATABLE, - 'callback' => array( $this, 'create_item' ), - 'permission_callback' => array( $this, 'create_item_permissions_check' ), - 'args' => array_merge( - $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ), array( - 'code' => array( - 'description' => __( 'Coupon code.', 'woocommerce' ), - 'required' => true, - 'type' => 'string', - ), - ) - ), - ), - 'schema' => array( $this, 'get_public_item_schema' ), - ) - ); - - register_rest_route( - $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)', array( - 'args' => array( - 'id' => array( - 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), - 'type' => 'integer', - ), - ), - array( - 'methods' => WP_REST_Server::READABLE, - 'callback' => array( $this, 'get_item' ), - 'permission_callback' => array( $this, 'get_item_permissions_check' ), - 'args' => array( - 'context' => $this->get_context_param( array( 'default' => 'view' ) ), - ), - ), - array( - 'methods' => WP_REST_Server::EDITABLE, - 'callback' => array( $this, 'update_item' ), - 'permission_callback' => array( $this, 'update_item_permissions_check' ), - 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), - ), - array( - 'methods' => WP_REST_Server::DELETABLE, - 'callback' => array( $this, 'delete_item' ), - 'permission_callback' => array( $this, 'delete_item_permissions_check' ), - 'args' => array( - 'force' => array( - 'default' => false, - 'type' => 'boolean', - 'description' => __( 'Whether to bypass trash and force deletion.', 'woocommerce' ), - ), - ), - ), - 'schema' => array( $this, 'get_public_item_schema' ), - ) - ); - - register_rest_route( - $this->namespace, '/' . $this->rest_base . '/batch', array( - array( - 'methods' => WP_REST_Server::EDITABLE, - 'callback' => array( $this, 'batch_items' ), - 'permission_callback' => array( $this, 'batch_items_permissions_check' ), - 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), - ), - 'schema' => array( $this, 'get_public_batch_schema' ), - ) - ); - } - - /** - * Get object. - * - * @since 3.0.0 - * @param int $id Object ID. - * @return WC_Data - */ - protected function get_object( $id ) { - return new WC_Coupon( $id ); - } - - /** - * Get formatted item data. - * - * @since 3.0.0 - * @param WC_Data $object WC_Data instance. - * @return array - */ - protected function get_formatted_item_data( $object ) { - $data = $object->get_data(); - - $format_decimal = array( 'amount', 'minimum_amount', 'maximum_amount' ); - $format_date = array( 'date_created', 'date_modified', 'date_expires' ); - $format_null = array( 'usage_limit', 'usage_limit_per_user', 'limit_usage_to_x_items' ); - - // Format decimal values. - foreach ( $format_decimal as $key ) { - $data[ $key ] = wc_format_decimal( $data[ $key ], 2 ); - } - - // Format date values. - foreach ( $format_date as $key ) { - $datetime = $data[ $key ]; - $data[ $key ] = wc_rest_prepare_date_response( $datetime, false ); - $data[ $key . '_gmt' ] = wc_rest_prepare_date_response( $datetime ); - } - - // Format null values. - foreach ( $format_null as $key ) { - $data[ $key ] = $data[ $key ] ? $data[ $key ] : null; - } - - return array( - 'id' => $object->get_id(), - 'code' => $data['code'], - 'amount' => $data['amount'], - 'date_created' => $data['date_created'], - 'date_created_gmt' => $data['date_created_gmt'], - 'date_modified' => $data['date_modified'], - 'date_modified_gmt' => $data['date_modified_gmt'], - 'discount_type' => $data['discount_type'], - 'description' => $data['description'], - 'date_expires' => $data['date_expires'], - 'date_expires_gmt' => $data['date_expires_gmt'], - 'usage_count' => $data['usage_count'], - 'individual_use' => $data['individual_use'], - 'product_ids' => $data['product_ids'], - 'excluded_product_ids' => $data['excluded_product_ids'], - 'usage_limit' => $data['usage_limit'], - 'usage_limit_per_user' => $data['usage_limit_per_user'], - 'limit_usage_to_x_items' => $data['limit_usage_to_x_items'], - 'free_shipping' => $data['free_shipping'], - 'product_categories' => $data['product_categories'], - 'excluded_product_categories' => $data['excluded_product_categories'], - 'exclude_sale_items' => $data['exclude_sale_items'], - 'minimum_amount' => $data['minimum_amount'], - 'maximum_amount' => $data['maximum_amount'], - 'email_restrictions' => $data['email_restrictions'], - 'used_by' => $data['used_by'], - 'meta_data' => $data['meta_data'], - ); - } - - /** - * Prepare a single coupon output for response. - * - * @since 3.0.0 - * @param WC_Data $object Object data. - * @param WP_REST_Request $request Request object. - * @return WP_REST_Response - */ - public function prepare_object_for_response( $object, $request ) { - $data = $this->get_formatted_item_data( $object ); - $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; - $data = $this->add_additional_fields_to_object( $data, $request ); - $data = $this->filter_response_by_context( $data, $context ); - $response = rest_ensure_response( $data ); - $response->add_links( $this->prepare_links( $object, $request ) ); - - /** - * Filter the data for a response. - * - * The dynamic portion of the hook name, $this->post_type, - * refers to object type being prepared for the response. - * - * @param WP_REST_Response $response The response object. - * @param WC_Data $object Object data. - * @param WP_REST_Request $request Request object. - */ - return apply_filters( "woocommerce_rest_prepare_{$this->post_type}_object", $response, $object, $request ); - } - - /** - * Prepare objects query. - * - * @since 3.0.0 - * @param WP_REST_Request $request Full details about the request. - * @return array - */ - protected function prepare_objects_query( $request ) { - $args = parent::prepare_objects_query( $request ); - - if ( ! empty( $request['code'] ) ) { - $id = wc_get_coupon_id_by_code( $request['code'] ); - $args['post__in'] = array( $id ); - } - - // Get only ids. - $args['fields'] = 'ids'; - - return $args; - } - - /** - * Only return writable props from schema. - * - * @param array $schema Schema. - * @return bool - */ - protected function filter_writable_props( $schema ) { - return empty( $schema['readonly'] ); - } - - /** - * Prepare a single coupon for create or update. - * - * @param WP_REST_Request $request Request object. - * @param bool $creating If is creating a new object. - * @return WP_Error|WC_Data - */ - protected function prepare_object_for_database( $request, $creating = false ) { - $id = isset( $request['id'] ) ? absint( $request['id'] ) : 0; - $coupon = new WC_Coupon( $id ); - $schema = $this->get_item_schema(); - $data_keys = array_keys( array_filter( $schema['properties'], array( $this, 'filter_writable_props' ) ) ); - - // Validate required POST fields. - if ( $creating && empty( $request['code'] ) ) { - return new WP_Error( 'woocommerce_rest_empty_coupon_code', sprintf( __( 'The coupon code cannot be empty.', 'woocommerce' ), 'code' ), array( 'status' => 400 ) ); - } - - // Handle all writable props. - foreach ( $data_keys as $key ) { - $value = $request[ $key ]; - - if ( ! is_null( $value ) ) { - switch ( $key ) { - case 'code': - $coupon_code = wc_format_coupon_code( $value ); - $id = $coupon->get_id() ? $coupon->get_id() : 0; - $id_from_code = wc_get_coupon_id_by_code( $coupon_code, $id ); - - if ( $id_from_code ) { - return new WP_Error( 'woocommerce_rest_coupon_code_already_exists', __( 'The coupon code already exists', 'woocommerce' ), array( 'status' => 400 ) ); - } - - $coupon->set_code( $coupon_code ); - break; - case 'meta_data': - if ( is_array( $value ) ) { - foreach ( $value as $meta ) { - $coupon->update_meta_data( $meta['key'], $meta['value'], isset( $meta['id'] ) ? $meta['id'] : '' ); - } - } - break; - case 'description': - $coupon->set_description( wp_filter_post_kses( $value ) ); - break; - default: - if ( is_callable( array( $coupon, "set_{$key}" ) ) ) { - $coupon->{"set_{$key}"}( $value ); - } - break; - } - } - } - - /** - * Filters an object before it is inserted via the REST API. - * - * The dynamic portion of the hook name, `$this->post_type`, - * refers to the object type slug. - * - * @param WC_Data $coupon Object object. - * @param WP_REST_Request $request Request object. - * @param bool $creating If is creating a new object. - */ - return apply_filters( "woocommerce_rest_pre_insert_{$this->post_type}_object", $coupon, $request, $creating ); - } - - /** - * Get the Coupon's schema, conforming to JSON Schema. - * - * @return array - */ - public function get_item_schema() { - $schema = array( - '$schema' => 'http://json-schema.org/draft-04/schema#', - 'title' => $this->post_type, - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Unique identifier for the object.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'code' => array( - 'description' => __( 'Coupon code.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'amount' => array( - 'description' => __( 'The amount of discount. Should always be numeric, even if setting a percentage.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'date_created' => array( - 'description' => __( "The date the coupon was created, in the site's timezone.", 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_created_gmt' => array( - 'description' => __( 'The date the coupon was created, as GMT.', 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_modified' => array( - 'description' => __( "The date the coupon was last modified, in the site's timezone.", 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_modified_gmt' => array( - 'description' => __( 'The date the coupon was last modified, as GMT.', 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'discount_type' => array( - 'description' => __( 'Determines the type of discount that will be applied.', 'woocommerce' ), - 'type' => 'string', - 'default' => 'fixed_cart', - 'enum' => array_keys( wc_get_coupon_types() ), - 'context' => array( 'view', 'edit' ), - ), - 'description' => array( - 'description' => __( 'Coupon description.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'date_expires' => array( - 'description' => __( "The date the coupon expires, in the site's timezone.", 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'date_expires_gmt' => array( - 'description' => __( 'The date the coupon expires, as GMT.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'usage_count' => array( - 'description' => __( 'Number of times the coupon has been used already.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'individual_use' => array( - 'description' => __( 'If true, the coupon can only be used individually. Other applied coupons will be removed from the cart.', 'woocommerce' ), - 'type' => 'boolean', - 'default' => false, - 'context' => array( 'view', 'edit' ), - ), - 'product_ids' => array( - 'description' => __( 'List of product IDs the coupon can be used on.', 'woocommerce' ), - 'type' => 'array', - 'items' => array( - 'type' => 'integer', - ), - 'context' => array( 'view', 'edit' ), - ), - 'excluded_product_ids' => array( - 'description' => __( 'List of product IDs the coupon cannot be used on.', 'woocommerce' ), - 'type' => 'array', - 'items' => array( - 'type' => 'integer', - ), - 'context' => array( 'view', 'edit' ), - ), - 'usage_limit' => array( - 'description' => __( 'How many times the coupon can be used in total.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - ), - 'usage_limit_per_user' => array( - 'description' => __( 'How many times the coupon can be used per customer.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - ), - 'limit_usage_to_x_items' => array( - 'description' => __( 'Max number of items in the cart the coupon can be applied to.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - ), - 'free_shipping' => array( - 'description' => __( 'If true and if the free shipping method requires a coupon, this coupon will enable free shipping.', 'woocommerce' ), - 'type' => 'boolean', - 'default' => false, - 'context' => array( 'view', 'edit' ), - ), - 'product_categories' => array( - 'description' => __( 'List of category IDs the coupon applies to.', 'woocommerce' ), - 'type' => 'array', - 'items' => array( - 'type' => 'integer', - ), - 'context' => array( 'view', 'edit' ), - ), - 'excluded_product_categories' => array( - 'description' => __( 'List of category IDs the coupon does not apply to.', 'woocommerce' ), - 'type' => 'array', - 'items' => array( - 'type' => 'integer', - ), - 'context' => array( 'view', 'edit' ), - ), - 'exclude_sale_items' => array( - 'description' => __( 'If true, this coupon will not be applied to items that have sale prices.', 'woocommerce' ), - 'type' => 'boolean', - 'default' => false, - 'context' => array( 'view', 'edit' ), - ), - 'minimum_amount' => array( - 'description' => __( 'Minimum order amount that needs to be in the cart before coupon applies.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'maximum_amount' => array( - 'description' => __( 'Maximum order amount allowed when using the coupon.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'email_restrictions' => array( - 'description' => __( 'List of email addresses that can use this coupon.', 'woocommerce' ), - 'type' => 'array', - 'items' => array( - 'type' => 'string', - ), - 'context' => array( 'view', 'edit' ), - ), - 'used_by' => array( - 'description' => __( 'List of user IDs (or guest email addresses) that have used the coupon.', 'woocommerce' ), - 'type' => 'array', - 'items' => array( - 'type' => 'integer', - ), - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'meta_data' => array( - 'description' => __( 'Meta data.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'items' => array( - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Meta ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'key' => array( - 'description' => __( 'Meta key.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'value' => array( - 'description' => __( 'Meta value.', 'woocommerce' ), - 'type' => 'mixed', - 'context' => array( 'view', 'edit' ), - ), - ), - ), - ), - ), - ); - return $this->add_additional_fields_schema( $schema ); - } - - /** - * Get the query params for collections of attachments. - * - * @return array - */ - public function get_collection_params() { - $params = parent::get_collection_params(); - - $params['code'] = array( - 'description' => __( 'Limit result set to resources with a specific code.', 'woocommerce' ), - 'type' => 'string', - 'sanitize_callback' => 'sanitize_text_field', - 'validate_callback' => 'rest_validate_request_arg', - ); - - return $params; - } + protected $namespace = 'wc/v3'; } diff --git a/includes/api/class-wc-rest-customer-downloads-controller.php b/includes/api/class-wc-rest-customer-downloads-controller.php index 3fd52f3827f..3fd89d4a4fb 100644 --- a/includes/api/class-wc-rest-customer-downloads-controller.php +++ b/includes/api/class-wc-rest-customer-downloads-controller.php @@ -14,152 +14,14 @@ defined( 'ABSPATH' ) || exit; * REST API Customers controller class. * * @package WooCommerce/API - * @extends WC_REST_Customer_Downloads_V1_Controller + * @extends WC_REST_Customer_Downloads_V2_Controller */ -class WC_REST_Customer_Downloads_Controller extends WC_REST_Customer_Downloads_V1_Controller { +class WC_REST_Customer_Downloads_Controller extends WC_REST_Customer_Downloads_V2_Controller { /** * Endpoint namespace. * * @var string */ - protected $namespace = 'wc/v2'; - - /** - * Prepare a single download output for response. - * - * @param stdClass $download Download object. - * @param WP_REST_Request $request Request object. - * @return WP_REST_Response $response Response data. - */ - public function prepare_item_for_response( $download, $request ) { - $data = array( - 'download_id' => $download->download_id, - 'download_url' => $download->download_url, - 'product_id' => $download->product_id, - 'product_name' => $download->product_name, - 'download_name' => $download->download_name, - 'order_id' => $download->order_id, - 'order_key' => $download->order_key, - 'downloads_remaining' => '' === $download->downloads_remaining ? 'unlimited' : $download->downloads_remaining, - 'access_expires' => $download->access_expires ? wc_rest_prepare_date_response( $download->access_expires ) : 'never', - 'access_expires_gmt' => $download->access_expires ? wc_rest_prepare_date_response( get_gmt_from_date( $download->access_expires ) ) : 'never', - 'file' => $download->file, - ); - - $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; - $data = $this->add_additional_fields_to_object( $data, $request ); - $data = $this->filter_response_by_context( $data, $context ); - - // Wrap the data in a response object. - $response = rest_ensure_response( $data ); - - $response->add_links( $this->prepare_links( $download, $request ) ); - - /** - * Filter customer download data returned from the REST API. - * - * @param WP_REST_Response $response The response object. - * @param stdClass $download Download object used to create response. - * @param WP_REST_Request $request Request object. - */ - return apply_filters( 'woocommerce_rest_prepare_customer_download', $response, $download, $request ); - } - - /** - * Get the Customer Download's schema, conforming to JSON Schema. - * - * @return array - */ - public function get_item_schema() { - $schema = array( - '$schema' => 'http://json-schema.org/draft-04/schema#', - 'title' => 'customer_download', - 'type' => 'object', - 'properties' => array( - 'download_id' => array( - 'description' => __( 'Download ID.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'download_url' => array( - 'description' => __( 'Download file URL.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'product_id' => array( - 'description' => __( 'Downloadable product ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'product_name' => array( - 'description' => __( 'Product name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'download_name' => array( - 'description' => __( 'Downloadable file name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'order_id' => array( - 'description' => __( 'Order ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'order_key' => array( - 'description' => __( 'Order key.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'downloads_remaining' => array( - 'description' => __( 'Number of downloads remaining.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'access_expires' => array( - 'description' => __( "The date when download access expires, in the site's timezone.", 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'access_expires_gmt' => array( - 'description' => __( 'The date when download access expires, as GMT.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'file' => array( - 'description' => __( 'File details.', 'woocommerce' ), - 'type' => 'object', - 'context' => array( 'view' ), - 'readonly' => true, - 'properties' => array( - 'name' => array( - 'description' => __( 'File name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'file' => array( - 'description' => __( 'File URL.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - ), - ), - ), - ); - - return $this->add_additional_fields_schema( $schema ); - } + protected $namespace = 'wc/v3'; } diff --git a/includes/api/class-wc-rest-customers-controller.php b/includes/api/class-wc-rest-customers-controller.php index 33e4f098a4e..2bdacd95ba0 100644 --- a/includes/api/class-wc-rest-customers-controller.php +++ b/includes/api/class-wc-rest-customers-controller.php @@ -14,351 +14,14 @@ defined( 'ABSPATH' ) || exit; * REST API Customers controller class. * * @package WooCommerce/API - * @extends WC_REST_Customers_V1_Controller + * @extends WC_REST_Customers_V2_Controller */ -class WC_REST_Customers_Controller extends WC_REST_Customers_V1_Controller { +class WC_REST_Customers_Controller extends WC_REST_Customers_V2_Controller { /** * Endpoint namespace. * * @var string */ - protected $namespace = 'wc/v2'; - - /** - * Get formatted item data. - * - * @since 3.0.0 - * @param WC_Data $object WC_Data instance. - * @return array - */ - protected function get_formatted_item_data( $object ) { - $data = $object->get_data(); - $format_date = array( 'date_created', 'date_modified' ); - - // Format date values. - foreach ( $format_date as $key ) { - $datetime = $data[ $key ]; - $data[ $key ] = wc_rest_prepare_date_response( $datetime, false ); - $data[ $key . '_gmt' ] = wc_rest_prepare_date_response( $datetime ); - } - - return array( - 'id' => $object->get_id(), - 'date_created' => $data['date_created'], - 'date_created_gmt' => $data['date_created_gmt'], - 'date_modified' => $data['date_modified'], - 'date_modified_gmt' => $data['date_modified_gmt'], - 'email' => $data['email'], - 'first_name' => $data['first_name'], - 'last_name' => $data['last_name'], - 'role' => $data['role'], - 'username' => $data['username'], - 'billing' => $data['billing'], - 'shipping' => $data['shipping'], - 'is_paying_customer' => $data['is_paying_customer'], - 'orders_count' => $object->get_order_count(), - 'total_spent' => $object->get_total_spent(), - 'avatar_url' => $object->get_avatar_url(), - 'meta_data' => $data['meta_data'], - ); - } - - /** - * Prepare a single customer output for response. - * - * @param WP_User $user_data User object. - * @param WP_REST_Request $request Request object. - * @return WP_REST_Response $response Response data. - */ - public function prepare_item_for_response( $user_data, $request ) { - $customer = new WC_Customer( $user_data->ID ); - $data = $this->get_formatted_item_data( $customer ); - $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; - $data = $this->add_additional_fields_to_object( $data, $request ); - $data = $this->filter_response_by_context( $data, $context ); - $response = rest_ensure_response( $data ); - $response->add_links( $this->prepare_links( $user_data ) ); - - /** - * Filter customer data returned from the REST API. - * - * @param WP_REST_Response $response The response object. - * @param WP_User $user_data User object used to create response. - * @param WP_REST_Request $request Request object. - */ - return apply_filters( 'woocommerce_rest_prepare_customer', $response, $user_data, $request ); - } - - /** - * Update customer meta fields. - * - * @param WC_Customer $customer Customer data. - * @param WP_REST_Request $request Request data. - */ - protected function update_customer_meta_fields( $customer, $request ) { - parent::update_customer_meta_fields( $customer, $request ); - - // Meta data. - if ( isset( $request['meta_data'] ) ) { - if ( is_array( $request['meta_data'] ) ) { - foreach ( $request['meta_data'] as $meta ) { - $customer->update_meta_data( $meta['key'], $meta['value'], isset( $meta['id'] ) ? $meta['id'] : '' ); - } - } - } - } - - /** - * Get the Customer's schema, conforming to JSON Schema. - * - * @return array - */ - public function get_item_schema() { - $schema = array( - '$schema' => 'http://json-schema.org/draft-04/schema#', - 'title' => 'customer', - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_created' => array( - 'description' => __( "The date the customer was created, in the site's timezone.", 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_created_gmt' => array( - 'description' => __( 'The date the order was created, as GMT.', 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_modified' => array( - 'description' => __( "The date the customer was last modified, in the site's timezone.", 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_modified_gmt' => array( - 'description' => __( 'The date the customer was last modified, as GMT.', 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'email' => array( - 'description' => __( 'The email address for the customer.', 'woocommerce' ), - 'type' => 'string', - 'format' => 'email', - 'context' => array( 'view', 'edit' ), - ), - 'first_name' => array( - 'description' => __( 'Customer first name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'arg_options' => array( - 'sanitize_callback' => 'sanitize_text_field', - ), - ), - 'last_name' => array( - 'description' => __( 'Customer last name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'arg_options' => array( - 'sanitize_callback' => 'sanitize_text_field', - ), - ), - 'role' => array( - 'description' => __( 'Customer role.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'username' => array( - 'description' => __( 'Customer login name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'arg_options' => array( - 'sanitize_callback' => 'sanitize_user', - ), - ), - 'password' => array( - 'description' => __( 'Customer password.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'edit' ), - ), - 'billing' => array( - 'description' => __( 'List of billing address data.', 'woocommerce' ), - 'type' => 'object', - 'context' => array( 'view', 'edit' ), - 'properties' => array( - 'first_name' => array( - 'description' => __( 'First name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'last_name' => array( - 'description' => __( 'Last name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'company' => array( - 'description' => __( 'Company name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'address_1' => array( - 'description' => __( 'Address line 1', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'address_2' => array( - 'description' => __( 'Address line 2', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'city' => array( - 'description' => __( 'City name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'state' => array( - 'description' => __( 'ISO code or name of the state, province or district.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'postcode' => array( - 'description' => __( 'Postal code.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'country' => array( - 'description' => __( 'ISO code of the country.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'email' => array( - 'description' => __( 'Email address.', 'woocommerce' ), - 'type' => 'string', - 'format' => 'email', - 'context' => array( 'view', 'edit' ), - ), - 'phone' => array( - 'description' => __( 'Phone number.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - ), - ), - 'shipping' => array( - 'description' => __( 'List of shipping address data.', 'woocommerce' ), - 'type' => 'object', - 'context' => array( 'view', 'edit' ), - 'properties' => array( - 'first_name' => array( - 'description' => __( 'First name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'last_name' => array( - 'description' => __( 'Last name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'company' => array( - 'description' => __( 'Company name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'address_1' => array( - 'description' => __( 'Address line 1', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'address_2' => array( - 'description' => __( 'Address line 2', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'city' => array( - 'description' => __( 'City name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'state' => array( - 'description' => __( 'ISO code or name of the state, province or district.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'postcode' => array( - 'description' => __( 'Postal code.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'country' => array( - 'description' => __( 'ISO code of the country.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - ), - ), - 'is_paying_customer' => array( - 'description' => __( 'Is the customer a paying customer?', 'woocommerce' ), - 'type' => 'bool', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'orders_count' => array( - 'description' => __( 'Quantity of orders made by the customer.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'total_spent' => array( - 'description' => __( 'Total amount spent.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'avatar_url' => array( - 'description' => __( 'Avatar URL.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'meta_data' => array( - 'description' => __( 'Meta data.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'items' => array( - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Meta ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'key' => array( - 'description' => __( 'Meta key.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'value' => array( - 'description' => __( 'Meta value.', 'woocommerce' ), - 'type' => 'mixed', - 'context' => array( 'view', 'edit' ), - ), - ), - ), - ), - ), - ); - - return $this->add_additional_fields_schema( $schema ); - } + protected $namespace = 'wc/v3'; } diff --git a/includes/api/class-wc-rest-network-orders-controller.php b/includes/api/class-wc-rest-network-orders-controller.php index 00c7ed2366a..070f95b0555 100644 --- a/includes/api/class-wc-rest-network-orders-controller.php +++ b/includes/api/class-wc-rest-network-orders-controller.php @@ -4,8 +4,8 @@ * * Handles requests to the /orders/network endpoint * - * @package WooCommerce/API - * @since 3.4.0 + * @package WooCommerce/API + * @since 3.4.0 */ defined( 'ABSPATH' ) || exit; @@ -14,139 +14,14 @@ defined( 'ABSPATH' ) || exit; * REST API Network Orders controller class. * * @package WooCommerce/API - * @extends WC_REST_Orders_Controller + * @extends WC_REST_Network_Orders_V2_Controller */ -class WC_REST_Network_Orders_Controller extends WC_REST_Orders_Controller { +class WC_REST_Network_Orders_Controller extends WC_REST_Network_Orders_V2_Controller { /** - * Register the routes for network orders. + * Endpoint namespace. + * + * @var string */ - public function register_routes() { - if ( is_multisite() ) { - register_rest_route( - $this->namespace, '/' . $this->rest_base . '/network', array( - array( - 'methods' => WP_REST_Server::READABLE, - 'callback' => array( $this, 'network_orders' ), - 'permission_callback' => array( $this, 'network_orders_permissions_check' ), - 'args' => $this->get_collection_params(), - ), - 'schema' => array( $this, 'get_public_item_schema' ), - ) - ); - } - } - - /** - * Retrieves the item's schema for display / public consumption purposes. - * - * @access public - * - * @return array Public item schema data. - */ - public function get_public_item_schema() { - $schema = parent::get_public_item_schema(); - - $schema['properties']['blog'] = array( - 'description' => __( 'Blog id of the record on the multisite.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view' ), - 'readonly' => true, - ); - $schema['properties']['edit_url'] = array( - 'description' => __( 'URL to edit the order', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ); - $schema['properties']['customer'][] = array( - 'description' => __( 'Name of the customer for the order', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ); - $schema['properties']['status_name'][] = array( - 'description' => __( 'Order Status', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ); - $schema['properties']['formatted_total'][] = array( - 'description' => __( 'Order total formatted for locale', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ); - - return $schema; - } - - /** - * Does a permissions check for the proper requested blog - * - * @param WP_REST_Request $request Full details about the request. - * - * @return bool $permission - */ - public function network_orders_permissions_check( $request ) { - $blog_id = $request->get_param( 'blog_id' ); - $blog_id = ! empty( $blog_id ) ? $blog_id : get_current_blog_id(); - - switch_to_blog( $blog_id ); - - $permission = $this->get_items_permissions_check( $request ); - - restore_current_blog(); - - return $permission; - } - - /** - * Get a collection of orders from the requested blog id - * - * @param WP_REST_Request $request Full details about the request. - * - * @return WP_REST_Response - */ - public function network_orders( $request ) { - $blog_id = $request->get_param( 'blog_id' ); - $blog_id = ! empty( $blog_id ) ? $blog_id : get_current_blog_id(); - - switch_to_blog( $blog_id ); - - add_filter( 'woocommerce_rest_orders_prepare_object_query', array( $this, 'network_orders_filter_args' ) ); - $items = $this->get_items( $request ); - remove_filter( 'woocommerce_rest_orders_prepare_object_query', array( $this, 'network_orders_filter_args' ) ); - - foreach ( $items->data as &$current_order ) { - $order = wc_get_order( $current_order['id'] ); - - $current_order['blog'] = get_blog_details( get_current_blog_id() ); - $current_order['edit_url'] = get_admin_url( $blog_id, 'post.php?post=' . absint( $order->get_id() ) . '&action=edit' ); - /* translators: 1: first name 2: last name */ - $current_order['customer'] = trim( sprintf( _x( '%1$s %2$s', 'full name', 'woocommerce' ), $order->get_billing_first_name(), $order->get_billing_last_name() ) ); - $current_order['status_name'] = wc_get_order_status_name( $order->get_status() ); - $current_order['formatted_total'] = $order->get_formatted_order_total(); - } - - restore_current_blog(); - - return $items; - } - - /** - * Filters the post statuses to on hold and processing for the network order query. - * - * @param array $args Query args. - * - * @return array - */ - public function network_orders_filter_args( $args ) { - $args['post_status'] = array( - 'wc-on-hold', - 'wc-processing', - ); - - return $args; - } + protected $namespace = 'wc/v3'; } diff --git a/includes/api/class-wc-rest-order-notes-controller.php b/includes/api/class-wc-rest-order-notes-controller.php index 870c4e17f19..035b64fce3f 100644 --- a/includes/api/class-wc-rest-order-notes-controller.php +++ b/includes/api/class-wc-rest-order-notes-controller.php @@ -14,169 +14,14 @@ defined( 'ABSPATH' ) || exit; * REST API Order Notes controller class. * * @package WooCommerce/API - * @extends WC_REST_ControllerWC_REST_Order_Notes_V1_Controller + * @extends WC_REST_Order_Notes_V2_Controller */ -class WC_REST_Order_Notes_Controller extends WC_REST_Order_Notes_V1_Controller { +class WC_REST_Order_Notes_Controller extends WC_REST_Order_Notes_V2_Controller { /** * Endpoint namespace. * * @var string */ - protected $namespace = 'wc/v2'; - - /** - * Get order notes from an order. - * - * @param WP_REST_Request $request Request data. - * - * @return array|WP_Error - */ - public function get_items( $request ) { - $order = wc_get_order( (int) $request['order_id'] ); - - if ( ! $order || $this->post_type !== $order->get_type() ) { - return new WP_Error( "woocommerce_rest_{$this->post_type}_invalid_id", __( 'Invalid order ID.', 'woocommerce' ), array( 'status' => 404 ) ); - } - - $args = array( - 'post_id' => $order->get_id(), - 'approve' => 'approve', - 'type' => 'order_note', - ); - - // Allow filter by order note type. - if ( 'customer' === $request['type'] ) { - $args['meta_query'] = array( // WPCS: slow query ok. - array( - 'key' => 'is_customer_note', - 'value' => 1, - 'compare' => '=', - ), - ); - } elseif ( 'internal' === $request['type'] ) { - $args['meta_query'] = array( // WPCS: slow query ok. - array( - 'key' => 'is_customer_note', - 'compare' => 'NOT EXISTS', - ), - ); - } - - remove_filter( 'comments_clauses', array( 'WC_Comments', 'exclude_order_comments' ), 10, 1 ); - - $notes = get_comments( $args ); - - add_filter( 'comments_clauses', array( 'WC_Comments', 'exclude_order_comments' ), 10, 1 ); - - $data = array(); - foreach ( $notes as $note ) { - $order_note = $this->prepare_item_for_response( $note, $request ); - $order_note = $this->prepare_response_for_collection( $order_note ); - $data[] = $order_note; - } - - return rest_ensure_response( $data ); - } - - /** - * Prepare a single order note output for response. - * - * @param WP_Comment $note Order note object. - * @param WP_REST_Request $request Request object. - * @return WP_REST_Response $response Response data. - */ - public function prepare_item_for_response( $note, $request ) { - $data = array( - 'id' => (int) $note->comment_ID, - 'date_created' => wc_rest_prepare_date_response( $note->comment_date ), - 'date_created_gmt' => wc_rest_prepare_date_response( $note->comment_date_gmt ), - 'note' => $note->comment_content, - 'customer_note' => (bool) get_comment_meta( $note->comment_ID, 'is_customer_note', true ), - ); - - $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; - $data = $this->add_additional_fields_to_object( $data, $request ); - $data = $this->filter_response_by_context( $data, $context ); - - // Wrap the data in a response object. - $response = rest_ensure_response( $data ); - - $response->add_links( $this->prepare_links( $note ) ); - - /** - * Filter order note object returned from the REST API. - * - * @param WP_REST_Response $response The response object. - * @param WP_Comment $note Order note object used to create response. - * @param WP_REST_Request $request Request object. - */ - return apply_filters( 'woocommerce_rest_prepare_order_note', $response, $note, $request ); - } - - /** - * Get the Order Notes schema, conforming to JSON Schema. - * - * @return array - */ - public function get_item_schema() { - $schema = array( - '$schema' => 'http://json-schema.org/draft-04/schema#', - 'title' => 'order_note', - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_created' => array( - 'description' => __( "The date the order note was created, in the site's timezone.", 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_created_gmt' => array( - 'description' => __( 'The date the order note was created, as GMT.', 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'note' => array( - 'description' => __( 'Order note content.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'customer_note' => array( - 'description' => __( 'If true, the note will be shown to customers and they will be notified. If false, the note will be for admin reference only.', 'woocommerce' ), - 'type' => 'boolean', - 'default' => false, - 'context' => array( 'view', 'edit' ), - ), - ), - ); - - return $this->add_additional_fields_schema( $schema ); - } - - /** - * Get the query params for collections. - * - * @return array - */ - public function get_collection_params() { - $params = array(); - $params['context'] = $this->get_context_param( array( 'default' => 'view' ) ); - $params['type'] = array( - 'default' => 'any', - 'description' => __( 'Limit result to customers or internal notes.', 'woocommerce' ), - 'type' => 'string', - 'enum' => array( 'any', 'customer', 'internal' ), - 'sanitize_callback' => 'sanitize_key', - 'validate_callback' => 'rest_validate_request_arg', - ); - - return $params; - } + protected $namespace = 'wc/v3'; } diff --git a/includes/api/class-wc-rest-order-refunds-controller.php b/includes/api/class-wc-rest-order-refunds-controller.php index 1df6b936087..29546886019 100644 --- a/includes/api/class-wc-rest-order-refunds-controller.php +++ b/includes/api/class-wc-rest-order-refunds-controller.php @@ -14,570 +14,14 @@ defined( 'ABSPATH' ) || exit; * REST API Order Refunds controller class. * * @package WooCommerce/API - * @extends WC_REST_Orders_Controller + * @extends WC_REST_Order_Refunds_V2_Controller */ -class WC_REST_Order_Refunds_Controller extends WC_REST_Orders_Controller { +class WC_REST_Order_Refunds_Controller extends WC_REST_Order_Refunds_V2_Controller { /** * Endpoint namespace. * * @var string */ - protected $namespace = 'wc/v2'; - - /** - * Route base. - * - * @var string - */ - protected $rest_base = 'orders/(?P[\d]+)/refunds'; - - /** - * Post type. - * - * @var string - */ - protected $post_type = 'shop_order_refund'; - - /** - * Stores the request. - * - * @var array - */ - protected $request = array(); - - /** - * Order refunds actions. - */ - public function __construct() { - add_filter( "woocommerce_rest_{$this->post_type}_object_trashable", '__return_false' ); - } - - /** - * Register the routes for order refunds. - */ - public function register_routes() { - register_rest_route( - $this->namespace, '/' . $this->rest_base, array( - 'args' => array( - 'order_id' => array( - 'description' => __( 'The order ID.', 'woocommerce' ), - 'type' => 'integer', - ), - ), - array( - 'methods' => WP_REST_Server::READABLE, - 'callback' => array( $this, 'get_items' ), - 'permission_callback' => array( $this, 'get_items_permissions_check' ), - 'args' => $this->get_collection_params(), - ), - array( - 'methods' => WP_REST_Server::CREATABLE, - 'callback' => array( $this, 'create_item' ), - 'permission_callback' => array( $this, 'create_item_permissions_check' ), - 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ), - ), - 'schema' => array( $this, 'get_public_item_schema' ), - ) - ); - - register_rest_route( - $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)', array( - 'args' => array( - 'order_id' => array( - 'description' => __( 'The order ID.', 'woocommerce' ), - 'type' => 'integer', - ), - 'id' => array( - 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), - 'type' => 'integer', - ), - ), - array( - 'methods' => WP_REST_Server::READABLE, - 'callback' => array( $this, 'get_item' ), - 'permission_callback' => array( $this, 'get_item_permissions_check' ), - 'args' => array( - 'context' => $this->get_context_param( array( 'default' => 'view' ) ), - ), - ), - array( - 'methods' => WP_REST_Server::DELETABLE, - 'callback' => array( $this, 'delete_item' ), - 'permission_callback' => array( $this, 'delete_item_permissions_check' ), - 'args' => array( - 'force' => array( - 'default' => true, - 'type' => 'boolean', - 'description' => __( 'Required to be true, as resource does not support trashing.', 'woocommerce' ), - ), - ), - ), - 'schema' => array( $this, 'get_public_item_schema' ), - ) - ); - } - - /** - * Get object. - * - * @since 3.0.0 - * @param int $id Object ID. - * @return WC_Data - */ - protected function get_object( $id ) { - return wc_get_order( $id ); - } - - /** - * Get formatted item data. - * - * @since 3.0.0 - * @param WC_Data $object WC_Data instance. - * @return array - */ - protected function get_formatted_item_data( $object ) { - $data = $object->get_data(); - $format_decimal = array( 'amount' ); - $format_date = array( 'date_created' ); - $format_line_items = array( 'line_items' ); - - // Format decimal values. - foreach ( $format_decimal as $key ) { - $data[ $key ] = wc_format_decimal( $data[ $key ], $this->request['dp'] ); - } - - // Format date values. - foreach ( $format_date as $key ) { - $datetime = $data[ $key ]; - $data[ $key ] = wc_rest_prepare_date_response( $datetime, false ); - $data[ $key . '_gmt' ] = wc_rest_prepare_date_response( $datetime ); - } - - // Format line items. - foreach ( $format_line_items as $key ) { - $data[ $key ] = array_values( array_map( array( $this, 'get_order_item_data' ), $data[ $key ] ) ); - } - - return array( - 'id' => $object->get_id(), - 'date_created' => $data['date_created'], - 'date_created_gmt' => $data['date_created_gmt'], - 'amount' => $data['amount'], - 'reason' => $data['reason'], - 'refunded_by' => $data['refunded_by'], - 'refunded_payment' => $data['refunded_payment'], - 'meta_data' => $data['meta_data'], - 'line_items' => $data['line_items'], - ); - } - - /** - * Prepare a single order output for response. - * - * @since 3.0.0 - * - * @param WC_Data $object Object data. - * @param WP_REST_Request $request Request object. - * - * @return WP_Error|WP_REST_Response - */ - public function prepare_object_for_response( $object, $request ) { - $this->request = $request; - $this->request['dp'] = is_null( $this->request['dp'] ) ? wc_get_price_decimals() : absint( $this->request['dp'] ); - $order = wc_get_order( (int) $request['order_id'] ); - - if ( ! $order ) { - return new WP_Error( 'woocommerce_rest_invalid_order_id', __( 'Invalid order ID.', 'woocommerce' ), 404 ); - } - - if ( ! $object || $object->get_parent_id() !== $order->get_id() ) { - return new WP_Error( 'woocommerce_rest_invalid_order_refund_id', __( 'Invalid order refund ID.', 'woocommerce' ), 404 ); - } - - $data = $this->get_formatted_item_data( $object ); - $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; - $data = $this->add_additional_fields_to_object( $data, $request ); - $data = $this->filter_response_by_context( $data, $context ); - - // Wrap the data in a response object. - $response = rest_ensure_response( $data ); - - $response->add_links( $this->prepare_links( $object, $request ) ); - - /** - * Filter the data for a response. - * - * The dynamic portion of the hook name, $this->post_type, - * refers to object type being prepared for the response. - * - * @param WP_REST_Response $response The response object. - * @param WC_Data $object Object data. - * @param WP_REST_Request $request Request object. - */ - return apply_filters( "woocommerce_rest_prepare_{$this->post_type}_object", $response, $object, $request ); - } - - /** - * Prepare links for the request. - * - * @param WC_Data $object Object data. - * @param WP_REST_Request $request Request object. - * @return array Links for the given post. - */ - protected function prepare_links( $object, $request ) { - $base = str_replace( '(?P[\d]+)', $object->get_parent_id(), $this->rest_base ); - $links = array( - 'self' => array( - 'href' => rest_url( sprintf( '/%s/%s/%d', $this->namespace, $base, $object->get_id() ) ), - ), - 'collection' => array( - 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $base ) ), - ), - 'up' => array( - 'href' => rest_url( sprintf( '/%s/orders/%d', $this->namespace, $object->get_parent_id() ) ), - ), - ); - - return $links; - } - - /** - * Prepare objects query. - * - * @since 3.0.0 - * @param WP_REST_Request $request Full details about the request. - * @return array - */ - protected function prepare_objects_query( $request ) { - $args = parent::prepare_objects_query( $request ); - - $args['post_status'] = array_keys( wc_get_order_statuses() ); - $args['post_parent__in'] = array( absint( $request['order_id'] ) ); - - return $args; - } - - /** - * Prepares one object for create or update operation. - * - * @since 3.0.0 - * @param WP_REST_Request $request Request object. - * @param bool $creating If is creating a new object. - * @return WP_Error|WC_Data The prepared item, or WP_Error object on failure. - */ - protected function prepare_object_for_database( $request, $creating = false ) { - $order = wc_get_order( (int) $request['order_id'] ); - - if ( ! $order ) { - return new WP_Error( 'woocommerce_rest_invalid_order_id', __( 'Invalid order ID.', 'woocommerce' ), 404 ); - } - - if ( 0 > $request['amount'] ) { - return new WP_Error( 'woocommerce_rest_invalid_order_refund', __( 'Refund amount must be greater than zero.', 'woocommerce' ), 400 ); - } - - // Create the refund. - $refund = wc_create_refund( - array( - 'order_id' => $order->get_id(), - 'amount' => $request['amount'], - 'reason' => empty( $request['reason'] ) ? null : $request['reason'], - 'refund_payment' => is_bool( $request['api_refund'] ) ? $request['api_refund'] : true, - 'restock_items' => true, - ) - ); - - if ( is_wp_error( $refund ) ) { - return new WP_Error( 'woocommerce_rest_cannot_create_order_refund', $refund->get_error_message(), 500 ); - } - - if ( ! $refund ) { - return new WP_Error( 'woocommerce_rest_cannot_create_order_refund', __( 'Cannot create order refund, please try again.', 'woocommerce' ), 500 ); - } - - if ( ! empty( $request['meta_data'] ) && is_array( $request['meta_data'] ) ) { - foreach ( $request['meta_data'] as $meta ) { - $refund->update_meta_data( $meta['key'], $meta['value'], isset( $meta['id'] ) ? $meta['id'] : '' ); - } - $refund->save_meta_data(); - } - - /** - * Filters an object before it is inserted via the REST API. - * - * The dynamic portion of the hook name, `$this->post_type`, - * refers to the object type slug. - * - * @param WC_Data $coupon Object object. - * @param WP_REST_Request $request Request object. - * @param bool $creating If is creating a new object. - */ - return apply_filters( "woocommerce_rest_pre_insert_{$this->post_type}_object", $refund, $request, $creating ); - } - - /** - * Save an object data. - * - * @since 3.0.0 - * @param WP_REST_Request $request Full details about the request. - * @param bool $creating If is creating a new object. - * @return WC_Data|WP_Error - */ - protected function save_object( $request, $creating = false ) { - try { - $object = $this->prepare_object_for_database( $request, $creating ); - - if ( is_wp_error( $object ) ) { - return $object; - } - - return $this->get_object( $object->get_id() ); - } catch ( WC_Data_Exception $e ) { - return new WP_Error( $e->getErrorCode(), $e->getMessage(), $e->getErrorData() ); - } catch ( WC_REST_Exception $e ) { - return new WP_Error( $e->getErrorCode(), $e->getMessage(), array( 'status' => $e->getCode() ) ); - } - } - - /** - * Get the Order's schema, conforming to JSON Schema. - * - * @return array - */ - public function get_item_schema() { - $schema = array( - '$schema' => 'http://json-schema.org/draft-04/schema#', - 'title' => $this->post_type, - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_created' => array( - 'description' => __( "The date the order refund was created, in the site's timezone.", 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_created_gmt' => array( - 'description' => __( 'The date the order refund was created, as GMT.', 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'amount' => array( - 'description' => __( 'Refund amount.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'reason' => array( - 'description' => __( 'Reason for refund.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'refunded_by' => array( - 'description' => __( 'User ID of user who created the refund.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - ), - 'refunded_payment' => array( - 'description' => __( 'If the payment was refunded via the API.', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view' ), - ), - 'meta_data' => array( - 'description' => __( 'Meta data.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'items' => array( - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Meta ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'key' => array( - 'description' => __( 'Meta key.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'value' => array( - 'description' => __( 'Meta value.', 'woocommerce' ), - 'type' => 'mixed', - 'context' => array( 'view', 'edit' ), - ), - ), - ), - ), - 'line_items' => array( - 'description' => __( 'Line items data.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - 'items' => array( - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Item ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'name' => array( - 'description' => __( 'Product name.', 'woocommerce' ), - 'type' => 'mixed', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'product_id' => array( - 'description' => __( 'Product ID.', 'woocommerce' ), - 'type' => 'mixed', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'variation_id' => array( - 'description' => __( 'Variation ID, if applicable.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'quantity' => array( - 'description' => __( 'Quantity ordered.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'tax_class' => array( - 'description' => __( 'Tax class of product.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'subtotal' => array( - 'description' => __( 'Line subtotal (before discounts).', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'subtotal_tax' => array( - 'description' => __( 'Line subtotal tax (before discounts).', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'total' => array( - 'description' => __( 'Line total (after discounts).', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'total_tax' => array( - 'description' => __( 'Line total tax (after discounts).', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'taxes' => array( - 'description' => __( 'Line taxes.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - 'items' => array( - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Tax rate ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'total' => array( - 'description' => __( 'Tax total.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'subtotal' => array( - 'description' => __( 'Tax subtotal.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - ), - ), - ), - 'meta_data' => array( - 'description' => __( 'Meta data.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - 'items' => array( - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Meta ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'key' => array( - 'description' => __( 'Meta key.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'value' => array( - 'description' => __( 'Meta value.', 'woocommerce' ), - 'type' => 'mixed', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - ), - ), - ), - 'sku' => array( - 'description' => __( 'Product SKU.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'price' => array( - 'description' => __( 'Product price.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - ), - ), - ), - 'api_refund' => array( - 'description' => __( 'When true, the payment gateway API is used to generate the refund.', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'edit' ), - 'default' => true, - ), - ), - ); - - return $this->add_additional_fields_schema( $schema ); - } - - /** - * Get the query params for collections. - * - * @return array - */ - public function get_collection_params() { - $params = parent::get_collection_params(); - - unset( $params['status'], $params['customer'], $params['product'] ); - - return $params; - } + protected $namespace = 'wc/v3'; } diff --git a/includes/api/class-wc-rest-orders-controller.php b/includes/api/class-wc-rest-orders-controller.php index bfafc26054c..0075619ce40 100644 --- a/includes/api/class-wc-rest-orders-controller.php +++ b/includes/api/class-wc-rest-orders-controller.php @@ -14,1674 +14,14 @@ defined( 'ABSPATH' ) || exit; * REST API Orders controller class. * * @package WooCommerce/API - * @extends WC_REST_CRUD_Controller + * @extends WC_REST_Orders_V2_Controller */ -class WC_REST_Orders_Controller extends WC_REST_Legacy_Orders_Controller { +class WC_REST_Orders_Controller extends WC_REST_Orders_V2_Controller { /** * Endpoint namespace. * * @var string */ - protected $namespace = 'wc/v2'; - - /** - * Route base. - * - * @var string - */ - protected $rest_base = 'orders'; - - /** - * Post type. - * - * @var string - */ - protected $post_type = 'shop_order'; - - /** - * If object is hierarchical. - * - * @var bool - */ - protected $hierarchical = true; - - /** - * Stores the request. - * - * @var array - */ - protected $request = array(); - - /** - * Register the routes for orders. - */ - public function register_routes() { - register_rest_route( - $this->namespace, '/' . $this->rest_base, array( - array( - 'methods' => WP_REST_Server::READABLE, - 'callback' => array( $this, 'get_items' ), - 'permission_callback' => array( $this, 'get_items_permissions_check' ), - 'args' => $this->get_collection_params(), - ), - array( - 'methods' => WP_REST_Server::CREATABLE, - 'callback' => array( $this, 'create_item' ), - 'permission_callback' => array( $this, 'create_item_permissions_check' ), - 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ), - ), - 'schema' => array( $this, 'get_public_item_schema' ), - ) - ); - - register_rest_route( - $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)', array( - 'args' => array( - 'id' => array( - 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), - 'type' => 'integer', - ), - ), - array( - 'methods' => WP_REST_Server::READABLE, - 'callback' => array( $this, 'get_item' ), - 'permission_callback' => array( $this, 'get_item_permissions_check' ), - 'args' => array( - 'context' => $this->get_context_param( array( 'default' => 'view' ) ), - ), - ), - array( - 'methods' => WP_REST_Server::EDITABLE, - 'callback' => array( $this, 'update_item' ), - 'permission_callback' => array( $this, 'update_item_permissions_check' ), - 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), - ), - array( - 'methods' => WP_REST_Server::DELETABLE, - 'callback' => array( $this, 'delete_item' ), - 'permission_callback' => array( $this, 'delete_item_permissions_check' ), - 'args' => array( - 'force' => array( - 'default' => false, - 'type' => 'boolean', - 'description' => __( 'Whether to bypass trash and force deletion.', 'woocommerce' ), - ), - ), - ), - 'schema' => array( $this, 'get_public_item_schema' ), - ) - ); - - register_rest_route( - $this->namespace, '/' . $this->rest_base . '/batch', array( - array( - 'methods' => WP_REST_Server::EDITABLE, - 'callback' => array( $this, 'batch_items' ), - 'permission_callback' => array( $this, 'batch_items_permissions_check' ), - 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), - ), - 'schema' => array( $this, 'get_public_batch_schema' ), - ) - ); - } - - /** - * Get object. - * - * @since 3.0.0 - * @param int $id Object ID. - * @return WC_Data - */ - protected function get_object( $id ) { - return wc_get_order( $id ); - } - - /** - * Expands an order item to get its data. - * - * @param WC_Order_item $item Order item data. - * @return array - */ - protected function get_order_item_data( $item ) { - $data = $item->get_data(); - $format_decimal = array( 'subtotal', 'subtotal_tax', 'total', 'total_tax', 'tax_total', 'shipping_tax_total' ); - - // Format decimal values. - foreach ( $format_decimal as $key ) { - if ( isset( $data[ $key ] ) ) { - $data[ $key ] = wc_format_decimal( $data[ $key ], $this->request['dp'] ); - } - } - - // Add SKU and PRICE to products. - if ( is_callable( array( $item, 'get_product' ) ) ) { - $data['sku'] = $item->get_product() ? $item->get_product()->get_sku() : null; - $data['price'] = $item->get_quantity() ? $item->get_total() / $item->get_quantity() : 0; - } - - // Format taxes. - if ( ! empty( $data['taxes']['total'] ) ) { - $taxes = array(); - - foreach ( $data['taxes']['total'] as $tax_rate_id => $tax ) { - $taxes[] = array( - 'id' => $tax_rate_id, - 'total' => $tax, - 'subtotal' => isset( $data['taxes']['subtotal'][ $tax_rate_id ] ) ? $data['taxes']['subtotal'][ $tax_rate_id ] : '', - ); - } - $data['taxes'] = $taxes; - } elseif ( isset( $data['taxes'] ) ) { - $data['taxes'] = array(); - } - - // Remove names for coupons, taxes and shipping. - if ( isset( $data['code'] ) || isset( $data['rate_code'] ) || isset( $data['method_title'] ) ) { - unset( $data['name'] ); - } - - // Remove props we don't want to expose. - unset( $data['order_id'] ); - unset( $data['type'] ); - - return $data; - } - - /** - * Get formatted item data. - * - * @since 3.0.0 - * @param WC_Data $object WC_Data instance. - * @return array - */ - protected function get_formatted_item_data( $object ) { - $data = $object->get_data(); - $format_decimal = array( 'discount_total', 'discount_tax', 'shipping_total', 'shipping_tax', 'shipping_total', 'shipping_tax', 'cart_tax', 'total', 'total_tax' ); - $format_date = array( 'date_created', 'date_modified', 'date_completed', 'date_paid' ); - $format_line_items = array( 'line_items', 'tax_lines', 'shipping_lines', 'fee_lines', 'coupon_lines' ); - - // Format decimal values. - foreach ( $format_decimal as $key ) { - $data[ $key ] = wc_format_decimal( $data[ $key ], $this->request['dp'] ); - } - - // Format date values. - foreach ( $format_date as $key ) { - $datetime = $data[ $key ]; - $data[ $key ] = wc_rest_prepare_date_response( $datetime, false ); - $data[ $key . '_gmt' ] = wc_rest_prepare_date_response( $datetime ); - } - - // Format the order status. - $data['status'] = 'wc-' === substr( $data['status'], 0, 3 ) ? substr( $data['status'], 3 ) : $data['status']; - - // Format line items. - foreach ( $format_line_items as $key ) { - $data[ $key ] = array_values( array_map( array( $this, 'get_order_item_data' ), $data[ $key ] ) ); - } - - // Refunds. - $data['refunds'] = array(); - foreach ( $object->get_refunds() as $refund ) { - $data['refunds'][] = array( - 'id' => $refund->get_id(), - 'reason' => $refund->get_reason() ? $refund->get_reason() : '', - 'total' => '-' . wc_format_decimal( $refund->get_amount(), $this->request['dp'] ), - ); - } - - return array( - 'id' => $object->get_id(), - 'parent_id' => $data['parent_id'], - 'number' => $data['number'], - 'order_key' => $data['order_key'], - 'created_via' => $data['created_via'], - 'version' => $data['version'], - 'status' => $data['status'], - 'currency' => $data['currency'], - 'date_created' => $data['date_created'], - 'date_created_gmt' => $data['date_created_gmt'], - 'date_modified' => $data['date_modified'], - 'date_modified_gmt' => $data['date_modified_gmt'], - 'discount_total' => $data['discount_total'], - 'discount_tax' => $data['discount_tax'], - 'shipping_total' => $data['shipping_total'], - 'shipping_tax' => $data['shipping_tax'], - 'cart_tax' => $data['cart_tax'], - 'total' => $data['total'], - 'total_tax' => $data['total_tax'], - 'prices_include_tax' => $data['prices_include_tax'], - 'customer_id' => $data['customer_id'], - 'customer_ip_address' => $data['customer_ip_address'], - 'customer_user_agent' => $data['customer_user_agent'], - 'customer_note' => $data['customer_note'], - 'billing' => $data['billing'], - 'shipping' => $data['shipping'], - 'payment_method' => $data['payment_method'], - 'payment_method_title' => $data['payment_method_title'], - 'transaction_id' => $data['transaction_id'], - 'date_paid' => $data['date_paid'], - 'date_paid_gmt' => $data['date_paid_gmt'], - 'date_completed' => $data['date_completed'], - 'date_completed_gmt' => $data['date_completed_gmt'], - 'cart_hash' => $data['cart_hash'], - 'meta_data' => $data['meta_data'], - 'line_items' => $data['line_items'], - 'tax_lines' => $data['tax_lines'], - 'shipping_lines' => $data['shipping_lines'], - 'fee_lines' => $data['fee_lines'], - 'coupon_lines' => $data['coupon_lines'], - 'refunds' => $data['refunds'], - ); - } - - /** - * Prepare a single order output for response. - * - * @since 3.0.0 - * @param WC_Data $object Object data. - * @param WP_REST_Request $request Request object. - * @return WP_REST_Response - */ - public function prepare_object_for_response( $object, $request ) { - $this->request = $request; - $this->request['dp'] = is_null( $this->request['dp'] ) ? wc_get_price_decimals() : absint( $this->request['dp'] ); - $data = $this->get_formatted_item_data( $object ); - $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; - $data = $this->add_additional_fields_to_object( $data, $request ); - $data = $this->filter_response_by_context( $data, $context ); - $response = rest_ensure_response( $data ); - $response->add_links( $this->prepare_links( $object, $request ) ); - - /** - * Filter the data for a response. - * - * The dynamic portion of the hook name, $this->post_type, - * refers to object type being prepared for the response. - * - * @param WP_REST_Response $response The response object. - * @param WC_Data $object Object data. - * @param WP_REST_Request $request Request object. - */ - return apply_filters( "woocommerce_rest_prepare_{$this->post_type}_object", $response, $object, $request ); - } - - /** - * Prepare links for the request. - * - * @param WC_Data $object Object data. - * @param WP_REST_Request $request Request object. - * @return array Links for the given post. - */ - protected function prepare_links( $object, $request ) { - $links = array( - 'self' => array( - 'href' => rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $object->get_id() ) ), - ), - 'collection' => array( - 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ), - ), - ); - - if ( 0 !== (int) $object->get_customer_id() ) { - $links['customer'] = array( - 'href' => rest_url( sprintf( '/%s/customers/%d', $this->namespace, $object->get_customer_id() ) ), - ); - } - - if ( 0 !== (int) $object->get_parent_id() ) { - $links['up'] = array( - 'href' => rest_url( sprintf( '/%s/orders/%d', $this->namespace, $object->get_parent_id() ) ), - ); - } - - return $links; - } - - /** - * Prepare objects query. - * - * @since 3.0.0 - * @param WP_REST_Request $request Full details about the request. - * @return array - */ - protected function prepare_objects_query( $request ) { - global $wpdb; - - $args = parent::prepare_objects_query( $request ); - - // Set post_status. - if ( 'any' !== $request['status'] ) { - $args['post_status'] = 'wc-' . $request['status']; - } else { - $args['post_status'] = 'any'; - } - - if ( isset( $request['customer'] ) ) { - if ( ! empty( $args['meta_query'] ) ) { - $args['meta_query'] = array(); // WPCS: slow query ok. - } - - $args['meta_query'][] = array( - 'key' => '_customer_user', - 'value' => $request['customer'], - 'type' => 'NUMERIC', - ); - } - - // Search by product. - if ( ! empty( $request['product'] ) ) { - $order_ids = $wpdb->get_col( - $wpdb->prepare( - " - SELECT order_id - FROM {$wpdb->prefix}woocommerce_order_items - WHERE order_item_id IN ( SELECT order_item_id FROM {$wpdb->prefix}woocommerce_order_itemmeta WHERE meta_key = '_product_id' AND meta_value = %d ) - AND order_item_type = 'line_item' - ", $request['product'] - ) - ); - - // Force WP_Query return empty if don't found any order. - $order_ids = ! empty( $order_ids ) ? $order_ids : array( 0 ); - - $args['post__in'] = $order_ids; - } - - // Search. - if ( ! empty( $args['s'] ) ) { - $order_ids = wc_order_search( $args['s'] ); - - if ( ! empty( $order_ids ) ) { - unset( $args['s'] ); - $args['post__in'] = array_merge( $order_ids, array( 0 ) ); - } - } - - /** - * Filter the query arguments for a request. - * - * Enables adding extra arguments or setting defaults for an order collection request. - * - * @param array $args Key value array of query var to query value. - * @param WP_REST_Request $request The request used. - */ - $args = apply_filters( 'woocommerce_rest_orders_prepare_object_query', $args, $request ); - - return $args; - } - - /** - * Only return writable props from schema. - * - * @param array $schema Schema. - * @return bool - */ - protected function filter_writable_props( $schema ) { - return empty( $schema['readonly'] ); - } - - /** - * Prepare a single order for create or update. - * - * @param WP_REST_Request $request Request object. - * @param bool $creating If is creating a new object. - * @return WP_Error|WC_Data - */ - protected function prepare_object_for_database( $request, $creating = false ) { - $id = isset( $request['id'] ) ? absint( $request['id'] ) : 0; - $order = new WC_Order( $id ); - $schema = $this->get_item_schema(); - $data_keys = array_keys( array_filter( $schema['properties'], array( $this, 'filter_writable_props' ) ) ); - - // Handle all writable props. - foreach ( $data_keys as $key ) { - $value = $request[ $key ]; - - if ( ! is_null( $value ) ) { - switch ( $key ) { - case 'status': - // Status change should be done later so transitions have new data. - break; - case 'billing': - case 'shipping': - $this->update_address( $order, $value, $key ); - break; - case 'line_items': - case 'shipping_lines': - case 'fee_lines': - case 'coupon_lines': - if ( is_array( $value ) ) { - foreach ( $value as $item ) { - if ( is_array( $item ) ) { - if ( $this->item_is_null( $item ) || ( isset( $item['quantity'] ) && 0 === $item['quantity'] ) ) { - $order->remove_item( $item['id'] ); - } else { - $this->set_item( $order, $key, $item ); - } - } - } - } - break; - case 'meta_data': - if ( is_array( $value ) ) { - foreach ( $value as $meta ) { - $order->update_meta_data( $meta['key'], $meta['value'], isset( $meta['id'] ) ? $meta['id'] : '' ); - } - } - break; - default: - if ( is_callable( array( $order, "set_{$key}" ) ) ) { - $order->{"set_{$key}"}( $value ); - } - break; - } - } - } - - /** - * Filters an object before it is inserted via the REST API. - * - * The dynamic portion of the hook name, `$this->post_type`, - * refers to the object type slug. - * - * @param WC_Data $order Object object. - * @param WP_REST_Request $request Request object. - * @param bool $creating If is creating a new object. - */ - return apply_filters( "woocommerce_rest_pre_insert_{$this->post_type}_object", $order, $request, $creating ); - } - - /** - * Save an object data. - * - * @since 3.0.0 - * @throws WC_REST_Exception But all errors are validated before returning any data. - * @param WP_REST_Request $request Full details about the request. - * @param bool $creating If is creating a new object. - * @return WC_Data|WP_Error - */ - protected function save_object( $request, $creating = false ) { - try { - $object = $this->prepare_object_for_database( $request, $creating ); - - if ( is_wp_error( $object ) ) { - return $object; - } - - // Make sure gateways are loaded so hooks from gateways fire on save/create. - WC()->payment_gateways(); - - if ( ! is_null( $request['customer_id'] ) && 0 !== $request['customer_id'] ) { - // Make sure customer exists. - if ( false === get_user_by( 'id', $request['customer_id'] ) ) { - throw new WC_REST_Exception( 'woocommerce_rest_invalid_customer_id', __( 'Customer ID is invalid.', 'woocommerce' ), 400 ); - } - - // Make sure customer is part of blog. - if ( is_multisite() && ! is_user_member_of_blog( $request['customer_id'] ) ) { - throw new WC_REST_Exception( 'woocommerce_rest_invalid_customer_id_network', __( 'Customer ID does not belong to this site.', 'woocommerce' ), 400 ); - } - } - - if ( $creating ) { - $object->set_created_via( 'rest-api' ); - $object->set_prices_include_tax( 'yes' === get_option( 'woocommerce_prices_include_tax' ) ); - $object->calculate_totals(); - } else { - // If items have changed, recalculate order totals. - if ( isset( $request['billing'] ) || isset( $request['shipping'] ) || isset( $request['line_items'] ) || isset( $request['shipping_lines'] ) || isset( $request['fee_lines'] ) || isset( $request['coupon_lines'] ) ) { - $object->calculate_totals(); - } - } - - // Set status. - if ( ! empty( $request['status'] ) ) { - $object->set_status( $request['status'] ); - } - - $object->save(); - - // Actions for after the order is saved. - if ( true === $request['set_paid'] ) { - if ( $creating || $object->needs_payment() ) { - $object->payment_complete( $request['transaction_id'] ); - } - } - - return $this->get_object( $object->get_id() ); - } catch ( WC_Data_Exception $e ) { - return new WP_Error( $e->getErrorCode(), $e->getMessage(), $e->getErrorData() ); - } catch ( WC_REST_Exception $e ) { - return new WP_Error( $e->getErrorCode(), $e->getMessage(), array( 'status' => $e->getCode() ) ); - } - } - - /** - * Update address. - * - * @param WC_Order $order Order data. - * @param array $posted Posted data. - * @param string $type Address type. - */ - protected function update_address( $order, $posted, $type = 'billing' ) { - foreach ( $posted as $key => $value ) { - if ( is_callable( array( $order, "set_{$type}_{$key}" ) ) ) { - $order->{"set_{$type}_{$key}"}( $value ); - } - } - } - - /** - * Gets the product ID from the SKU or posted ID. - * - * @throws WC_REST_Exception When SKU or ID is not valid. - * @param array $posted Request data. - * @return int - */ - protected function get_product_id( $posted ) { - if ( ! empty( $posted['sku'] ) ) { - $product_id = (int) wc_get_product_id_by_sku( $posted['sku'] ); - } elseif ( ! empty( $posted['product_id'] ) && empty( $posted['variation_id'] ) ) { - $product_id = (int) $posted['product_id']; - } elseif ( ! empty( $posted['variation_id'] ) ) { - $product_id = (int) $posted['variation_id']; - } else { - throw new WC_REST_Exception( 'woocommerce_rest_required_product_reference', __( 'Product ID or SKU is required.', 'woocommerce' ), 400 ); - } - return $product_id; - } - - /** - * Maybe set an item prop if the value was posted. - * - * @param WC_Order_Item $item Order item. - * @param string $prop Order property. - * @param array $posted Request data. - */ - protected function maybe_set_item_prop( $item, $prop, $posted ) { - if ( isset( $posted[ $prop ] ) ) { - $item->{"set_$prop"}( $posted[ $prop ] ); - } - } - - /** - * Maybe set item props if the values were posted. - * - * @param WC_Order_Item $item Order item data. - * @param string[] $props Properties. - * @param array $posted Request data. - */ - protected function maybe_set_item_props( $item, $props, $posted ) { - foreach ( $props as $prop ) { - $this->maybe_set_item_prop( $item, $prop, $posted ); - } - } - - /** - * Maybe set item meta if posted. - * - * @param WC_Order_Item $item Order item data. - * @param array $posted Request data. - */ - protected function maybe_set_item_meta_data( $item, $posted ) { - if ( ! empty( $posted['meta_data'] ) && is_array( $posted['meta_data'] ) ) { - foreach ( $posted['meta_data'] as $meta ) { - if ( isset( $meta['key'] ) ) { - $value = isset( $meta['value'] ) ? $meta['value'] : null; - $item->update_meta_data( $meta['key'], $value, isset( $meta['id'] ) ? $meta['id'] : '' ); - } - } - } - } - - /** - * Create or update a line item. - * - * @param array $posted Line item data. - * @param string $action 'create' to add line item or 'update' to update it. - * @param object $item Passed when updating an item. Null during creation. - * @return WC_Order_Item_Product - * @throws WC_REST_Exception Invalid data, server error. - */ - protected function prepare_line_items( $posted, $action = 'create', $item = null ) { - $item = is_null( $item ) ? new WC_Order_Item_Product( ! empty( $posted['id'] ) ? $posted['id'] : '' ) : $item; - $product = wc_get_product( $this->get_product_id( $posted ) ); - - if ( $product !== $item->get_product() ) { - $item->set_product( $product ); - - if ( 'create' === $action ) { - $quantity = isset( $posted['quantity'] ) ? $posted['quantity'] : 1; - $total = wc_get_price_excluding_tax( $product, array( 'qty' => $quantity ) ); - $item->set_total( $total ); - $item->set_subtotal( $total ); - } - } - - $this->maybe_set_item_props( $item, array( 'name', 'quantity', 'total', 'subtotal', 'tax_class' ), $posted ); - $this->maybe_set_item_meta_data( $item, $posted ); - - return $item; - } - - /** - * Create or update an order shipping method. - * - * @param array $posted $shipping Item data. - * @param string $action 'create' to add shipping or 'update' to update it. - * @param object $item Passed when updating an item. Null during creation. - * @return WC_Order_Item_Shipping - * @throws WC_REST_Exception Invalid data, server error. - */ - protected function prepare_shipping_lines( $posted, $action = 'create', $item = null ) { - $item = is_null( $item ) ? new WC_Order_Item_Shipping( ! empty( $posted['id'] ) ? $posted['id'] : '' ) : $item; - - if ( 'create' === $action ) { - if ( empty( $posted['method_id'] ) ) { - throw new WC_REST_Exception( 'woocommerce_rest_invalid_shipping_item', __( 'Shipping method ID is required.', 'woocommerce' ), 400 ); - } - } - - $this->maybe_set_item_props( $item, array( 'method_id', 'method_title', 'total' ), $posted ); - $this->maybe_set_item_meta_data( $item, $posted ); - - return $item; - } - - /** - * Create or update an order fee. - * - * @param array $posted Item data. - * @param string $action 'create' to add fee or 'update' to update it. - * @param object $item Passed when updating an item. Null during creation. - * @return WC_Order_Item_Fee - * @throws WC_REST_Exception Invalid data, server error. - */ - protected function prepare_fee_lines( $posted, $action = 'create', $item = null ) { - $item = is_null( $item ) ? new WC_Order_Item_Fee( ! empty( $posted['id'] ) ? $posted['id'] : '' ) : $item; - - if ( 'create' === $action ) { - if ( empty( $posted['name'] ) ) { - throw new WC_REST_Exception( 'woocommerce_rest_invalid_fee_item', __( 'Fee name is required.', 'woocommerce' ), 400 ); - } - } - - $this->maybe_set_item_props( $item, array( 'name', 'tax_class', 'tax_status', 'total' ), $posted ); - $this->maybe_set_item_meta_data( $item, $posted ); - - return $item; - } - - /** - * Create or update an order coupon. - * - * @param array $posted Item data. - * @param string $action 'create' to add coupon or 'update' to update it. - * @param object $item Passed when updating an item. Null during creation. - * @return WC_Order_Item_Coupon - * @throws WC_REST_Exception Invalid data, server error. - */ - protected function prepare_coupon_lines( $posted, $action = 'create', $item = null ) { - $item = is_null( $item ) ? new WC_Order_Item_Coupon( ! empty( $posted['id'] ) ? $posted['id'] : '' ) : $item; - - if ( 'create' === $action ) { - if ( empty( $posted['code'] ) ) { - throw new WC_REST_Exception( 'woocommerce_rest_invalid_coupon_coupon', __( 'Coupon code is required.', 'woocommerce' ), 400 ); - } - } - - $this->maybe_set_item_props( $item, array( 'code', 'discount' ), $posted ); - $this->maybe_set_item_meta_data( $item, $posted ); - - return $item; - } - - /** - * Wrapper method to create/update order items. - * When updating, the item ID provided is checked to ensure it is associated - * with the order. - * - * @param WC_Order $order order object. - * @param string $item_type The item type. - * @param array $posted item provided in the request body. - * @throws WC_REST_Exception If item ID is not associated with order. - */ - protected function set_item( $order, $item_type, $posted ) { - global $wpdb; - - if ( ! empty( $posted['id'] ) ) { - $action = 'update'; - } else { - $action = 'create'; - } - - $method = 'prepare_' . $item_type; - $item = null; - - // Verify provided line item ID is associated with order. - if ( 'update' === $action ) { - $item = $order->get_item( absint( $posted['id'] ), false ); - - if ( ! $item ) { - throw new WC_REST_Exception( 'woocommerce_rest_invalid_item_id', __( 'Order item ID provided is not associated with order.', 'woocommerce' ), 400 ); - } - } - - // Prepare item data. - $item = $this->$method( $posted, $action, $item ); - - do_action( 'woocommerce_rest_set_order_item', $item, $posted ); - - // If creating the order, add the item to it. - if ( 'create' === $action ) { - $order->add_item( $item ); - } else { - $item->save(); - } - } - - /** - * Helper method to check if the resource ID associated with the provided item is null. - * Items can be deleted by setting the resource ID to null. - * - * @param array $item Item provided in the request body. - * @return bool True if the item resource ID is null, false otherwise. - */ - protected function item_is_null( $item ) { - $keys = array( 'product_id', 'method_id', 'method_title', 'name', 'code' ); - - foreach ( $keys as $key ) { - if ( array_key_exists( $key, $item ) && is_null( $item[ $key ] ) ) { - return true; - } - } - - return false; - } - - /** - * Get order statuses without prefixes. - * - * @return array - */ - protected function get_order_statuses() { - $order_statuses = array(); - - foreach ( array_keys( wc_get_order_statuses() ) as $status ) { - $order_statuses[] = str_replace( 'wc-', '', $status ); - } - - return $order_statuses; - } - - /** - * Get the Order's schema, conforming to JSON Schema. - * - * @return array - */ - public function get_item_schema() { - $schema = array( - '$schema' => 'http://json-schema.org/draft-04/schema#', - 'title' => $this->post_type, - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'parent_id' => array( - 'description' => __( 'Parent order ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - ), - 'number' => array( - 'description' => __( 'Order number.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'order_key' => array( - 'description' => __( 'Order key.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'created_via' => array( - 'description' => __( 'Shows where the order was created.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'version' => array( - 'description' => __( 'Version of WooCommerce which last updated the order.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'status' => array( - 'description' => __( 'Order status.', 'woocommerce' ), - 'type' => 'string', - 'default' => 'pending', - 'enum' => $this->get_order_statuses(), - 'context' => array( 'view', 'edit' ), - ), - 'currency' => array( - 'description' => __( 'Currency the order was created with, in ISO format.', 'woocommerce' ), - 'type' => 'string', - 'default' => get_woocommerce_currency(), - 'enum' => array_keys( get_woocommerce_currencies() ), - 'context' => array( 'view', 'edit' ), - ), - 'date_created' => array( - 'description' => __( "The date the order was created, in the site's timezone.", 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_created_gmt' => array( - 'description' => __( 'The date the order was created, as GMT.', 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_modified' => array( - 'description' => __( "The date the order was last modified, in the site's timezone.", 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_modified_gmt' => array( - 'description' => __( 'The date the order was last modified, as GMT.', 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'discount_total' => array( - 'description' => __( 'Total discount amount for the order.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'discount_tax' => array( - 'description' => __( 'Total discount tax amount for the order.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'shipping_total' => array( - 'description' => __( 'Total shipping amount for the order.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'shipping_tax' => array( - 'description' => __( 'Total shipping tax amount for the order.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'cart_tax' => array( - 'description' => __( 'Sum of line item taxes only.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'total' => array( - 'description' => __( 'Grand total.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'total_tax' => array( - 'description' => __( 'Sum of all taxes.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'prices_include_tax' => array( - 'description' => __( 'True the prices included tax during checkout.', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'customer_id' => array( - 'description' => __( 'User ID who owns the order. 0 for guests.', 'woocommerce' ), - 'type' => 'integer', - 'default' => 0, - 'context' => array( 'view', 'edit' ), - ), - 'customer_ip_address' => array( - 'description' => __( "Customer's IP address.", 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'customer_user_agent' => array( - 'description' => __( 'User agent of the customer.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'customer_note' => array( - 'description' => __( 'Note left by customer during checkout.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'billing' => array( - 'description' => __( 'Billing address.', 'woocommerce' ), - 'type' => 'object', - 'context' => array( 'view', 'edit' ), - 'properties' => array( - 'first_name' => array( - 'description' => __( 'First name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'last_name' => array( - 'description' => __( 'Last name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'company' => array( - 'description' => __( 'Company name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'address_1' => array( - 'description' => __( 'Address line 1', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'address_2' => array( - 'description' => __( 'Address line 2', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'city' => array( - 'description' => __( 'City name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'state' => array( - 'description' => __( 'ISO code or name of the state, province or district.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'postcode' => array( - 'description' => __( 'Postal code.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'country' => array( - 'description' => __( 'Country code in ISO 3166-1 alpha-2 format.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'email' => array( - 'description' => __( 'Email address.', 'woocommerce' ), - 'type' => 'string', - 'format' => 'email', - 'context' => array( 'view', 'edit' ), - ), - 'phone' => array( - 'description' => __( 'Phone number.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - ), - ), - 'shipping' => array( - 'description' => __( 'Shipping address.', 'woocommerce' ), - 'type' => 'object', - 'context' => array( 'view', 'edit' ), - 'properties' => array( - 'first_name' => array( - 'description' => __( 'First name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'last_name' => array( - 'description' => __( 'Last name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'company' => array( - 'description' => __( 'Company name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'address_1' => array( - 'description' => __( 'Address line 1', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'address_2' => array( - 'description' => __( 'Address line 2', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'city' => array( - 'description' => __( 'City name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'state' => array( - 'description' => __( 'ISO code or name of the state, province or district.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'postcode' => array( - 'description' => __( 'Postal code.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'country' => array( - 'description' => __( 'Country code in ISO 3166-1 alpha-2 format.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - ), - ), - 'payment_method' => array( - 'description' => __( 'Payment method ID.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'payment_method_title' => array( - 'description' => __( 'Payment method title.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'transaction_id' => array( - 'description' => __( 'Unique transaction ID.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'date_paid' => array( - 'description' => __( "The date the order was paid, in the site's timezone.", 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_paid_gmt' => array( - 'description' => __( 'The date the order was paid, as GMT.', 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_completed' => array( - 'description' => __( "The date the order was completed, in the site's timezone.", 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_completed_gmt' => array( - 'description' => __( 'The date the order was completed, as GMT.', 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'cart_hash' => array( - 'description' => __( 'MD5 hash of cart items to ensure orders are not modified.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'meta_data' => array( - 'description' => __( 'Meta data.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'items' => array( - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Meta ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'key' => array( - 'description' => __( 'Meta key.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'value' => array( - 'description' => __( 'Meta value.', 'woocommerce' ), - 'type' => 'mixed', - 'context' => array( 'view', 'edit' ), - ), - ), - ), - ), - 'line_items' => array( - 'description' => __( 'Line items data.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'items' => array( - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Item ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'name' => array( - 'description' => __( 'Product name.', 'woocommerce' ), - 'type' => 'mixed', - 'context' => array( 'view', 'edit' ), - ), - 'product_id' => array( - 'description' => __( 'Product ID.', 'woocommerce' ), - 'type' => 'mixed', - 'context' => array( 'view', 'edit' ), - ), - 'variation_id' => array( - 'description' => __( 'Variation ID, if applicable.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - ), - 'quantity' => array( - 'description' => __( 'Quantity ordered.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - ), - 'tax_class' => array( - 'description' => __( 'Tax class of product.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'subtotal' => array( - 'description' => __( 'Line subtotal (before discounts).', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'subtotal_tax' => array( - 'description' => __( 'Line subtotal tax (before discounts).', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'total' => array( - 'description' => __( 'Line total (after discounts).', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'total_tax' => array( - 'description' => __( 'Line total tax (after discounts).', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'taxes' => array( - 'description' => __( 'Line taxes.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - 'items' => array( - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Tax rate ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - ), - 'total' => array( - 'description' => __( 'Tax total.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'subtotal' => array( - 'description' => __( 'Tax subtotal.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - ), - ), - ), - 'meta_data' => array( - 'description' => __( 'Meta data.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'items' => array( - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Meta ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'key' => array( - 'description' => __( 'Meta key.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'value' => array( - 'description' => __( 'Meta value.', 'woocommerce' ), - 'type' => 'mixed', - 'context' => array( 'view', 'edit' ), - ), - ), - ), - ), - 'sku' => array( - 'description' => __( 'Product SKU.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'price' => array( - 'description' => __( 'Product price.', 'woocommerce' ), - 'type' => 'number', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - ), - ), - ), - 'tax_lines' => array( - 'description' => __( 'Tax lines data.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - 'items' => array( - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Item ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'rate_code' => array( - 'description' => __( 'Tax rate code.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'rate_id' => array( - 'description' => __( 'Tax rate ID.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'label' => array( - 'description' => __( 'Tax rate label.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'compound' => array( - 'description' => __( 'Show if is a compound tax rate.', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'tax_total' => array( - 'description' => __( 'Tax total (not including shipping taxes).', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'shipping_tax_total' => array( - 'description' => __( 'Shipping tax total.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'meta_data' => array( - 'description' => __( 'Meta data.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'items' => array( - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Meta ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'key' => array( - 'description' => __( 'Meta key.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'value' => array( - 'description' => __( 'Meta value.', 'woocommerce' ), - 'type' => 'mixed', - 'context' => array( 'view', 'edit' ), - ), - ), - ), - ), - ), - ), - ), - 'shipping_lines' => array( - 'description' => __( 'Shipping lines data.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'items' => array( - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Item ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'method_title' => array( - 'description' => __( 'Shipping method name.', 'woocommerce' ), - 'type' => 'mixed', - 'context' => array( 'view', 'edit' ), - ), - 'method_id' => array( - 'description' => __( 'Shipping method ID.', 'woocommerce' ), - 'type' => 'mixed', - 'context' => array( 'view', 'edit' ), - ), - 'total' => array( - 'description' => __( 'Line total (after discounts).', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'total_tax' => array( - 'description' => __( 'Line total tax (after discounts).', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'taxes' => array( - 'description' => __( 'Line taxes.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - 'items' => array( - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Tax rate ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'total' => array( - 'description' => __( 'Tax total.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - ), - ), - ), - 'meta_data' => array( - 'description' => __( 'Meta data.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'items' => array( - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Meta ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'key' => array( - 'description' => __( 'Meta key.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'value' => array( - 'description' => __( 'Meta value.', 'woocommerce' ), - 'type' => 'mixed', - 'context' => array( 'view', 'edit' ), - ), - ), - ), - ), - ), - ), - ), - 'fee_lines' => array( - 'description' => __( 'Fee lines data.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'items' => array( - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Item ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'name' => array( - 'description' => __( 'Fee name.', 'woocommerce' ), - 'type' => 'mixed', - 'context' => array( 'view', 'edit' ), - ), - 'tax_class' => array( - 'description' => __( 'Tax class of fee.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'tax_status' => array( - 'description' => __( 'Tax status of fee.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'enum' => array( 'taxable', 'none' ), - ), - 'total' => array( - 'description' => __( 'Line total (after discounts).', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'total_tax' => array( - 'description' => __( 'Line total tax (after discounts).', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'taxes' => array( - 'description' => __( 'Line taxes.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - 'items' => array( - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Tax rate ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'total' => array( - 'description' => __( 'Tax total.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'subtotal' => array( - 'description' => __( 'Tax subtotal.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - ), - ), - ), - 'meta_data' => array( - 'description' => __( 'Meta data.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'items' => array( - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Meta ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'key' => array( - 'description' => __( 'Meta key.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'value' => array( - 'description' => __( 'Meta value.', 'woocommerce' ), - 'type' => 'mixed', - 'context' => array( 'view', 'edit' ), - ), - ), - ), - ), - ), - ), - ), - 'coupon_lines' => array( - 'description' => __( 'Coupons line data.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'items' => array( - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Item ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'code' => array( - 'description' => __( 'Coupon code.', 'woocommerce' ), - 'type' => 'mixed', - 'context' => array( 'view', 'edit' ), - ), - 'discount' => array( - 'description' => __( 'Discount total.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'discount_tax' => array( - 'description' => __( 'Discount total tax.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'meta_data' => array( - 'description' => __( 'Meta data.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'items' => array( - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Meta ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'key' => array( - 'description' => __( 'Meta key.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'value' => array( - 'description' => __( 'Meta value.', 'woocommerce' ), - 'type' => 'mixed', - 'context' => array( 'view', 'edit' ), - ), - ), - ), - ), - ), - ), - ), - 'refunds' => array( - 'description' => __( 'List of refunds.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - 'items' => array( - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Refund ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'reason' => array( - 'description' => __( 'Refund reason.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'total' => array( - 'description' => __( 'Refund total.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - ), - ), - ), - 'set_paid' => array( - 'description' => __( 'Define if the order is paid. It will set the status to processing and reduce stock items.', 'woocommerce' ), - 'type' => 'boolean', - 'default' => false, - 'context' => array( 'edit' ), - ), - ), - ); - - return $this->add_additional_fields_schema( $schema ); - } - - /** - * Get the query params for collections. - * - * @return array - */ - public function get_collection_params() { - $params = parent::get_collection_params(); - - $params['status'] = array( - 'default' => 'any', - 'description' => __( 'Limit result set to orders assigned a specific status.', 'woocommerce' ), - 'type' => 'string', - 'enum' => array_merge( array( 'any' ), $this->get_order_statuses() ), - 'sanitize_callback' => 'sanitize_key', - 'validate_callback' => 'rest_validate_request_arg', - ); - $params['customer'] = array( - 'description' => __( 'Limit result set to orders assigned a specific customer.', 'woocommerce' ), - 'type' => 'integer', - 'sanitize_callback' => 'absint', - 'validate_callback' => 'rest_validate_request_arg', - ); - $params['product'] = array( - 'description' => __( 'Limit result set to orders assigned a specific product.', 'woocommerce' ), - 'type' => 'integer', - 'sanitize_callback' => 'absint', - 'validate_callback' => 'rest_validate_request_arg', - ); - $params['dp'] = array( - 'default' => wc_get_price_decimals(), - 'description' => __( 'Number of decimal points to use in each resource.', 'woocommerce' ), - 'type' => 'integer', - 'sanitize_callback' => 'absint', - 'validate_callback' => 'rest_validate_request_arg', - ); - - return $params; - } + protected $namespace = 'wc/v3'; } diff --git a/includes/api/class-wc-rest-payment-gateways-controller.php b/includes/api/class-wc-rest-payment-gateways-controller.php index 89f6a692632..17bec9c2901 100644 --- a/includes/api/class-wc-rest-payment-gateways-controller.php +++ b/includes/api/class-wc-rest-payment-gateways-controller.php @@ -14,453 +14,14 @@ defined( 'ABSPATH' ) || exit; * Paymenga gateways controller class. * * @package WooCommerce/API - * @extends WC_REST_Controller + * @extends WC_REST_Payment_Gateways_V2_Controller */ -class WC_REST_Payment_Gateways_Controller extends WC_REST_Controller { +class WC_REST_Payment_Gateways_Controller extends WC_REST_Payment_Gateways_V2_Controller { /** * Endpoint namespace. * * @var string */ - protected $namespace = 'wc/v2'; - - /** - * Route base. - * - * @var string - */ - protected $rest_base = 'payment_gateways'; - - /** - * Register the route for /payment_gateways and /payment_gateways/ - */ - public function register_routes() { - register_rest_route( - $this->namespace, '/' . $this->rest_base, array( - array( - 'methods' => WP_REST_Server::READABLE, - 'callback' => array( $this, 'get_items' ), - 'permission_callback' => array( $this, 'get_items_permissions_check' ), - 'args' => $this->get_collection_params(), - ), - 'schema' => array( $this, 'get_public_item_schema' ), - ) - ); - register_rest_route( - $this->namespace, '/' . $this->rest_base . '/(?P[\w-]+)', array( - 'args' => array( - 'id' => array( - 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), - 'type' => 'string', - ), - ), - array( - 'methods' => WP_REST_Server::READABLE, - 'callback' => array( $this, 'get_item' ), - 'permission_callback' => array( $this, 'get_item_permissions_check' ), - 'args' => array( - 'context' => $this->get_context_param( array( 'default' => 'view' ) ), - ), - ), - array( - 'methods' => WP_REST_Server::EDITABLE, - 'callback' => array( $this, 'update_item' ), - 'permission_callback' => array( $this, 'update_items_permissions_check' ), - 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), - ), - 'schema' => array( $this, 'get_public_item_schema' ), - ) - ); - } - - /** - * Check whether a given request has permission to view payment gateways. - * - * @param WP_REST_Request $request Full details about the request. - * @return WP_Error|boolean - */ - public function get_items_permissions_check( $request ) { - if ( ! wc_rest_check_manager_permissions( 'payment_gateways', 'read' ) ) { - return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot list resources.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); - } - return true; - } - - /** - * Check if a given request has access to read a payment gateway. - * - * @param WP_REST_Request $request Full details about the request. - * @return WP_Error|boolean - */ - public function get_item_permissions_check( $request ) { - if ( ! wc_rest_check_manager_permissions( 'payment_gateways', 'read' ) ) { - return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot view this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); - } - return true; - } - - /** - * Check whether a given request has permission to edit payment gateways. - * - * @param WP_REST_Request $request Full details about the request. - * @return WP_Error|boolean - */ - public function update_items_permissions_check( $request ) { - if ( ! wc_rest_check_manager_permissions( 'payment_gateways', 'edit' ) ) { - return new WP_Error( 'woocommerce_rest_cannot_edit', __( 'Sorry, you are not allowed to edit this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); - } - return true; - } - - /** - * Get payment gateways. - * - * @param WP_REST_Request $request Full details about the request. - * @return WP_Error|WP_REST_Response - */ - public function get_items( $request ) { - $payment_gateways = WC()->payment_gateways->payment_gateways(); - $response = array(); - foreach ( $payment_gateways as $payment_gateway_id => $payment_gateway ) { - $payment_gateway->id = $payment_gateway_id; - $gateway = $this->prepare_item_for_response( $payment_gateway, $request ); - $gateway = $this->prepare_response_for_collection( $gateway ); - $response[] = $gateway; - } - return rest_ensure_response( $response ); - } - - /** - * Get a single payment gateway. - * - * @param WP_REST_Request $request Request data. - * @return WP_REST_Response|WP_Error - */ - public function get_item( $request ) { - $gateway = $this->get_gateway( $request ); - - if ( is_null( $gateway ) ) { - return new WP_Error( 'woocommerce_rest_payment_gateway_invalid', __( 'Resource does not exist.', 'woocommerce' ), array( 'status' => 404 ) ); - } - - $gateway = $this->prepare_item_for_response( $gateway, $request ); - return rest_ensure_response( $gateway ); - } - - /** - * Update A Single Payment Method. - * - * @param WP_REST_Request $request Request data. - * @return WP_REST_Response|WP_Error - */ - public function update_item( $request ) { - $gateway = $this->get_gateway( $request ); - - if ( is_null( $gateway ) ) { - return new WP_Error( 'woocommerce_rest_payment_gateway_invalid', __( 'Resource does not exist.', 'woocommerce' ), array( 'status' => 404 ) ); - } - - // Get settings. - $gateway->init_form_fields(); - $settings = $gateway->settings; - - // Update settings. - if ( isset( $request['settings'] ) ) { - $errors_found = false; - foreach ( $gateway->form_fields as $key => $field ) { - if ( isset( $request['settings'][ $key ] ) ) { - if ( is_callable( array( $this, 'validate_setting_' . $field['type'] . '_field' ) ) ) { - $value = $this->{'validate_setting_' . $field['type'] . '_field'}( $request['settings'][ $key ], $field ); - } else { - $value = $this->validate_setting_text_field( $request['settings'][ $key ], $field ); - } - if ( is_wp_error( $value ) ) { - $errors_found = true; - break; - } - $settings[ $key ] = $value; - } - } - - if ( $errors_found ) { - return new WP_Error( 'rest_setting_value_invalid', __( 'An invalid setting value was passed.', 'woocommerce' ), array( 'status' => 400 ) ); - } - } - - // Update if this method is enabled or not. - if ( isset( $request['enabled'] ) ) { - $settings['enabled'] = wc_bool_to_string( $request['enabled'] ); - $gateway->enabled = $settings['enabled']; - } - - // Update title. - if ( isset( $request['title'] ) ) { - $settings['title'] = $request['title']; - $gateway->title = $settings['title']; - } - - // Update description. - if ( isset( $request['description'] ) ) { - $settings['description'] = $request['description']; - $gateway->description = $settings['description']; - } - - // Update options. - $gateway->settings = $settings; - update_option( $gateway->get_option_key(), apply_filters( 'woocommerce_gateway_' . $gateway->id . '_settings_values', $settings, $gateway ) ); - - // Update order. - if ( isset( $request['order'] ) ) { - $order = (array) get_option( 'woocommerce_gateway_order' ); - $order[ $gateway->id ] = $request['order']; - update_option( 'woocommerce_gateway_order', $order ); - $gateway->order = absint( $request['order'] ); - } - - $gateway = $this->prepare_item_for_response( $gateway, $request ); - return rest_ensure_response( $gateway ); - } - - /** - * Get a gateway based on the current request object. - * - * @param WP_REST_Request $request Request data. - * @return WP_REST_Response|null - */ - public function get_gateway( $request ) { - $gateway = null; - $payment_gateways = WC()->payment_gateways->payment_gateways(); - foreach ( $payment_gateways as $payment_gateway_id => $payment_gateway ) { - if ( $request['id'] !== $payment_gateway_id ) { - continue; - } - $payment_gateway->id = $payment_gateway_id; - $gateway = $payment_gateway; - } - return $gateway; - } - - /** - * Prepare a payment gateway for response. - * - * @param WC_Payment_Gateway $gateway Payment gateway object. - * @param WP_REST_Request $request Request object. - * @return WP_REST_Response $response Response data. - */ - public function prepare_item_for_response( $gateway, $request ) { - $order = (array) get_option( 'woocommerce_gateway_order' ); - $item = array( - 'id' => $gateway->id, - 'title' => $gateway->title, - 'description' => $gateway->description, - 'order' => isset( $order[ $gateway->id ] ) ? $order[ $gateway->id ] : '', - 'enabled' => ( 'yes' === $gateway->enabled ), - 'method_title' => $gateway->get_method_title(), - 'method_description' => $gateway->get_method_description(), - 'settings' => $this->get_settings( $gateway ), - ); - - $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; - $data = $this->add_additional_fields_to_object( $item, $request ); - $data = $this->filter_response_by_context( $data, $context ); - - $response = rest_ensure_response( $data ); - $response->add_links( $this->prepare_links( $gateway, $request ) ); - - /** - * Filter payment gateway objects returned from the REST API. - * - * @param WP_REST_Response $response The response object. - * @param WC_Payment_Gateway $gateway Payment gateway object. - * @param WP_REST_Request $request Request object. - */ - return apply_filters( 'woocommerce_rest_prepare_payment_gateway', $response, $gateway, $request ); - } - - /** - * Return settings associated with this payment gateway. - * - * @param WC_Payment_Gateway $gateway Gateway data. - * - * @return array - */ - public function get_settings( $gateway ) { - $settings = array(); - $gateway->init_form_fields(); - foreach ( $gateway->form_fields as $id => $field ) { - // Make sure we at least have a title and type. - if ( empty( $field['title'] ) || empty( $field['type'] ) ) { - continue; - } - // Ignore 'title' settings/fields -- they are UI only. - if ( 'title' === $field['type'] ) { - continue; - } - // Ignore 'enabled' and 'description' which get included elsewhere. - if ( in_array( $id, array( 'enabled', 'description' ), true ) ) { - continue; - } - $data = array( - 'id' => $id, - 'label' => empty( $field['label'] ) ? $field['title'] : $field['label'], - 'description' => empty( $field['description'] ) ? '' : $field['description'], - 'type' => $field['type'], - 'value' => empty( $gateway->settings[ $id ] ) ? '' : $gateway->settings[ $id ], - 'default' => empty( $field['default'] ) ? '' : $field['default'], - 'tip' => empty( $field['description'] ) ? '' : $field['description'], - 'placeholder' => empty( $field['placeholder'] ) ? '' : $field['placeholder'], - ); - if ( ! empty( $field['options'] ) ) { - $data['options'] = $field['options']; - } - $settings[ $id ] = $data; - } - return $settings; - } - - /** - * Prepare links for the request. - * - * @param WC_Payment_Gateway $gateway Payment gateway object. - * @param WP_REST_Request $request Request object. - * @return array - */ - protected function prepare_links( $gateway, $request ) { - $links = array( - 'self' => array( - 'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $this->rest_base, $gateway->id ) ), - ), - 'collection' => array( - 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ), - ), - ); - - return $links; - } - - /** - * Get the payment gateway schema, conforming to JSON Schema. - * - * @return array - */ - public function get_item_schema() { - $schema = array( - '$schema' => 'http://json-schema.org/draft-04/schema#', - 'title' => 'payment_gateway', - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Payment gateway ID.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'title' => array( - 'description' => __( 'Payment gateway title on checkout.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'description' => array( - 'description' => __( 'Payment gateway description on checkout.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'order' => array( - 'description' => __( 'Payment gateway sort order.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'arg_options' => array( - 'sanitize_callback' => 'absint', - ), - ), - 'enabled' => array( - 'description' => __( 'Payment gateway enabled status.', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view', 'edit' ), - ), - 'method_title' => array( - 'description' => __( 'Payment gateway method title.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'method_description' => array( - 'description' => __( 'Payment gateway method description.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'settings' => array( - 'description' => __( 'Payment gateway settings.', 'woocommerce' ), - 'type' => 'object', - 'context' => array( 'view', 'edit' ), - 'properties' => array( - 'id' => array( - 'description' => __( 'A unique identifier for the setting.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'label' => array( - 'description' => __( 'A human readable label for the setting used in interfaces.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'description' => array( - 'description' => __( 'A human readable description for the setting used in interfaces.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'type' => array( - 'description' => __( 'Type of setting.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'enum' => array( 'text', 'email', 'number', 'color', 'password', 'textarea', 'select', 'multiselect', 'radio', 'image_width', 'checkbox' ), - 'readonly' => true, - ), - 'value' => array( - 'description' => __( 'Setting value.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'default' => array( - 'description' => __( 'Default value for the setting.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'tip' => array( - 'description' => __( 'Additional help text shown to the user about the setting.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'placeholder' => array( - 'description' => __( 'Placeholder text to be displayed in text inputs.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - ), - ), - ), - ); - - return $this->add_additional_fields_schema( $schema ); - } - - /** - * Get any query params needed. - * - * @return array - */ - public function get_collection_params() { - return array( - 'context' => $this->get_context_param( array( 'default' => 'view' ) ), - ); - } - + protected $namespace = 'wc/v3'; } diff --git a/includes/api/class-wc-rest-product-attribute-terms-controller.php b/includes/api/class-wc-rest-product-attribute-terms-controller.php index 6d844ec62ec..3e652894d69 100644 --- a/includes/api/class-wc-rest-product-attribute-terms-controller.php +++ b/includes/api/class-wc-rest-product-attribute-terms-controller.php @@ -14,14 +14,14 @@ defined( 'ABSPATH' ) || exit; * REST API Product Attribute Terms controller class. * * @package WooCommerce/API - * @extends WC_REST_Product_Attribute_Terms_V1_Controller + * @extends WC_REST_Product_Attribute_Terms_V2_Controller */ -class WC_REST_Product_Attribute_Terms_Controller extends WC_REST_Product_Attribute_Terms_V1_Controller { +class WC_REST_Product_Attribute_Terms_Controller extends WC_REST_Product_Attribute_Terms_V2_Controller { /** * Endpoint namespace. * * @var string */ - protected $namespace = 'wc/v2'; + protected $namespace = 'wc/v3'; } diff --git a/includes/api/class-wc-rest-product-attributes-controller.php b/includes/api/class-wc-rest-product-attributes-controller.php index 2ab17365c22..047e6e4e257 100644 --- a/includes/api/class-wc-rest-product-attributes-controller.php +++ b/includes/api/class-wc-rest-product-attributes-controller.php @@ -14,14 +14,14 @@ defined( 'ABSPATH' ) || exit; * REST API Product Attributes controller class. * * @package WooCommerce/API - * @extends WC_REST_Product_Attributes_V1_Controller + * @extends WC_REST_Product_Attributes_V2_Controller */ -class WC_REST_Product_Attributes_Controller extends WC_REST_Product_Attributes_V1_Controller { +class WC_REST_Product_Attributes_Controller extends WC_REST_Product_Attributes_V2_Controller { /** * Endpoint namespace. * * @var string */ - protected $namespace = 'wc/v2'; + protected $namespace = 'wc/v3'; } diff --git a/includes/api/class-wc-rest-product-categories-controller.php b/includes/api/class-wc-rest-product-categories-controller.php index 5b1a5a5b8d1..0142d20ed1f 100644 --- a/includes/api/class-wc-rest-product-categories-controller.php +++ b/includes/api/class-wc-rest-product-categories-controller.php @@ -14,199 +14,14 @@ defined( 'ABSPATH' ) || exit; * REST API Product Categories controller class. * * @package WooCommerce/API - * @extends WC_REST_Product_Categories_V1_Controller + * @extends WC_REST_Product_Categories_V2_Controller */ -class WC_REST_Product_Categories_Controller extends WC_REST_Product_Categories_V1_Controller { +class WC_REST_Product_Categories_Controller extends WC_REST_Product_Categories_V2_Controller { /** * Endpoint namespace. * * @var string */ - protected $namespace = 'wc/v2'; - - /** - * Prepare a single product category output for response. - * - * @param WP_Term $item Term object. - * @param WP_REST_Request $request Request instance. - * @return WP_REST_Response - */ - public function prepare_item_for_response( $item, $request ) { - // Get category display type. - $display_type = get_woocommerce_term_meta( $item->term_id, 'display_type' ); - - // Get category order. - $menu_order = get_woocommerce_term_meta( $item->term_id, 'order' ); - - $data = array( - 'id' => (int) $item->term_id, - 'name' => $item->name, - 'slug' => $item->slug, - 'parent' => (int) $item->parent, - 'description' => $item->description, - 'display' => $display_type ? $display_type : 'default', - 'image' => null, - 'menu_order' => (int) $menu_order, - 'count' => (int) $item->count, - ); - - // Get category image. - $image_id = get_woocommerce_term_meta( $item->term_id, 'thumbnail_id' ); - if ( $image_id ) { - $attachment = get_post( $image_id ); - - $data['image'] = array( - 'id' => (int) $image_id, - 'date_created' => wc_rest_prepare_date_response( $attachment->post_date ), - 'date_created_gmt' => wc_rest_prepare_date_response( $attachment->post_date_gmt ), - 'date_modified' => wc_rest_prepare_date_response( $attachment->post_modified ), - 'date_modified_gmt' => wc_rest_prepare_date_response( $attachment->post_modified_gmt ), - 'src' => wp_get_attachment_url( $image_id ), - 'title' => get_the_title( $attachment ), - 'alt' => get_post_meta( $image_id, '_wp_attachment_image_alt', true ), - ); - } - - $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; - $data = $this->add_additional_fields_to_object( $data, $request ); - $data = $this->filter_response_by_context( $data, $context ); - - $response = rest_ensure_response( $data ); - - $response->add_links( $this->prepare_links( $item, $request ) ); - - /** - * Filter a term item returned from the API. - * - * Allows modification of the term data right before it is returned. - * - * @param WP_REST_Response $response The response object. - * @param object $item The original term object. - * @param WP_REST_Request $request Request used to generate the response. - */ - return apply_filters( "woocommerce_rest_prepare_{$this->taxonomy}", $response, $item, $request ); - } - - /** - * Get the Category schema, conforming to JSON Schema. - * - * @return array - */ - public function get_item_schema() { - $schema = array( - '$schema' => 'http://json-schema.org/draft-04/schema#', - 'title' => $this->taxonomy, - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'name' => array( - 'description' => __( 'Category name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'arg_options' => array( - 'sanitize_callback' => 'sanitize_text_field', - ), - ), - 'slug' => array( - 'description' => __( 'An alphanumeric identifier for the resource unique to its type.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'arg_options' => array( - 'sanitize_callback' => 'sanitize_title', - ), - ), - 'parent' => array( - 'description' => __( 'The ID for the parent of the resource.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - ), - 'description' => array( - 'description' => __( 'HTML description of the resource.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'arg_options' => array( - 'sanitize_callback' => 'wp_filter_post_kses', - ), - ), - 'display' => array( - 'description' => __( 'Category archive display type.', 'woocommerce' ), - 'type' => 'string', - 'default' => 'default', - 'enum' => array( 'default', 'products', 'subcategories', 'both' ), - 'context' => array( 'view', 'edit' ), - ), - 'image' => array( - 'description' => __( 'Image data.', 'woocommerce' ), - 'type' => 'object', - 'context' => array( 'view', 'edit' ), - 'properties' => array( - 'id' => array( - 'description' => __( 'Image ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - ), - 'date_created' => array( - 'description' => __( "The date the image was created, in the site's timezone.", 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_created_gmt' => array( - 'description' => __( 'The date the image was created, as GMT.', 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_modified' => array( - 'description' => __( "The date the image was last modified, in the site's timezone.", 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_modified_gmt' => array( - 'description' => __( 'The date the image was last modified, as GMT.', 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'src' => array( - 'description' => __( 'Image URL.', 'woocommerce' ), - 'type' => 'string', - 'format' => 'uri', - 'context' => array( 'view', 'edit' ), - ), - 'title' => array( - 'description' => __( 'Image name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'alt' => array( - 'description' => __( 'Image alternative text.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - ), - ), - 'menu_order' => array( - 'description' => __( 'Menu order, used to custom sort the resource.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - ), - 'count' => array( - 'description' => __( 'Number of published products for the resource.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - ), - ); - - return $this->add_additional_fields_schema( $schema ); - } + protected $namespace = 'wc/v3'; } diff --git a/includes/api/class-wc-rest-product-reviews-controller.php b/includes/api/class-wc-rest-product-reviews-controller.php index 47b2de99d4f..8481d5eda08 100644 --- a/includes/api/class-wc-rest-product-reviews-controller.php +++ b/includes/api/class-wc-rest-product-reviews-controller.php @@ -14,186 +14,14 @@ defined( 'ABSPATH' ) || exit; * REST API Product Reviews Controller Class. * * @package WooCommerce/API - * @extends WC_REST_Product_Reviews_V1_Controller + * @extends WC_REST_Product_Reviews_V2_Controller */ -class WC_REST_Product_Reviews_Controller extends WC_REST_Product_Reviews_V1_Controller { +class WC_REST_Product_Reviews_Controller extends WC_REST_Product_Reviews_V2_Controller { /** * Endpoint namespace. * * @var string */ - protected $namespace = 'wc/v2'; - - /** - * Route base. - * - * @var string - */ - protected $rest_base = 'products/(?P[\d]+)/reviews'; - - /** - * Register the routes for product reviews. - */ - public function register_routes() { - parent::register_routes(); - - register_rest_route( - $this->namespace, '/' . $this->rest_base . '/batch', array( - 'args' => array( - 'product_id' => array( - 'description' => __( 'Unique identifier for the variable product.', 'woocommerce' ), - 'type' => 'integer', - ), - ), - array( - 'methods' => WP_REST_Server::EDITABLE, - 'callback' => array( $this, 'batch_items' ), - 'permission_callback' => array( $this, 'batch_items_permissions_check' ), - 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), - ), - 'schema' => array( $this, 'get_public_batch_schema' ), - ) - ); - } - - /** - * Check if a given request has access to batch manage product reviews. - * - * @param WP_REST_Request $request Full details about the request. - * @return WP_Error|boolean - */ - public function batch_items_permissions_check( $request ) { - if ( ! wc_rest_check_post_permissions( 'product', 'batch' ) ) { - return new WP_Error( 'woocommerce_rest_cannot_edit', __( 'Sorry, you are not allowed to batch manipulate this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); - } - return true; - } - - /** - * Prepare a single product review output for response. - * - * @param WP_Comment $review Product review object. - * @param WP_REST_Request $request Request object. - * @return WP_REST_Response $response Response data. - */ - public function prepare_item_for_response( $review, $request ) { - $data = array( - 'id' => (int) $review->comment_ID, - 'date_created' => wc_rest_prepare_date_response( $review->comment_date ), - 'date_created_gmt' => wc_rest_prepare_date_response( $review->comment_date_gmt ), - 'review' => $review->comment_content, - 'rating' => (int) get_comment_meta( $review->comment_ID, 'rating', true ), - 'name' => $review->comment_author, - 'email' => $review->comment_author_email, - 'verified' => wc_review_is_from_verified_owner( $review->comment_ID ), - ); - - $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; - $data = $this->add_additional_fields_to_object( $data, $request ); - $data = $this->filter_response_by_context( $data, $context ); - - // Wrap the data in a response object. - $response = rest_ensure_response( $data ); - - $response->add_links( $this->prepare_links( $review, $request ) ); - - /** - * Filter product reviews object returned from the REST API. - * - * @param WP_REST_Response $response The response object. - * @param WP_Comment $review Product review object used to create response. - * @param WP_REST_Request $request Request object. - */ - return apply_filters( 'woocommerce_rest_prepare_product_review', $response, $review, $request ); - } - - - /** - * Bulk create, update and delete items. - * - * @since 3.0.0 - * @param WP_REST_Request $request Full details about the request. - * @return array Of WP_Error or WP_REST_Response. - */ - public function batch_items( $request ) { - $items = array_filter( $request->get_params() ); - $params = $request->get_url_params(); - $product_id = $params['product_id']; - $body_params = array(); - - foreach ( array( 'update', 'create', 'delete' ) as $batch_type ) { - if ( ! empty( $items[ $batch_type ] ) ) { - $injected_items = array(); - foreach ( $items[ $batch_type ] as $item ) { - $injected_items[] = is_array( $item ) ? array_merge( array( 'product_id' => $product_id ), $item ) : $item; - } - $body_params[ $batch_type ] = $injected_items; - } - } - - $request = new WP_REST_Request( $request->get_method() ); - $request->set_body_params( $body_params ); - - return parent::batch_items( $request ); - } - - /** - * Get the Product Review's schema, conforming to JSON Schema. - * - * @return array - */ - public function get_item_schema() { - $schema = array( - '$schema' => 'http://json-schema.org/draft-04/schema#', - 'title' => 'product_review', - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'review' => array( - 'description' => __( 'The content of the review.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'date_created' => array( - 'description' => __( "The date the review was created, in the site's timezone.", 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - ), - 'date_created_gmt' => array( - 'description' => __( 'The date the review was created, as GMT.', 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - ), - 'rating' => array( - 'description' => __( 'Review rating (0 to 5).', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - ), - 'name' => array( - 'description' => __( 'Reviewer name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'email' => array( - 'description' => __( 'Reviewer email.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'verified' => array( - 'description' => __( 'Shows if the reviewer bought the product or not.', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - ), - ); - - return $this->add_additional_fields_schema( $schema ); - } + protected $namespace = 'wc/v3'; } diff --git a/includes/api/class-wc-rest-product-shipping-classes-controller.php b/includes/api/class-wc-rest-product-shipping-classes-controller.php index daf3d1befc5..3a3aa7c0444 100644 --- a/includes/api/class-wc-rest-product-shipping-classes-controller.php +++ b/includes/api/class-wc-rest-product-shipping-classes-controller.php @@ -14,14 +14,14 @@ defined( 'ABSPATH' ) || exit; * REST API Product Shipping Classes controller class. * * @package WooCommerce/API - * @extends WC_REST_Product_Shipping_Classes_V1_Controller + * @extends WC_REST_Product_Shipping_Classes_V2_Controller */ -class WC_REST_Product_Shipping_Classes_Controller extends WC_REST_Product_Shipping_Classes_V1_Controller { +class WC_REST_Product_Shipping_Classes_Controller extends WC_REST_Product_Shipping_Classes_V2_Controller { /** * Endpoint namespace. * * @var string */ - protected $namespace = 'wc/v2'; + protected $namespace = 'wc/v3'; } diff --git a/includes/api/class-wc-rest-product-tags-controller.php b/includes/api/class-wc-rest-product-tags-controller.php index 1110ada41de..121808721be 100644 --- a/includes/api/class-wc-rest-product-tags-controller.php +++ b/includes/api/class-wc-rest-product-tags-controller.php @@ -14,14 +14,14 @@ defined( 'ABSPATH' ) || exit; * REST API Product Tags controller class. * * @package WooCommerce/API - * @extends WC_REST_Product_Tags_V1_Controller + * @extends WC_REST_Product_Tags_V2_Controller */ -class WC_REST_Product_Tags_Controller extends WC_REST_Product_Tags_V1_Controller { +class WC_REST_Product_Tags_Controller extends WC_REST_Product_Tags_V2_Controller { /** * Endpoint namespace. * * @var string */ - protected $namespace = 'wc/v2'; + protected $namespace = 'wc/v3'; } diff --git a/includes/api/class-wc-rest-product-variations-controller.php b/includes/api/class-wc-rest-product-variations-controller.php index 621bffd7e5e..1334edbe279 100644 --- a/includes/api/class-wc-rest-product-variations-controller.php +++ b/includes/api/class-wc-rest-product-variations-controller.php @@ -14,990 +14,14 @@ defined( 'ABSPATH' ) || exit; * REST API variations controller class. * * @package WooCommerce/API - * @extends WC_REST_Products_Controller + * @extends WC_REST_Product_Variations_V2_Controller */ -class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller { +class WC_REST_Product_Variations_Controller extends WC_REST_Product_Variations_V2_Controller { /** * Endpoint namespace. * * @var string */ - protected $namespace = 'wc/v2'; - - /** - * Route base. - * - * @var string - */ - protected $rest_base = 'products/(?P[\d]+)/variations'; - - /** - * Post type. - * - * @var string - */ - protected $post_type = 'product_variation'; - - /** - * Initialize product actions (parent). - */ - public function __construct() { - add_filter( "woocommerce_rest_{$this->post_type}_query", array( $this, 'add_product_id' ), 9, 2 ); - parent::__construct(); - } - - /** - * Register the routes for products. - */ - public function register_routes() { - register_rest_route( - $this->namespace, '/' . $this->rest_base, array( - 'args' => array( - 'product_id' => array( - 'description' => __( 'Unique identifier for the variable product.', 'woocommerce' ), - 'type' => 'integer', - ), - ), - array( - 'methods' => WP_REST_Server::READABLE, - 'callback' => array( $this, 'get_items' ), - 'permission_callback' => array( $this, 'get_items_permissions_check' ), - 'args' => $this->get_collection_params(), - ), - array( - 'methods' => WP_REST_Server::CREATABLE, - 'callback' => array( $this, 'create_item' ), - 'permission_callback' => array( $this, 'create_item_permissions_check' ), - 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ), - ), - 'schema' => array( $this, 'get_public_item_schema' ), - ) - ); - register_rest_route( - $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)', array( - 'args' => array( - 'product_id' => array( - 'description' => __( 'Unique identifier for the variable product.', 'woocommerce' ), - 'type' => 'integer', - ), - 'id' => array( - 'description' => __( 'Unique identifier for the variation.', 'woocommerce' ), - 'type' => 'integer', - ), - ), - array( - 'methods' => WP_REST_Server::READABLE, - 'callback' => array( $this, 'get_item' ), - 'permission_callback' => array( $this, 'get_item_permissions_check' ), - 'args' => array( - 'context' => $this->get_context_param( - array( - 'default' => 'view', - ) - ), - ), - ), - array( - 'methods' => WP_REST_Server::EDITABLE, - 'callback' => array( $this, 'update_item' ), - 'permission_callback' => array( $this, 'update_item_permissions_check' ), - 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), - ), - array( - 'methods' => WP_REST_Server::DELETABLE, - 'callback' => array( $this, 'delete_item' ), - 'permission_callback' => array( $this, 'delete_item_permissions_check' ), - 'args' => array( - 'force' => array( - 'default' => false, - 'type' => 'boolean', - 'description' => __( 'Whether to bypass trash and force deletion.', 'woocommerce' ), - ), - ), - ), - 'schema' => array( $this, 'get_public_item_schema' ), - ) - ); - register_rest_route( - $this->namespace, '/' . $this->rest_base . '/batch', array( - 'args' => array( - 'product_id' => array( - 'description' => __( 'Unique identifier for the variable product.', 'woocommerce' ), - 'type' => 'integer', - ), - ), - array( - 'methods' => WP_REST_Server::EDITABLE, - 'callback' => array( $this, 'batch_items' ), - 'permission_callback' => array( $this, 'batch_items_permissions_check' ), - 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), - ), - 'schema' => array( $this, 'get_public_batch_schema' ), - ) - ); - } - - /** - * Get object. - * - * @since 3.0.0 - * @param int $id Object ID. - * @return WC_Data - */ - protected function get_object( $id ) { - return wc_get_product( $id ); - } - - /** - * Check if a given request has access to update an item. - * - * @param WP_REST_Request $request Full details about the request. - * @return WP_Error|boolean - */ - public function update_item_permissions_check( $request ) { - $object = $this->get_object( (int) $request['id'] ); - - if ( $object && 0 !== $object->get_id() && ! wc_rest_check_post_permissions( $this->post_type, 'edit', $object->get_id() ) ) { - return new WP_Error( 'woocommerce_rest_cannot_edit', __( 'Sorry, you are not allowed to edit this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); - } - - // Check if variation belongs to the correct parent product. - if ( $object && 0 !== $object->get_parent_id() && absint( $request['product_id'] ) !== $object->get_parent_id() ) { - return new WP_Error( 'woocommerce_rest_cannot_edit', __( 'Parent product does not match current variation.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); - } - - return true; - } - - /** - * Prepare a single variation output for response. - * - * @since 3.0.0 - * @param WC_Data $object Object data. - * @param WP_REST_Request $request Request object. - * @return WP_REST_Response - */ - public function prepare_object_for_response( $object, $request ) { - $data = array( - 'id' => $object->get_id(), - 'date_created' => wc_rest_prepare_date_response( $object->get_date_created(), false ), - 'date_created_gmt' => wc_rest_prepare_date_response( $object->get_date_created() ), - 'date_modified' => wc_rest_prepare_date_response( $object->get_date_modified(), false ), - 'date_modified_gmt' => wc_rest_prepare_date_response( $object->get_date_modified() ), - 'description' => wc_format_content( $object->get_description() ), - 'permalink' => $object->get_permalink(), - 'sku' => $object->get_sku(), - 'price' => $object->get_price(), - 'regular_price' => $object->get_regular_price(), - 'sale_price' => $object->get_sale_price(), - 'date_on_sale_from' => wc_rest_prepare_date_response( $object->get_date_on_sale_from(), false ), - 'date_on_sale_from_gmt' => wc_rest_prepare_date_response( $object->get_date_on_sale_from() ), - 'date_on_sale_to' => wc_rest_prepare_date_response( $object->get_date_on_sale_to(), false ), - 'date_on_sale_to_gmt' => wc_rest_prepare_date_response( $object->get_date_on_sale_to() ), - 'on_sale' => $object->is_on_sale(), - 'visible' => $object->is_visible(), - 'purchasable' => $object->is_purchasable(), - 'virtual' => $object->is_virtual(), - 'downloadable' => $object->is_downloadable(), - 'downloads' => $this->get_downloads( $object ), - 'download_limit' => '' !== $object->get_download_limit() ? (int) $object->get_download_limit() : -1, - 'download_expiry' => '' !== $object->get_download_expiry() ? (int) $object->get_download_expiry() : -1, - 'tax_status' => $object->get_tax_status(), - 'tax_class' => $object->get_tax_class(), - 'manage_stock' => $object->managing_stock(), - 'stock_quantity' => $object->get_stock_quantity(), - 'in_stock' => $object->is_in_stock(), - 'backorders' => $object->get_backorders(), - 'backorders_allowed' => $object->backorders_allowed(), - 'backordered' => $object->is_on_backorder(), - 'weight' => $object->get_weight(), - 'dimensions' => array( - 'length' => $object->get_length(), - 'width' => $object->get_width(), - 'height' => $object->get_height(), - ), - 'shipping_class' => $object->get_shipping_class(), - 'shipping_class_id' => $object->get_shipping_class_id(), - 'image' => current( $this->get_images( $object ) ), - 'attributes' => $this->get_attributes( $object ), - 'menu_order' => $object->get_menu_order(), - 'meta_data' => $object->get_meta_data(), - ); - - $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; - $data = $this->add_additional_fields_to_object( $data, $request ); - $data = $this->filter_response_by_context( $data, $context ); - $response = rest_ensure_response( $data ); - $response->add_links( $this->prepare_links( $object, $request ) ); - - /** - * Filter the data for a response. - * - * The dynamic portion of the hook name, $this->post_type, - * refers to object type being prepared for the response. - * - * @param WP_REST_Response $response The response object. - * @param WC_Data $object Object data. - * @param WP_REST_Request $request Request object. - */ - return apply_filters( "woocommerce_rest_prepare_{$this->post_type}_object", $response, $object, $request ); - } - - /** - * Prepare objects query. - * - * @since 3.0.0 - * @param WP_REST_Request $request Full details about the request. - * @return array - */ - protected function prepare_objects_query( $request ) { - $args = parent::prepare_objects_query( $request ); - - $args['post_parent'] = $request['product_id']; - - return $args; - } - - /** - * Prepare a single variation for create or update. - * - * @param WP_REST_Request $request Request object. - * @param bool $creating If is creating a new object. - * @return WP_Error|WC_Data - */ - protected function prepare_object_for_database( $request, $creating = false ) { - if ( isset( $request['id'] ) ) { - $variation = wc_get_product( absint( $request['id'] ) ); - } else { - $variation = new WC_Product_Variation(); - } - - // Update parent ID just once. - if ( 0 === $variation->get_parent_id() ) { - $variation->set_parent_id( absint( $request['product_id'] ) ); - } - - // Status. - if ( isset( $request['visible'] ) ) { - $variation->set_status( false === $request['visible'] ? 'private' : 'publish' ); - } - - // SKU. - if ( isset( $request['sku'] ) ) { - $variation->set_sku( wc_clean( $request['sku'] ) ); - } - - // Thumbnail. - if ( isset( $request['image'] ) ) { - if ( is_array( $request['image'] ) && ! empty( $request['image'] ) ) { - $image = $request['image']; - if ( is_array( $image ) ) { - $image['position'] = 0; - } - - $variation = $this->set_product_images( $variation, array( $image ) ); - } else { - $variation->set_image_id( '' ); - } - } - - // Virtual variation. - if ( isset( $request['virtual'] ) ) { - $variation->set_virtual( $request['virtual'] ); - } - - // Downloadable variation. - if ( isset( $request['downloadable'] ) ) { - $variation->set_downloadable( $request['downloadable'] ); - } - - // Downloads. - if ( $variation->get_downloadable() ) { - // Downloadable files. - if ( isset( $request['downloads'] ) && is_array( $request['downloads'] ) ) { - $variation = $this->save_downloadable_files( $variation, $request['downloads'] ); - } - - // Download limit. - if ( isset( $request['download_limit'] ) ) { - $variation->set_download_limit( $request['download_limit'] ); - } - - // Download expiry. - if ( isset( $request['download_expiry'] ) ) { - $variation->set_download_expiry( $request['download_expiry'] ); - } - } - - // Shipping data. - $variation = $this->save_product_shipping_data( $variation, $request ); - - // Stock handling. - if ( isset( $request['manage_stock'] ) ) { - if ( 'parent' === $request['manage_stock'] ) { - $variation->set_manage_stock( false ); // This just indicates the variation does not manage stock, but the parent does. - } else { - $variation->set_manage_stock( wc_string_to_bool( $request['manage_stock'] ) ); - } - } - - if ( isset( $request['in_stock'] ) ) { - $variation->set_stock_status( true === $request['in_stock'] ? 'instock' : 'outofstock' ); - } - - if ( isset( $request['backorders'] ) ) { - $variation->set_backorders( $request['backorders'] ); - } - - if ( $variation->get_manage_stock() ) { - if ( isset( $request['stock_quantity'] ) ) { - $variation->set_stock_quantity( $request['stock_quantity'] ); - } elseif ( isset( $request['inventory_delta'] ) ) { - $stock_quantity = wc_stock_amount( $variation->get_stock_quantity() ); - $stock_quantity += wc_stock_amount( $request['inventory_delta'] ); - $variation->set_stock_quantity( $stock_quantity ); - } - } else { - $variation->set_backorders( 'no' ); - $variation->set_stock_quantity( '' ); - } - - // Regular Price. - if ( isset( $request['regular_price'] ) ) { - $variation->set_regular_price( $request['regular_price'] ); - } - - // Sale Price. - if ( isset( $request['sale_price'] ) ) { - $variation->set_sale_price( $request['sale_price'] ); - } - - if ( isset( $request['date_on_sale_from'] ) ) { - $variation->set_date_on_sale_from( $request['date_on_sale_from'] ); - } - - if ( isset( $request['date_on_sale_from_gmt'] ) ) { - $variation->set_date_on_sale_from( $request['date_on_sale_from_gmt'] ? strtotime( $request['date_on_sale_from_gmt'] ) : null ); - } - - if ( isset( $request['date_on_sale_to'] ) ) { - $variation->set_date_on_sale_to( $request['date_on_sale_to'] ); - } - - if ( isset( $request['date_on_sale_to_gmt'] ) ) { - $variation->set_date_on_sale_to( $request['date_on_sale_to_gmt'] ? strtotime( $request['date_on_sale_to_gmt'] ) : null ); - } - - // Tax class. - if ( isset( $request['tax_class'] ) ) { - $variation->set_tax_class( $request['tax_class'] ); - } - - // Description. - if ( isset( $request['description'] ) ) { - $variation->set_description( wp_kses_post( $request['description'] ) ); - } - - // Update taxonomies. - if ( isset( $request['attributes'] ) ) { - $attributes = array(); - $parent = wc_get_product( $variation->get_parent_id() ); - $parent_attributes = $parent->get_attributes(); - - foreach ( $request['attributes'] as $attribute ) { - $attribute_id = 0; - $attribute_name = ''; - - // Check ID for global attributes or name for product attributes. - if ( ! empty( $attribute['id'] ) ) { - $attribute_id = absint( $attribute['id'] ); - $raw_attribute_name = wc_attribute_taxonomy_name_by_id( $attribute_id ); - } elseif ( ! empty( $attribute['name'] ) ) { - $raw_attribute_name = sanitize_title( $attribute['name'] ); - } - - if ( ! $attribute_id && ! $raw_attribute_name ) { - continue; - } - - $attribute_name = sanitize_title( $raw_attribute_name ); - - if ( ! isset( $parent_attributes[ $attribute_name ] ) || ! $parent_attributes[ $attribute_name ]->get_variation() ) { - continue; - } - - $attribute_key = sanitize_title( $parent_attributes[ $attribute_name ]->get_name() ); - $attribute_value = isset( $attribute['option'] ) ? wc_clean( stripslashes( $attribute['option'] ) ) : ''; - - if ( $parent_attributes[ $attribute_name ]->is_taxonomy() ) { - // If dealing with a taxonomy, we need to get the slug from the name posted to the API. - $term = get_term_by( 'name', $attribute_value, $raw_attribute_name ); // @codingStandardsIgnoreLine - - if ( $term && ! is_wp_error( $term ) ) { - $attribute_value = $term->slug; - } else { - $attribute_value = sanitize_title( $attribute_value ); - } - } - - $attributes[ $attribute_key ] = $attribute_value; - } - - $variation->set_attributes( $attributes ); - } - - // Menu order. - if ( $request['menu_order'] ) { - $variation->set_menu_order( $request['menu_order'] ); - } - - // Meta data. - if ( is_array( $request['meta_data'] ) ) { - foreach ( $request['meta_data'] as $meta ) { - $variation->update_meta_data( $meta['key'], $meta['value'], isset( $meta['id'] ) ? $meta['id'] : '' ); - } - } - - /** - * Filters an object before it is inserted via the REST API. - * - * The dynamic portion of the hook name, `$this->post_type`, - * refers to the object type slug. - * - * @param WC_Data $variation Object object. - * @param WP_REST_Request $request Request object. - * @param bool $creating If is creating a new object. - */ - return apply_filters( "woocommerce_rest_pre_insert_{$this->post_type}_object", $variation, $request, $creating ); - } - - /** - * Clear caches here so in sync with any new variations. - * - * @param WC_Data $object Object data. - */ - public function clear_transients( $object ) { - wc_delete_product_transients( $object->get_parent_id() ); - wp_cache_delete( 'product-' . $object->get_parent_id(), 'products' ); - } - - /** - * Delete a variation. - * - * @param WP_REST_Request $request Full details about the request. - * - * @return bool|WP_Error|WP_REST_Response - */ - public function delete_item( $request ) { - $force = (bool) $request['force']; - $object = $this->get_object( (int) $request['id'] ); - $result = false; - - if ( ! $object || 0 === $object->get_id() ) { - return new WP_Error( - "woocommerce_rest_{$this->post_type}_invalid_id", __( 'Invalid ID.', 'woocommerce' ), array( - 'status' => 404, - ) - ); - } - - $supports_trash = EMPTY_TRASH_DAYS > 0 && is_callable( array( $object, 'get_status' ) ); - - /** - * Filter whether an object is trashable. - * - * Return false to disable trash support for the object. - * - * @param boolean $supports_trash Whether the object type support trashing. - * @param WC_Data $object The object being considered for trashing support. - */ - $supports_trash = apply_filters( "woocommerce_rest_{$this->post_type}_object_trashable", $supports_trash, $object ); - - if ( ! wc_rest_check_post_permissions( $this->post_type, 'delete', $object->get_id() ) ) { - return new WP_Error( - /* translators: %s: post type */ - "woocommerce_rest_user_cannot_delete_{$this->post_type}", sprintf( __( 'Sorry, you are not allowed to delete %s.', 'woocommerce' ), $this->post_type ), array( - 'status' => rest_authorization_required_code(), - ) - ); - } - - $request->set_param( 'context', 'edit' ); - $response = $this->prepare_object_for_response( $object, $request ); - - // If we're forcing, then delete permanently. - if ( $force ) { - $object->delete( true ); - $result = 0 === $object->get_id(); - } else { - // If we don't support trashing for this type, error out. - if ( ! $supports_trash ) { - return new WP_Error( - /* translators: %s: post type */ - 'woocommerce_rest_trash_not_supported', sprintf( __( 'The %s does not support trashing.', 'woocommerce' ), $this->post_type ), array( - 'status' => 501, - ) - ); - } - - // Otherwise, only trash if we haven't already. - if ( is_callable( array( $object, 'get_status' ) ) ) { - if ( 'trash' === $object->get_status() ) { - return new WP_Error( - /* translators: %s: post type */ - 'woocommerce_rest_already_trashed', sprintf( __( 'The %s has already been deleted.', 'woocommerce' ), $this->post_type ), array( - 'status' => 410, - ) - ); - } - - $object->delete(); - $result = 'trash' === $object->get_status(); - } - } - - if ( ! $result ) { - return new WP_Error( - /* translators: %s: post type */ - 'woocommerce_rest_cannot_delete', sprintf( __( 'The %s cannot be deleted.', 'woocommerce' ), $this->post_type ), array( - 'status' => 500, - ) - ); - } - - // Delete parent product transients. - if ( 0 !== $object->get_parent_id() ) { - wc_delete_product_transients( $object->get_parent_id() ); - } - - /** - * Fires after a single object is deleted or trashed via the REST API. - * - * @param WC_Data $object The deleted or trashed object. - * @param WP_REST_Response $response The response data. - * @param WP_REST_Request $request The request sent to the API. - */ - do_action( "woocommerce_rest_delete_{$this->post_type}_object", $object, $response, $request ); - - return $response; - } - - /** - * Bulk create, update and delete items. - * - * @since 3.0.0 - * @param WP_REST_Request $request Full details about the request. - * @return array Of WP_Error or WP_REST_Response. - */ - public function batch_items( $request ) { - $items = array_filter( $request->get_params() ); - $params = $request->get_url_params(); - $product_id = $params['product_id']; - $body_params = array(); - - foreach ( array( 'update', 'create', 'delete' ) as $batch_type ) { - if ( ! empty( $items[ $batch_type ] ) ) { - $injected_items = array(); - foreach ( $items[ $batch_type ] as $item ) { - $injected_items[] = is_array( $item ) ? array_merge( - array( - 'product_id' => $product_id, - ), $item - ) : $item; - } - $body_params[ $batch_type ] = $injected_items; - } - } - - $request = new WP_REST_Request( $request->get_method() ); - $request->set_body_params( $body_params ); - - return parent::batch_items( $request ); - } - - /** - * Prepare links for the request. - * - * @param WC_Data $object Object data. - * @param WP_REST_Request $request Request object. - * @return array Links for the given post. - */ - protected function prepare_links( $object, $request ) { - $product_id = (int) $request['product_id']; - $base = str_replace( '(?P[\d]+)', $product_id, $this->rest_base ); - $links = array( - 'self' => array( - 'href' => rest_url( sprintf( '/%s/%s/%d', $this->namespace, $base, $object->get_id() ) ), - ), - 'collection' => array( - 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $base ) ), - ), - 'up' => array( - 'href' => rest_url( sprintf( '/%s/products/%d', $this->namespace, $product_id ) ), - ), - ); - return $links; - } - - /** - * Get the Variation's schema, conforming to JSON Schema. - * - * @return array - */ - public function get_item_schema() { - $weight_unit = get_option( 'woocommerce_weight_unit' ); - $dimension_unit = get_option( 'woocommerce_dimension_unit' ); - $schema = array( - '$schema' => 'http://json-schema.org/draft-04/schema#', - 'title' => $this->post_type, - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_created' => array( - 'description' => __( "The date the variation was created, in the site's timezone.", 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_modified' => array( - 'description' => __( "The date the variation was last modified, in the site's timezone.", 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'description' => array( - 'description' => __( 'Variation description.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'permalink' => array( - 'description' => __( 'Variation URL.', 'woocommerce' ), - 'type' => 'string', - 'format' => 'uri', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'sku' => array( - 'description' => __( 'Unique identifier.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'price' => array( - 'description' => __( 'Current variation price.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'regular_price' => array( - 'description' => __( 'Variation regular price.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'sale_price' => array( - 'description' => __( 'Variation sale price.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'date_on_sale_from' => array( - 'description' => __( "Start date of sale price, in the site's timezone.", 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - ), - 'date_on_sale_from_gmt' => array( - 'description' => __( 'Start date of sale price, as GMT.', 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - ), - 'date_on_sale_to' => array( - 'description' => __( "End date of sale price, in the site's timezone.", 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - ), - 'date_on_sale_to_gmt' => array( - 'description' => __( 'End date of sale price, as GMT.', 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - ), - 'on_sale' => array( - 'description' => __( 'Shows if the variation is on sale.', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'visible' => array( - 'description' => __( "Define if the variation is visible on the product's page.", 'woocommerce' ), - 'type' => 'boolean', - 'default' => true, - 'context' => array( 'view', 'edit' ), - ), - 'purchasable' => array( - 'description' => __( 'Shows if the variation can be bought.', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'virtual' => array( - 'description' => __( 'If the variation is virtual.', 'woocommerce' ), - 'type' => 'boolean', - 'default' => false, - 'context' => array( 'view', 'edit' ), - ), - 'downloadable' => array( - 'description' => __( 'If the variation is downloadable.', 'woocommerce' ), - 'type' => 'boolean', - 'default' => false, - 'context' => array( 'view', 'edit' ), - ), - 'downloads' => array( - 'description' => __( 'List of downloadable files.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'items' => array( - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'File MD5 hash.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'name' => array( - 'description' => __( 'File name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'file' => array( - 'description' => __( 'File URL.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - ), - ), - ), - 'download_limit' => array( - 'description' => __( 'Number of times downloadable files can be downloaded after purchase.', 'woocommerce' ), - 'type' => 'integer', - 'default' => -1, - 'context' => array( 'view', 'edit' ), - ), - 'download_expiry' => array( - 'description' => __( 'Number of days until access to downloadable files expires.', 'woocommerce' ), - 'type' => 'integer', - 'default' => -1, - 'context' => array( 'view', 'edit' ), - ), - 'tax_status' => array( - 'description' => __( 'Tax status.', 'woocommerce' ), - 'type' => 'string', - 'default' => 'taxable', - 'enum' => array( 'taxable', 'shipping', 'none' ), - 'context' => array( 'view', 'edit' ), - ), - 'tax_class' => array( - 'description' => __( 'Tax class.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'manage_stock' => array( - 'description' => __( 'Stock management at variation level.', 'woocommerce' ), - 'type' => 'mixed', - 'default' => false, - 'context' => array( 'view', 'edit' ), - ), - 'stock_quantity' => array( - 'description' => __( 'Stock quantity.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - ), - 'in_stock' => array( - 'description' => __( 'Controls whether or not the variation is listed as "in stock" or "out of stock" on the frontend.', 'woocommerce' ), - 'type' => 'boolean', - 'default' => true, - 'context' => array( 'view', 'edit' ), - ), - 'backorders' => array( - 'description' => __( 'If managing stock, this controls if backorders are allowed.', 'woocommerce' ), - 'type' => 'string', - 'default' => 'no', - 'enum' => array( 'no', 'notify', 'yes' ), - 'context' => array( 'view', 'edit' ), - ), - 'backorders_allowed' => array( - 'description' => __( 'Shows if backorders are allowed.', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'backordered' => array( - 'description' => __( 'Shows if the variation is on backordered.', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'weight' => array( - /* translators: %s: weight unit */ - 'description' => sprintf( __( 'Variation weight (%s).', 'woocommerce' ), $weight_unit ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'dimensions' => array( - 'description' => __( 'Variation dimensions.', 'woocommerce' ), - 'type' => 'object', - 'context' => array( 'view', 'edit' ), - 'properties' => array( - 'length' => array( - /* translators: %s: dimension unit */ - 'description' => sprintf( __( 'Variation length (%s).', 'woocommerce' ), $dimension_unit ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'width' => array( - /* translators: %s: dimension unit */ - 'description' => sprintf( __( 'Variation width (%s).', 'woocommerce' ), $dimension_unit ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'height' => array( - /* translators: %s: dimension unit */ - 'description' => sprintf( __( 'Variation height (%s).', 'woocommerce' ), $dimension_unit ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - ), - ), - 'shipping_class' => array( - 'description' => __( 'Shipping class slug.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'shipping_class_id' => array( - 'description' => __( 'Shipping class ID.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'image' => array( - 'description' => __( 'Variation image data.', 'woocommerce' ), - 'type' => 'object', - 'context' => array( 'view', 'edit' ), - 'properties' => array( - 'id' => array( - 'description' => __( 'Image ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - ), - 'date_created' => array( - 'description' => __( "The date the image was created, in the site's timezone.", 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_created_gmt' => array( - 'description' => __( 'The date the image was created, as GMT.', 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_modified' => array( - 'description' => __( "The date the image was last modified, in the site's timezone.", 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_modified_gmt' => array( - 'description' => __( 'The date the image was last modified, as GMT.', 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'src' => array( - 'description' => __( 'Image URL.', 'woocommerce' ), - 'type' => 'string', - 'format' => 'uri', - 'context' => array( 'view', 'edit' ), - ), - 'name' => array( - 'description' => __( 'Image name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'alt' => array( - 'description' => __( 'Image alternative text.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'position' => array( - 'description' => __( 'Image position. 0 means that the image is featured.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - ), - ), - ), - 'attributes' => array( - 'description' => __( 'List of attributes.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'items' => array( - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Attribute ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - ), - 'name' => array( - 'description' => __( 'Attribute name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'option' => array( - 'description' => __( 'Selected attribute term name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - ), - ), - ), - 'menu_order' => array( - 'description' => __( 'Menu order, used to custom sort products.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - ), - 'meta_data' => array( - 'description' => __( 'Meta data.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'items' => array( - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Meta ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'key' => array( - 'description' => __( 'Meta key.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'value' => array( - 'description' => __( 'Meta value.', 'woocommerce' ), - 'type' => 'mixed', - 'context' => array( 'view', 'edit' ), - ), - ), - ), - ), - ), - ); - - return $this->add_additional_fields_schema( $schema ); - } + protected $namespace = 'wc/v3'; } diff --git a/includes/api/class-wc-rest-products-controller.php b/includes/api/class-wc-rest-products-controller.php index 1f2af73999c..1073cf6ef40 100644 --- a/includes/api/class-wc-rest-products-controller.php +++ b/includes/api/class-wc-rest-products-controller.php @@ -14,2132 +14,14 @@ defined( 'ABSPATH' ) || exit; * REST API Products controller class. * * @package WooCommerce/API - * @extends WC_REST_CRUD_Controller + * @extends WC_REST_Products_V2_Controller */ -class WC_REST_Products_Controller extends WC_REST_Legacy_Products_Controller { +class WC_REST_Products_Controller extends WC_REST_Products_V2_Controller { /** * Endpoint namespace. * * @var string */ - protected $namespace = 'wc/v2'; - - /** - * Route base. - * - * @var string - */ - protected $rest_base = 'products'; - - /** - * Post type. - * - * @var string - */ - protected $post_type = 'product'; - - /** - * If object is hierarchical. - * - * @var bool - */ - protected $hierarchical = true; - - /** - * Initialize product actions. - */ - public function __construct() { - add_action( "woocommerce_rest_insert_{$this->post_type}_object", array( $this, 'clear_transients' ) ); - } - - /** - * Register the routes for products. - */ - public function register_routes() { - register_rest_route( - $this->namespace, '/' . $this->rest_base, array( - array( - 'methods' => WP_REST_Server::READABLE, - 'callback' => array( $this, 'get_items' ), - 'permission_callback' => array( $this, 'get_items_permissions_check' ), - 'args' => $this->get_collection_params(), - ), - array( - 'methods' => WP_REST_Server::CREATABLE, - 'callback' => array( $this, 'create_item' ), - 'permission_callback' => array( $this, 'create_item_permissions_check' ), - 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ), - ), - 'schema' => array( $this, 'get_public_item_schema' ), - ) - ); - - register_rest_route( - $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)', array( - 'args' => array( - 'id' => array( - 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), - 'type' => 'integer', - ), - ), - array( - 'methods' => WP_REST_Server::READABLE, - 'callback' => array( $this, 'get_item' ), - 'permission_callback' => array( $this, 'get_item_permissions_check' ), - 'args' => array( - 'context' => $this->get_context_param( - array( - 'default' => 'view', - ) - ), - ), - ), - array( - 'methods' => WP_REST_Server::EDITABLE, - 'callback' => array( $this, 'update_item' ), - 'permission_callback' => array( $this, 'update_item_permissions_check' ), - 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), - ), - array( - 'methods' => WP_REST_Server::DELETABLE, - 'callback' => array( $this, 'delete_item' ), - 'permission_callback' => array( $this, 'delete_item_permissions_check' ), - 'args' => array( - 'force' => array( - 'default' => false, - 'description' => __( 'Whether to bypass trash and force deletion.', 'woocommerce' ), - 'type' => 'boolean', - ), - ), - ), - 'schema' => array( $this, 'get_public_item_schema' ), - ) - ); - - register_rest_route( - $this->namespace, '/' . $this->rest_base . '/batch', array( - array( - 'methods' => WP_REST_Server::EDITABLE, - 'callback' => array( $this, 'batch_items' ), - 'permission_callback' => array( $this, 'batch_items_permissions_check' ), - 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), - ), - 'schema' => array( $this, 'get_public_batch_schema' ), - ) - ); - } - - /** - * Get object. - * - * @since 3.0.0 - * @param int $id Object ID. - * @return WC_Data - */ - protected function get_object( $id ) { - return wc_get_product( $id ); - } - - /** - * Prepare a single product output for response. - * - * @since 3.0.0 - * @param WC_Data $object Object data. - * @param WP_REST_Request $request Request object. - * @return WP_REST_Response - */ - public function prepare_object_for_response( $object, $request ) { - $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; - $data = $this->get_product_data( $object, $context ); - - // Add variations to variable products. - if ( $object->is_type( 'variable' ) && $object->has_child() ) { - $data['variations'] = $object->get_children(); - } - - // Add grouped products data. - if ( $object->is_type( 'grouped' ) && $object->has_child() ) { - $data['grouped_products'] = $object->get_children(); - } - - $data = $this->add_additional_fields_to_object( $data, $request ); - $data = $this->filter_response_by_context( $data, $context ); - $response = rest_ensure_response( $data ); - $response->add_links( $this->prepare_links( $object, $request ) ); - - /** - * Filter the data for a response. - * - * The dynamic portion of the hook name, $this->post_type, - * refers to object type being prepared for the response. - * - * @param WP_REST_Response $response The response object. - * @param WC_Data $object Object data. - * @param WP_REST_Request $request Request object. - */ - return apply_filters( "woocommerce_rest_prepare_{$this->post_type}_object", $response, $object, $request ); - } - - /** - * Prepare objects query. - * - * @since 3.0.0 - * @param WP_REST_Request $request Full details about the request. - * @return array - */ - protected function prepare_objects_query( $request ) { - $args = parent::prepare_objects_query( $request ); - - // Set post_status. - $args['post_status'] = $request['status']; - - // Taxonomy query to filter products by type, category, - // tag, shipping class, and attribute. - $tax_query = array(); - - // Map between taxonomy name and arg's key. - $taxonomies = array( - 'product_cat' => 'category', - 'product_tag' => 'tag', - 'product_shipping_class' => 'shipping_class', - ); - - // Set tax_query for each passed arg. - foreach ( $taxonomies as $taxonomy => $key ) { - if ( ! empty( $request[ $key ] ) ) { - $tax_query[] = array( - 'taxonomy' => $taxonomy, - 'field' => 'term_id', - 'terms' => $request[ $key ], - ); - } - } - - // Filter product type by slug. - if ( ! empty( $request['type'] ) ) { - $tax_query[] = array( - 'taxonomy' => 'product_type', - 'field' => 'slug', - 'terms' => $request['type'], - ); - } - - // Filter by attribute and term. - if ( ! empty( $request['attribute'] ) && ! empty( $request['attribute_term'] ) ) { - if ( in_array( $request['attribute'], wc_get_attribute_taxonomy_names(), true ) ) { - $tax_query[] = array( - 'taxonomy' => $request['attribute'], - 'field' => 'term_id', - 'terms' => $request['attribute_term'], - ); - } - } - - if ( ! empty( $tax_query ) ) { - $args['tax_query'] = $tax_query; // WPCS: slow query ok. - } - - // Filter featured. - if ( is_bool( $request['featured'] ) ) { - $args['tax_query'][] = array( - 'taxonomy' => 'product_visibility', - 'field' => 'name', - 'terms' => 'featured', - 'operator' => true === $request['featured'] ? 'IN' : 'NOT IN', - ); - } - - // Filter by sku. - if ( ! empty( $request['sku'] ) ) { - $skus = explode( ',', $request['sku'] ); - // Include the current string as a SKU too. - if ( 1 < count( $skus ) ) { - $skus[] = $request['sku']; - } - - $args['meta_query'] = $this->add_meta_query( // WPCS: slow query ok. - $args, array( - 'key' => '_sku', - 'value' => $skus, - 'compare' => 'IN', - ) - ); - } - - // Filter by tax class. - if ( ! empty( $request['tax_class'] ) ) { - $args['meta_query'] = $this->add_meta_query( // WPCS: slow query ok. - $args, array( - 'key' => '_tax_class', - 'value' => 'standard' !== $request['tax_class'] ? $request['tax_class'] : '', - ) - ); - } - - // Price filter. - if ( ! empty( $request['min_price'] ) || ! empty( $request['max_price'] ) ) { - $args['meta_query'] = $this->add_meta_query( $args, wc_get_min_max_price_meta_query( $request ) ); // WPCS: slow query ok. - } - - // Filter product in stock or out of stock. - if ( is_bool( $request['in_stock'] ) ) { - $args['meta_query'] = $this->add_meta_query( // WPCS: slow query ok. - $args, array( - 'key' => '_stock_status', - 'value' => true === $request['in_stock'] ? 'instock' : 'outofstock', - ) - ); - } - - // Filter by on sale products. - if ( is_bool( $request['on_sale'] ) ) { - $on_sale_key = $request['on_sale'] ? 'post__in' : 'post__not_in'; - $on_sale_ids = wc_get_product_ids_on_sale(); - - // Use 0 when there's no on sale products to avoid return all products. - $on_sale_ids = empty( $on_sale_ids ) ? array( 0 ) : $on_sale_ids; - - $args[ $on_sale_key ] += $on_sale_ids; - } - - // Force the post_type argument, since it's not a user input variable. - if ( ! empty( $request['sku'] ) ) { - $args['post_type'] = array( 'product', 'product_variation' ); - } else { - $args['post_type'] = $this->post_type; - } - - return $args; - } - - /** - * Get the downloads for a product or product variation. - * - * @param WC_Product|WC_Product_Variation $product Product instance. - * @return array - */ - protected function get_downloads( $product ) { - $downloads = array(); - - if ( $product->is_downloadable() ) { - foreach ( $product->get_downloads() as $file_id => $file ) { - $downloads[] = array( - 'id' => $file_id, // MD5 hash. - 'name' => $file['name'], - 'file' => $file['file'], - ); - } - } - - return $downloads; - } - - /** - * Get taxonomy terms. - * - * @param WC_Product $product Product instance. - * @param string $taxonomy Taxonomy slug. - * @return array - */ - protected function get_taxonomy_terms( $product, $taxonomy = 'cat' ) { - $terms = array(); - - foreach ( wc_get_object_terms( $product->get_id(), 'product_' . $taxonomy ) as $term ) { - $terms[] = array( - 'id' => $term->term_id, - 'name' => $term->name, - 'slug' => $term->slug, - ); - } - - return $terms; - } - - /** - * Get the images for a product or product variation. - * - * @param WC_Product|WC_Product_Variation $product Product instance. - * @return array - */ - protected function get_images( $product ) { - $images = array(); - $attachment_ids = array(); - - // Add featured image. - if ( has_post_thumbnail( $product->get_id() ) ) { - $attachment_ids[] = $product->get_image_id(); - } - - // Add gallery images. - $attachment_ids = array_merge( $attachment_ids, $product->get_gallery_image_ids() ); - - // Build image data. - foreach ( $attachment_ids as $position => $attachment_id ) { - $attachment_post = get_post( $attachment_id ); - if ( is_null( $attachment_post ) ) { - continue; - } - - $attachment = wp_get_attachment_image_src( $attachment_id, 'full' ); - if ( ! is_array( $attachment ) ) { - continue; - } - - $images[] = array( - 'id' => (int) $attachment_id, - 'date_created' => wc_rest_prepare_date_response( $attachment_post->post_date, false ), - 'date_created_gmt' => wc_rest_prepare_date_response( strtotime( $attachment_post->post_date_gmt ) ), - 'date_modified' => wc_rest_prepare_date_response( $attachment_post->post_modified, false ), - 'date_modified_gmt' => wc_rest_prepare_date_response( strtotime( $attachment_post->post_modified_gmt ) ), - 'src' => current( $attachment ), - 'name' => get_the_title( $attachment_id ), - 'alt' => get_post_meta( $attachment_id, '_wp_attachment_image_alt', true ), - 'position' => (int) $position, - ); - } - - // Set a placeholder image if the product has no images set. - if ( empty( $images ) ) { - $images[] = array( - 'id' => 0, - 'date_created' => wc_rest_prepare_date_response( current_time( 'mysql' ), false ), // Default to now. - 'date_created_gmt' => wc_rest_prepare_date_response( current_time( 'timestamp', true ) ), // Default to now. - 'date_modified' => wc_rest_prepare_date_response( current_time( 'mysql' ), false ), - 'date_modified_gmt' => wc_rest_prepare_date_response( current_time( 'timestamp', true ) ), - 'src' => wc_placeholder_img_src(), - 'name' => __( 'Placeholder', 'woocommerce' ), - 'alt' => __( 'Placeholder', 'woocommerce' ), - 'position' => 0, - ); - } - - return $images; - } - - /** - * Get attribute taxonomy label. - * - * @deprecated 3.0.0 - * - * @param string $name Taxonomy name. - * @return string - */ - protected function get_attribute_taxonomy_label( $name ) { - $tax = get_taxonomy( $name ); - $labels = get_taxonomy_labels( $tax ); - - return $labels->singular_name; - } - - /** - * Get product attribute taxonomy name. - * - * @since 3.0.0 - * @param string $slug Taxonomy name. - * @param WC_Product $product Product data. - * @return string - */ - protected function get_attribute_taxonomy_name( $slug, $product ) { - $attributes = $product->get_attributes(); - - if ( ! isset( $attributes[ $slug ] ) ) { - return str_replace( 'pa_', '', $slug ); - } - - $attribute = $attributes[ $slug ]; - - // Taxonomy attribute name. - if ( $attribute->is_taxonomy() ) { - $taxonomy = $attribute->get_taxonomy_object(); - return $taxonomy->attribute_label; - } - - // Custom product attribute name. - return $attribute->get_name(); - } - - /** - * Get default attributes. - * - * @param WC_Product $product Product instance. - * @return array - */ - protected function get_default_attributes( $product ) { - $default = array(); - - if ( $product->is_type( 'variable' ) ) { - foreach ( array_filter( (array) $product->get_default_attributes(), 'strlen' ) as $key => $value ) { - if ( 0 === strpos( $key, 'pa_' ) ) { - $default[] = array( - 'id' => wc_attribute_taxonomy_id_by_name( $key ), - 'name' => $this->get_attribute_taxonomy_name( $key, $product ), - 'option' => $value, - ); - } else { - $default[] = array( - 'id' => 0, - 'name' => $this->get_attribute_taxonomy_name( $key, $product ), - 'option' => $value, - ); - } - } - } - - return $default; - } - - /** - * Get attribute options. - * - * @param int $product_id Product ID. - * @param array $attribute Attribute data. - * @return array - */ - protected function get_attribute_options( $product_id, $attribute ) { - if ( isset( $attribute['is_taxonomy'] ) && $attribute['is_taxonomy'] ) { - return wc_get_product_terms( - $product_id, $attribute['name'], array( - 'fields' => 'names', - ) - ); - } elseif ( isset( $attribute['value'] ) ) { - return array_map( 'trim', explode( '|', $attribute['value'] ) ); - } - - return array(); - } - - /** - * Get the attributes for a product or product variation. - * - * @param WC_Product|WC_Product_Variation $product Product instance. - * @return array - */ - protected function get_attributes( $product ) { - $attributes = array(); - - if ( $product->is_type( 'variation' ) ) { - $_product = wc_get_product( $product->get_parent_id() ); - foreach ( $product->get_variation_attributes() as $attribute_name => $attribute ) { - $name = str_replace( 'attribute_', '', $attribute_name ); - - if ( ! $attribute ) { - continue; - } - - // Taxonomy-based attributes are prefixed with `pa_`, otherwise simply `attribute_`. - if ( 0 === strpos( $attribute_name, 'attribute_pa_' ) ) { - $option_term = get_term_by( 'slug', $attribute, $name ); - $attributes[] = array( - 'id' => wc_attribute_taxonomy_id_by_name( $name ), - 'name' => $this->get_attribute_taxonomy_name( $name, $_product ), - 'option' => $option_term && ! is_wp_error( $option_term ) ? $option_term->name : $attribute, - ); - } else { - $attributes[] = array( - 'id' => 0, - 'name' => $this->get_attribute_taxonomy_name( $name, $_product ), - 'option' => $attribute, - ); - } - } - } else { - foreach ( $product->get_attributes() as $attribute ) { - $attributes[] = array( - 'id' => $attribute['is_taxonomy'] ? wc_attribute_taxonomy_id_by_name( $attribute['name'] ) : 0, - 'name' => $this->get_attribute_taxonomy_name( $attribute['name'], $product ), - 'position' => (int) $attribute['position'], - 'visible' => (bool) $attribute['is_visible'], - 'variation' => (bool) $attribute['is_variation'], - 'options' => $this->get_attribute_options( $product->get_id(), $attribute ), - ); - } - } - - return $attributes; - } - - /** - * Get product data. - * - * @param WC_Product $product Product instance. - * @param string $context Request context. - * Options: 'view' and 'edit'. - * @return array - */ - protected function get_product_data( $product, $context = 'view' ) { - $data = array( - 'id' => $product->get_id(), - 'name' => $product->get_name( $context ), - 'slug' => $product->get_slug( $context ), - 'permalink' => $product->get_permalink(), - 'date_created' => wc_rest_prepare_date_response( $product->get_date_created( $context ), false ), - 'date_created_gmt' => wc_rest_prepare_date_response( $product->get_date_created( $context ) ), - 'date_modified' => wc_rest_prepare_date_response( $product->get_date_modified( $context ), false ), - 'date_modified_gmt' => wc_rest_prepare_date_response( $product->get_date_modified( $context ) ), - 'type' => $product->get_type(), - 'status' => $product->get_status( $context ), - 'featured' => $product->is_featured(), - 'catalog_visibility' => $product->get_catalog_visibility( $context ), - 'description' => 'view' === $context ? wpautop( do_shortcode( $product->get_description() ) ) : $product->get_description( $context ), - 'short_description' => 'view' === $context ? apply_filters( 'woocommerce_short_description', $product->get_short_description() ) : $product->get_short_description( $context ), - 'sku' => $product->get_sku( $context ), - 'price' => $product->get_price( $context ), - 'regular_price' => $product->get_regular_price( $context ), - 'sale_price' => $product->get_sale_price( $context ) ? $product->get_sale_price( $context ) : '', - 'date_on_sale_from' => wc_rest_prepare_date_response( $product->get_date_on_sale_from( $context ), false ), - 'date_on_sale_from_gmt' => wc_rest_prepare_date_response( $product->get_date_on_sale_from( $context ) ), - 'date_on_sale_to' => wc_rest_prepare_date_response( $product->get_date_on_sale_to( $context ), false ), - 'date_on_sale_to_gmt' => wc_rest_prepare_date_response( $product->get_date_on_sale_to( $context ) ), - 'price_html' => $product->get_price_html(), - 'on_sale' => $product->is_on_sale( $context ), - 'purchasable' => $product->is_purchasable(), - 'total_sales' => $product->get_total_sales( $context ), - 'virtual' => $product->is_virtual(), - 'downloadable' => $product->is_downloadable(), - 'downloads' => $this->get_downloads( $product ), - 'download_limit' => $product->get_download_limit( $context ), - 'download_expiry' => $product->get_download_expiry( $context ), - 'external_url' => $product->is_type( 'external' ) ? $product->get_product_url( $context ) : '', - 'button_text' => $product->is_type( 'external' ) ? $product->get_button_text( $context ) : '', - 'tax_status' => $product->get_tax_status( $context ), - 'tax_class' => $product->get_tax_class( $context ), - 'manage_stock' => $product->managing_stock(), - 'stock_quantity' => $product->get_stock_quantity( $context ), - 'in_stock' => $product->is_in_stock(), - 'backorders' => $product->get_backorders( $context ), - 'backorders_allowed' => $product->backorders_allowed(), - 'backordered' => $product->is_on_backorder(), - 'sold_individually' => $product->is_sold_individually(), - 'weight' => $product->get_weight( $context ), - 'dimensions' => array( - 'length' => $product->get_length( $context ), - 'width' => $product->get_width( $context ), - 'height' => $product->get_height( $context ), - ), - 'shipping_required' => $product->needs_shipping(), - 'shipping_taxable' => $product->is_shipping_taxable(), - 'shipping_class' => $product->get_shipping_class(), - 'shipping_class_id' => $product->get_shipping_class_id( $context ), - 'reviews_allowed' => $product->get_reviews_allowed( $context ), - 'average_rating' => 'view' === $context ? wc_format_decimal( $product->get_average_rating(), 2 ) : $product->get_average_rating( $context ), - 'rating_count' => $product->get_rating_count(), - 'related_ids' => array_map( 'absint', array_values( wc_get_related_products( $product->get_id() ) ) ), - 'upsell_ids' => array_map( 'absint', $product->get_upsell_ids( $context ) ), - 'cross_sell_ids' => array_map( 'absint', $product->get_cross_sell_ids( $context ) ), - 'parent_id' => $product->get_parent_id( $context ), - 'purchase_note' => 'view' === $context ? wpautop( do_shortcode( wp_kses_post( $product->get_purchase_note() ) ) ) : $product->get_purchase_note( $context ), - 'categories' => $this->get_taxonomy_terms( $product ), - 'tags' => $this->get_taxonomy_terms( $product, 'tag' ), - 'images' => $this->get_images( $product ), - 'attributes' => $this->get_attributes( $product ), - 'default_attributes' => $this->get_default_attributes( $product ), - 'variations' => array(), - 'grouped_products' => array(), - 'menu_order' => $product->get_menu_order( $context ), - 'meta_data' => $product->get_meta_data(), - ); - - return $data; - } - - /** - * Prepare links for the request. - * - * @param WC_Data $object Object data. - * @param WP_REST_Request $request Request object. - * @return array Links for the given post. - */ - protected function prepare_links( $object, $request ) { - $links = array( - 'self' => array( - 'href' => rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $object->get_id() ) ), - ), - 'collection' => array( - 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ), - ), - ); - - if ( $object->get_parent_id() ) { - $links['up'] = array( - 'href' => rest_url( sprintf( '/%s/products/%d', $this->namespace, $object->get_parent_id() ) ), - ); - } - - return $links; - } - - /** - * Prepare a single product for create or update. - * - * @param WP_REST_Request $request Request object. - * @param bool $creating If is creating a new object. - * @return WP_Error|WC_Data - */ - protected function prepare_object_for_database( $request, $creating = false ) { - $id = isset( $request['id'] ) ? absint( $request['id'] ) : 0; - - // Type is the most important part here because we need to be using the correct class and methods. - if ( isset( $request['type'] ) ) { - $classname = WC_Product_Factory::get_classname_from_product_type( $request['type'] ); - - if ( ! class_exists( $classname ) ) { - $classname = 'WC_Product_Simple'; - } - - $product = new $classname( $id ); - } elseif ( isset( $request['id'] ) ) { - $product = wc_get_product( $id ); - } else { - $product = new WC_Product_Simple(); - } - - if ( 'variation' === $product->get_type() ) { - return new WP_Error( - "woocommerce_rest_invalid_{$this->post_type}_id", __( 'To manipulate product variations you should use the /products/<product_id>/variations/<id> endpoint.', 'woocommerce' ), array( - 'status' => 404, - ) - ); - } - - // Post title. - if ( isset( $request['name'] ) ) { - $product->set_name( wp_filter_post_kses( $request['name'] ) ); - } - - // Post content. - if ( isset( $request['description'] ) ) { - $product->set_description( wp_filter_post_kses( $request['description'] ) ); - } - - // Post excerpt. - if ( isset( $request['short_description'] ) ) { - $product->set_short_description( wp_filter_post_kses( $request['short_description'] ) ); - } - - // Post status. - if ( isset( $request['status'] ) ) { - $product->set_status( get_post_status_object( $request['status'] ) ? $request['status'] : 'draft' ); - } - - // Post slug. - if ( isset( $request['slug'] ) ) { - $product->set_slug( $request['slug'] ); - } - - // Menu order. - if ( isset( $request['menu_order'] ) ) { - $product->set_menu_order( $request['menu_order'] ); - } - - // Comment status. - if ( isset( $request['reviews_allowed'] ) ) { - $product->set_reviews_allowed( $request['reviews_allowed'] ); - } - - // Virtual. - if ( isset( $request['virtual'] ) ) { - $product->set_virtual( $request['virtual'] ); - } - - // Tax status. - if ( isset( $request['tax_status'] ) ) { - $product->set_tax_status( $request['tax_status'] ); - } - - // Tax Class. - if ( isset( $request['tax_class'] ) ) { - $product->set_tax_class( $request['tax_class'] ); - } - - // Catalog Visibility. - if ( isset( $request['catalog_visibility'] ) ) { - $product->set_catalog_visibility( $request['catalog_visibility'] ); - } - - // Purchase Note. - if ( isset( $request['purchase_note'] ) ) { - $product->set_purchase_note( wp_kses_post( wp_unslash( $request['purchase_note'] ) ) ); - } - - // Featured Product. - if ( isset( $request['featured'] ) ) { - $product->set_featured( $request['featured'] ); - } - - // Shipping data. - $product = $this->save_product_shipping_data( $product, $request ); - - // SKU. - if ( isset( $request['sku'] ) ) { - $product->set_sku( wc_clean( $request['sku'] ) ); - } - - // Attributes. - if ( isset( $request['attributes'] ) ) { - $attributes = array(); - - foreach ( $request['attributes'] as $attribute ) { - $attribute_id = 0; - $attribute_name = ''; - - // Check ID for global attributes or name for product attributes. - if ( ! empty( $attribute['id'] ) ) { - $attribute_id = absint( $attribute['id'] ); - $attribute_name = wc_attribute_taxonomy_name_by_id( $attribute_id ); - } elseif ( ! empty( $attribute['name'] ) ) { - $attribute_name = wc_clean( $attribute['name'] ); - } - - if ( ! $attribute_id && ! $attribute_name ) { - continue; - } - - if ( $attribute_id ) { - - if ( isset( $attribute['options'] ) ) { - $options = $attribute['options']; - - if ( ! is_array( $attribute['options'] ) ) { - // Text based attributes - Posted values are term names. - $options = explode( WC_DELIMITER, $options ); - } - - $values = array_map( 'wc_sanitize_term_text_based', $options ); - $values = array_filter( $values, 'strlen' ); - } else { - $values = array(); - } - - if ( ! empty( $values ) ) { - // Add attribute to array, but don't set values. - $attribute_object = new WC_Product_Attribute(); - $attribute_object->set_id( $attribute_id ); - $attribute_object->set_name( $attribute_name ); - $attribute_object->set_options( $values ); - $attribute_object->set_position( isset( $attribute['position'] ) ? (string) absint( $attribute['position'] ) : '0' ); - $attribute_object->set_visible( ( isset( $attribute['visible'] ) && $attribute['visible'] ) ? 1 : 0 ); - $attribute_object->set_variation( ( isset( $attribute['variation'] ) && $attribute['variation'] ) ? 1 : 0 ); - $attributes[] = $attribute_object; - } - } elseif ( isset( $attribute['options'] ) ) { - // Custom attribute - Add attribute to array and set the values. - if ( is_array( $attribute['options'] ) ) { - $values = $attribute['options']; - } else { - $values = explode( WC_DELIMITER, $attribute['options'] ); - } - $attribute_object = new WC_Product_Attribute(); - $attribute_object->set_name( $attribute_name ); - $attribute_object->set_options( $values ); - $attribute_object->set_position( isset( $attribute['position'] ) ? (string) absint( $attribute['position'] ) : '0' ); - $attribute_object->set_visible( ( isset( $attribute['visible'] ) && $attribute['visible'] ) ? 1 : 0 ); - $attribute_object->set_variation( ( isset( $attribute['variation'] ) && $attribute['variation'] ) ? 1 : 0 ); - $attributes[] = $attribute_object; - } - } - $product->set_attributes( $attributes ); - } - - // Sales and prices. - if ( in_array( $product->get_type(), array( 'variable', 'grouped' ), true ) ) { - $product->set_regular_price( '' ); - $product->set_sale_price( '' ); - $product->set_date_on_sale_to( '' ); - $product->set_date_on_sale_from( '' ); - $product->set_price( '' ); - } else { - // Regular Price. - if ( isset( $request['regular_price'] ) ) { - $product->set_regular_price( $request['regular_price'] ); - } - - // Sale Price. - if ( isset( $request['sale_price'] ) ) { - $product->set_sale_price( $request['sale_price'] ); - } - - if ( isset( $request['date_on_sale_from'] ) ) { - $product->set_date_on_sale_from( $request['date_on_sale_from'] ); - } - - if ( isset( $request['date_on_sale_from_gmt'] ) ) { - $product->set_date_on_sale_from( $request['date_on_sale_from_gmt'] ? strtotime( $request['date_on_sale_from_gmt'] ) : null ); - } - - if ( isset( $request['date_on_sale_to'] ) ) { - $product->set_date_on_sale_to( $request['date_on_sale_to'] ); - } - - if ( isset( $request['date_on_sale_to_gmt'] ) ) { - $product->set_date_on_sale_to( $request['date_on_sale_to_gmt'] ? strtotime( $request['date_on_sale_to_gmt'] ) : null ); - } - } - - // Product parent ID for groups. - if ( isset( $request['parent_id'] ) ) { - $product->set_parent_id( $request['parent_id'] ); - } - - // Sold individually. - if ( isset( $request['sold_individually'] ) ) { - $product->set_sold_individually( $request['sold_individually'] ); - } - - // Stock status. - if ( isset( $request['in_stock'] ) ) { - $stock_status = true === $request['in_stock'] ? 'instock' : 'outofstock'; - } else { - $stock_status = $product->get_stock_status(); - } - - // Stock data. - if ( 'yes' === get_option( 'woocommerce_manage_stock' ) ) { - // Manage stock. - if ( isset( $request['manage_stock'] ) ) { - $product->set_manage_stock( $request['manage_stock'] ); - } - - // Backorders. - if ( isset( $request['backorders'] ) ) { - $product->set_backorders( $request['backorders'] ); - } - - if ( $product->is_type( 'grouped' ) ) { - $product->set_manage_stock( 'no' ); - $product->set_backorders( 'no' ); - $product->set_stock_quantity( '' ); - $product->set_stock_status( $stock_status ); - } elseif ( $product->is_type( 'external' ) ) { - $product->set_manage_stock( 'no' ); - $product->set_backorders( 'no' ); - $product->set_stock_quantity( '' ); - $product->set_stock_status( 'instock' ); - } elseif ( $product->get_manage_stock() ) { - // Stock status is always determined by children so sync later. - if ( ! $product->is_type( 'variable' ) ) { - $product->set_stock_status( $stock_status ); - } - - // Stock quantity. - if ( isset( $request['stock_quantity'] ) ) { - $product->set_stock_quantity( wc_stock_amount( $request['stock_quantity'] ) ); - } elseif ( isset( $request['inventory_delta'] ) ) { - $stock_quantity = wc_stock_amount( $product->get_stock_quantity() ); - $stock_quantity += wc_stock_amount( $request['inventory_delta'] ); - $product->set_stock_quantity( wc_stock_amount( $stock_quantity ) ); - } - } else { - // Don't manage stock. - $product->set_manage_stock( 'no' ); - $product->set_stock_quantity( '' ); - $product->set_stock_status( $stock_status ); - } - } elseif ( ! $product->is_type( 'variable' ) ) { - $product->set_stock_status( $stock_status ); - } - - // Upsells. - if ( isset( $request['upsell_ids'] ) ) { - $upsells = array(); - $ids = $request['upsell_ids']; - - if ( ! empty( $ids ) ) { - foreach ( $ids as $id ) { - if ( $id && $id > 0 ) { - $upsells[] = $id; - } - } - } - - $product->set_upsell_ids( $upsells ); - } - - // Cross sells. - if ( isset( $request['cross_sell_ids'] ) ) { - $crosssells = array(); - $ids = $request['cross_sell_ids']; - - if ( ! empty( $ids ) ) { - foreach ( $ids as $id ) { - if ( $id && $id > 0 ) { - $crosssells[] = $id; - } - } - } - - $product->set_cross_sell_ids( $crosssells ); - } - - // Product categories. - if ( isset( $request['categories'] ) && is_array( $request['categories'] ) ) { - $product = $this->save_taxonomy_terms( $product, $request['categories'] ); - } - - // Product tags. - if ( isset( $request['tags'] ) && is_array( $request['tags'] ) ) { - $product = $this->save_taxonomy_terms( $product, $request['tags'], 'tag' ); - } - - // Downloadable. - if ( isset( $request['downloadable'] ) ) { - $product->set_downloadable( $request['downloadable'] ); - } - - // Downloadable options. - if ( $product->get_downloadable() ) { - - // Downloadable files. - if ( isset( $request['downloads'] ) && is_array( $request['downloads'] ) ) { - $product = $this->save_downloadable_files( $product, $request['downloads'] ); - } - - // Download limit. - if ( isset( $request['download_limit'] ) ) { - $product->set_download_limit( $request['download_limit'] ); - } - - // Download expiry. - if ( isset( $request['download_expiry'] ) ) { - $product->set_download_expiry( $request['download_expiry'] ); - } - } - - // Product url and button text for external products. - if ( $product->is_type( 'external' ) ) { - if ( isset( $request['external_url'] ) ) { - $product->set_product_url( $request['external_url'] ); - } - - if ( isset( $request['button_text'] ) ) { - $product->set_button_text( $request['button_text'] ); - } - } - - // Save default attributes for variable products. - if ( $product->is_type( 'variable' ) ) { - $product = $this->save_default_attributes( $product, $request ); - } - - // Set children for a grouped product. - if ( $product->is_type( 'grouped' ) && isset( $request['grouped_products'] ) ) { - $product->set_children( $request['grouped_products'] ); - } - - // Check for featured/gallery images, upload it and set it. - if ( isset( $request['images'] ) ) { - $product = $this->set_product_images( $product, $request['images'] ); - } - - // Allow set meta_data. - if ( is_array( $request['meta_data'] ) ) { - foreach ( $request['meta_data'] as $meta ) { - $product->update_meta_data( $meta['key'], $meta['value'], isset( $meta['id'] ) ? $meta['id'] : '' ); - } - } - - /** - * Filters an object before it is inserted via the REST API. - * - * The dynamic portion of the hook name, `$this->post_type`, - * refers to the object type slug. - * - * @param WC_Data $product Object object. - * @param WP_REST_Request $request Request object. - * @param bool $creating If is creating a new object. - */ - return apply_filters( "woocommerce_rest_pre_insert_{$this->post_type}_object", $product, $request, $creating ); - } - - /** - * Set product images. - * - * @throws WC_REST_Exception REST API exceptions. - * @param WC_Product $product Product instance. - * @param array $images Images data. - * @return WC_Product - */ - protected function set_product_images( $product, $images ) { - $images = is_array( $images ) ? array_filter( $images ) : array(); - - if ( ! empty( $images ) ) { - $gallery = array(); - - foreach ( $images as $image ) { - $attachment_id = isset( $image['id'] ) ? absint( $image['id'] ) : 0; - - if ( 0 === $attachment_id && isset( $image['src'] ) ) { - $upload = wc_rest_upload_image_from_url( esc_url_raw( $image['src'] ) ); - - if ( is_wp_error( $upload ) ) { - if ( ! apply_filters( 'woocommerce_rest_suppress_image_upload_error', false, $upload, $product->get_id(), $images ) ) { - throw new WC_REST_Exception( 'woocommerce_product_image_upload_error', $upload->get_error_message(), 400 ); - } else { - continue; - } - } - - $attachment_id = wc_rest_set_uploaded_image_as_attachment( $upload, $product->get_id() ); - } - - if ( ! wp_attachment_is_image( $attachment_id ) ) { - /* translators: %s: attachment id */ - throw new WC_REST_Exception( 'woocommerce_product_invalid_image_id', sprintf( __( '#%s is an invalid image ID.', 'woocommerce' ), $attachment_id ), 400 ); - } - - if ( isset( $image['position'] ) && 0 === absint( $image['position'] ) ) { - $product->set_image_id( $attachment_id ); - } else { - $gallery[] = $attachment_id; - } - - // Set the image alt if present. - if ( ! empty( $image['alt'] ) ) { - update_post_meta( $attachment_id, '_wp_attachment_image_alt', wc_clean( $image['alt'] ) ); - } - - // Set the image name if present. - if ( ! empty( $image['name'] ) ) { - wp_update_post( - array( - 'ID' => $attachment_id, - 'post_title' => $image['name'], - ) - ); - } - - // Set the image source if present, for future reference. - if ( ! empty( $image['src'] ) ) { - update_post_meta( $attachment_id, '_wc_attachment_source', esc_url_raw( $image['src'] ) ); - } - } - - $product->set_gallery_image_ids( $gallery ); - } else { - $product->set_image_id( '' ); - $product->set_gallery_image_ids( array() ); - } - - return $product; - } - - /** - * Save product shipping data. - * - * @param WC_Product $product Product instance. - * @param array $data Shipping data. - * @return WC_Product - */ - protected function save_product_shipping_data( $product, $data ) { - // Virtual. - if ( isset( $data['virtual'] ) && true === $data['virtual'] ) { - $product->set_weight( '' ); - $product->set_height( '' ); - $product->set_length( '' ); - $product->set_width( '' ); - } else { - if ( isset( $data['weight'] ) ) { - $product->set_weight( $data['weight'] ); - } - - // Height. - if ( isset( $data['dimensions']['height'] ) ) { - $product->set_height( $data['dimensions']['height'] ); - } - - // Width. - if ( isset( $data['dimensions']['width'] ) ) { - $product->set_width( $data['dimensions']['width'] ); - } - - // Length. - if ( isset( $data['dimensions']['length'] ) ) { - $product->set_length( $data['dimensions']['length'] ); - } - } - - // Shipping class. - if ( isset( $data['shipping_class'] ) ) { - $data_store = $product->get_data_store(); - $shipping_class_id = $data_store->get_shipping_class_id_by_slug( wc_clean( $data['shipping_class'] ) ); - $product->set_shipping_class_id( $shipping_class_id ); - } - - return $product; - } - - /** - * Save downloadable files. - * - * @param WC_Product $product Product instance. - * @param array $downloads Downloads data. - * @param int $deprecated Deprecated since 3.0. - * @return WC_Product - */ - protected function save_downloadable_files( $product, $downloads, $deprecated = 0 ) { - if ( $deprecated ) { - wc_deprecated_argument( 'variation_id', '3.0', 'save_downloadable_files() not requires a variation_id anymore.' ); - } - - $files = array(); - foreach ( $downloads as $key => $file ) { - if ( empty( $file['file'] ) ) { - continue; - } - - $download = new WC_Product_Download(); - $download->set_id( $file['id'] ? $file['id'] : wp_generate_uuid4() ); - $download->set_name( $file['name'] ? $file['name'] : wc_get_filename_from_url( $file['file'] ) ); - $download->set_file( apply_filters( 'woocommerce_file_download_path', $file['file'], $product, $key ) ); - $files[] = $download; - } - $product->set_downloads( $files ); - - return $product; - } - - /** - * Save taxonomy terms. - * - * @param WC_Product $product Product instance. - * @param array $terms Terms data. - * @param string $taxonomy Taxonomy name. - * @return WC_Product - */ - protected function save_taxonomy_terms( $product, $terms, $taxonomy = 'cat' ) { - $term_ids = wp_list_pluck( $terms, 'id' ); - - if ( 'cat' === $taxonomy ) { - $product->set_category_ids( $term_ids ); - } elseif ( 'tag' === $taxonomy ) { - $product->set_tag_ids( $term_ids ); - } - - return $product; - } - - /** - * Save default attributes. - * - * @since 3.0.0 - * - * @param WC_Product $product Product instance. - * @param WP_REST_Request $request Request data. - * @return WC_Product - */ - protected function save_default_attributes( $product, $request ) { - if ( isset( $request['default_attributes'] ) && is_array( $request['default_attributes'] ) ) { - - $attributes = $product->get_attributes(); - $default_attributes = array(); - - foreach ( $request['default_attributes'] as $attribute ) { - $attribute_id = 0; - $attribute_name = ''; - - // Check ID for global attributes or name for product attributes. - if ( ! empty( $attribute['id'] ) ) { - $attribute_id = absint( $attribute['id'] ); - $attribute_name = wc_attribute_taxonomy_name_by_id( $attribute_id ); - } elseif ( ! empty( $attribute['name'] ) ) { - $attribute_name = sanitize_title( $attribute['name'] ); - } - - if ( ! $attribute_id && ! $attribute_name ) { - continue; - } - - if ( isset( $attributes[ $attribute_name ] ) ) { - $_attribute = $attributes[ $attribute_name ]; - - if ( $_attribute['is_variation'] ) { - $value = isset( $attribute['option'] ) ? wc_clean( stripslashes( $attribute['option'] ) ) : ''; - - if ( ! empty( $_attribute['is_taxonomy'] ) ) { - // If dealing with a taxonomy, we need to get the slug from the name posted to the API. - $term = get_term_by( 'name', $value, $attribute_name ); - - if ( $term && ! is_wp_error( $term ) ) { - $value = $term->slug; - } else { - $value = sanitize_title( $value ); - } - } - - if ( $value ) { - $default_attributes[ $attribute_name ] = $value; - } - } - } - } - - $product->set_default_attributes( $default_attributes ); - } - - return $product; - } - - /** - * Clear caches here so in sync with any new variations/children. - * - * @param WC_Data $object Object data. - */ - public function clear_transients( $object ) { - wc_delete_product_transients( $object->get_id() ); - wp_cache_delete( 'product-' . $object->get_id(), 'products' ); - } - - /** - * Delete a single item. - * - * @param WP_REST_Request $request Full details about the request. - * @return WP_REST_Response|WP_Error - */ - public function delete_item( $request ) { - $id = (int) $request['id']; - $force = (bool) $request['force']; - $object = $this->get_object( (int) $request['id'] ); - $result = false; - - if ( ! $object || 0 === $object->get_id() ) { - return new WP_Error( - "woocommerce_rest_{$this->post_type}_invalid_id", __( 'Invalid ID.', 'woocommerce' ), array( - 'status' => 404, - ) - ); - } - - if ( 'variation' === $object->get_type() ) { - return new WP_Error( - "woocommerce_rest_invalid_{$this->post_type}_id", __( 'To manipulate product variations you should use the /products/<product_id>/variations/<id> endpoint.', 'woocommerce' ), array( - 'status' => 404, - ) - ); - } - - $supports_trash = EMPTY_TRASH_DAYS > 0 && is_callable( array( $object, 'get_status' ) ); - - /** - * Filter whether an object is trashable. - * - * Return false to disable trash support for the object. - * - * @param boolean $supports_trash Whether the object type support trashing. - * @param WC_Data $object The object being considered for trashing support. - */ - $supports_trash = apply_filters( "woocommerce_rest_{$this->post_type}_object_trashable", $supports_trash, $object ); - - if ( ! wc_rest_check_post_permissions( $this->post_type, 'delete', $object->get_id() ) ) { - return new WP_Error( - /* translators: %s: post type */ - "woocommerce_rest_user_cannot_delete_{$this->post_type}", sprintf( __( 'Sorry, you are not allowed to delete %s.', 'woocommerce' ), $this->post_type ), array( - 'status' => rest_authorization_required_code(), - ) - ); - } - - $request->set_param( 'context', 'edit' ); - $response = $this->prepare_object_for_response( $object, $request ); - - // If we're forcing, then delete permanently. - if ( $force ) { - if ( $object->is_type( 'variable' ) ) { - foreach ( $object->get_children() as $child_id ) { - $child = wc_get_product( $child_id ); - $child->delete( true ); - } - } elseif ( $object->is_type( 'grouped' ) ) { - foreach ( $object->get_children() as $child_id ) { - $child = wc_get_product( $child_id ); - $child->set_parent_id( 0 ); - $child->save(); - } - } - - $object->delete( true ); - $result = 0 === $object->get_id(); - } else { - // If we don't support trashing for this type, error out. - if ( ! $supports_trash ) { - return new WP_Error( - /* translators: %s: post type */ - 'woocommerce_rest_trash_not_supported', sprintf( __( 'The %s does not support trashing.', 'woocommerce' ), $this->post_type ), array( - 'status' => 501, - ) - ); - } - - // Otherwise, only trash if we haven't already. - if ( is_callable( array( $object, 'get_status' ) ) ) { - if ( 'trash' === $object->get_status() ) { - return new WP_Error( - /* translators: %s: post type */ - 'woocommerce_rest_already_trashed', sprintf( __( 'The %s has already been deleted.', 'woocommerce' ), $this->post_type ), array( - 'status' => 410, - ) - ); - } - - $object->delete(); - $result = 'trash' === $object->get_status(); - } - } - - if ( ! $result ) { - return new WP_Error( - /* translators: %s: post type */ - 'woocommerce_rest_cannot_delete', sprintf( __( 'The %s cannot be deleted.', 'woocommerce' ), $this->post_type ), array( - 'status' => 500, - ) - ); - } - - // Delete parent product transients. - if ( 0 !== $object->get_parent_id() ) { - wc_delete_product_transients( $object->get_parent_id() ); - } - - /** - * Fires after a single object is deleted or trashed via the REST API. - * - * @param WC_Data $object The deleted or trashed object. - * @param WP_REST_Response $response The response data. - * @param WP_REST_Request $request The request sent to the API. - */ - do_action( "woocommerce_rest_delete_{$this->post_type}_object", $object, $response, $request ); - - return $response; - } - - /** - * Get the Product's schema, conforming to JSON Schema. - * - * @return array - */ - public function get_item_schema() { - $weight_unit = get_option( 'woocommerce_weight_unit' ); - $dimension_unit = get_option( 'woocommerce_dimension_unit' ); - $schema = array( - '$schema' => 'http://json-schema.org/draft-04/schema#', - 'title' => $this->post_type, - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'name' => array( - 'description' => __( 'Product name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'slug' => array( - 'description' => __( 'Product slug.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'permalink' => array( - 'description' => __( 'Product URL.', 'woocommerce' ), - 'type' => 'string', - 'format' => 'uri', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_created' => array( - 'description' => __( "The date the product was created, in the site's timezone.", 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_created_gmt' => array( - 'description' => __( 'The date the product was created, as GMT.', 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_modified' => array( - 'description' => __( "The date the product was last modified, in the site's timezone.", 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_modified_gmt' => array( - 'description' => __( 'The date the product was last modified, as GMT.', 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'type' => array( - 'description' => __( 'Product type.', 'woocommerce' ), - 'type' => 'string', - 'default' => 'simple', - 'enum' => array_keys( wc_get_product_types() ), - 'context' => array( 'view', 'edit' ), - ), - 'status' => array( - 'description' => __( 'Product status (post status).', 'woocommerce' ), - 'type' => 'string', - 'default' => 'publish', - 'enum' => array_keys( get_post_statuses() ), - 'context' => array( 'view', 'edit' ), - ), - 'featured' => array( - 'description' => __( 'Featured product.', 'woocommerce' ), - 'type' => 'boolean', - 'default' => false, - 'context' => array( 'view', 'edit' ), - ), - 'catalog_visibility' => array( - 'description' => __( 'Catalog visibility.', 'woocommerce' ), - 'type' => 'string', - 'default' => 'visible', - 'enum' => array( 'visible', 'catalog', 'search', 'hidden' ), - 'context' => array( 'view', 'edit' ), - ), - 'description' => array( - 'description' => __( 'Product description.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'short_description' => array( - 'description' => __( 'Product short description.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'sku' => array( - 'description' => __( 'Unique identifier.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'price' => array( - 'description' => __( 'Current product price.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'regular_price' => array( - 'description' => __( 'Product regular price.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'sale_price' => array( - 'description' => __( 'Product sale price.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'date_on_sale_from' => array( - 'description' => __( "Start date of sale price, in the site's timezone.", 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - ), - 'date_on_sale_from_gmt' => array( - 'description' => __( 'Start date of sale price, as GMT.', 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - ), - 'date_on_sale_to' => array( - 'description' => __( "End date of sale price, in the site's timezone.", 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - ), - 'date_on_sale_to_gmt' => array( - 'description' => __( 'End date of sale price, as GMT.', 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - ), - 'price_html' => array( - 'description' => __( 'Price formatted in HTML.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'on_sale' => array( - 'description' => __( 'Shows if the product is on sale.', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'purchasable' => array( - 'description' => __( 'Shows if the product can be bought.', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'total_sales' => array( - 'description' => __( 'Amount of sales.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'virtual' => array( - 'description' => __( 'If the product is virtual.', 'woocommerce' ), - 'type' => 'boolean', - 'default' => false, - 'context' => array( 'view', 'edit' ), - ), - 'downloadable' => array( - 'description' => __( 'If the product is downloadable.', 'woocommerce' ), - 'type' => 'boolean', - 'default' => false, - 'context' => array( 'view', 'edit' ), - ), - 'downloads' => array( - 'description' => __( 'List of downloadable files.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'items' => array( - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'File MD5 hash.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'name' => array( - 'description' => __( 'File name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'file' => array( - 'description' => __( 'File URL.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - ), - ), - ), - 'download_limit' => array( - 'description' => __( 'Number of times downloadable files can be downloaded after purchase.', 'woocommerce' ), - 'type' => 'integer', - 'default' => -1, - 'context' => array( 'view', 'edit' ), - ), - 'download_expiry' => array( - 'description' => __( 'Number of days until access to downloadable files expires.', 'woocommerce' ), - 'type' => 'integer', - 'default' => -1, - 'context' => array( 'view', 'edit' ), - ), - 'external_url' => array( - 'description' => __( 'Product external URL. Only for external products.', 'woocommerce' ), - 'type' => 'string', - 'format' => 'uri', - 'context' => array( 'view', 'edit' ), - ), - 'button_text' => array( - 'description' => __( 'Product external button text. Only for external products.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'tax_status' => array( - 'description' => __( 'Tax status.', 'woocommerce' ), - 'type' => 'string', - 'default' => 'taxable', - 'enum' => array( 'taxable', 'shipping', 'none' ), - 'context' => array( 'view', 'edit' ), - ), - 'tax_class' => array( - 'description' => __( 'Tax class.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'manage_stock' => array( - 'description' => __( 'Stock management at product level.', 'woocommerce' ), - 'type' => 'boolean', - 'default' => false, - 'context' => array( 'view', 'edit' ), - ), - 'stock_quantity' => array( - 'description' => __( 'Stock quantity.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - ), - 'in_stock' => array( - 'description' => __( 'Controls whether or not the product is listed as "in stock" or "out of stock" on the frontend.', 'woocommerce' ), - 'type' => 'boolean', - 'default' => true, - 'context' => array( 'view', 'edit' ), - ), - 'backorders' => array( - 'description' => __( 'If managing stock, this controls if backorders are allowed.', 'woocommerce' ), - 'type' => 'string', - 'default' => 'no', - 'enum' => array( 'no', 'notify', 'yes' ), - 'context' => array( 'view', 'edit' ), - ), - 'backorders_allowed' => array( - 'description' => __( 'Shows if backorders are allowed.', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'backordered' => array( - 'description' => __( 'Shows if the product is on backordered.', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'sold_individually' => array( - 'description' => __( 'Allow one item to be bought in a single order.', 'woocommerce' ), - 'type' => 'boolean', - 'default' => false, - 'context' => array( 'view', 'edit' ), - ), - 'weight' => array( - /* translators: %s: weight unit */ - 'description' => sprintf( __( 'Product weight (%s).', 'woocommerce' ), $weight_unit ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'dimensions' => array( - 'description' => __( 'Product dimensions.', 'woocommerce' ), - 'type' => 'object', - 'context' => array( 'view', 'edit' ), - 'properties' => array( - 'length' => array( - /* translators: %s: dimension unit */ - 'description' => sprintf( __( 'Product length (%s).', 'woocommerce' ), $dimension_unit ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'width' => array( - /* translators: %s: dimension unit */ - 'description' => sprintf( __( 'Product width (%s).', 'woocommerce' ), $dimension_unit ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'height' => array( - /* translators: %s: dimension unit */ - 'description' => sprintf( __( 'Product height (%s).', 'woocommerce' ), $dimension_unit ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - ), - ), - 'shipping_required' => array( - 'description' => __( 'Shows if the product need to be shipped.', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'shipping_taxable' => array( - 'description' => __( 'Shows whether or not the product shipping is taxable.', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'shipping_class' => array( - 'description' => __( 'Shipping class slug.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'shipping_class_id' => array( - 'description' => __( 'Shipping class ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'reviews_allowed' => array( - 'description' => __( 'Allow reviews.', 'woocommerce' ), - 'type' => 'boolean', - 'default' => true, - 'context' => array( 'view', 'edit' ), - ), - 'average_rating' => array( - 'description' => __( 'Reviews average rating.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'rating_count' => array( - 'description' => __( 'Amount of reviews that the product have.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'related_ids' => array( - 'description' => __( 'List of related products IDs.', 'woocommerce' ), - 'type' => 'array', - 'items' => array( - 'type' => 'integer', - ), - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'upsell_ids' => array( - 'description' => __( 'List of up-sell products IDs.', 'woocommerce' ), - 'type' => 'array', - 'items' => array( - 'type' => 'integer', - ), - 'context' => array( 'view', 'edit' ), - ), - 'cross_sell_ids' => array( - 'description' => __( 'List of cross-sell products IDs.', 'woocommerce' ), - 'type' => 'array', - 'items' => array( - 'type' => 'integer', - ), - 'context' => array( 'view', 'edit' ), - ), - 'parent_id' => array( - 'description' => __( 'Product parent ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - ), - 'purchase_note' => array( - 'description' => __( 'Optional note to send the customer after purchase.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'categories' => array( - 'description' => __( 'List of categories.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'items' => array( - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Category ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - ), - 'name' => array( - 'description' => __( 'Category name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'slug' => array( - 'description' => __( 'Category slug.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - ), - ), - ), - 'tags' => array( - 'description' => __( 'List of tags.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'items' => array( - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Tag ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - ), - 'name' => array( - 'description' => __( 'Tag name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'slug' => array( - 'description' => __( 'Tag slug.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - ), - ), - ), - 'images' => array( - 'description' => __( 'List of images.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'items' => array( - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Image ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - ), - 'date_created' => array( - 'description' => __( "The date the image was created, in the site's timezone.", 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_created_gmt' => array( - 'description' => __( 'The date the image was created, as GMT.', 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_modified' => array( - 'description' => __( "The date the image was last modified, in the site's timezone.", 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_modified_gmt' => array( - 'description' => __( 'The date the image was last modified, as GMT.', 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'src' => array( - 'description' => __( 'Image URL.', 'woocommerce' ), - 'type' => 'string', - 'format' => 'uri', - 'context' => array( 'view', 'edit' ), - ), - 'name' => array( - 'description' => __( 'Image name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'alt' => array( - 'description' => __( 'Image alternative text.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'position' => array( - 'description' => __( 'Image position. 0 means that the image is featured.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - ), - ), - ), - ), - 'attributes' => array( - 'description' => __( 'List of attributes.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'items' => array( - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Attribute ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - ), - 'name' => array( - 'description' => __( 'Attribute name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'position' => array( - 'description' => __( 'Attribute position.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - ), - 'visible' => array( - 'description' => __( "Define if the attribute is visible on the \"Additional information\" tab in the product's page.", 'woocommerce' ), - 'type' => 'boolean', - 'default' => false, - 'context' => array( 'view', 'edit' ), - ), - 'variation' => array( - 'description' => __( 'Define if the attribute can be used as variation.', 'woocommerce' ), - 'type' => 'boolean', - 'default' => false, - 'context' => array( 'view', 'edit' ), - ), - 'options' => array( - 'description' => __( 'List of available term names of the attribute.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'items' => array( - 'type' => 'string', - ), - ), - ), - ), - ), - 'default_attributes' => array( - 'description' => __( 'Defaults variation attributes.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'items' => array( - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Attribute ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - ), - 'name' => array( - 'description' => __( 'Attribute name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'option' => array( - 'description' => __( 'Selected attribute term name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - ), - ), - ), - 'variations' => array( - 'description' => __( 'List of variations IDs.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'items' => array( - 'type' => 'integer', - ), - 'readonly' => true, - ), - 'grouped_products' => array( - 'description' => __( 'List of grouped products ID.', 'woocommerce' ), - 'type' => 'array', - 'items' => array( - 'type' => 'integer', - ), - 'context' => array( 'view', 'edit' ), - ), - 'menu_order' => array( - 'description' => __( 'Menu order, used to custom sort products.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - ), - 'meta_data' => array( - 'description' => __( 'Meta data.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'items' => array( - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Meta ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'key' => array( - 'description' => __( 'Meta key.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'value' => array( - 'description' => __( 'Meta value.', 'woocommerce' ), - 'type' => 'mixed', - 'context' => array( 'view', 'edit' ), - ), - ), - ), - ), - ), - ); - - return $this->add_additional_fields_schema( $schema ); - } - - /** - * Get the query params for collections of attachments. - * - * @return array - */ - public function get_collection_params() { - $params = parent::get_collection_params(); - - $params['slug'] = array( - 'description' => __( 'Limit result set to products with a specific slug.', 'woocommerce' ), - 'type' => 'string', - 'validate_callback' => 'rest_validate_request_arg', - ); - $params['status'] = array( - 'default' => 'any', - 'description' => __( 'Limit result set to products assigned a specific status.', 'woocommerce' ), - 'type' => 'string', - 'enum' => array_merge( array( 'any' ), array_keys( get_post_statuses() ) ), - 'sanitize_callback' => 'sanitize_key', - 'validate_callback' => 'rest_validate_request_arg', - ); - $params['type'] = array( - 'description' => __( 'Limit result set to products assigned a specific type.', 'woocommerce' ), - 'type' => 'string', - 'enum' => array_keys( wc_get_product_types() ), - 'sanitize_callback' => 'sanitize_key', - 'validate_callback' => 'rest_validate_request_arg', - ); - $params['sku'] = array( - 'description' => __( 'Limit result set to products with specific SKU(s). Use commas to separate.', 'woocommerce' ), - 'type' => 'string', - 'sanitize_callback' => 'sanitize_text_field', - 'validate_callback' => 'rest_validate_request_arg', - ); - $params['featured'] = array( - 'description' => __( 'Limit result set to featured products.', 'woocommerce' ), - 'type' => 'boolean', - 'sanitize_callback' => 'wc_string_to_bool', - 'validate_callback' => 'rest_validate_request_arg', - ); - $params['category'] = array( - 'description' => __( 'Limit result set to products assigned a specific category ID.', 'woocommerce' ), - 'type' => 'string', - 'sanitize_callback' => 'wp_parse_id_list', - 'validate_callback' => 'rest_validate_request_arg', - ); - $params['tag'] = array( - 'description' => __( 'Limit result set to products assigned a specific tag ID.', 'woocommerce' ), - 'type' => 'string', - 'sanitize_callback' => 'wp_parse_id_list', - 'validate_callback' => 'rest_validate_request_arg', - ); - $params['shipping_class'] = array( - 'description' => __( 'Limit result set to products assigned a specific shipping class ID.', 'woocommerce' ), - 'type' => 'string', - 'sanitize_callback' => 'wp_parse_id_list', - 'validate_callback' => 'rest_validate_request_arg', - ); - $params['attribute'] = array( - 'description' => __( 'Limit result set to products with a specific attribute. Use the taxonomy name/attribute slug.', 'woocommerce' ), - 'type' => 'string', - 'sanitize_callback' => 'sanitize_text_field', - 'validate_callback' => 'rest_validate_request_arg', - ); - $params['attribute_term'] = array( - 'description' => __( 'Limit result set to products with a specific attribute term ID (required an assigned attribute).', 'woocommerce' ), - 'type' => 'string', - 'sanitize_callback' => 'wp_parse_id_list', - 'validate_callback' => 'rest_validate_request_arg', - ); - - if ( wc_tax_enabled() ) { - $params['tax_class'] = array( - 'description' => __( 'Limit result set to products with a specific tax class.', 'woocommerce' ), - 'type' => 'string', - 'enum' => array_merge( array( 'standard' ), WC_Tax::get_tax_class_slugs() ), - 'sanitize_callback' => 'sanitize_text_field', - 'validate_callback' => 'rest_validate_request_arg', - ); - } - - $params['in_stock'] = array( - 'description' => __( 'Limit result set to products in stock or out of stock.', 'woocommerce' ), - 'type' => 'boolean', - 'sanitize_callback' => 'wc_string_to_bool', - 'validate_callback' => 'rest_validate_request_arg', - ); - $params['on_sale'] = array( - 'description' => __( 'Limit result set to products on sale.', 'woocommerce' ), - 'type' => 'boolean', - 'sanitize_callback' => 'wc_string_to_bool', - 'validate_callback' => 'rest_validate_request_arg', - ); - $params['min_price'] = array( - 'description' => __( 'Limit result set to products based on a minimum price.', 'woocommerce' ), - 'type' => 'string', - 'sanitize_callback' => 'sanitize_text_field', - 'validate_callback' => 'rest_validate_request_arg', - ); - $params['max_price'] = array( - 'description' => __( 'Limit result set to products based on a maximum price.', 'woocommerce' ), - 'type' => 'string', - 'sanitize_callback' => 'sanitize_text_field', - 'validate_callback' => 'rest_validate_request_arg', - ); - - return $params; - } + protected $namespace = 'wc/v3'; } diff --git a/includes/api/class-wc-rest-report-sales-controller.php b/includes/api/class-wc-rest-report-sales-controller.php deleted file mode 100644 index f4a787ece5c..00000000000 --- a/includes/api/class-wc-rest-report-sales-controller.php +++ /dev/null @@ -1,27 +0,0 @@ -[\w-]+)'; - - /** - * Register routes. - * - * @since 3.0.0 - */ - public function register_routes() { - register_rest_route( - $this->namespace, '/' . $this->rest_base, array( - 'args' => array( - 'group' => array( - 'description' => __( 'Settings group ID.', 'woocommerce' ), - 'type' => 'string', - ), - ), - array( - 'methods' => WP_REST_Server::READABLE, - 'callback' => array( $this, 'get_items' ), - 'permission_callback' => array( $this, 'get_items_permissions_check' ), - ), - 'schema' => array( $this, 'get_public_item_schema' ), - ) - ); - - register_rest_route( - $this->namespace, '/' . $this->rest_base . '/batch', array( - 'args' => array( - 'group' => array( - 'description' => __( 'Settings group ID.', 'woocommerce' ), - 'type' => 'string', - ), - ), - array( - 'methods' => WP_REST_Server::EDITABLE, - 'callback' => array( $this, 'batch_items' ), - 'permission_callback' => array( $this, 'update_items_permissions_check' ), - 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), - ), - 'schema' => array( $this, 'get_public_batch_schema' ), - ) - ); - - register_rest_route( - $this->namespace, '/' . $this->rest_base . '/(?P[\w-]+)', array( - 'args' => array( - 'group' => array( - 'description' => __( 'Settings group ID.', 'woocommerce' ), - 'type' => 'string', - ), - 'id' => array( - 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), - 'type' => 'string', - ), - ), - array( - 'methods' => WP_REST_Server::READABLE, - 'callback' => array( $this, 'get_item' ), - 'permission_callback' => array( $this, 'get_items_permissions_check' ), - ), - array( - 'methods' => WP_REST_Server::EDITABLE, - 'callback' => array( $this, 'update_item' ), - 'permission_callback' => array( $this, 'update_items_permissions_check' ), - 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), - ), - 'schema' => array( $this, 'get_public_item_schema' ), - ) - ); - } - - /** - * Return a single setting. - * - * @since 3.0.0 - * @param WP_REST_Request $request Request data. - * @return WP_Error|WP_REST_Response - */ - public function get_item( $request ) { - $setting = $this->get_setting( $request['group_id'], $request['id'] ); - - if ( is_wp_error( $setting ) ) { - return $setting; - } - - $response = $this->prepare_item_for_response( $setting, $request ); - - return rest_ensure_response( $response ); - } - - /** - * Return all settings in a group. - * - * @since 3.0.0 - * @param WP_REST_Request $request Request data. - * @return WP_Error|WP_REST_Response - */ - public function get_items( $request ) { - $settings = $this->get_group_settings( $request['group_id'] ); - - if ( is_wp_error( $settings ) ) { - return $settings; - } - - $data = array(); - - foreach ( $settings as $setting_obj ) { - $setting = $this->prepare_item_for_response( $setting_obj, $request ); - $setting = $this->prepare_response_for_collection( $setting ); - if ( $this->is_setting_type_valid( $setting['type'] ) ) { - $data[] = $setting; - } - } - - return rest_ensure_response( $data ); - } - - /** - * Get all settings in a group. - * - * @since 3.0.0 - * @param string $group_id Group ID. - * @return array|WP_Error - */ - public function get_group_settings( $group_id ) { - if ( empty( $group_id ) ) { - return new WP_Error( 'rest_setting_setting_group_invalid', __( 'Invalid setting group.', 'woocommerce' ), array( 'status' => 404 ) ); - } - - $settings = apply_filters( 'woocommerce_settings-' . $group_id, array() ); - - if ( empty( $settings ) ) { - return new WP_Error( 'rest_setting_setting_group_invalid', __( 'Invalid setting group.', 'woocommerce' ), array( 'status' => 404 ) ); - } - - $filtered_settings = array(); - foreach ( $settings as $setting ) { - $option_key = $setting['option_key']; - $setting = $this->filter_setting( $setting ); - $default = isset( $setting['default'] ) ? $setting['default'] : ''; - // Get the option value. - if ( is_array( $option_key ) ) { - $option = get_option( $option_key[0] ); - $setting['value'] = isset( $option[ $option_key[1] ] ) ? $option[ $option_key[1] ] : $default; - } else { - $admin_setting_value = WC_Admin_Settings::get_option( $option_key, $default ); - $setting['value'] = $admin_setting_value; - } - - if ( 'multi_select_countries' === $setting['type'] ) { - $setting['options'] = WC()->countries->get_countries(); - $setting['type'] = 'multiselect'; - } elseif ( 'single_select_country' === $setting['type'] ) { - $setting['type'] = 'select'; - $setting['options'] = $this->get_countries_and_states(); - } - - $filtered_settings[] = $setting; - } - - return $filtered_settings; - } - - /** - * Returns a list of countries and states for use in the base location setting. - * - * @since 3.0.7 - * @return array Array of states and countries. - */ - private function get_countries_and_states() { - $countries = WC()->countries->get_countries(); - if ( ! $countries ) { - return array(); - } - - $output = array(); - - foreach ( $countries as $key => $value ) { - $states = WC()->countries->get_states( $key ); - if ( $states ) { - foreach ( $states as $state_key => $state_value ) { - $output[ $key . ':' . $state_key ] = $value . ' - ' . $state_value; - } - } else { - $output[ $key ] = $value; - } - } - - return $output; - } - - /** - * Get setting data. - * - * @since 3.0.0 - * @param string $group_id Group ID. - * @param string $setting_id Setting ID. - * @return stdClass|WP_Error - */ - public function get_setting( $group_id, $setting_id ) { - if ( empty( $setting_id ) ) { - return new WP_Error( 'rest_setting_setting_invalid', __( 'Invalid setting.', 'woocommerce' ), array( 'status' => 404 ) ); - } - - $settings = $this->get_group_settings( $group_id ); - - if ( is_wp_error( $settings ) ) { - return $settings; - } - - $array_key = array_keys( wp_list_pluck( $settings, 'id' ), $setting_id ); - - if ( empty( $array_key ) ) { - return new WP_Error( 'rest_setting_setting_invalid', __( 'Invalid setting.', 'woocommerce' ), array( 'status' => 404 ) ); - } - - $setting = $settings[ $array_key[0] ]; - - if ( ! $this->is_setting_type_valid( $setting['type'] ) ) { - return new WP_Error( 'rest_setting_setting_invalid', __( 'Invalid setting.', 'woocommerce' ), array( 'status' => 404 ) ); - } - - return $setting; - } - - /** - * Bulk create, update and delete items. - * - * @since 3.0.0 - * @param WP_REST_Request $request Full details about the request. - * @return array Of WP_Error or WP_REST_Response. - */ - public function batch_items( $request ) { - // Get the request params. - $items = array_filter( $request->get_params() ); - - /* - * Since our batch settings update is group-specific and matches based on the route, - * we inject the URL parameters (containing group) into the batch items - */ - if ( ! empty( $items['update'] ) ) { - $to_update = array(); - foreach ( $items['update'] as $item ) { - $to_update[] = array_merge( $request->get_url_params(), $item ); - } - $request = new WP_REST_Request( $request->get_method() ); - $request->set_body_params( array( 'update' => $to_update ) ); - } - - return parent::batch_items( $request ); - } - - /** - * Update a single setting in a group. - * - * @since 3.0.0 - * @param WP_REST_Request $request Request data. - * @return WP_Error|WP_REST_Response - */ - public function update_item( $request ) { - $setting = $this->get_setting( $request['group_id'], $request['id'] ); - - if ( is_wp_error( $setting ) ) { - return $setting; - } - - if ( is_callable( array( $this, 'validate_setting_' . $setting['type'] . '_field' ) ) ) { - $value = $this->{'validate_setting_' . $setting['type'] . '_field'}( $request['value'], $setting ); - } else { - $value = $this->validate_setting_text_field( $request['value'], $setting ); - } - - if ( is_wp_error( $value ) ) { - return $value; - } - - if ( is_array( $setting['option_key'] ) ) { - $setting['value'] = $value; - $option_key = $setting['option_key']; - $prev = get_option( $option_key[0] ); - $prev[ $option_key[1] ] = $request['value']; - update_option( $option_key[0], $prev ); - } else { - $update_data = array(); - $update_data[ $setting['option_key'] ] = $value; - $setting['value'] = $value; - WC_Admin_Settings::save_fields( array( $setting ), $update_data ); - } - - $response = $this->prepare_item_for_response( $setting, $request ); - - return rest_ensure_response( $response ); - } - - /** - * Prepare a single setting object for response. - * - * @since 3.0.0 - * @param object $item Setting object. - * @param WP_REST_Request $request Request object. - * @return WP_REST_Response $response Response data. - */ - public function prepare_item_for_response( $item, $request ) { - unset( $item['option_key'] ); - $data = $this->filter_setting( $item ); - $data = $this->add_additional_fields_to_object( $data, $request ); - $data = $this->filter_response_by_context( $data, empty( $request['context'] ) ? 'view' : $request['context'] ); - $response = rest_ensure_response( $data ); - $response->add_links( $this->prepare_links( $data['id'], $request['group_id'] ) ); - return $response; - } - - /** - * Prepare links for the request. - * - * @since 3.0.0 - * @param string $setting_id Setting ID. - * @param string $group_id Group ID. - * @return array Links for the given setting. - */ - protected function prepare_links( $setting_id, $group_id ) { - $base = str_replace( '(?P[\w-]+)', $group_id, $this->rest_base ); - $links = array( - 'self' => array( - 'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $base, $setting_id ) ), - ), - 'collection' => array( - 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $base ) ), - ), - ); - - return $links; - } - - /** - * Makes sure the current user has access to READ the settings APIs. - * - * @since 3.0.0 - * @param WP_REST_Request $request Full data about the request. - * @return WP_Error|boolean - */ - public function get_items_permissions_check( $request ) { - if ( ! wc_rest_check_manager_permissions( 'settings', 'read' ) ) { - return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot list resources.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); - } - - return true; - } - - /** - * Makes sure the current user has access to WRITE the settings APIs. - * - * @since 3.0.0 - * @param WP_REST_Request $request Full data about the request. - * @return WP_Error|boolean - */ - public function update_items_permissions_check( $request ) { - if ( ! wc_rest_check_manager_permissions( 'settings', 'edit' ) ) { - return new WP_Error( 'woocommerce_rest_cannot_edit', __( 'Sorry, you cannot edit this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); - } - - return true; - } - - /** - * Filters out bad values from the settings array/filter so we - * only return known values via the API. - * - * @since 3.0.0 - * @param array $setting Settings. - * @return array - */ - public function filter_setting( $setting ) { - $setting = array_intersect_key( - $setting, - array_flip( array_filter( array_keys( $setting ), array( $this, 'allowed_setting_keys' ) ) ) - ); - - if ( empty( $setting['options'] ) ) { - unset( $setting['options'] ); - } - - if ( 'image_width' === $setting['type'] ) { - $setting = $this->cast_image_width( $setting ); - } - - return $setting; - } - - /** - * For image_width, Crop can return "0" instead of false -- so we want - * to make sure we return these consistently the same we accept them. - * - * @todo remove in 4.0 - * @since 3.0.0 - * @param array $setting Settings. - * @return array - */ - public function cast_image_width( $setting ) { - foreach ( array( 'default', 'value' ) as $key ) { - if ( isset( $setting[ $key ] ) ) { - $setting[ $key ]['width'] = intval( $setting[ $key ]['width'] ); - $setting[ $key ]['height'] = intval( $setting[ $key ]['height'] ); - $setting[ $key ]['crop'] = (bool) $setting[ $key ]['crop']; - } - } - return $setting; - } - - /** - * Callback for allowed keys for each setting response. - * - * @since 3.0.0 - * @param string $key Key to check. - * @return boolean - */ - public function allowed_setting_keys( $key ) { - return in_array( - $key, array( - 'id', - 'label', - 'description', - 'default', - 'tip', - 'placeholder', - 'type', - 'options', - 'value', - 'option_key', - ) - ); - } - - /** - * Boolean for if a setting type is a valid supported setting type. - * - * @since 3.0.0 - * @param string $type Type. - * @return bool - */ - public function is_setting_type_valid( $type ) { - return in_array( - $type, array( - 'text', // Validates with validate_setting_text_field. - 'email', // Validates with validate_setting_text_field. - 'number', // Validates with validate_setting_text_field. - 'color', // Validates with validate_setting_text_field. - 'password', // Validates with validate_setting_text_field. - 'textarea', // Validates with validate_setting_textarea_field. - 'select', // Validates with validate_setting_select_field. - 'multiselect', // Validates with validate_setting_multiselect_field. - 'radio', // Validates with validate_setting_radio_field (-> validate_setting_select_field). - 'checkbox', // Validates with validate_setting_checkbox_field. - 'image_width', // Validates with validate_setting_image_width_field. - 'thumbnail_cropping', // Validates with validate_setting_text_field. - ) - ); - } - - /** - * Get the settings schema, conforming to JSON Schema. - * - * @since 3.0.0 - * @return array - */ - public function get_item_schema() { - $schema = array( - '$schema' => 'http://json-schema.org/draft-04/schema#', - 'title' => 'setting', - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'A unique identifier for the setting.', 'woocommerce' ), - 'type' => 'string', - 'arg_options' => array( - 'sanitize_callback' => 'sanitize_title', - ), - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'label' => array( - 'description' => __( 'A human readable label for the setting used in interfaces.', 'woocommerce' ), - 'type' => 'string', - 'arg_options' => array( - 'sanitize_callback' => 'sanitize_text_field', - ), - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'description' => array( - 'description' => __( 'A human readable description for the setting used in interfaces.', 'woocommerce' ), - 'type' => 'string', - 'arg_options' => array( - 'sanitize_callback' => 'sanitize_text_field', - ), - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'value' => array( - 'description' => __( 'Setting value.', 'woocommerce' ), - 'type' => 'mixed', - 'context' => array( 'view', 'edit' ), - ), - 'default' => array( - 'description' => __( 'Default value for the setting.', 'woocommerce' ), - 'type' => 'mixed', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'tip' => array( - 'description' => __( 'Additional help text shown to the user about the setting.', 'woocommerce' ), - 'type' => 'string', - 'arg_options' => array( - 'sanitize_callback' => 'sanitize_text_field', - ), - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'placeholder' => array( - 'description' => __( 'Placeholder text to be displayed in text inputs.', 'woocommerce' ), - 'type' => 'string', - 'arg_options' => array( - 'sanitize_callback' => 'sanitize_text_field', - ), - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'type' => array( - 'description' => __( 'Type of setting.', 'woocommerce' ), - 'type' => 'string', - 'arg_options' => array( - 'sanitize_callback' => 'sanitize_text_field', - ), - 'context' => array( 'view', 'edit' ), - 'enum' => array( 'text', 'email', 'number', 'color', 'password', 'textarea', 'select', 'multiselect', 'radio', 'image_width', 'checkbox', 'thumbnail_cropping' ), - 'readonly' => true, - ), - 'options' => array( - 'description' => __( 'Array of options (key value pairs) for inputs such as select, multiselect, and radio buttons.', 'woocommerce' ), - 'type' => 'object', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - ), - ); - - return $this->add_additional_fields_schema( $schema ); - } + protected $namespace = 'wc/v3'; } diff --git a/includes/api/class-wc-rest-settings-controller.php b/includes/api/class-wc-rest-settings-controller.php index 35d012796ad..e26a6731247 100644 --- a/includes/api/class-wc-rest-settings-controller.php +++ b/includes/api/class-wc-rest-settings-controller.php @@ -14,219 +14,14 @@ defined( 'ABSPATH' ) || exit; * REST API Settings controller class. * * @package WooCommerce/API - * @extends WC_REST_Controller + * @extends WC_REST_Settings_V2_Controller */ -class WC_REST_Settings_Controller extends WC_REST_Controller { +class WC_REST_Settings_Controller extends WC_REST_Settings_V2_Controller { /** - * WP REST API namespace/version. + * Endpoint namespace. * * @var string */ - protected $namespace = 'wc/v2'; - - /** - * Route base. - * - * @var string - */ - protected $rest_base = 'settings'; - - /** - * Register routes. - * - * @since 3.0.0 - */ - public function register_routes() { - register_rest_route( - $this->namespace, '/' . $this->rest_base, array( - array( - 'methods' => WP_REST_Server::READABLE, - 'callback' => array( $this, 'get_items' ), - 'permission_callback' => array( $this, 'get_items_permissions_check' ), - ), - 'schema' => array( $this, 'get_public_item_schema' ), - ) - ); - } - - /** - * Get all settings groups items. - * - * @since 3.0.0 - * @param WP_REST_Request $request Request data. - * @return WP_Error|WP_REST_Response - */ - public function get_items( $request ) { - $groups = apply_filters( 'woocommerce_settings_groups', array() ); - if ( empty( $groups ) ) { - return new WP_Error( 'rest_setting_groups_empty', __( 'No setting groups have been registered.', 'woocommerce' ), array( 'status' => 500 ) ); - } - - $defaults = $this->group_defaults(); - $filtered_groups = array(); - foreach ( $groups as $group ) { - $sub_groups = array(); - foreach ( $groups as $_group ) { - if ( ! empty( $_group['parent_id'] ) && $group['id'] === $_group['parent_id'] ) { - $sub_groups[] = $_group['id']; - } - } - $group['sub_groups'] = $sub_groups; - - $group = wp_parse_args( $group, $defaults ); - if ( ! is_null( $group['id'] ) && ! is_null( $group['label'] ) ) { - $group_obj = $this->filter_group( $group ); - $group_data = $this->prepare_item_for_response( $group_obj, $request ); - $group_data = $this->prepare_response_for_collection( $group_data ); - - $filtered_groups[] = $group_data; - } - } - - $response = rest_ensure_response( $filtered_groups ); - return $response; - } - - /** - * Prepare links for the request. - * - * @param string $group_id Group ID. - * @return array Links for the given group. - */ - protected function prepare_links( $group_id ) { - $base = '/' . $this->namespace . '/' . $this->rest_base; - $links = array( - 'options' => array( - 'href' => rest_url( trailingslashit( $base ) . $group_id ), - ), - ); - - return $links; - } - - /** - * Prepare a report sales object for serialization. - * - * @since 3.0.0 - * @param array $item Group object. - * @param WP_REST_Request $request Request object. - * @return WP_REST_Response $response Response data. - */ - public function prepare_item_for_response( $item, $request ) { - $context = empty( $request['context'] ) ? 'view' : $request['context']; - $data = $this->add_additional_fields_to_object( $item, $request ); - $data = $this->filter_response_by_context( $data, $context ); - - $response = rest_ensure_response( $data ); - - $response->add_links( $this->prepare_links( $item['id'] ) ); - - return $response; - } - - /** - * Filters out bad values from the groups array/filter so we - * only return known values via the API. - * - * @since 3.0.0 - * @param array $group Group. - * @return array - */ - public function filter_group( $group ) { - return array_intersect_key( - $group, - array_flip( array_filter( array_keys( $group ), array( $this, 'allowed_group_keys' ) ) ) - ); - } - - /** - * Callback for allowed keys for each group response. - * - * @since 3.0.0 - * @param string $key Key to check. - * @return boolean - */ - public function allowed_group_keys( $key ) { - return in_array( $key, array( 'id', 'label', 'description', 'parent_id', 'sub_groups' ) ); - } - - /** - * Returns default settings for groups. null means the field is required. - * - * @since 3.0.0 - * @return array - */ - protected function group_defaults() { - return array( - 'id' => null, - 'label' => null, - 'description' => '', - 'parent_id' => '', - 'sub_groups' => array(), - ); - } - - /** - * Makes sure the current user has access to READ the settings APIs. - * - * @since 3.0.0 - * @param WP_REST_Request $request Full data about the request. - * @return WP_Error|boolean - */ - public function get_items_permissions_check( $request ) { - if ( ! wc_rest_check_manager_permissions( 'settings', 'read' ) ) { - return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot list resources.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); - } - - return true; - } - - /** - * Get the groups schema, conforming to JSON Schema. - * - * @since 3.0.0 - * @return array - */ - public function get_item_schema() { - $schema = array( - '$schema' => 'http://json-schema.org/draft-04/schema#', - 'title' => 'setting_group', - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'A unique identifier that can be used to link settings together.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'label' => array( - 'description' => __( 'A human readable label for the setting used in interfaces.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'description' => array( - 'description' => __( 'A human readable description for the setting used in interfaces.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'parent_id' => array( - 'description' => __( 'ID of parent grouping.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'sub_groups' => array( - 'description' => __( 'IDs for settings sub groups.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - ), - ); - - return $this->add_additional_fields_schema( $schema ); - } + protected $namespace = 'wc/v3'; } diff --git a/includes/api/class-wc-rest-shipping-methods-controller.php b/includes/api/class-wc-rest-shipping-methods-controller.php index ab1b8acffc8..075e4f777cd 100644 --- a/includes/api/class-wc-rest-shipping-methods-controller.php +++ b/includes/api/class-wc-rest-shipping-methods-controller.php @@ -14,218 +14,14 @@ defined( 'ABSPATH' ) || exit; * Shipping methods controller class. * * @package WooCommerce/API - * @extends WC_REST_Controller + * @extends WC_REST_Shipping_Methods_V2_Controller */ -class WC_REST_Shipping_Methods_Controller extends WC_REST_Controller { +class WC_REST_Shipping_Methods_Controller extends WC_REST_Shipping_Methods_V2_Controller { /** * Endpoint namespace. * * @var string */ - protected $namespace = 'wc/v2'; - - /** - * Route base. - * - * @var string - */ - protected $rest_base = 'shipping_methods'; - - /** - * Register the route for /shipping_methods and /shipping_methods/ - */ - public function register_routes() { - register_rest_route( - $this->namespace, '/' . $this->rest_base, array( - array( - 'methods' => WP_REST_Server::READABLE, - 'callback' => array( $this, 'get_items' ), - 'permission_callback' => array( $this, 'get_items_permissions_check' ), - 'args' => $this->get_collection_params(), - ), - 'schema' => array( $this, 'get_public_item_schema' ), - ) - ); - register_rest_route( - $this->namespace, '/' . $this->rest_base . '/(?P[\w-]+)', array( - 'args' => array( - 'id' => array( - 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), - 'type' => 'string', - ), - ), - array( - 'methods' => WP_REST_Server::READABLE, - 'callback' => array( $this, 'get_item' ), - 'permission_callback' => array( $this, 'get_item_permissions_check' ), - 'args' => array( - 'context' => $this->get_context_param( array( 'default' => 'view' ) ), - ), - ), - 'schema' => array( $this, 'get_public_item_schema' ), - ) - ); - } - - /** - * Check whether a given request has permission to view shipping methods. - * - * @param WP_REST_Request $request Full details about the request. - * @return WP_Error|boolean - */ - public function get_items_permissions_check( $request ) { - if ( ! wc_rest_check_manager_permissions( 'shipping_methods', 'read' ) ) { - return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot list resources.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); - } - return true; - } - - /** - * Check if a given request has access to read a shipping method. - * - * @param WP_REST_Request $request Full details about the request. - * @return WP_Error|boolean - */ - public function get_item_permissions_check( $request ) { - if ( ! wc_rest_check_manager_permissions( 'shipping_methods', 'read' ) ) { - return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot view this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); - } - return true; - } - - /** - * Get shipping methods. - * - * @param WP_REST_Request $request Full details about the request. - * @return WP_Error|WP_REST_Response - */ - public function get_items( $request ) { - $wc_shipping = WC_Shipping::instance(); - $response = array(); - foreach ( $wc_shipping->get_shipping_methods() as $id => $shipping_method ) { - $method = $this->prepare_item_for_response( $shipping_method, $request ); - $method = $this->prepare_response_for_collection( $method ); - $response[] = $method; - } - return rest_ensure_response( $response ); - } - - /** - * Get a single Shipping Method. - * - * @param WP_REST_Request $request Request data. - * @return WP_REST_Response|WP_Error - */ - public function get_item( $request ) { - $wc_shipping = WC_Shipping::instance(); - $methods = $wc_shipping->get_shipping_methods(); - if ( empty( $methods[ $request['id'] ] ) ) { - return new WP_Error( 'woocommerce_rest_shipping_method_invalid', __( 'Resource does not exist.', 'woocommerce' ), array( 'status' => 404 ) ); - } - - $method = $methods[ $request['id'] ]; - $response = $this->prepare_item_for_response( $method, $request ); - - return rest_ensure_response( $response ); - } - - /** - * Prepare a shipping method for response. - * - * @param WC_Shipping_Method $method Shipping method object. - * @param WP_REST_Request $request Request object. - * @return WP_REST_Response $response Response data. - */ - public function prepare_item_for_response( $method, $request ) { - $data = array( - 'id' => $method->id, - 'title' => $method->method_title, - 'description' => $method->method_description, - ); - - $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; - $data = $this->add_additional_fields_to_object( $data, $request ); - $data = $this->filter_response_by_context( $data, $context ); - - // Wrap the data in a response object. - $response = rest_ensure_response( $data ); - - $response->add_links( $this->prepare_links( $method, $request ) ); - - /** - * Filter shipping methods object returned from the REST API. - * - * @param WP_REST_Response $response The response object. - * @param WC_Shipping_Method $method Shipping method object used to create response. - * @param WP_REST_Request $request Request object. - */ - return apply_filters( 'woocommerce_rest_prepare_shipping_method', $response, $method, $request ); - } - - /** - * Prepare links for the request. - * - * @param WC_Shipping_Method $method Shipping method object. - * @param WP_REST_Request $request Request object. - * @return array - */ - protected function prepare_links( $method, $request ) { - $links = array( - 'self' => array( - 'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $this->rest_base, $method->id ) ), - ), - 'collection' => array( - 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ), - ), - ); - - return $links; - } - - /** - * Get the shipping method schema, conforming to JSON Schema. - * - * @return array - */ - public function get_item_schema() { - $schema = array( - '$schema' => 'http://json-schema.org/draft-04/schema#', - 'title' => 'shipping_method', - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Method ID.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'title' => array( - 'description' => __( 'Shipping method title.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'description' => array( - 'description' => __( 'Shipping method description.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - ), - ); - - return $this->add_additional_fields_schema( $schema ); - } - - /** - * Get any query params needed. - * - * @return array - */ - public function get_collection_params() { - return array( - 'context' => $this->get_context_param( array( 'default' => 'view' ) ), - ); - } + protected $namespace = 'wc/v3'; } diff --git a/includes/api/class-wc-rest-shipping-zone-locations-controller.php b/includes/api/class-wc-rest-shipping-zone-locations-controller.php index fb97a818a82..cba326a80ca 100644 --- a/includes/api/class-wc-rest-shipping-zone-locations-controller.php +++ b/includes/api/class-wc-rest-shipping-zone-locations-controller.php @@ -14,177 +14,14 @@ defined( 'ABSPATH' ) || exit; * REST API Shipping Zone Locations class. * * @package WooCommerce/API - * @extends WC_REST_Shipping_Zones_Controller_Base + * @extends WC_REST_Shipping_Zone_Locations_V2_Controller */ -class WC_REST_Shipping_Zone_Locations_Controller extends WC_REST_Shipping_Zones_Controller_Base { +class WC_REST_Shipping_Zone_Locations_Controller extends WC_REST_Shipping_Zone_Locations_V2_Controller { /** - * Register the routes for Shipping Zone Locations. - */ - public function register_routes() { - register_rest_route( - $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)/locations', array( - 'args' => array( - 'id' => array( - 'description' => __( 'Unique ID for the resource.', 'woocommerce' ), - 'type' => 'integer', - ), - ), - array( - 'methods' => WP_REST_Server::READABLE, - 'callback' => array( $this, 'get_items' ), - 'permission_callback' => array( $this, 'get_items_permissions_check' ), - ), - array( - 'methods' => WP_REST_Server::EDITABLE, - 'callback' => array( $this, 'update_items' ), - 'permission_callback' => array( $this, 'update_items_permissions_check' ), - 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), - ), - 'schema' => array( $this, 'get_public_item_schema' ), - ) - ); - } - - /** - * Get all Shipping Zone Locations. + * Endpoint namespace. * - * @param WP_REST_Request $request Request data. - * @return WP_REST_Response|WP_Error + * @var string */ - public function get_items( $request ) { - $zone = $this->get_zone( (int) $request['id'] ); - - if ( is_wp_error( $zone ) ) { - return $zone; - } - - $locations = $zone->get_zone_locations(); - $data = array(); - - foreach ( $locations as $location_obj ) { - $location = $this->prepare_item_for_response( $location_obj, $request ); - $location = $this->prepare_response_for_collection( $location ); - $data[] = $location; - } - - return rest_ensure_response( $data ); - } - - /** - * Update all Shipping Zone Locations. - * - * @param WP_REST_Request $request Request data. - * @return WP_REST_Response|WP_Error - */ - public function update_items( $request ) { - $zone = $this->get_zone( (int) $request['id'] ); - - if ( is_wp_error( $zone ) ) { - return $zone; - } - - if ( 0 === $zone->get_id() ) { - return new WP_Error( 'woocommerce_rest_shipping_zone_locations_invalid_zone', __( 'The "locations not covered by your other zones" zone cannot be updated.', 'woocommerce' ), array( 'status' => 403 ) ); - } - - $raw_locations = $request->get_json_params(); - $locations = array(); - - foreach ( (array) $raw_locations as $raw_location ) { - if ( empty( $raw_location['code'] ) ) { - continue; - } - - $type = ! empty( $raw_location['type'] ) ? sanitize_text_field( $raw_location['type'] ) : 'country'; - - if ( ! in_array( $type, array( 'postcode', 'state', 'country', 'continent' ), true ) ) { - continue; - } - - $locations[] = array( - 'code' => sanitize_text_field( $raw_location['code'] ), - 'type' => sanitize_text_field( $type ), - ); - } - - $zone->set_locations( $locations ); - $zone->save(); - - return $this->get_items( $request ); - } - - /** - * Prepare the Shipping Zone Location for the REST response. - * - * @param array $item Shipping Zone Location. - * @param WP_REST_Request $request Request object. - * @return WP_REST_Response $response - */ - public function prepare_item_for_response( $item, $request ) { - $context = empty( $request['context'] ) ? 'view' : $request['context']; - $data = $this->add_additional_fields_to_object( $item, $request ); - $data = $this->filter_response_by_context( $data, $context ); - - // Wrap the data in a response object. - $response = rest_ensure_response( $data ); - - $response->add_links( $this->prepare_links( (int) $request['id'] ) ); - - return $response; - } - - /** - * Prepare links for the request. - * - * @param int $zone_id Given Shipping Zone ID. - * @return array Links for the given Shipping Zone Location. - */ - protected function prepare_links( $zone_id ) { - $base = '/' . $this->namespace . '/' . $this->rest_base . '/' . $zone_id; - $links = array( - 'collection' => array( - 'href' => rest_url( $base . '/locations' ), - ), - 'describes' => array( - 'href' => rest_url( $base ), - ), - ); - - return $links; - } - - /** - * Get the Shipping Zone Locations schema, conforming to JSON Schema - * - * @return array - */ - public function get_item_schema() { - $schema = array( - '$schema' => 'http://json-schema.org/draft-04/schema#', - 'title' => 'shipping_zone_location', - 'type' => 'object', - 'properties' => array( - 'code' => array( - 'description' => __( 'Shipping zone location code.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'type' => array( - 'description' => __( 'Shipping zone location type.', 'woocommerce' ), - 'type' => 'string', - 'default' => 'country', - 'enum' => array( - 'postcode', - 'state', - 'country', - 'continent', - ), - 'context' => array( 'view', 'edit' ), - ), - ), - ); - - return $this->add_additional_fields_schema( $schema ); - } + protected $namespace = 'wc/v3'; } diff --git a/includes/api/class-wc-rest-shipping-zone-methods-controller.php b/includes/api/class-wc-rest-shipping-zone-methods-controller.php index c0bc3c2d6a3..6058e95baaf 100644 --- a/includes/api/class-wc-rest-shipping-zone-methods-controller.php +++ b/includes/api/class-wc-rest-shipping-zone-methods-controller.php @@ -14,528 +14,14 @@ defined( 'ABSPATH' ) || exit; * REST API Shipping Zone Methods class. * * @package WooCommerce/API - * @extends WC_REST_Shipping_Zones_Controller_Base + * @extends WC_REST_Shipping_Zone_Methods_V2_Controller */ -class WC_REST_Shipping_Zone_Methods_Controller extends WC_REST_Shipping_Zones_Controller_Base { +class WC_REST_Shipping_Zone_Methods_Controller extends WC_REST_Shipping_Zone_Methods_V2_Controller { /** - * Register the routes for Shipping Zone Methods. + * Endpoint namespace. + * + * @var string */ - public function register_routes() { - register_rest_route( - $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)/methods', array( - 'args' => array( - 'zone_id' => array( - 'description' => __( 'Unique ID for the zone.', 'woocommerce' ), - 'type' => 'integer', - ), - ), - array( - 'methods' => WP_REST_Server::READABLE, - 'callback' => array( $this, 'get_items' ), - 'permission_callback' => array( $this, 'get_items_permissions_check' ), - ), - array( - 'methods' => WP_REST_Server::CREATABLE, - 'callback' => array( $this, 'create_item' ), - 'permission_callback' => array( $this, 'create_item_permissions_check' ), - 'args' => array_merge( - $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ), array( - 'method_id' => array( - 'required' => true, - 'readonly' => false, - 'description' => __( 'Shipping method ID.', 'woocommerce' ), - ), - ) - ), - ), - 'schema' => array( $this, 'get_public_item_schema' ), - ) - ); - - register_rest_route( - $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)/methods/(?P[\d]+)', array( - 'args' => array( - 'zone_id' => array( - 'description' => __( 'Unique ID for the zone.', 'woocommerce' ), - 'type' => 'integer', - ), - 'instance_id' => array( - 'description' => __( 'Unique ID for the instance.', 'woocommerce' ), - 'type' => 'integer', - ), - ), - array( - 'methods' => WP_REST_Server::READABLE, - 'callback' => array( $this, 'get_item' ), - 'permission_callback' => array( $this, 'get_items_permissions_check' ), - ), - array( - 'methods' => WP_REST_Server::EDITABLE, - 'callback' => array( $this, 'update_item' ), - 'permission_callback' => array( $this, 'update_items_permissions_check' ), - 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), - ), - array( - 'methods' => WP_REST_Server::DELETABLE, - 'callback' => array( $this, 'delete_item' ), - 'permission_callback' => array( $this, 'delete_items_permissions_check' ), - 'args' => array( - 'force' => array( - 'default' => false, - 'type' => 'boolean', - 'description' => __( 'Whether to bypass trash and force deletion.', 'woocommerce' ), - ), - ), - ), - 'schema' => array( $this, 'get_public_item_schema' ), - ) - ); - } - - /** - * Get a single Shipping Zone Method. - * - * @param WP_REST_Request $request Request data. - * @return WP_REST_Response|WP_Error - */ - public function get_item( $request ) { - $zone = $this->get_zone( $request['zone_id'] ); - - if ( is_wp_error( $zone ) ) { - return $zone; - } - - $instance_id = (int) $request['instance_id']; - $methods = $zone->get_shipping_methods(); - $method = false; - - foreach ( $methods as $method_obj ) { - if ( $instance_id === $method_obj->instance_id ) { - $method = $method_obj; - break; - } - } - - if ( false === $method ) { - return new WP_Error( 'woocommerce_rest_shipping_zone_method_invalid', __( 'Resource does not exist.', 'woocommerce' ), array( 'status' => 404 ) ); - } - - $data = $this->prepare_item_for_response( $method, $request ); - - return rest_ensure_response( $data ); - } - - /** - * Get all Shipping Zone Methods. - * - * @param WP_REST_Request $request Request data. - * @return WP_REST_Response|WP_Error - */ - public function get_items( $request ) { - $zone = $this->get_zone( $request['zone_id'] ); - - if ( is_wp_error( $zone ) ) { - return $zone; - } - - $methods = $zone->get_shipping_methods(); - $data = array(); - - foreach ( $methods as $method_obj ) { - $method = $this->prepare_item_for_response( $method_obj, $request ); - $data[] = $method; - } - - return rest_ensure_response( $data ); - } - - /** - * Create a new shipping zone method instance. - * - * @param WP_REST_Request $request Full details about the request. - * @return WP_REST_Request|WP_Error - */ - public function create_item( $request ) { - $method_id = $request['method_id']; - $zone = $this->get_zone( $request['zone_id'] ); - if ( is_wp_error( $zone ) ) { - return $zone; - } - - $instance_id = $zone->add_shipping_method( $method_id ); - $methods = $zone->get_shipping_methods(); - $method = false; - foreach ( $methods as $method_obj ) { - if ( $instance_id === $method_obj->instance_id ) { - $method = $method_obj; - break; - } - } - - if ( false === $method ) { - return new WP_Error( 'woocommerce_rest_shipping_zone_not_created', __( 'Resource cannot be created.', 'woocommerce' ), array( 'status' => 500 ) ); - } - - $method = $this->update_fields( $instance_id, $method, $request ); - if ( is_wp_error( $method ) ) { - return $method; - } - - $data = $this->prepare_item_for_response( $method, $request ); - return rest_ensure_response( $data ); - } - - /** - * Delete a shipping method instance. - * - * @param WP_REST_Request $request Full details about the request. - * @return WP_Error|boolean - */ - public function delete_item( $request ) { - $zone = $this->get_zone( $request['zone_id'] ); - if ( is_wp_error( $zone ) ) { - return $zone; - } - - $instance_id = (int) $request['instance_id']; - $force = $request['force']; - - $methods = $zone->get_shipping_methods(); - $method = false; - - foreach ( $methods as $method_obj ) { - if ( $instance_id === $method_obj->instance_id ) { - $method = $method_obj; - break; - } - } - - if ( false === $method ) { - return new WP_Error( 'woocommerce_rest_shipping_zone_method_invalid', __( 'Resource does not exist.', 'woocommerce' ), array( 'status' => 404 ) ); - } - - $method = $this->update_fields( $instance_id, $method, $request ); - if ( is_wp_error( $method ) ) { - return $method; - } - - $request->set_param( 'context', 'view' ); - $response = $this->prepare_item_for_response( $method, $request ); - - // Actually delete. - if ( $force ) { - $zone->delete_shipping_method( $instance_id ); - } else { - return new WP_Error( 'rest_trash_not_supported', __( 'Shipping methods do not support trashing.', 'woocommerce' ), array( 'status' => 501 ) ); - } - - /** - * Fires after a product review is deleted via the REST API. - * - * @param object $method - * @param WP_REST_Response $response The response data. - * @param WP_REST_Request $request The request sent to the API. - */ - do_action( 'rest_delete_product_review', $method, $response, $request ); - - return $response; - } - - /** - * Update A Single Shipping Zone Method. - * - * @param WP_REST_Request $request Request data. - * @return WP_REST_Response|WP_Error - */ - public function update_item( $request ) { - $zone = $this->get_zone( $request['zone_id'] ); - if ( is_wp_error( $zone ) ) { - return $zone; - } - - $instance_id = (int) $request['instance_id']; - $methods = $zone->get_shipping_methods(); - $method = false; - - foreach ( $methods as $method_obj ) { - if ( $instance_id === $method_obj->instance_id ) { - $method = $method_obj; - break; - } - } - - if ( false === $method ) { - return new WP_Error( 'woocommerce_rest_shipping_zone_method_invalid', __( 'Resource does not exist.', 'woocommerce' ), array( 'status' => 404 ) ); - } - - $method = $this->update_fields( $instance_id, $method, $request ); - if ( is_wp_error( $method ) ) { - return $method; - } - - $data = $this->prepare_item_for_response( $method, $request ); - return rest_ensure_response( $data ); - } - - /** - * Updates settings, order, and enabled status on create. - * - * @param int $instance_id Instance ID. - * @param WC_Shipping_Method $method Shipping method data. - * @param WP_REST_Request $request Request data. - * - * @return WC_Shipping_Method - */ - public function update_fields( $instance_id, $method, $request ) { - global $wpdb; - - // Update settings if present. - if ( isset( $request['settings'] ) ) { - $method->init_instance_settings(); - $instance_settings = $method->instance_settings; - $errors_found = false; - foreach ( $method->get_instance_form_fields() as $key => $field ) { - if ( isset( $request['settings'][ $key ] ) ) { - if ( is_callable( array( $this, 'validate_setting_' . $field['type'] . '_field' ) ) ) { - $value = $this->{'validate_setting_' . $field['type'] . '_field'}( $request['settings'][ $key ], $field ); - } else { - $value = $this->validate_setting_text_field( $request['settings'][ $key ], $field ); - } - if ( is_wp_error( $value ) ) { - $errors_found = true; - break; - } - $instance_settings[ $key ] = $value; - } - } - - if ( $errors_found ) { - return new WP_Error( 'rest_setting_value_invalid', __( 'An invalid setting value was passed.', 'woocommerce' ), array( 'status' => 400 ) ); - } - - update_option( $method->get_instance_option_key(), apply_filters( 'woocommerce_shipping_' . $method->id . '_instance_settings_values', $instance_settings, $method ) ); - } - - // Update order. - if ( isset( $request['order'] ) ) { - $wpdb->update( "{$wpdb->prefix}woocommerce_shipping_zone_methods", array( 'method_order' => absint( $request['order'] ) ), array( 'instance_id' => absint( $instance_id ) ) ); - $method->method_order = absint( $request['order'] ); - } - - // Update if this method is enabled or not. - if ( isset( $request['enabled'] ) ) { - if ( $wpdb->update( "{$wpdb->prefix}woocommerce_shipping_zone_methods", array( 'is_enabled' => $request['enabled'] ), array( 'instance_id' => absint( $instance_id ) ) ) ) { - do_action( 'woocommerce_shipping_zone_method_status_toggled', $instance_id, $method->id, $request['zone_id'], $request['enabled'] ); - $method->enabled = ( true === $request['enabled'] ? 'yes' : 'no' ); - } - } - - return $method; - } - - /** - * Prepare the Shipping Zone Method for the REST response. - * - * @param array $item Shipping Zone Method. - * @param WP_REST_Request $request Request object. - * @return WP_REST_Response $response - */ - public function prepare_item_for_response( $item, $request ) { - $method = array( - 'id' => $item->instance_id, - 'instance_id' => $item->instance_id, - 'title' => $item->instance_settings['title'], - 'order' => $item->method_order, - 'enabled' => ( 'yes' === $item->enabled ), - 'method_id' => $item->id, - 'method_title' => $item->method_title, - 'method_description' => $item->method_description, - 'settings' => $this->get_settings( $item ), - ); - - $context = empty( $request['context'] ) ? 'view' : $request['context']; - $data = $this->add_additional_fields_to_object( $method, $request ); - $data = $this->filter_response_by_context( $data, $context ); - - // Wrap the data in a response object. - $response = rest_ensure_response( $data ); - - $response->add_links( $this->prepare_links( $request['zone_id'], $item->instance_id ) ); - - $response = $this->prepare_response_for_collection( $response ); - - return $response; - } - - /** - * Return settings associated with this shipping zone method instance. - * - * @param WC_Shipping_Method $item Shipping method data. - * - * @return array - */ - public function get_settings( $item ) { - $item->init_instance_settings(); - $settings = array(); - foreach ( $item->get_instance_form_fields() as $id => $field ) { - $data = array( - 'id' => $id, - 'label' => $field['title'], - 'description' => empty( $field['description'] ) ? '' : $field['description'], - 'type' => $field['type'], - 'value' => $item->instance_settings[ $id ], - 'default' => empty( $field['default'] ) ? '' : $field['default'], - 'tip' => empty( $field['description'] ) ? '' : $field['description'], - 'placeholder' => empty( $field['placeholder'] ) ? '' : $field['placeholder'], - ); - if ( ! empty( $field['options'] ) ) { - $data['options'] = $field['options']; - } - $settings[ $id ] = $data; - } - return $settings; - } - - /** - * Prepare links for the request. - * - * @param int $zone_id Given Shipping Zone ID. - * @param int $instance_id Given Shipping Zone Method Instance ID. - * @return array Links for the given Shipping Zone Method. - */ - protected function prepare_links( $zone_id, $instance_id ) { - $base = '/' . $this->namespace . '/' . $this->rest_base . '/' . $zone_id; - $links = array( - 'self' => array( - 'href' => rest_url( $base . '/methods/' . $instance_id ), - ), - 'collection' => array( - 'href' => rest_url( $base . '/methods' ), - ), - 'describes' => array( - 'href' => rest_url( $base ), - ), - ); - - return $links; - } - - /** - * Get the Shipping Zone Methods schema, conforming to JSON Schema - * - * @return array - */ - public function get_item_schema() { - $schema = array( - '$schema' => 'http://json-schema.org/draft-04/schema#', - 'title' => 'shipping_zone_method', - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Shipping method instance ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'instance_id' => array( - 'description' => __( 'Shipping method instance ID.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'title' => array( - 'description' => __( 'Shipping method customer facing title.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'order' => array( - 'description' => __( 'Shipping method sort order.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - ), - 'enabled' => array( - 'description' => __( 'Shipping method enabled status.', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view', 'edit' ), - ), - 'method_id' => array( - 'description' => __( 'Shipping method ID.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'method_title' => array( - 'description' => __( 'Shipping method title.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'method_description' => array( - 'description' => __( 'Shipping method description.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'settings' => array( - 'description' => __( 'Shipping method settings.', 'woocommerce' ), - 'type' => 'object', - 'context' => array( 'view', 'edit' ), - 'properties' => array( - 'id' => array( - 'description' => __( 'A unique identifier for the setting.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'label' => array( - 'description' => __( 'A human readable label for the setting used in interfaces.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'description' => array( - 'description' => __( 'A human readable description for the setting used in interfaces.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'type' => array( - 'description' => __( 'Type of setting.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'enum' => array( 'text', 'email', 'number', 'color', 'password', 'textarea', 'select', 'multiselect', 'radio', 'image_width', 'checkbox' ), - 'readonly' => true, - ), - 'value' => array( - 'description' => __( 'Setting value.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'default' => array( - 'description' => __( 'Default value for the setting.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'tip' => array( - 'description' => __( 'Additional help text shown to the user about the setting.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'placeholder' => array( - 'description' => __( 'Placeholder text to be displayed in text inputs.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - ), - ), - ), - ); - - return $this->add_additional_fields_schema( $schema ); - } + protected $namespace = 'wc/v3'; } diff --git a/includes/api/class-wc-rest-shipping-zones-controller.php b/includes/api/class-wc-rest-shipping-zones-controller.php index d2d8e5b2ade..dd766a3291c 100644 --- a/includes/api/class-wc-rest-shipping-zones-controller.php +++ b/includes/api/class-wc-rest-shipping-zones-controller.php @@ -14,291 +14,14 @@ defined( 'ABSPATH' ) || exit; * REST API Shipping Zones class. * * @package WooCommerce/API - * @extends WC_REST_Shipping_Zones_Controller_Base + * @extends WC_REST_Shipping_Zones_V2_Controller */ -class WC_REST_Shipping_Zones_Controller extends WC_REST_Shipping_Zones_Controller_Base { +class WC_REST_Shipping_Zones_Controller extends WC_REST_Shipping_Zones_V2_Controller { /** - * Register the routes for Shipping Zones. - */ - public function register_routes() { - register_rest_route( - $this->namespace, '/' . $this->rest_base, array( - array( - 'methods' => WP_REST_Server::READABLE, - 'callback' => array( $this, 'get_items' ), - 'permission_callback' => array( $this, 'get_items_permissions_check' ), - ), - array( - 'methods' => WP_REST_Server::CREATABLE, - 'callback' => array( $this, 'create_item' ), - 'permission_callback' => array( $this, 'create_item_permissions_check' ), - 'args' => array_merge( - $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ), array( - 'name' => array( - 'required' => true, - 'type' => 'string', - 'description' => __( 'Shipping zone name.', 'woocommerce' ), - ), - ) - ), - ), - 'schema' => array( $this, 'get_public_item_schema' ), - ) - ); - - register_rest_route( - $this->namespace, '/' . $this->rest_base . '/(?P[\d-]+)', array( - 'args' => array( - 'id' => array( - 'description' => __( 'Unique ID for the resource.', 'woocommerce' ), - 'type' => 'integer', - ), - ), - array( - 'methods' => WP_REST_Server::READABLE, - 'callback' => array( $this, 'get_item' ), - 'permission_callback' => array( $this, 'get_items_permissions_check' ), - ), - array( - 'methods' => WP_REST_Server::EDITABLE, - 'callback' => array( $this, 'update_item' ), - 'permission_callback' => array( $this, 'update_items_permissions_check' ), - 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), - ), - array( - 'methods' => WP_REST_Server::DELETABLE, - 'callback' => array( $this, 'delete_item' ), - 'permission_callback' => array( $this, 'delete_items_permissions_check' ), - 'args' => array( - 'force' => array( - 'default' => false, - 'type' => 'boolean', - 'description' => __( 'Whether to bypass trash and force deletion.', 'woocommerce' ), - ), - ), - ), - 'schema' => array( $this, 'get_public_item_schema' ), - ) - ); - } - - /** - * Get a single Shipping Zone. + * Endpoint namespace. * - * @param WP_REST_Request $request Request data. - * @return WP_REST_Response|WP_Error + * @var string */ - public function get_item( $request ) { - $zone = $this->get_zone( $request->get_param( 'id' ) ); - - if ( is_wp_error( $zone ) ) { - return $zone; - } - - $data = $zone->get_data(); - $data = $this->prepare_item_for_response( $data, $request ); - $data = $this->prepare_response_for_collection( $data ); - - return rest_ensure_response( $data ); - } - - /** - * Get all Shipping Zones. - * - * @param WP_REST_Request $request Request data. - * @return WP_REST_Response - */ - public function get_items( $request ) { - $rest_of_the_world = WC_Shipping_Zones::get_zone_by( 'zone_id', 0 ); - - $zones = WC_Shipping_Zones::get_zones(); - array_unshift( $zones, $rest_of_the_world->get_data() ); - $data = array(); - - foreach ( $zones as $zone_obj ) { - $zone = $this->prepare_item_for_response( $zone_obj, $request ); - $zone = $this->prepare_response_for_collection( $zone ); - $data[] = $zone; - } - - return rest_ensure_response( $data ); - } - - /** - * Create a single Shipping Zone. - * - * @param WP_REST_Request $request Full details about the request. - * @return WP_REST_Request|WP_Error - */ - public function create_item( $request ) { - $zone = new WC_Shipping_Zone( null ); - - if ( ! is_null( $request->get_param( 'name' ) ) ) { - $zone->set_zone_name( $request->get_param( 'name' ) ); - } - - if ( ! is_null( $request->get_param( 'order' ) ) ) { - $zone->set_zone_order( $request->get_param( 'order' ) ); - } - - $zone->save(); - - if ( $zone->get_id() !== 0 ) { - $request->set_param( 'id', $zone->get_id() ); - $response = $this->get_item( $request ); - $response->set_status( 201 ); - $response->header( 'Location', rest_url( sprintf( '/%s/%s/%d', $this->namespace, $this->rest_base, $zone->get_id() ) ) ); - return $response; - } else { - return new WP_Error( 'woocommerce_rest_shipping_zone_not_created', __( "Resource cannot be created. Check to make sure 'order' and 'name' are present.", 'woocommerce' ), array( 'status' => 500 ) ); - } - } - - /** - * Update a single Shipping Zone. - * - * @param WP_REST_Request $request Full details about the request. - * @return WP_REST_Request|WP_Error - */ - public function update_item( $request ) { - $zone = $this->get_zone( $request->get_param( 'id' ) ); - - if ( is_wp_error( $zone ) ) { - return $zone; - } - - if ( 0 === $zone->get_id() ) { - return new WP_Error( 'woocommerce_rest_shipping_zone_invalid_zone', __( 'The "locations not covered by your other zones" zone cannot be updated.', 'woocommerce' ), array( 'status' => 403 ) ); - } - - $zone_changed = false; - - if ( ! is_null( $request->get_param( 'name' ) ) ) { - $zone->set_zone_name( $request->get_param( 'name' ) ); - $zone_changed = true; - } - - if ( ! is_null( $request->get_param( 'order' ) ) ) { - $zone->set_zone_order( $request->get_param( 'order' ) ); - $zone_changed = true; - } - - if ( $zone_changed ) { - $zone->save(); - } - - return $this->get_item( $request ); - } - - /** - * Delete a single Shipping Zone. - * - * @param WP_REST_Request $request Full details about the request. - * @return WP_REST_Request|WP_Error - */ - public function delete_item( $request ) { - $zone = $this->get_zone( $request->get_param( 'id' ) ); - - if ( is_wp_error( $zone ) ) { - return $zone; - } - - $force = $request['force']; - - $response = $this->get_item( $request ); - - if ( $force ) { - $zone->delete(); - } else { - return new WP_Error( 'rest_trash_not_supported', __( 'Shipping zones do not support trashing.', 'woocommerce' ), array( 'status' => 501 ) ); - } - - return $response; - } - - /** - * Prepare the Shipping Zone for the REST response. - * - * @param array $item Shipping Zone. - * @param WP_REST_Request $request Request object. - * @return WP_REST_Response $response - */ - public function prepare_item_for_response( $item, $request ) { - $data = array( - 'id' => (int) $item['id'], - 'name' => $item['zone_name'], - 'order' => (int) $item['zone_order'], - ); - - $context = empty( $request['context'] ) ? 'view' : $request['context']; - $data = $this->add_additional_fields_to_object( $data, $request ); - $data = $this->filter_response_by_context( $data, $context ); - - // Wrap the data in a response object. - $response = rest_ensure_response( $data ); - - $response->add_links( $this->prepare_links( $data['id'] ) ); - - return $response; - } - - /** - * Prepare links for the request. - * - * @param int $zone_id Given Shipping Zone ID. - * @return array Links for the given Shipping Zone. - */ - protected function prepare_links( $zone_id ) { - $base = '/' . $this->namespace . '/' . $this->rest_base; - $links = array( - 'self' => array( - 'href' => rest_url( trailingslashit( $base ) . $zone_id ), - ), - 'collection' => array( - 'href' => rest_url( $base ), - ), - 'describedby' => array( - 'href' => rest_url( trailingslashit( $base ) . $zone_id . '/locations' ), - ), - ); - - return $links; - } - - /** - * Get the Shipping Zones schema, conforming to JSON Schema - * - * @return array - */ - public function get_item_schema() { - $schema = array( - '$schema' => 'http://json-schema.org/draft-04/schema#', - 'title' => 'shipping_zone', - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'name' => array( - 'description' => __( 'Shipping zone name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'arg_options' => array( - 'sanitize_callback' => 'sanitize_text_field', - ), - ), - 'order' => array( - 'description' => __( 'Shipping zone order.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - ), - ), - ); - - return $this->add_additional_fields_schema( $schema ); - } + protected $namespace = 'wc/v3'; } diff --git a/includes/api/class-wc-rest-system-status-controller.php b/includes/api/class-wc-rest-system-status-controller.php index 4404f4f11d6..78b37fbe162 100644 --- a/includes/api/class-wc-rest-system-status-controller.php +++ b/includes/api/class-wc-rest-system-status-controller.php @@ -14,1054 +14,14 @@ defined( 'ABSPATH' ) || exit; * System status controller class. * * @package WooCommerce/API - * @extends WC_REST_Controller + * @extends WC_REST_System_Status_V2_Controller */ -class WC_REST_System_Status_Controller extends WC_REST_Controller { +class WC_REST_System_Status_Controller extends WC_REST_System_Status_V2_Controller { /** * Endpoint namespace. * * @var string */ - protected $namespace = 'wc/v2'; - - /** - * Route base. - * - * @var string - */ - protected $rest_base = 'system_status'; - - /** - * Register the route for /system_status - */ - public function register_routes() { - register_rest_route( - $this->namespace, '/' . $this->rest_base, - array( - array( - 'methods' => WP_REST_Server::READABLE, - 'callback' => array( $this, 'get_items' ), - 'permission_callback' => array( $this, 'get_items_permissions_check' ), - 'args' => $this->get_collection_params(), - ), - 'schema' => array( $this, 'get_public_item_schema' ), - ) - ); - } - - /** - * Check whether a given request has permission to view system status. - * - * @param WP_REST_Request $request Full details about the request. - * @return WP_Error|boolean - */ - public function get_items_permissions_check( $request ) { - if ( ! wc_rest_check_manager_permissions( 'system_status', 'read' ) ) { - return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot list resources.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); - } - return true; - } - - /** - * Get a system status info, by section. - * - * @param WP_REST_Request $request Full details about the request. - * @return WP_Error|WP_REST_Response - */ - public function get_items( $request ) { - $schema = $this->get_item_schema(); - $mappings = $this->get_item_mappings(); - $response = array(); - - foreach ( $mappings as $section => $values ) { - foreach ( $values as $key => $value ) { - if ( isset( $schema['properties'][ $section ]['properties'][ $key ]['type'] ) ) { - settype( $values[ $key ], $schema['properties'][ $section ]['properties'][ $key ]['type'] ); - } - } - settype( $values, $schema['properties'][ $section ]['type'] ); - $response[ $section ] = $values; - } - - $response = $this->prepare_item_for_response( $response, $request ); - - return rest_ensure_response( $response ); - } - - /** - * Get the system status schema, conforming to JSON Schema. - * - * @return array - */ - public function get_item_schema() { - $schema = array( - '$schema' => 'http://json-schema.org/draft-04/schema#', - 'title' => 'system_status', - 'type' => 'object', - 'properties' => array( - 'environment' => array( - 'description' => __( 'Environment.', 'woocommerce' ), - 'type' => 'object', - 'context' => array( 'view' ), - 'readonly' => true, - 'properties' => array( - 'home_url' => array( - 'description' => __( 'Home URL.', 'woocommerce' ), - 'type' => 'string', - 'format' => 'uri', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'site_url' => array( - 'description' => __( 'Site URL.', 'woocommerce' ), - 'type' => 'string', - 'format' => 'uri', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'wc_version' => array( - 'description' => __( 'WooCommerce version.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'log_directory' => array( - 'description' => __( 'Log directory.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'log_directory_writable' => array( - 'description' => __( 'Is log directory writable?', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'wp_version' => array( - 'description' => __( 'WordPress version.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'wp_multisite' => array( - 'description' => __( 'Is WordPress multisite?', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'wp_memory_limit' => array( - 'description' => __( 'WordPress memory limit.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'wp_debug_mode' => array( - 'description' => __( 'Is WordPress debug mode active?', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'wp_cron' => array( - 'description' => __( 'Are WordPress cron jobs enabled?', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'language' => array( - 'description' => __( 'WordPress language.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'server_info' => array( - 'description' => __( 'Server info.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'php_version' => array( - 'description' => __( 'PHP version.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'php_post_max_size' => array( - 'description' => __( 'PHP post max size.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'php_max_execution_time' => array( - 'description' => __( 'PHP max execution time.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'php_max_input_vars' => array( - 'description' => __( 'PHP max input vars.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'curl_version' => array( - 'description' => __( 'cURL version.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'suhosin_installed' => array( - 'description' => __( 'Is SUHOSIN installed?', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'max_upload_size' => array( - 'description' => __( 'Max upload size.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'mysql_version' => array( - 'description' => __( 'MySQL version.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'default_timezone' => array( - 'description' => __( 'Default timezone.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'fsockopen_or_curl_enabled' => array( - 'description' => __( 'Is fsockopen/cURL enabled?', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'soapclient_enabled' => array( - 'description' => __( 'Is SoapClient class enabled?', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'domdocument_enabled' => array( - 'description' => __( 'Is DomDocument class enabled?', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'gzip_enabled' => array( - 'description' => __( 'Is GZip enabled?', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'mbstring_enabled' => array( - 'description' => __( 'Is mbstring enabled?', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'remote_post_successful' => array( - 'description' => __( 'Remote POST successful?', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'remote_post_response' => array( - 'description' => __( 'Remote POST response.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'remote_get_successful' => array( - 'description' => __( 'Remote GET successful?', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'remote_get_response' => array( - 'description' => __( 'Remote GET response.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - ), - ), - 'database' => array( - 'description' => __( 'Database.', 'woocommerce' ), - 'type' => 'object', - 'context' => array( 'view' ), - 'readonly' => true, - 'properties' => array( - 'wc_database_version' => array( - 'description' => __( 'WC database version.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'database_prefix' => array( - 'description' => __( 'Database prefix.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'maxmind_geoip_database' => array( - 'description' => __( 'MaxMind GeoIP database.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'database_tables' => array( - 'description' => __( 'Database tables.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view' ), - 'readonly' => true, - 'items' => array( - 'type' => 'string', - ), - ), - ), - ), - 'active_plugins' => array( - 'description' => __( 'Active plugins.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view' ), - 'readonly' => true, - 'items' => array( - 'type' => 'string', - ), - ), - 'theme' => array( - 'description' => __( 'Theme.', 'woocommerce' ), - 'type' => 'object', - 'context' => array( 'view' ), - 'readonly' => true, - 'properties' => array( - 'name' => array( - 'description' => __( 'Theme name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'version' => array( - 'description' => __( 'Theme version.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'version_latest' => array( - 'description' => __( 'Latest version of theme.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'author_url' => array( - 'description' => __( 'Theme author URL.', 'woocommerce' ), - 'type' => 'string', - 'format' => 'uri', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'is_child_theme' => array( - 'description' => __( 'Is this theme a child theme?', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'has_woocommerce_support' => array( - 'description' => __( 'Does the theme declare WooCommerce support?', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'has_woocommerce_file' => array( - 'description' => __( 'Does the theme have a woocommerce.php file?', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'has_outdated_templates' => array( - 'description' => __( 'Does this theme have outdated templates?', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'overrides' => array( - 'description' => __( 'Template overrides.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view' ), - 'readonly' => true, - 'items' => array( - 'type' => 'string', - ), - ), - 'parent_name' => array( - 'description' => __( 'Parent theme name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'parent_version' => array( - 'description' => __( 'Parent theme version.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'parent_author_url' => array( - 'description' => __( 'Parent theme author URL.', 'woocommerce' ), - 'type' => 'string', - 'format' => 'uri', - 'context' => array( 'view' ), - 'readonly' => true, - ), - ), - ), - 'settings' => array( - 'description' => __( 'Settings.', 'woocommerce' ), - 'type' => 'object', - 'context' => array( 'view' ), - 'readonly' => true, - 'properties' => array( - 'api_enabled' => array( - 'description' => __( 'REST API enabled?', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'force_ssl' => array( - 'description' => __( 'SSL forced?', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'currency' => array( - 'description' => __( 'Currency.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'currency_symbol' => array( - 'description' => __( 'Currency symbol.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'currency_position' => array( - 'description' => __( 'Currency position.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'thousand_separator' => array( - 'description' => __( 'Thousand separator.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'decimal_separator' => array( - 'description' => __( 'Decimal separator.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'number_of_decimals' => array( - 'description' => __( 'Number of decimals.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'geolocation_enabled' => array( - 'description' => __( 'Geolocation enabled?', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'taxonomies' => array( - 'description' => __( 'Taxonomy terms for product/order statuses.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view' ), - 'readonly' => true, - 'items' => array( - 'type' => 'string', - ), - ), - 'product_visibility_terms' => array( - 'description' => __( 'Terms in the product visibility taxonomy.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view' ), - 'readonly' => true, - 'items' => array( - 'type' => 'string', - ), - ), - ), - ), - 'security' => array( - 'description' => __( 'Security.', 'woocommerce' ), - 'type' => 'object', - 'context' => array( 'view' ), - 'readonly' => true, - 'properties' => array( - 'secure_connection' => array( - 'description' => __( 'Is the connection to your store secure?', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'hide_errors' => array( - 'description' => __( 'Hide errors from visitors?', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'view' ), - 'readonly' => true, - ), - ), - ), - 'pages' => array( - 'description' => __( 'WooCommerce pages.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view' ), - 'readonly' => true, - 'items' => array( - 'type' => 'string', - ), - ), - ), - ); - - return $this->add_additional_fields_schema( $schema ); - } - - /** - * Return an array of sections and the data associated with each. - * - * @return array - */ - public function get_item_mappings() { - return array( - 'environment' => $this->get_environment_info(), - 'database' => $this->get_database_info(), - 'active_plugins' => $this->get_active_plugins(), - 'theme' => $this->get_theme_info(), - 'settings' => $this->get_settings(), - 'security' => $this->get_security_info(), - 'pages' => $this->get_pages(), - ); - } - - /** - * Get array of environment information. Includes thing like software - * versions, and various server settings. - * - * @return array - */ - public function get_environment_info() { - global $wpdb; - - // Figure out cURL version, if installed. - $curl_version = ''; - if ( function_exists( 'curl_version' ) ) { - $curl_version = curl_version(); - $curl_version = $curl_version['version'] . ', ' . $curl_version['ssl_version']; - } - - // WP memory limit. - $wp_memory_limit = wc_let_to_num( WP_MEMORY_LIMIT ); - if ( function_exists( 'memory_get_usage' ) ) { - $wp_memory_limit = max( $wp_memory_limit, wc_let_to_num( @ini_get( 'memory_limit' ) ) ); - } - - // Test POST requests. - $post_response = wp_safe_remote_post( - 'https://www.paypal.com/cgi-bin/webscr', - array( - 'timeout' => 10, - 'user-agent' => 'WooCommerce/' . WC()->version, - 'httpversion' => '1.1', - 'body' => array( - 'cmd' => '_notify-validate', - ), - ) - ); - $post_response_successful = false; - if ( ! is_wp_error( $post_response ) && $post_response['response']['code'] >= 200 && $post_response['response']['code'] < 300 ) { - $post_response_successful = true; - } - - // Test GET requests. - $get_response = wp_safe_remote_get( 'https://woocommerce.com/wc-api/product-key-api?request=ping&network=' . ( is_multisite() ? '1' : '0' ) ); - $get_response_successful = false; - if ( ! is_wp_error( $post_response ) && $post_response['response']['code'] >= 200 && $post_response['response']['code'] < 300 ) { - $get_response_successful = true; - } - - // Return all environment info. Described by JSON Schema. - return array( - 'home_url' => get_option( 'home' ), - 'site_url' => get_option( 'siteurl' ), - 'version' => WC()->version, - 'log_directory' => WC_LOG_DIR, - 'log_directory_writable' => (bool) @fopen( WC_LOG_DIR . 'test-log.log', 'a' ), - 'wp_version' => get_bloginfo( 'version' ), - 'wp_multisite' => is_multisite(), - 'wp_memory_limit' => $wp_memory_limit, - 'wp_debug_mode' => ( defined( 'WP_DEBUG' ) && WP_DEBUG ), - 'wp_cron' => ! ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON ), - 'language' => get_locale(), - 'external_object_cache' => wp_using_ext_object_cache(), - 'server_info' => isset( $_SERVER['SERVER_SOFTWARE'] ) ? wc_clean( wp_unslash( $_SERVER['SERVER_SOFTWARE'] ) ) : '', - 'php_version' => phpversion(), - 'php_post_max_size' => wc_let_to_num( ini_get( 'post_max_size' ) ), - 'php_max_execution_time' => ini_get( 'max_execution_time' ), - 'php_max_input_vars' => ini_get( 'max_input_vars' ), - 'curl_version' => $curl_version, - 'suhosin_installed' => extension_loaded( 'suhosin' ), - 'max_upload_size' => wp_max_upload_size(), - 'mysql_version' => ( ! empty( $wpdb->is_mysql ) ? $wpdb->db_version() : '' ), - 'default_timezone' => date_default_timezone_get(), - 'fsockopen_or_curl_enabled' => ( function_exists( 'fsockopen' ) || function_exists( 'curl_init' ) ), - 'soapclient_enabled' => class_exists( 'SoapClient' ), - 'domdocument_enabled' => class_exists( 'DOMDocument' ), - 'gzip_enabled' => is_callable( 'gzopen' ), - 'mbstring_enabled' => extension_loaded( 'mbstring' ), - 'remote_post_successful' => $post_response_successful, - 'remote_post_response' => ( is_wp_error( $post_response ) ? $post_response->get_error_message() : $post_response['response']['code'] ), - 'remote_get_successful' => $get_response_successful, - 'remote_get_response' => ( is_wp_error( $get_response ) ? $get_response->get_error_message() : $get_response['response']['code'] ), - ); - } - - /** - * Add prefix to table. - * - * @param string $table Table name. - * @return stromg - */ - protected function add_db_table_prefix( $table ) { - global $wpdb; - return $wpdb->prefix . $table; - } - - /** - * Get array of database information. Version, prefix, and table existence. - * - * @return array - */ - public function get_database_info() { - global $wpdb; - - $database_table_sizes = $wpdb->get_results( - $wpdb->prepare( - "SELECT - table_name AS 'name', - round( ( data_length / 1024 / 1024 ), 2 ) 'data', - round( ( index_length / 1024 / 1024 ), 2 ) 'index' - FROM information_schema.TABLES - WHERE table_schema = %s - ORDER BY name ASC;", - DB_NAME - ) - ); - - // WC Core tables to check existence of. - $core_tables = apply_filters( - 'woocommerce_database_tables', - array( - 'woocommerce_sessions', - 'woocommerce_api_keys', - 'woocommerce_attribute_taxonomies', - 'woocommerce_downloadable_product_permissions', - 'woocommerce_order_items', - 'woocommerce_order_itemmeta', - 'woocommerce_tax_rates', - 'woocommerce_tax_rate_locations', - 'woocommerce_shipping_zones', - 'woocommerce_shipping_zone_locations', - 'woocommerce_shipping_zone_methods', - 'woocommerce_payment_tokens', - 'woocommerce_payment_tokenmeta', - 'woocommerce_log', - ) - ); - - if ( get_option( 'db_version' ) < 34370 ) { - $core_tables[] = 'woocommerce_termmeta'; - } - - /** - * Adding the prefix to the tables array, for backwards compatibility. - * - * If we changed the tables above to include the prefix, then any filters against that table could break. - */ - $core_tables = array_map( array( $this, 'add_db_table_prefix' ), $core_tables ); - - /** - * Organize WooCommerce and non-WooCommerce tables separately for display purposes later. - * - * To ensure we include all WC tables, even if they do not exist, pre-populate the WC array with all the tables. - */ - $tables = array( - 'woocommerce' => array_fill_keys( $core_tables, false ), - 'other' => array(), - ); - - $database_size = array( - 'data' => 0, - 'index' => 0, - ); - - foreach ( $database_table_sizes as $table ) { - $table_type = in_array( $table->name, $core_tables ) ? 'woocommerce' : 'other'; - - $tables[ $table_type ][ $table->name ] = array( - 'data' => $table->data, - 'index' => $table->index, - ); - - $database_size['data'] += $table->data; - $database_size['index'] += $table->index; - } - - // Return all database info. Described by JSON Schema. - return array( - 'wc_database_version' => get_option( 'woocommerce_db_version' ), - 'database_prefix' => $wpdb->prefix, - 'maxmind_geoip_database' => WC_Geolocation::get_local_database_path(), - 'database_tables' => $tables, - 'database_size' => $database_size, - ); - } - - /** - * Get array of counts of objects. Orders, products, etc. - * - * @return array - */ - public function get_post_type_counts() { - global $wpdb; - - $post_type_counts = $wpdb->get_results( "SELECT post_type AS 'type', count(1) AS 'count' FROM {$wpdb->posts} GROUP BY post_type;" ); - - return is_array( $post_type_counts ) ? $post_type_counts : array(); - } - - /** - * Get a list of plugins active on the site. - * - * @return array - */ - public function get_active_plugins() { - require_once ABSPATH . 'wp-admin/includes/plugin.php'; - require_once ABSPATH . 'wp-admin/includes/update.php'; - - if ( ! function_exists( 'get_plugin_updates' ) ) { - return array(); - } - - // Get both site plugins and network plugins. - $active_plugins = (array) get_option( 'active_plugins', array() ); - if ( is_multisite() ) { - $network_activated_plugins = array_keys( get_site_option( 'active_sitewide_plugins', array() ) ); - $active_plugins = array_merge( $active_plugins, $network_activated_plugins ); - } - - $active_plugins_data = array(); - $available_updates = get_plugin_updates(); - - foreach ( $active_plugins as $plugin ) { - $data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin ); - $dirname = dirname( $plugin ); - $version_latest = ''; - $slug = explode( '/', $plugin ); - $slug = explode( '.', end( $slug ) ); - $slug = $slug[0]; - - if ( 'woocommerce' !== $slug && ( strstr( $data['PluginURI'], 'woothemes.com' ) || strstr( $data['PluginURI'], 'woocommerce.com' ) ) ) { - $version_data = get_transient( md5( $plugin ) . '_version_data' ); - if ( false === $version_data ) { - $changelog = wp_safe_remote_get( 'http://dzv365zjfbd8v.cloudfront.net/changelogs/' . $dirname . '/changelog.txt' ); - $cl_lines = explode( "\n", wp_remote_retrieve_body( $changelog ) ); - if ( ! empty( $cl_lines ) ) { - foreach ( $cl_lines as $line_num => $cl_line ) { - if ( preg_match( '/^[0-9]/', $cl_line ) ) { - $date = str_replace( '.', '-', trim( substr( $cl_line, 0, strpos( $cl_line, '-' ) ) ) ); - $version = preg_replace( '~[^0-9,.]~', '', stristr( $cl_line, 'version' ) ); - $update = trim( str_replace( '*', '', $cl_lines[ $line_num + 1 ] ) ); - $version_data = array( - 'date' => $date, - 'version' => $version, - 'update' => $update, - 'changelog' => $changelog, - ); - set_transient( md5( $plugin ) . '_version_data', $version_data, DAY_IN_SECONDS ); - break; - } - } - } - } - $version_latest = $version_data['version']; - } elseif ( isset( $available_updates[ $plugin ]->update->new_version ) ) { - $version_latest = $available_updates[ $plugin ]->update->new_version; - } - - // convert plugin data to json response format. - $active_plugins_data[] = array( - 'plugin' => $plugin, - 'name' => $data['Name'], - 'version' => $data['Version'], - 'version_latest' => $version_latest, - 'url' => $data['PluginURI'], - 'author_name' => $data['AuthorName'], - 'author_url' => esc_url_raw( $data['AuthorURI'] ), - 'network_activated' => $data['Network'], - ); - } - - return $active_plugins_data; - } - - /** - * Get info on the current active theme, info on parent theme (if presnet) - * and a list of template overrides. - * - * @return array - */ - public function get_theme_info() { - $active_theme = wp_get_theme(); - - // Get parent theme info if this theme is a child theme, otherwise - // pass empty info in the response. - if ( is_child_theme() ) { - $parent_theme = wp_get_theme( $active_theme->template ); - $parent_theme_info = array( - 'parent_name' => $parent_theme->name, - 'parent_version' => $parent_theme->version, - 'parent_version_latest' => WC_Admin_Status::get_latest_theme_version( $parent_theme ), - 'parent_author_url' => $parent_theme->{'Author URI'}, - ); - } else { - $parent_theme_info = array( - 'parent_name' => '', - 'parent_version' => '', - 'parent_version_latest' => '', - 'parent_author_url' => '', - ); - } - - /** - * Scan the theme directory for all WC templates to see if our theme - * overrides any of them. - */ - $override_files = array(); - $outdated_templates = false; - $scan_files = WC_Admin_Status::scan_template_files( WC()->plugin_path() . '/templates/' ); - foreach ( $scan_files as $file ) { - $located = apply_filters( 'wc_get_template', $file, $file, array(), WC()->template_path(), WC()->plugin_path() . '/templates/' ); - - if ( file_exists( $located ) ) { - $theme_file = $located; - } elseif ( file_exists( get_stylesheet_directory() . '/' . $file ) ) { - $theme_file = get_stylesheet_directory() . '/' . $file; - } elseif ( file_exists( get_stylesheet_directory() . '/' . WC()->template_path() . $file ) ) { - $theme_file = get_stylesheet_directory() . '/' . WC()->template_path() . $file; - } elseif ( file_exists( get_template_directory() . '/' . $file ) ) { - $theme_file = get_template_directory() . '/' . $file; - } elseif ( file_exists( get_template_directory() . '/' . WC()->template_path() . $file ) ) { - $theme_file = get_template_directory() . '/' . WC()->template_path() . $file; - } else { - $theme_file = false; - } - - if ( ! empty( $theme_file ) ) { - $core_version = WC_Admin_Status::get_file_version( WC()->plugin_path() . '/templates/' . $file ); - $theme_version = WC_Admin_Status::get_file_version( $theme_file ); - if ( $core_version && ( empty( $theme_version ) || version_compare( $theme_version, $core_version, '<' ) ) ) { - if ( ! $outdated_templates ) { - $outdated_templates = true; - } - } - $override_files[] = array( - 'file' => str_replace( WP_CONTENT_DIR . '/themes/', '', $theme_file ), - 'version' => $theme_version, - 'core_version' => $core_version, - ); - } - } - - $active_theme_info = array( - 'name' => $active_theme->name, - 'version' => $active_theme->version, - 'version_latest' => WC_Admin_Status::get_latest_theme_version( $active_theme ), - 'author_url' => esc_url_raw( $active_theme->{'Author URI'} ), - 'is_child_theme' => is_child_theme(), - 'has_woocommerce_support' => current_theme_supports( 'woocommerce' ), - 'has_woocommerce_file' => ( file_exists( get_stylesheet_directory() . '/woocommerce.php' ) || file_exists( get_template_directory() . '/woocommerce.php' ) ), - 'has_outdated_templates' => $outdated_templates, - 'overrides' => $override_files, - ); - - return array_merge( $active_theme_info, $parent_theme_info ); - } - - /** - * Get some setting values for the site that are useful for debugging - * purposes. For full settings access, use the settings api. - * - * @return array - */ - public function get_settings() { - // Get a list of terms used for product/order taxonomies. - $term_response = array(); - $terms = get_terms( 'product_type', array( 'hide_empty' => 0 ) ); - foreach ( $terms as $term ) { - $term_response[ $term->slug ] = strtolower( $term->name ); - } - - // Get a list of terms used for product visibility. - $product_visibility_terms = array(); - $terms = get_terms( 'product_visibility', array( 'hide_empty' => 0 ) ); - foreach ( $terms as $term ) { - $product_visibility_terms[ $term->slug ] = strtolower( $term->name ); - } - - // Return array of useful settings for debugging. - return array( - 'api_enabled' => 'yes' === get_option( 'woocommerce_api_enabled' ), - 'force_ssl' => 'yes' === get_option( 'woocommerce_force_ssl_checkout' ), - 'currency' => get_woocommerce_currency(), - 'currency_symbol' => get_woocommerce_currency_symbol(), - 'currency_position' => get_option( 'woocommerce_currency_pos' ), - 'thousand_separator' => wc_get_price_thousand_separator(), - 'decimal_separator' => wc_get_price_decimal_separator(), - 'number_of_decimals' => wc_get_price_decimals(), - 'geolocation_enabled' => in_array( get_option( 'woocommerce_default_customer_address' ), array( 'geolocation_ajax', 'geolocation' ) ), - 'taxonomies' => $term_response, - 'product_visibility_terms' => $product_visibility_terms, - ); - } - - /** - * Returns security tips. - * - * @return array - */ - public function get_security_info() { - $check_page = 0 < wc_get_page_id( 'shop' ) ? get_permalink( wc_get_page_id( 'shop' ) ) : get_home_url(); - return array( - 'secure_connection' => 'https' === substr( $check_page, 0, 5 ), - 'hide_errors' => ! ( defined( 'WP_DEBUG' ) && defined( 'WP_DEBUG_DISPLAY' ) && WP_DEBUG && WP_DEBUG_DISPLAY ) || 0 === intval( ini_get( 'display_errors' ) ), - ); - } - - /** - * Returns a mini-report on WC pages and if they are configured correctly: - * Present, visible, and including the correct shortcode. - * - * @return array - */ - public function get_pages() { - // WC pages to check against. - $check_pages = array( - _x( 'Shop base', 'Page setting', 'woocommerce' ) => array( - 'option' => 'woocommerce_shop_page_id', - 'shortcode' => '', - ), - _x( 'Cart', 'Page setting', 'woocommerce' ) => array( - 'option' => 'woocommerce_cart_page_id', - 'shortcode' => '[' . apply_filters( 'woocommerce_cart_shortcode_tag', 'woocommerce_cart' ) . ']', - ), - _x( 'Checkout', 'Page setting', 'woocommerce' ) => array( - 'option' => 'woocommerce_checkout_page_id', - 'shortcode' => '[' . apply_filters( 'woocommerce_checkout_shortcode_tag', 'woocommerce_checkout' ) . ']', - ), - _x( 'My account', 'Page setting', 'woocommerce' ) => array( - 'option' => 'woocommerce_myaccount_page_id', - 'shortcode' => '[' . apply_filters( 'woocommerce_my_account_shortcode_tag', 'woocommerce_my_account' ) . ']', - ), - _x( 'Terms and conditions', 'Page setting', 'woocommerce' ) => array( - 'option' => 'woocommerce_terms_page_id', - 'shortcode' => '', - ), - ); - - $pages_output = array(); - foreach ( $check_pages as $page_name => $values ) { - $page_id = get_option( $values['option'] ); - $page_set = false; - $page_exists = false; - $page_visible = false; - $shortcode_present = false; - $shortcode_required = false; - - // Page checks. - if ( $page_id ) { - $page_set = true; - } - if ( get_post( $page_id ) ) { - $page_exists = true; - } - if ( 'publish' === get_post_status( $page_id ) ) { - $page_visible = true; - } - - // Shortcode checks. - if ( $values['shortcode'] && get_post( $page_id ) ) { - $shortcode_required = true; - $page = get_post( $page_id ); - if ( strstr( $page->post_content, $values['shortcode'] ) ) { - $shortcode_present = true; - } - } - - // Wrap up our findings into an output array. - $pages_output[] = array( - 'page_name' => $page_name, - 'page_id' => $page_id, - 'page_set' => $page_set, - 'page_exists' => $page_exists, - 'page_visible' => $page_visible, - 'shortcode' => $values['shortcode'], - 'shortcode_required' => $shortcode_required, - 'shortcode_present' => $shortcode_present, - ); - } - - return $pages_output; - } - - /** - * Get any query params needed. - * - * @return array - */ - public function get_collection_params() { - return array( - 'context' => $this->get_context_param( array( 'default' => 'view' ) ), - ); - } - - /** - * Prepare the system status response - * - * @param array $system_status System status data. - * @param WP_REST_Request $request Request object. - * @return WP_REST_Response - */ - public function prepare_item_for_response( $system_status, $request ) { - $data = $this->add_additional_fields_to_object( $system_status, $request ); - $data = $this->filter_response_by_context( $data, 'view' ); - - $response = rest_ensure_response( $data ); - - /** - * Filter the system status returned from the REST API. - * - * @param WP_REST_Response $response The response object. - * @param mixed $system_status System status - * @param WP_REST_Request $request Request object. - */ - return apply_filters( 'woocommerce_rest_prepare_system_status', $response, $system_status, $request ); - } + protected $namespace = 'wc/v3'; } diff --git a/includes/api/class-wc-rest-system-status-tools-controller.php b/includes/api/class-wc-rest-system-status-tools-controller.php index b5302f06aca..f1b0bef61d7 100644 --- a/includes/api/class-wc-rest-system-status-tools-controller.php +++ b/includes/api/class-wc-rest-system-status-tools-controller.php @@ -14,544 +14,14 @@ defined( 'ABSPATH' ) || exit; * System status tools controller. * * @package WooCommerce/API - * @extends WC_REST_Controller + * @extends WC_REST_System_Status_Tools_V2_Controller */ -class WC_REST_System_Status_Tools_Controller extends WC_REST_Controller { +class WC_REST_System_Status_Tools_Controller extends WC_REST_System_Status_Tools_V2_Controller { /** * Endpoint namespace. * * @var string */ - protected $namespace = 'wc/v2'; - - /** - * Route base. - * - * @var string - */ - protected $rest_base = 'system_status/tools'; - - /** - * Register the routes for /system_status/tools/*. - */ - public function register_routes() { - register_rest_route( - $this->namespace, '/' . $this->rest_base, array( - array( - 'methods' => WP_REST_Server::READABLE, - 'callback' => array( $this, 'get_items' ), - 'permission_callback' => array( $this, 'get_items_permissions_check' ), - 'args' => $this->get_collection_params(), - ), - 'schema' => array( $this, 'get_public_item_schema' ), - ) - ); - - register_rest_route( - $this->namespace, '/' . $this->rest_base . '/(?P[\w-]+)', array( - 'args' => array( - 'id' => array( - 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), - 'type' => 'string', - ), - ), - array( - 'methods' => WP_REST_Server::READABLE, - 'callback' => array( $this, 'get_item' ), - 'permission_callback' => array( $this, 'get_item_permissions_check' ), - ), - array( - 'methods' => WP_REST_Server::EDITABLE, - 'callback' => array( $this, 'update_item' ), - 'permission_callback' => array( $this, 'update_item_permissions_check' ), - 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), - ), - 'schema' => array( $this, 'get_public_item_schema' ), - ) - ); - } - - /** - * Check whether a given request has permission to view system status tools. - * - * @param WP_REST_Request $request Full details about the request. - * @return WP_Error|boolean - */ - public function get_items_permissions_check( $request ) { - if ( ! wc_rest_check_manager_permissions( 'system_status', 'read' ) ) { - return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot list resources.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); - } - return true; - } - - /** - * Check whether a given request has permission to view a specific system status tool. - * - * @param WP_REST_Request $request Full details about the request. - * @return WP_Error|boolean - */ - public function get_item_permissions_check( $request ) { - if ( ! wc_rest_check_manager_permissions( 'system_status', 'read' ) ) { - return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot view this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); - } - return true; - } - - /** - * Check whether a given request has permission to execute a specific system status tool. - * - * @param WP_REST_Request $request Full details about the request. - * @return WP_Error|boolean - */ - public function update_item_permissions_check( $request ) { - if ( ! wc_rest_check_manager_permissions( 'system_status', 'edit' ) ) { - return new WP_Error( 'woocommerce_rest_cannot_update', __( 'Sorry, you cannot update resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); - } - return true; - } - - /** - * A list of available tools for use in the system status section. - * 'button' becomes 'action' in the API. - * - * @return array - */ - public function get_tools() { - $tools = array( - 'clear_transients' => array( - 'name' => __( 'WooCommerce transients', 'woocommerce' ), - 'button' => __( 'Clear transients', 'woocommerce' ), - 'desc' => __( 'This tool will clear the product/shop transients cache.', 'woocommerce' ), - ), - 'clear_expired_transients' => array( - 'name' => __( 'Expired transients', 'woocommerce' ), - 'button' => __( 'Clear transients', 'woocommerce' ), - 'desc' => __( 'This tool will clear ALL expired transients from WordPress.', 'woocommerce' ), - ), - 'delete_orphaned_variations' => array( - 'name' => __( 'Orphaned variations', 'woocommerce' ), - 'button' => __( 'Delete orphaned variations', 'woocommerce' ), - 'desc' => __( 'This tool will delete all variations which have no parent.', 'woocommerce' ), - ), - 'clear_expired_download_permissions' => array( - 'name' => __( 'Used-up download permissions', 'woocommerce' ), - 'button' => __( 'Clean up download permissions', 'woocommerce' ), - 'desc' => __( 'This tool will delete expired download permissions and permissions with 0 remaining downloads.', 'woocommerce' ), - ), - 'add_order_indexes' => array( - 'name' => __( 'Order address indexes', 'woocommerce' ), - 'button' => __( 'Index orders', 'woocommerce' ), - 'desc' => __( 'This tool will add address indexes to orders that do not have them yet. This improves order search results.', 'woocommerce' ), - ), - 'recount_terms' => array( - 'name' => __( 'Term counts', 'woocommerce' ), - 'button' => __( 'Recount terms', 'woocommerce' ), - 'desc' => __( 'This tool will recount product terms - useful when changing your settings in a way which hides products from the catalog.', 'woocommerce' ), - ), - 'reset_roles' => array( - 'name' => __( 'Capabilities', 'woocommerce' ), - 'button' => __( 'Reset capabilities', 'woocommerce' ), - 'desc' => __( 'This tool will reset the admin, customer and shop_manager roles to default. Use this if your users cannot access all of the WooCommerce admin pages.', 'woocommerce' ), - ), - 'clear_sessions' => array( - 'name' => __( 'Clear customer sessions', 'woocommerce' ), - 'button' => __( 'Clear', 'woocommerce' ), - 'desc' => sprintf( - '%1$s %2$s', - __( 'Note:', 'woocommerce' ), - __( 'This tool will delete all customer session data from the database, including current carts and saved carts in the database.', 'woocommerce' ) - ), - ), - 'install_pages' => array( - 'name' => __( 'Create default WooCommerce pages', 'woocommerce' ), - 'button' => __( 'Create pages', 'woocommerce' ), - 'desc' => sprintf( - '%1$s %2$s', - __( 'Note:', 'woocommerce' ), - __( 'This tool will install all the missing WooCommerce pages. Pages already defined and set up will not be replaced.', 'woocommerce' ) - ), - ), - 'delete_taxes' => array( - 'name' => __( 'Delete WooCommerce tax rates', 'woocommerce' ), - 'button' => __( 'Delete tax rates', 'woocommerce' ), - 'desc' => sprintf( - '%1$s %2$s', - __( 'Note:', 'woocommerce' ), - __( 'This option will delete ALL of your tax rates, use with caution. This action cannot be reversed.', 'woocommerce' ) - ), - ), - 'reset_tracking' => array( - 'name' => __( 'Reset usage tracking', 'woocommerce' ), - 'button' => __( 'Reset', 'woocommerce' ), - 'desc' => __( 'This will reset your usage tracking settings, causing it to show the opt-in banner again and not sending any data.', 'woocommerce' ), - ), - 'regenerate_thumbnails' => array( - 'name' => __( 'Regenerate shop thumbnails', 'woocommerce' ), - 'button' => __( 'Regenerate', 'woocommerce' ), - 'desc' => __( 'This will regenerate all shop thumbnails to match your theme and/or image settings.', 'woocommerce' ), - ), - ); - - // Jetpack does the image resizing heavy lifting so you don't have to. - if ( ( class_exists( 'Jetpack' ) && Jetpack::is_module_active( 'photon' ) ) || ! apply_filters( 'woocommerce_background_image_regeneration', true ) ) { - unset( $tools['regenerate_thumbnails'] ); - } - - return apply_filters( 'woocommerce_debug_tools', $tools ); - } - - /** - * Get a list of system status tools. - * - * @param WP_REST_Request $request Full details about the request. - * @return WP_Error|WP_REST_Response - */ - public function get_items( $request ) { - $tools = array(); - foreach ( $this->get_tools() as $id => $tool ) { - $tools[] = $this->prepare_response_for_collection( - $this->prepare_item_for_response( - array( - 'id' => $id, - 'name' => $tool['name'], - 'action' => $tool['button'], - 'description' => $tool['desc'], - ), $request - ) - ); - } - - $response = rest_ensure_response( $tools ); - return $response; - } - - /** - * Return a single tool. - * - * @param WP_REST_Request $request Request data. - * @return WP_Error|WP_REST_Response - */ - public function get_item( $request ) { - $tools = $this->get_tools(); - if ( empty( $tools[ $request['id'] ] ) ) { - return new WP_Error( 'woocommerce_rest_system_status_tool_invalid_id', __( 'Invalid tool ID.', 'woocommerce' ), array( 'status' => 404 ) ); - } - $tool = $tools[ $request['id'] ]; - return rest_ensure_response( - $this->prepare_item_for_response( - array( - 'id' => $request['id'], - 'name' => $tool['name'], - 'action' => $tool['button'], - 'description' => $tool['desc'], - ), $request - ) - ); - } - - /** - * Update (execute) a tool. - * - * @param WP_REST_Request $request Request data. - * @return WP_Error|WP_REST_Response - */ - public function update_item( $request ) { - $tools = $this->get_tools(); - if ( empty( $tools[ $request['id'] ] ) ) { - return new WP_Error( 'woocommerce_rest_system_status_tool_invalid_id', __( 'Invalid tool ID.', 'woocommerce' ), array( 'status' => 404 ) ); - } - - $tool = $tools[ $request['id'] ]; - $tool = array( - 'id' => $request['id'], - 'name' => $tool['name'], - 'action' => $tool['button'], - 'description' => $tool['desc'], - ); - - $execute_return = $this->execute_tool( $request['id'] ); - $tool = array_merge( $tool, $execute_return ); - - /** - * Fires after a WooCommerce REST system status tool has been executed. - * - * @param array $tool Details about the tool that has been executed. - * @param WP_REST_Request $request The current WP_REST_Request object. - */ - do_action( 'woocommerce_rest_insert_system_status_tool', $tool, $request ); - - $request->set_param( 'context', 'edit' ); - $response = $this->prepare_item_for_response( $tool, $request ); - return rest_ensure_response( $response ); - } - - /** - * Prepare a tool item for serialization. - * - * @param array $item Object. - * @param WP_REST_Request $request Request object. - * @return WP_REST_Response $response Response data. - */ - public function prepare_item_for_response( $item, $request ) { - $context = empty( $request['context'] ) ? 'view' : $request['context']; - $data = $this->add_additional_fields_to_object( $item, $request ); - $data = $this->filter_response_by_context( $data, $context ); - - $response = rest_ensure_response( $data ); - - $response->add_links( $this->prepare_links( $item['id'] ) ); - - return $response; - } - - /** - * Get the system status tools schema, conforming to JSON Schema. - * - * @return array - */ - public function get_item_schema() { - $schema = array( - '$schema' => 'http://json-schema.org/draft-04/schema#', - 'title' => 'system_status_tool', - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'A unique identifier for the tool.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'arg_options' => array( - 'sanitize_callback' => 'sanitize_title', - ), - ), - 'name' => array( - 'description' => __( 'Tool name.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'arg_options' => array( - 'sanitize_callback' => 'sanitize_text_field', - ), - ), - 'action' => array( - 'description' => __( 'What running the tool will do.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'arg_options' => array( - 'sanitize_callback' => 'sanitize_text_field', - ), - ), - 'description' => array( - 'description' => __( 'Tool description.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'arg_options' => array( - 'sanitize_callback' => 'sanitize_text_field', - ), - ), - 'success' => array( - 'description' => __( 'Did the tool run successfully?', 'woocommerce' ), - 'type' => 'boolean', - 'context' => array( 'edit' ), - ), - 'message' => array( - 'description' => __( 'Tool return message.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'edit' ), - 'arg_options' => array( - 'sanitize_callback' => 'sanitize_text_field', - ), - ), - ), - ); - - return $this->add_additional_fields_schema( $schema ); - } - - /** - * Prepare links for the request. - * - * @param string $id ID. - * @return array - */ - protected function prepare_links( $id ) { - $base = '/' . $this->namespace . '/' . $this->rest_base; - $links = array( - 'item' => array( - 'href' => rest_url( trailingslashit( $base ) . $id ), - 'embeddable' => true, - ), - ); - - return $links; - } - - /** - * Get any query params needed. - * - * @return array - */ - public function get_collection_params() { - return array( - 'context' => $this->get_context_param( array( 'default' => 'view' ) ), - ); - } - - /** - * Actually executes a tool. - * - * @param string $tool Tool. - * @return array - */ - public function execute_tool( $tool ) { - global $wpdb; - $ran = true; - switch ( $tool ) { - case 'clear_transients': - wc_delete_product_transients(); - wc_delete_shop_order_transients(); - WC_Cache_Helper::get_transient_version( 'shipping', true ); - $message = __( 'Product transients cleared', 'woocommerce' ); - break; - - case 'clear_expired_transients': - /* translators: %d: amount of expired transients */ - $message = sprintf( __( '%d transients rows cleared', 'woocommerce' ), wc_delete_expired_transients() ); - break; - - case 'delete_orphaned_variations': - // Delete orphans. - $result = absint( - $wpdb->query( - "DELETE products - FROM {$wpdb->posts} products - LEFT JOIN {$wpdb->posts} wp ON wp.ID = products.post_parent - WHERE wp.ID IS NULL AND products.post_type = 'product_variation';" - ) - ); - /* translators: %d: amount of orphaned variations */ - $message = sprintf( __( '%d orphaned variations deleted', 'woocommerce' ), $result ); - break; - - case 'clear_expired_download_permissions': - // Delete expired download permissions and ones with 0 downloads remaining. - $result = absint( - $wpdb->query( - $wpdb->prepare( - "DELETE FROM {$wpdb->prefix}woocommerce_downloadable_product_permissions - WHERE ( downloads_remaining != '' AND downloads_remaining = 0 ) OR ( access_expires IS NOT NULL AND access_expires < %s )", - date( 'Y-m-d', current_time( 'timestamp' ) ) - ) - ) - ); - /* translators: %d: amount of permissions */ - $message = sprintf( __( '%d permissions deleted', 'woocommerce' ), $result ); - break; - - case 'add_order_indexes': - /* - * Add billing and shipping address indexes containing the customer name for orders - * that don't have address indexes yet. - */ - $sql = "INSERT INTO {$wpdb->postmeta}( post_id, meta_key, meta_value ) - SELECT post_id, '%s', GROUP_CONCAT( meta_value SEPARATOR ' ' ) - FROM {$wpdb->postmeta} - WHERE meta_key IN ( '%s', '%s' ) - AND post_id IN ( SELECT DISTINCT post_id FROM {$wpdb->postmeta} - WHERE post_id NOT IN ( SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key='%s' ) - AND post_id IN ( SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key='%s' ) ) - GROUP BY post_id"; - $rows = $wpdb->query( $wpdb->prepare( $sql, '_billing_address_index', '_billing_first_name', '_billing_last_name', '_billing_address_index', '_billing_last_name' ) ); // WPCS: unprepared SQL ok. - $rows += $wpdb->query( $wpdb->prepare( $sql, '_shipping_address_index', '_shipping_first_name', '_shipping_last_name', '_shipping_address_index', '_shipping_last_name' ) ); // WPCS: unprepared SQL ok. - - /* translators: %d: amount of indexes */ - $message = sprintf( __( '%d indexes added', 'woocommerce' ), $rows ); - break; - - case 'reset_roles': - // Remove then re-add caps and roles. - WC_Install::remove_roles(); - WC_Install::create_roles(); - $message = __( 'Roles successfully reset', 'woocommerce' ); - break; - - case 'recount_terms': - $product_cats = get_terms( - 'product_cat', array( - 'hide_empty' => false, - 'fields' => 'id=>parent', - ) - ); - _wc_term_recount( $product_cats, get_taxonomy( 'product_cat' ), true, false ); - $product_tags = get_terms( - 'product_tag', array( - 'hide_empty' => false, - 'fields' => 'id=>parent', - ) - ); - _wc_term_recount( $product_tags, get_taxonomy( 'product_tag' ), true, false ); - $message = __( 'Terms successfully recounted', 'woocommerce' ); - break; - - case 'clear_sessions': - $wpdb->query( "TRUNCATE {$wpdb->prefix}woocommerce_sessions" ); - $result = absint( $wpdb->query( "DELETE FROM {$wpdb->usermeta} WHERE meta_key='_woocommerce_persistent_cart_" . get_current_blog_id() . "';" ) ); // WPCS: unprepared SQL ok. - wp_cache_flush(); - /* translators: %d: amount of sessions */ - $message = sprintf( __( 'Deleted all active sessions, and %d saved carts.', 'woocommerce' ), absint( $result ) ); - break; - - case 'install_pages': - WC_Install::create_pages(); - $message = __( 'All missing WooCommerce pages successfully installed', 'woocommerce' ); - break; - - case 'delete_taxes': - $wpdb->query( "TRUNCATE TABLE {$wpdb->prefix}woocommerce_tax_rates;" ); - $wpdb->query( "TRUNCATE TABLE {$wpdb->prefix}woocommerce_tax_rate_locations;" ); - WC_Cache_Helper::incr_cache_prefix( 'taxes' ); - $message = __( 'Tax rates successfully deleted', 'woocommerce' ); - break; - - case 'reset_tracking': - if ( ! class_exists( 'WC_Tracker' ) ) { - include_once WC_ABSPATH . 'includes/class-wc-tracker.php'; - } - WC_Tracker::opt_out_request(); - delete_option( 'woocommerce_allow_tracking' ); - WC_Admin_Notices::add_notice( 'tracking' ); - $message = __( 'Usage tracking settings successfully reset.', 'woocommerce' ); - break; - - case 'regenerate_thumbnails': - WC_Regenerate_Images::queue_image_regeneration(); - $message = __( 'Thumbnail regeneration has been scheduled to run in the background.', 'woocommerce' ); - break; - - default: - $tools = $this->get_tools(); - if ( isset( $tools[ $tool ]['callback'] ) ) { - $callback = $tools[ $tool ]['callback']; - $return = call_user_func( $callback ); - if ( is_string( $return ) ) { - $message = $return; - } elseif ( false === $return ) { - $callback_string = is_array( $callback ) ? get_class( $callback[0] ) . '::' . $callback[1] : $callback; - $ran = false; - /* translators: %s: callback string */ - $message = sprintf( __( 'There was an error calling %s', 'woocommerce' ), $callback_string ); - } else { - $message = __( 'Tool ran.', 'woocommerce' ); - } - } else { - $ran = false; - $message = __( 'There was an error calling this tool. There is no callback present.', 'woocommerce' ); - } - break; - } - - return array( - 'success' => $ran, - 'message' => $message, - ); - } + protected $namespace = 'wc/v3'; } diff --git a/includes/api/class-wc-rest-tax-classes-controller.php b/includes/api/class-wc-rest-tax-classes-controller.php index eb36a2da3d7..39879e20ef4 100644 --- a/includes/api/class-wc-rest-tax-classes-controller.php +++ b/includes/api/class-wc-rest-tax-classes-controller.php @@ -14,14 +14,14 @@ defined( 'ABSPATH' ) || exit; * REST API Tax Classes controller class. * * @package WooCommerce/API - * @extends WC_REST_Tax_Classes_V1_Controller + * @extends WC_REST_Tax_Classes_V2_Controller */ -class WC_REST_Tax_Classes_Controller extends WC_REST_Tax_Classes_V1_Controller { +class WC_REST_Tax_Classes_Controller extends WC_REST_Tax_Classes_V2_Controller { /** * Endpoint namespace. * * @var string */ - protected $namespace = 'wc/v2'; + protected $namespace = 'wc/v3'; } diff --git a/includes/api/class-wc-rest-taxes-controller.php b/includes/api/class-wc-rest-taxes-controller.php index 5bd1b609211..bd650f87c41 100644 --- a/includes/api/class-wc-rest-taxes-controller.php +++ b/includes/api/class-wc-rest-taxes-controller.php @@ -1,4 +1,4 @@ -/deliveries endpoint. - * - * @package WooCommerce/API - * @since 2.6.0 - */ - -defined( 'ABSPATH' ) || exit; - -/** - * REST API Webhook Deliveries controller class. - * - * @deprecated 3.3.0 Webhooks deliveries logs now uses logging system. - * @package WooCommerce/API - * @extends WC_REST_Webhook_Deliveries_V1_Controller - */ -class WC_REST_Webhook_Deliveries_Controller extends WC_REST_Webhook_Deliveries_V1_Controller { - - /** - * Endpoint namespace. - * - * @var string - */ - protected $namespace = 'wc/v2'; - - /** - * Prepare a single webhook delivery output for response. - * - * @param stdClass $log Delivery log object. - * @param WP_REST_Request $request Request object. - * @return WP_REST_Response - */ - public function prepare_item_for_response( $log, $request ) { - $data = (array) $log; - - $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; - $data = $this->add_additional_fields_to_object( $data, $request ); - $data = $this->filter_response_by_context( $data, $context ); - - // Wrap the data in a response object. - $response = rest_ensure_response( $data ); - - $response->add_links( $this->prepare_links( $log ) ); - - /** - * Filter webhook delivery object returned from the REST API. - * - * @param WP_REST_Response $response The response object. - * @param stdClass $log Delivery log object used to create response. - * @param WP_REST_Request $request Request object. - */ - return apply_filters( 'woocommerce_rest_prepare_webhook_delivery', $response, $log, $request ); - } - - /** - * Get the Webhook's schema, conforming to JSON Schema. - * - * @return array - */ - public function get_item_schema() { - $schema = array( - '$schema' => 'http://json-schema.org/draft-04/schema#', - 'title' => 'webhook_delivery', - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'duration' => array( - 'description' => __( 'The delivery duration, in seconds.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'summary' => array( - 'description' => __( 'A friendly summary of the response including the HTTP response code, message, and body.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'request_url' => array( - 'description' => __( 'The URL where the webhook was delivered.', 'woocommerce' ), - 'type' => 'string', - 'format' => 'uri', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'request_headers' => array( - 'description' => __( 'Request headers.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view' ), - 'readonly' => true, - 'items' => array( - 'type' => 'string', - ), - ), - 'request_body' => array( - 'description' => __( 'Request body.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'response_code' => array( - 'description' => __( 'The HTTP response code from the receiving server.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'response_message' => array( - 'description' => __( 'The HTTP response message from the receiving server.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'response_headers' => array( - 'description' => __( 'Array of the response headers from the receiving server.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view' ), - 'readonly' => true, - 'items' => array( - 'type' => 'string', - ), - ), - 'response_body' => array( - 'description' => __( 'The response body from the receiving server.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view' ), - 'readonly' => true, - ), - 'date_created' => array( - 'description' => __( "The date the webhook delivery was logged, in the site's timezone.", 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_created_gmt' => array( - 'description' => __( 'The date the webhook delivery was logged, as GMT.', 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - ), - ); - - return $this->add_additional_fields_schema( $schema ); - } -} diff --git a/includes/api/class-wc-rest-webhooks-controller.php b/includes/api/class-wc-rest-webhooks-controller.php index f5cc00e235c..f876adb3f21 100644 --- a/includes/api/class-wc-rest-webhooks-controller.php +++ b/includes/api/class-wc-rest-webhooks-controller.php @@ -14,172 +14,14 @@ defined( 'ABSPATH' ) || exit; * REST API Webhooks controller class. * * @package WooCommerce/API - * @extends WC_REST_Webhooks_V1_Controller + * @extends WC_REST_Webhooks_V2_Controller */ -class WC_REST_Webhooks_Controller extends WC_REST_Webhooks_V1_Controller { +class WC_REST_Webhooks_Controller extends WC_REST_Webhooks_V2_Controller { /** * Endpoint namespace. * * @var string */ - protected $namespace = 'wc/v2'; - - /** - * Prepare a single webhook output for response. - * - * @param int $id Webhook ID. - * @param WP_REST_Request $request Request object. - * @return WP_REST_Response $response - */ - public function prepare_item_for_response( $id, $request ) { - $webhook = wc_get_webhook( $id ); - - if ( empty( $webhook ) || is_null( $webhook ) ) { - return new WP_Error( "woocommerce_rest_{$this->post_type}_invalid_id", __( 'ID is invalid.', 'woocommerce' ), array( 'status' => 400 ) ); - } - - $data = array( - 'id' => $webhook->get_id(), - 'name' => $webhook->get_name(), - 'status' => $webhook->get_status(), - 'topic' => $webhook->get_topic(), - 'resource' => $webhook->get_resource(), - 'event' => $webhook->get_event(), - 'hooks' => $webhook->get_hooks(), - 'delivery_url' => $webhook->get_delivery_url(), - 'date_created' => wc_rest_prepare_date_response( $webhook->get_date_created(), false ), - 'date_created_gmt' => wc_rest_prepare_date_response( $webhook->get_date_created() ), - 'date_modified' => wc_rest_prepare_date_response( $webhook->get_date_modified(), false ), - 'date_modified_gmt' => wc_rest_prepare_date_response( $webhook->get_date_modified() ), - ); - - $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; - $data = $this->add_additional_fields_to_object( $data, $request ); - $data = $this->filter_response_by_context( $data, $context ); - - // Wrap the data in a response object. - $response = rest_ensure_response( $data ); - - $response->add_links( $this->prepare_links( $webhook->get_id(), $request ) ); - - /** - * Filter webhook object returned from the REST API. - * - * @param WP_REST_Response $response The response object. - * @param WC_Webhook $webhook Webhook object used to create response. - * @param WP_REST_Request $request Request object. - */ - return apply_filters( "woocommerce_rest_prepare_{$this->post_type}", $response, $webhook, $request ); - } - - /** - * Get the default REST API version. - * - * @since 3.0.0 - * @return string - */ - protected function get_default_api_version() { - return 'wp_api_v2'; - } - - /** - * Get the Webhook's schema, conforming to JSON Schema. - * - * @return array - */ - public function get_item_schema() { - $schema = array( - '$schema' => 'http://json-schema.org/draft-04/schema#', - 'title' => 'webhook', - 'type' => 'object', - 'properties' => array( - 'id' => array( - 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), - 'type' => 'integer', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'name' => array( - 'description' => __( 'A friendly name for the webhook.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'status' => array( - 'description' => __( 'Webhook status.', 'woocommerce' ), - 'type' => 'string', - 'default' => 'active', - 'enum' => array( 'active', 'paused', 'disabled' ), - 'context' => array( 'view', 'edit' ), - 'arg_options' => array( - 'sanitize_callback' => 'wc_is_webhook_valid_topic', - ), - ), - 'topic' => array( - 'description' => __( 'Webhook topic.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - ), - 'resource' => array( - 'description' => __( 'Webhook resource.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'event' => array( - 'description' => __( 'Webhook event.', 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'hooks' => array( - 'description' => __( 'WooCommerce action names associated with the webhook.', 'woocommerce' ), - 'type' => 'array', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - 'items' => array( - 'type' => 'string', - ), - ), - 'delivery_url' => array( - 'description' => __( 'The URL where the webhook payload is delivered.', 'woocommerce' ), - 'type' => 'string', - 'format' => 'uri', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'secret' => array( - 'description' => __( "Secret key used to generate a hash of the delivered webhook and provided in the request headers. This will default to a MD5 hash from the current user's ID|username if not provided.", 'woocommerce' ), - 'type' => 'string', - 'context' => array( 'edit' ), - ), - 'date_created' => array( - 'description' => __( "The date the webhook was created, in the site's timezone.", 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_created_gmt' => array( - 'description' => __( 'The date the webhook was created, as GMT.', 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_modified' => array( - 'description' => __( "The date the webhook was last modified, in the site's timezone.", 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - 'date_modified_gmt' => array( - 'description' => __( 'The date the webhook was last modified, as GMT.', 'woocommerce' ), - 'type' => 'date-time', - 'context' => array( 'view', 'edit' ), - 'readonly' => true, - ), - ), - ); - - return $this->add_additional_fields_schema( $schema ); - } + protected $namespace = 'wc/v3'; } From 04c19bb035921780b93817cdcffb8553bef2aedd Mon Sep 17 00:00:00 2001 From: Claudio Sanches Date: Thu, 17 May 2018 11:48:48 +0100 Subject: [PATCH 007/984] Include new REST API files and classes --- includes/class-wc-api.php | 76 ++++++++++++++++++++++++++++++++++----- 1 file changed, 68 insertions(+), 8 deletions(-) diff --git a/includes/class-wc-api.php b/includes/class-wc-api.php index 286a1e9b2b3..acd6c4b4d88 100644 --- a/includes/class-wc-api.php +++ b/includes/class-wc-api.php @@ -167,6 +167,39 @@ class WC_API extends WC_Legacy_API { include_once dirname( __FILE__ ) . '/api/legacy/class-wc-rest-legacy-products-controller.php'; // REST API v2 controllers. + include_once dirname( __FILE__ ) . '/api/class-wc-rest-coupons-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-customer-downloads-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-customers-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-orders-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-network-orders-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-order-notes-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-order-refunds-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-product-attribute-terms-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-product-attributes-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-product-categories-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-product-reviews-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-product-shipping-classes-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-product-tags-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-products-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-product-variations-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-report-sales-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-report-top-sellers-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-reports-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-settings-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-setting-options-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-shipping-zones-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-shipping-zone-locations-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-shipping-zone-methods-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-tax-classes-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-taxes-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-webhook-deliveries-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-webhooks-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-system-status-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-system-status-tools-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-shipping-methods-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-payment-gateways-v2-controller.php'; + + // REST API v3 controllers. include_once dirname( __FILE__ ) . '/api/class-wc-rest-coupons-controller.php'; include_once dirname( __FILE__ ) . '/api/class-wc-rest-customer-downloads-controller.php'; include_once dirname( __FILE__ ) . '/api/class-wc-rest-customers-controller.php'; @@ -182,8 +215,6 @@ class WC_API extends WC_Legacy_API { include_once dirname( __FILE__ ) . '/api/class-wc-rest-product-tags-controller.php'; include_once dirname( __FILE__ ) . '/api/class-wc-rest-products-controller.php'; include_once dirname( __FILE__ ) . '/api/class-wc-rest-product-variations-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-report-sales-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-report-top-sellers-controller.php'; include_once dirname( __FILE__ ) . '/api/class-wc-rest-reports-controller.php'; include_once dirname( __FILE__ ) . '/api/class-wc-rest-settings-controller.php'; include_once dirname( __FILE__ ) . '/api/class-wc-rest-setting-options-controller.php'; @@ -192,7 +223,6 @@ class WC_API extends WC_Legacy_API { include_once dirname( __FILE__ ) . '/api/class-wc-rest-shipping-zone-methods-controller.php'; include_once dirname( __FILE__ ) . '/api/class-wc-rest-tax-classes-controller.php'; include_once dirname( __FILE__ ) . '/api/class-wc-rest-taxes-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-webhook-deliveries-controller.php'; include_once dirname( __FILE__ ) . '/api/class-wc-rest-webhooks-controller.php'; include_once dirname( __FILE__ ) . '/api/class-wc-rest-system-status-controller.php'; include_once dirname( __FILE__ ) . '/api/class-wc-rest-system-status-tools-controller.php'; @@ -210,7 +240,7 @@ class WC_API extends WC_Legacy_API { $this->register_wp_admin_settings(); $controllers = array( - // v1 controllers. + // REST API v1 controllers. 'WC_REST_Coupons_V1_Controller', 'WC_REST_Customer_Downloads_V1_Controller', 'WC_REST_Customers_V1_Controller', @@ -232,7 +262,40 @@ class WC_API extends WC_Legacy_API { 'WC_REST_Webhook_Deliveries_V1_Controller', 'WC_REST_Webhooks_V1_Controller', - // v2 controllers. + // REST API v2 controllers. + 'WC_REST_Coupons_V2_Controller', + 'WC_REST_Customer_Downloads_V2_Controller', + 'WC_REST_Customers_V2_Controller', + 'WC_REST_Network_Orders_V2_Controller', + 'WC_REST_Order_Notes_V2_Controller', + 'WC_REST_Order_Refunds_V2_Controller', + 'WC_REST_Orders_V2_Controller', + 'WC_REST_Product_Attribute_Terms_V2_Controller', + 'WC_REST_Product_Attributes_V2_Controller', + 'WC_REST_Product_Categories_V2_Controller', + 'WC_REST_Product_Reviews_V2_Controller', + 'WC_REST_Product_Shipping_Classes_V2_Controller', + 'WC_REST_Product_Tags_V2_Controller', + 'WC_REST_Products_V2_Controller', + 'WC_REST_Product_Variations_V2_Controller', + 'WC_REST_Report_Sales_V2_Controller', + 'WC_REST_Report_Top_Sellers_V2_Controller', + 'WC_REST_Reports_V2_Controller', + 'WC_REST_Settings_V2_Controller', + 'WC_REST_Setting_Options_V2_Controller', + 'WC_REST_Shipping_Zones_V2_Controller', + 'WC_REST_Shipping_Zone_Locations_V2_Controller', + 'WC_REST_Shipping_Zone_Methods_V2_Controller', + 'WC_REST_Tax_Classes_V2_Controller', + 'WC_REST_Taxes_V2_Controller', + 'WC_REST_Webhook_Deliveries_V2_Controller', + 'WC_REST_Webhooks_V2_Controller', + 'WC_REST_System_Status_V2_Controller', + 'WC_REST_System_Status_Tools_V2_Controller', + 'WC_REST_Shipping_Methods_V2_Controller', + 'WC_REST_Payment_Gateways_V2_Controller', + + // REST API v3 controllers. 'WC_REST_Coupons_Controller', 'WC_REST_Customer_Downloads_Controller', 'WC_REST_Customers_Controller', @@ -248,8 +311,6 @@ class WC_API extends WC_Legacy_API { 'WC_REST_Product_Tags_Controller', 'WC_REST_Products_Controller', 'WC_REST_Product_Variations_Controller', - 'WC_REST_Report_Sales_Controller', - 'WC_REST_Report_Top_Sellers_Controller', 'WC_REST_Reports_Controller', 'WC_REST_Settings_Controller', 'WC_REST_Setting_Options_Controller', @@ -258,7 +319,6 @@ class WC_API extends WC_Legacy_API { 'WC_REST_Shipping_Zone_Methods_Controller', 'WC_REST_Tax_Classes_Controller', 'WC_REST_Taxes_Controller', - 'WC_REST_Webhook_Deliveries_Controller', 'WC_REST_Webhooks_Controller', 'WC_REST_System_Status_Controller', 'WC_REST_System_Status_Tools_Controller', From 2c2861bdd0fc3f7532556a1308e0cbb0e55a590a Mon Sep 17 00:00:00 2001 From: Claudio Sanches Date: Thu, 17 May 2018 12:08:43 +0100 Subject: [PATCH 008/984] Fixed REST API v2 file paths --- includes/class-wc-api.php | 62 +++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/includes/class-wc-api.php b/includes/class-wc-api.php index acd6c4b4d88..f75de8d9388 100644 --- a/includes/class-wc-api.php +++ b/includes/class-wc-api.php @@ -167,37 +167,37 @@ class WC_API extends WC_Legacy_API { include_once dirname( __FILE__ ) . '/api/legacy/class-wc-rest-legacy-products-controller.php'; // REST API v2 controllers. - include_once dirname( __FILE__ ) . '/api/class-wc-rest-coupons-v2-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-customer-downloads-v2-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-customers-v2-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-orders-v2-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-network-orders-v2-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-order-notes-v2-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-order-refunds-v2-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-product-attribute-terms-v2-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-product-attributes-v2-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-product-categories-v2-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-product-reviews-v2-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-product-shipping-classes-v2-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-product-tags-v2-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-products-v2-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-product-variations-v2-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-report-sales-v2-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-report-top-sellers-v2-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-reports-v2-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-settings-v2-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-setting-options-v2-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-shipping-zones-v2-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-shipping-zone-locations-v2-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-shipping-zone-methods-v2-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-tax-classes-v2-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-taxes-v2-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-webhook-deliveries-v2-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-webhooks-v2-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-system-status-v2-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-system-status-tools-v2-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-shipping-methods-v2-controller.php'; - include_once dirname( __FILE__ ) . '/api/class-wc-rest-payment-gateways-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-coupons-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-customer-downloads-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-customers-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-orders-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-network-orders-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-order-notes-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-order-refunds-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-product-attribute-terms-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-product-attributes-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-product-categories-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-product-reviews-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-product-shipping-classes-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-product-tags-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-products-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-product-variations-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-report-sales-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-report-top-sellers-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-reports-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-settings-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-setting-options-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-shipping-zones-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-shipping-zone-locations-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-shipping-zone-methods-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-tax-classes-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-taxes-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-webhook-deliveries-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-webhooks-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-system-status-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-system-status-tools-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-shipping-methods-v2-controller.php'; + include_once dirname( __FILE__ ) . '/api/v2/class-wc-rest-payment-gateways-v2-controller.php'; // REST API v3 controllers. include_once dirname( __FILE__ ) . '/api/class-wc-rest-coupons-controller.php'; From aa2b424c2159ef54f7131f223fe77b4d33f3ef3f Mon Sep 17 00:00:00 2001 From: Claudio Sanches Date: Thu, 17 May 2018 12:11:56 +0100 Subject: [PATCH 009/984] Fixed class hierarchy in REST API v2 --- .../api/v2/class-wc-rest-network-orders-v2-controller.php | 4 ++-- includes/api/v2/class-wc-rest-order-refunds-v2-controller.php | 4 ++-- .../api/v2/class-wc-rest-product-variations-v2-controller.php | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/includes/api/v2/class-wc-rest-network-orders-v2-controller.php b/includes/api/v2/class-wc-rest-network-orders-v2-controller.php index 0a2981d7667..7e288b9dfc0 100644 --- a/includes/api/v2/class-wc-rest-network-orders-v2-controller.php +++ b/includes/api/v2/class-wc-rest-network-orders-v2-controller.php @@ -14,9 +14,9 @@ defined( 'ABSPATH' ) || exit; * REST API Network Orders controller class. * * @package WooCommerce/API - * @extends WC_REST_Orders_Controller + * @extends WC_REST_Orders_V2_Controller */ -class WC_REST_Network_Orders_V2_Controller extends WC_REST_Orders_Controller { +class WC_REST_Network_Orders_V2_Controller extends WC_REST_Orders_V2_Controller { /** * Endpoint namespace. diff --git a/includes/api/v2/class-wc-rest-order-refunds-v2-controller.php b/includes/api/v2/class-wc-rest-order-refunds-v2-controller.php index 8fb549acc61..9fb35b27fbb 100644 --- a/includes/api/v2/class-wc-rest-order-refunds-v2-controller.php +++ b/includes/api/v2/class-wc-rest-order-refunds-v2-controller.php @@ -14,9 +14,9 @@ defined( 'ABSPATH' ) || exit; * REST API Order Refunds controller class. * * @package WooCommerce/API - * @extends WC_REST_Orders_Controller + * @extends WC_REST_Orders_V2_Controller */ -class WC_REST_Order_Refunds_V2_Controller extends WC_REST_Orders_Controller { +class WC_REST_Order_Refunds_V2_Controller extends WC_REST_Orders_V2_Controller { /** * Endpoint namespace. diff --git a/includes/api/v2/class-wc-rest-product-variations-v2-controller.php b/includes/api/v2/class-wc-rest-product-variations-v2-controller.php index 6825434deb9..6cb3350ab1d 100644 --- a/includes/api/v2/class-wc-rest-product-variations-v2-controller.php +++ b/includes/api/v2/class-wc-rest-product-variations-v2-controller.php @@ -14,9 +14,9 @@ defined( 'ABSPATH' ) || exit; * REST API variations controller class. * * @package WooCommerce/API - * @extends WC_REST_Products_Controller + * @extends WC_REST_Products_V2_Controller */ -class WC_REST_Product_Variations_V2_Controller extends WC_REST_Products_Controller { +class WC_REST_Product_Variations_V2_Controller extends WC_REST_Products_V2_Controller { /** * Endpoint namespace. From 1c31021eb41db38b0ffae39f6c5148ec38d6ca52 Mon Sep 17 00:00:00 2001 From: Claudio Sanches Date: Thu, 17 May 2018 12:15:38 +0100 Subject: [PATCH 010/984] Fixed typo --- includes/api/class-wc-rest-taxes-controller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/api/class-wc-rest-taxes-controller.php b/includes/api/class-wc-rest-taxes-controller.php index bd650f87c41..35c20e57908 100644 --- a/includes/api/class-wc-rest-taxes-controller.php +++ b/includes/api/class-wc-rest-taxes-controller.php @@ -1,4 +1,4 @@ -a Date: Thu, 17 May 2018 12:15:45 +0100 Subject: [PATCH 011/984] Don't include reports endpoint while is empty --- includes/class-wc-api.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/class-wc-api.php b/includes/class-wc-api.php index f75de8d9388..88defee0af9 100644 --- a/includes/class-wc-api.php +++ b/includes/class-wc-api.php @@ -311,7 +311,7 @@ class WC_API extends WC_Legacy_API { 'WC_REST_Product_Tags_Controller', 'WC_REST_Products_Controller', 'WC_REST_Product_Variations_Controller', - 'WC_REST_Reports_Controller', + // 'WC_REST_Reports_Controller', 'WC_REST_Settings_Controller', 'WC_REST_Setting_Options_Controller', 'WC_REST_Shipping_Zones_Controller', From e02989361c76cd838bffa7d09eb4724a17b69d99 Mon Sep 17 00:00:00 2001 From: Peter Fabian Date: Thu, 17 May 2018 15:50:27 +0100 Subject: [PATCH 012/984] Change image title to name in v3. --- ...-wc-rest-product-categories-controller.php | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/includes/api/class-wc-rest-product-categories-controller.php b/includes/api/class-wc-rest-product-categories-controller.php index 0142d20ed1f..a32daa3804d 100644 --- a/includes/api/class-wc-rest-product-categories-controller.php +++ b/includes/api/class-wc-rest-product-categories-controller.php @@ -24,4 +24,67 @@ class WC_REST_Product_Categories_Controller extends WC_REST_Product_Categories_V * @var string */ protected $namespace = 'wc/v3'; + + /** + * Prepare a single product category output for response. + * + * @param WP_Term $item Term object. + * @param WP_REST_Request $request Request instance. + * @return WP_REST_Response + */ + public function prepare_item_for_response( $item, $request ) { + // Get category display type. + $display_type = get_woocommerce_term_meta( $item->term_id, 'display_type' ); + + // Get category order. + $menu_order = get_woocommerce_term_meta( $item->term_id, 'order' ); + + $data = array( + 'id' => (int) $item->term_id, + 'name' => $item->name, + 'slug' => $item->slug, + 'parent' => (int) $item->parent, + 'description' => $item->description, + 'display' => $display_type ? $display_type : 'default', + 'image' => null, + 'menu_order' => (int) $menu_order, + 'count' => (int) $item->count, + ); + + // Get category image. + $image_id = get_woocommerce_term_meta( $item->term_id, 'thumbnail_id' ); + if ( $image_id ) { + $attachment = get_post( $image_id ); + + $data['image'] = array( + 'id' => (int) $image_id, + 'date_created' => wc_rest_prepare_date_response( $attachment->post_date ), + 'date_created_gmt' => wc_rest_prepare_date_response( $attachment->post_date_gmt ), + 'date_modified' => wc_rest_prepare_date_response( $attachment->post_modified ), + 'date_modified_gmt' => wc_rest_prepare_date_response( $attachment->post_modified_gmt ), + 'src' => wp_get_attachment_url( $image_id ), + 'name' => get_the_title( $attachment ), + 'alt' => get_post_meta( $image_id, '_wp_attachment_image_alt', true ), + ); + } + + $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; + $data = $this->add_additional_fields_to_object( $data, $request ); + $data = $this->filter_response_by_context( $data, $context ); + + $response = rest_ensure_response( $data ); + + $response->add_links( $this->prepare_links( $item, $request ) ); + + /** + * Filter a term item returned from the API. + * + * Allows modification of the term data right before it is returned. + * + * @param WP_REST_Response $response The response object. + * @param object $item The original term object. + * @param WP_REST_Request $request Request used to generate the response. + */ + return apply_filters( "woocommerce_rest_prepare_{$this->taxonomy}", $response, $item, $request ); + } } From 2c476f60ceba4e578e6bfdf3f999cca8d04cc1ed Mon Sep 17 00:00:00 2001 From: Claudio Sanches Date: Thu, 17 May 2018 16:14:38 +0100 Subject: [PATCH 013/984] Included REST API feature plugin endpoints and changes --- ...ass-wc-rest-data-continents-controller.php | 357 ++++++++ .../api/class-wc-rest-data-controller.php | 188 +++++ ...lass-wc-rest-data-countries-controller.php | 240 ++++++ ...ass-wc-rest-data-currencies-controller.php | 221 +++++ .../class-wc-rest-order-notes-controller.php | 104 +++ ...class-wc-rest-order-refunds-controller.php | 59 ++ .../api/class-wc-rest-orders-controller.php | 48 ++ ...ss-wc-rest-payment-gateways-controller.php | 199 +++++ ...-wc-rest-product-variations-controller.php | 712 ++++++++++++++++ .../api/class-wc-rest-products-controller.php | 763 ++++++++++++++++++ ...ass-wc-rest-setting-options-controller.php | 223 +++++ .../api/class-wc-rest-settings-controller.php | 42 + ...ss-wc-rest-order-refunds-v2-controller.php | 4 +- includes/class-wc-api.php | 4 + 14 files changed, 3162 insertions(+), 2 deletions(-) create mode 100644 includes/api/class-wc-rest-data-continents-controller.php create mode 100644 includes/api/class-wc-rest-data-controller.php create mode 100644 includes/api/class-wc-rest-data-countries-controller.php create mode 100644 includes/api/class-wc-rest-data-currencies-controller.php diff --git a/includes/api/class-wc-rest-data-continents-controller.php b/includes/api/class-wc-rest-data-continents-controller.php new file mode 100644 index 00000000000..56c82fcb2f3 --- /dev/null +++ b/includes/api/class-wc-rest-data-continents-controller.php @@ -0,0 +1,357 @@ +namespace, '/' . $this->rest_base, array( + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_items' ), + 'permission_callback' => array( $this, 'get_items_permissions_check' ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + register_rest_route( + $this->namespace, '/' . $this->rest_base . '/(?P[\w-]+)', array( + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_item' ), + 'permission_callback' => array( $this, 'get_items_permissions_check' ), + 'args' => array( + 'continent' => array( + 'description' => __( '2 character continent code.', 'woocommerce' ), + 'type' => 'string', + ), + ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + } + + /** + * Return the list of countries and states for a given continent. + * + * @since 3.5.0 + * @param string $continent_code Continent code. + * @param WP_REST_Request $request Request data. + * @return array|mixed Response data, ready for insertion into collection data. + */ + public function get_continent( $continent_code = false, $request ) { + $continents = WC()->countries->get_continents(); + $countries = WC()->countries->get_countries(); + $states = WC()->countries->get_states(); + $locale_info = include WC()->plugin_path() . '/i18n/locale-info.php'; + $data = array(); + + if ( ! array_key_exists( $continent_code, $continents ) ) { + return false; + } + + $continent_list = $continents[ $continent_code ]; + + $continent = array( + 'code' => $continent_code, + 'name' => $continent_list['name'], + ); + + $local_countries = array(); + foreach ( $continent_list['countries'] as $country_code ) { + if ( isset( $countries[ $country_code ] ) ) { + $country = array( + 'code' => $country_code, + 'name' => $countries[ $country_code ], + ); + + // If we have detailed locale information include that in the response. + if ( array_key_exists( $country_code, $locale_info ) ) { + // Defensive programming against unexpected changes in locale-info.php. + $country_data = wp_parse_args( + $locale_info[ $country_code ], array( + 'currency_code' => 'USD', + 'currency_pos' => 'left', + 'decimal_sep' => '.', + 'dimension_unit' => 'in', + 'num_decimals' => 2, + 'thousand_sep' => ',', + 'weight_unit' => 'lbs', + ) + ); + + $country = array_merge( $country, $country_data ); + } + + $local_states = array(); + if ( isset( $states[ $country_code ] ) ) { + foreach ( $states[ $country_code ] as $state_code => $state_name ) { + $local_states[] = array( + 'code' => $state_code, + 'name' => $state_name, + ); + } + } + $country['states'] = $local_states; + + // Allow only desired keys (e.g. filter out tax rates). + $allowed = array( + 'code', + 'currency_code', + 'currency_pos', + 'decimal_sep', + 'dimension_unit', + 'name', + 'num_decimals', + 'states', + 'thousand_sep', + 'weight_unit', + ); + $country = array_intersect_key( $country, array_flip( $allowed ) ); + + $local_countries[] = $country; + } + } + + $continent['countries'] = $local_countries; + return $continent; + } + + /** + * Return the list of states for all continents. + * + * @since 3.5.0 + * @param WP_REST_Request $request Request data. + * @return WP_Error|WP_REST_Response + */ + public function get_items( $request ) { + $continents = WC()->countries->get_continents(); + $data = array(); + + foreach ( array_keys( $continents ) as $continent_code ) { + $continent = $this->get_continent( $continent_code, $request ); + $response = $this->prepare_item_for_response( $continent, $request ); + $data[] = $this->prepare_response_for_collection( $response ); + } + + return rest_ensure_response( $data ); + } + + /** + * Return the list of locations for a given continent. + * + * @since 3.5.0 + * @param WP_REST_Request $request Request data. + * @return WP_Error|WP_REST_Response + */ + public function get_item( $request ) { + $data = $this->get_continent( strtoupper( $request['location'] ), $request ); + if ( empty( $data ) ) { + return new WP_Error( 'woocommerce_rest_data_invalid_location', __( 'There are no locations matching these parameters.', 'woocommerce' ), array( 'status' => 404 ) ); + } + return $this->prepare_item_for_response( $data, $request ); + } + + /** + * Prepare the data object for response. + * + * @since 3.5.0 + * @param object $item Data object. + * @param WP_REST_Request $request Request object. + * @return WP_REST_Response $response Response data. + */ + public function prepare_item_for_response( $item, $request ) { + $data = $this->add_additional_fields_to_object( $item, $request ); + $data = $this->filter_response_by_context( $data, 'view' ); + $response = rest_ensure_response( $data ); + + $response->add_links( $this->prepare_links( $item ) ); + + /** + * Filter the location list returned from the API. + * + * Allows modification of the loction data right before it is returned. + * + * @param WP_REST_Response $response The response object. + * @param array $item The original list of continent(s), countries, and states. + * @param WP_REST_Request $request Request used to generate the response. + */ + return apply_filters( 'woocommerce_rest_prepare_data_continent', $response, $item, $request ); + } + + /** + * Prepare links for the request. + * + * @param object $item Data object. + * @return array Links for the given continent. + */ + protected function prepare_links( $item ) { + $continent_code = strtolower( $item['code'] ); + $links = array( + 'self' => array( + 'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $this->rest_base, $continent_code ) ), + ), + 'collection' => array( + 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ), + ), + ); + return $links; + } + + /** + * Get the location schema, conforming to JSON Schema. + * + * @since 3.5.0 + * @return array + */ + public function get_item_schema() { + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => 'data_continents', + 'type' => 'object', + 'properties' => array( + 'code' => array( + 'type' => 'string', + 'description' => __( '2 character continent code.', 'woocommerce' ), + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'name' => array( + 'type' => 'string', + 'description' => __( 'Full name of continent.', 'woocommerce' ), + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'countries' => array( + 'type' => 'array', + 'description' => __( 'List of countries on this continent.', 'woocommerce' ), + 'context' => array( 'view' ), + 'readonly' => true, + 'items' => array( + 'type' => 'object', + 'context' => array( 'view' ), + 'readonly' => true, + 'properties' => array( + 'code' => array( + 'type' => 'string', + 'description' => __( 'ISO3166 alpha-2 country code.', 'woocommerce' ), + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'currency_code' => array( + 'type' => 'string', + 'description' => __( 'Default ISO4127 alpha-3 currency code for the country.', 'woocommerce' ), + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'currency_pos' => array( + 'type' => 'string', + 'description' => __( 'Currency symbol position for this country.', 'woocommerce' ), + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'decimal_sep' => array( + 'type' => 'string', + 'description' => __( 'Decimal separator for displayed prices for this country.', 'woocommerce' ), + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'dimension_unit' => array( + 'type' => 'string', + 'description' => __( 'The unit lengths are defined in for this country.', 'woocommerce' ), + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'name' => array( + 'type' => 'string', + 'description' => __( 'Full name of country.', 'woocommerce' ), + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'num_decimals' => array( + 'type' => 'integer', + 'description' => __( 'Number of decimal points shown in displayed prices for this country.', 'woocommerce' ), + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'states' => array( + 'type' => 'array', + 'description' => __( 'List of states in this country.', 'woocommerce' ), + 'context' => array( 'view' ), + 'readonly' => true, + 'items' => array( + 'type' => 'object', + 'context' => array( 'view' ), + 'readonly' => true, + 'properties' => array( + 'code' => array( + 'type' => 'string', + 'description' => __( 'State code.', 'woocommerce' ), + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'name' => array( + 'type' => 'string', + 'description' => __( 'Full name of state.', 'woocommerce' ), + 'context' => array( 'view' ), + 'readonly' => true, + ), + ), + ), + ), + 'thousand_sep' => array( + 'type' => 'string', + 'description' => __( 'Thousands separator for displayed prices in this country.', 'woocommerce' ), + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'weight_unit' => array( + 'type' => 'string', + 'description' => __( 'The unit weights are defined in for this country.', 'woocommerce' ), + 'context' => array( 'view' ), + 'readonly' => true, + ), + ), + ), + ), + ), + ); + + return $this->add_additional_fields_schema( $schema ); + } +} diff --git a/includes/api/class-wc-rest-data-controller.php b/includes/api/class-wc-rest-data-controller.php new file mode 100644 index 00000000000..dd366af5774 --- /dev/null +++ b/includes/api/class-wc-rest-data-controller.php @@ -0,0 +1,188 @@ +namespace, '/' . $this->rest_base, array( + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_items' ), + 'permission_callback' => array( $this, 'get_items_permissions_check' ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + } + + /** + * Check whether a given request has permission to read site data. + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_Error|boolean + */ + public function get_items_permissions_check( $request ) { + if ( ! wc_rest_check_manager_permissions( 'settings', 'read' ) ) { + return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot list resources.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); + } + + return true; + } + + /** + * Check whether a given request has permission to read site settings. + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_Error|boolean + */ + public function get_item_permissions_check( $request ) { + if ( ! wc_rest_check_manager_permissions( 'settings', 'read' ) ) { + return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot view this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); + } + + return true; + } + + /** + * Return the list of data resources. + * + * @since 3.5.0 + * @param WP_REST_Request $request Request data. + * @return WP_Error|WP_REST_Response + */ + public function get_items( $request ) { + $data = array(); + $resources = array( + array( + 'slug' => 'continents', + 'description' => __( 'List of supported continents, countries, and states.', 'woocommerce' ), + ), + array( + 'slug' => 'countries', + 'description' => __( 'List of supported states in a given country.', 'woocommerce' ), + ), + array( + 'slug' => 'counts', + 'description' => __( 'Information about the amount of various objects on this site.', 'woocommerce' ), + ), + array( + 'slug' => 'currencies', + 'description' => __( 'List of supported currencies.', 'woocommerce' ), + ), + ); + + foreach ( $resources as $resource ) { + $item = $this->prepare_item_for_response( (object) $resource, $request ); + $data[] = $this->prepare_response_for_collection( $item ); + } + + return rest_ensure_response( $data ); + } + + /** + * Prepare a data resource object for serialization. + * + * @param stdClass $resource Resource data. + * @param WP_REST_Request $request Request object. + * @return WP_REST_Response $response Response data. + */ + public function prepare_item_for_response( $resource, $request ) { + $data = array( + 'slug' => $resource->slug, + 'description' => $resource->description, + ); + + $data = $this->add_additional_fields_to_object( $data, $request ); + $data = $this->filter_response_by_context( $data, 'view' ); + + // Wrap the data in a response object. + $response = rest_ensure_response( $data ); + $response->add_links( $this->prepare_links( $resource ) ); + + return $response; + } + + /** + * Prepare links for the request. + * + * @param object $item Data object. + * @return array Links for the given country. + */ + protected function prepare_links( $item ) { + $links = array( + 'self' => array( + 'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $this->rest_base, $item->slug ) ), + ), + 'collection' => array( + 'href' => rest_url( sprintf( '%s/%s', $this->namespace, $this->rest_base ) ), + ), + ); + + return $links; + } + + /** + * Get the data index schema, conforming to JSON Schema. + * + * @since 3.5.0 + * @return array + */ + public function get_item_schema() { + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => 'data_index', + 'type' => 'object', + 'properties' => array( + 'slug' => array( + 'description' => __( 'Data resource ID.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'description' => array( + 'description' => __( 'Data resource description.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + ), + ); + + return $this->add_additional_fields_schema( $schema ); + } +} diff --git a/includes/api/class-wc-rest-data-countries-controller.php b/includes/api/class-wc-rest-data-countries-controller.php new file mode 100644 index 00000000000..3bc7cb65762 --- /dev/null +++ b/includes/api/class-wc-rest-data-countries-controller.php @@ -0,0 +1,240 @@ +namespace, '/' . $this->rest_base, array( + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_items' ), + 'permission_callback' => array( $this, 'get_items_permissions_check' ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + register_rest_route( + $this->namespace, '/' . $this->rest_base . '/(?P[\w-]+)', array( + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_item' ), + 'permission_callback' => array( $this, 'get_items_permissions_check' ), + 'args' => array( + 'location' => array( + 'description' => __( 'ISO3166 alpha-2 country code.', 'woocommerce' ), + 'type' => 'string', + ), + ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + } + + /** + * Get a list of countries and states. + * + * @param string $country_code Country code. + * @param WP_REST_Request $request Request data. + * @return array|mixed Response data, ready for insertion into collection data. + */ + public function get_country( $country_code = false, $request ) { + $countries = WC()->countries->get_countries(); + $states = WC()->countries->get_states(); + $data = array(); + + if ( ! array_key_exists( $country_code, $countries ) ) { + return false; + } + + $country = array( + 'code' => $country_code, + 'name' => $countries[ $country_code ], + ); + + $local_states = array(); + if ( isset( $states[ $country_code ] ) ) { + foreach ( $states[ $country_code ] as $state_code => $state_name ) { + $local_states[] = array( + 'code' => $state_code, + 'name' => $state_name, + ); + } + } + $country['states'] = $local_states; + return $country; + } + + /** + * Return the list of states for all countries. + * + * @since 3.5.0 + * @param WP_REST_Request $request Request data. + * @return WP_Error|WP_REST_Response + */ + public function get_items( $request ) { + $countries = WC()->countries->get_countries(); + $data = array(); + + foreach ( array_keys( $countries ) as $country_code ) { + $country = $this->get_country( $country_code, $request ); + $response = $this->prepare_item_for_response( $country, $request ); + $data[] = $this->prepare_response_for_collection( $response ); + } + + return rest_ensure_response( $data ); + } + + /** + * Return the list of states for a given country. + * + * @since 3.5.0 + * @param WP_REST_Request $request Request data. + * @return WP_Error|WP_REST_Response + */ + public function get_item( $request ) { + $data = $this->get_country( strtoupper( $request['location'] ), $request ); + if ( empty( $data ) ) { + return new WP_Error( 'woocommerce_rest_data_invalid_location', __( 'There are no locations matching these parameters.', 'woocommerce' ), array( 'status' => 404 ) ); + } + return $this->prepare_item_for_response( $data, $request ); + } + + /** + * Prepare the data object for response. + * + * @since 3.5.0 + * @param object $item Data object. + * @param WP_REST_Request $request Request object. + * @return WP_REST_Response $response Response data. + */ + public function prepare_item_for_response( $item, $request ) { + $data = $this->add_additional_fields_to_object( $item, $request ); + $data = $this->filter_response_by_context( $data, 'view' ); + $response = rest_ensure_response( $data ); + + $response->add_links( $this->prepare_links( $item ) ); + + /** + * Filter the states list for a country returned from the API. + * + * Allows modification of the loction data right before it is returned. + * + * @param WP_REST_Response $response The response object. + * @param array $data The original country's states list. + * @param WP_REST_Request $request Request used to generate the response. + */ + return apply_filters( 'woocommerce_rest_prepare_data_country', $response, $item, $request ); + } + + /** + * Prepare links for the request. + * + * @param object $item Data object. + * @return array Links for the given country. + */ + protected function prepare_links( $item ) { + $country_code = strtolower( $item['code'] ); + $links = array( + 'self' => array( + 'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $this->rest_base, $country_code ) ), + ), + 'collection' => array( + 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ), + ), + ); + + return $links; + } + + + /** + * Get the location schema, conforming to JSON Schema. + * + * @since 3.5.0 + * @return array + */ + public function get_item_schema() { + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => 'data_countries', + 'type' => 'object', + 'properties' => array( + 'code' => array( + 'type' => 'string', + 'description' => __( 'ISO3166 alpha-2 country code.', 'woocommerce' ), + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'name' => array( + 'type' => 'string', + 'description' => __( 'Full name of country.', 'woocommerce' ), + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'states' => array( + 'type' => 'array', + 'description' => __( 'List of states in this country.', 'woocommerce' ), + 'context' => array( 'view' ), + 'readonly' => true, + 'items' => array( + 'type' => 'object', + 'context' => array( 'view' ), + 'readonly' => true, + 'properties' => array( + 'code' => array( + 'type' => 'string', + 'description' => __( 'State code.', 'woocommerce' ), + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'name' => array( + 'type' => 'string', + 'description' => __( 'Full name of state.', 'woocommerce' ), + 'context' => array( 'view' ), + 'readonly' => true, + ), + ), + ), + ), + ), + ); + + return $this->add_additional_fields_schema( $schema ); + } +} diff --git a/includes/api/class-wc-rest-data-currencies-controller.php b/includes/api/class-wc-rest-data-currencies-controller.php new file mode 100644 index 00000000000..1b589c297fa --- /dev/null +++ b/includes/api/class-wc-rest-data-currencies-controller.php @@ -0,0 +1,221 @@ +namespace, '/' . $this->rest_base, array( + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_items' ), + 'permission_callback' => array( $this, 'get_items_permissions_check' ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + register_rest_route( + $this->namespace, '/' . $this->rest_base . '/current', array( + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_current_item' ), + 'permission_callback' => array( $this, 'get_item_permissions_check' ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + register_rest_route( + $this->namespace, '/' . $this->rest_base . '/(?P[\w-]{3})', array( + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_item' ), + 'permission_callback' => array( $this, 'get_item_permissions_check' ), + 'args' => array( + 'location' => array( + 'description' => __( 'ISO4217 currency code.', 'woocommerce' ), + 'type' => 'string', + ), + ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + } + + /** + * Get currency information. + * + * @param string $code Currency code. + * @param WP_REST_Request $request Request data. + * @return array|mixed Response data, ready for insertion into collection data. + */ + public function get_currency( $code = false, $request ) { + $currencies = get_woocommerce_currencies(); + $data = array(); + + if ( ! array_key_exists( $code, $currencies ) ) { + return false; + } + + $currency = array( + 'code' => $code, + 'name' => $currencies[ $code ], + 'symbol' => get_woocommerce_currency_symbol( $code ), + ); + + return $currency; + } + + /** + * Return the list of currencies. + * + * @param WP_REST_Request $request Request data. + * @return WP_Error|WP_REST_Response + */ + public function get_items( $request ) { + $currencies = get_woocommerce_currencies(); + foreach ( array_keys( $currencies ) as $code ) { + $currency = $this->get_currency( $code, $request ); + $response = $this->prepare_item_for_response( $currency, $request ); + $data[] = $this->prepare_response_for_collection( $response ); + } + + return rest_ensure_response( $data ); + } + + /** + * Return information for a specific currency. + * + * @param WP_REST_Request $request Request data. + * @return WP_Error|WP_REST_Response + */ + public function get_item( $request ) { + $data = $this->get_currency( strtoupper( $request['currency'] ), $request ); + if ( empty( $data ) ) { + return new WP_Error( 'woocommerce_rest_data_invalid_currency', __( 'There are no currencies matching these parameters.', 'woocommerce' ), array( 'status' => 404 ) ); + } + return $this->prepare_item_for_response( $data, $request ); + } + + /** + * Return information for the current site currency. + * + * @param WP_REST_Request $request Request data. + * @return WP_Error|WP_REST_Response + */ + public function get_current_item( $request ) { + $currency = get_option( 'woocommerce_currency' ); + return $this->prepare_item_for_response( $this->get_currency( $currency, $request ), $request ); + } + + /** + * Prepare the data object for response. + * + * @param object $item Data object. + * @param WP_REST_Request $request Request object. + * @return WP_REST_Response $response Response data. + */ + public function prepare_item_for_response( $item, $request ) { + $data = $this->add_additional_fields_to_object( $item, $request ); + $data = $this->filter_response_by_context( $data, 'view' ); + $response = rest_ensure_response( $data ); + + $response->add_links( $this->prepare_links( $item ) ); + + /** + * Filter currency returned from the API. + * + * @param WP_REST_Response $response The response object. + * @param array $item Currency data. + * @param WP_REST_Request $request Request used to generate the response. + */ + return apply_filters( 'woocommerce_rest_prepare_data_currency', $response, $item, $request ); + } + + /** + * Prepare links for the request. + * + * @param object $item Data object. + * @return array Links for the given currency. + */ + protected function prepare_links( $item ) { + $code = strtoupper( $item['code'] ); + $links = array( + 'self' => array( + 'href' => rest_url( sprintf( '/%s/%s/%s', $this->namespace, $this->rest_base, $code ) ), + ), + 'collection' => array( + 'href' => rest_url( sprintf( '/%s/%s', $this->namespace, $this->rest_base ) ), + ), + ); + + return $links; + } + + + /** + * Get the currency schema, conforming to JSON Schema. + * + * @return array + */ + public function get_item_schema() { + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => 'data_currencies', + 'type' => 'object', + 'properties' => array( + 'code' => array( + 'type' => 'string', + 'description' => __( 'ISO4217 currency code.', 'woocommerce' ), + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'name' => array( + 'type' => 'string', + 'description' => __( 'Full name of currency.', 'woocommerce' ), + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'symbol' => array( + 'type' => 'string', + 'description' => __( 'Currency symbol.', 'woocommerce' ), + 'context' => array( 'view' ), + 'readonly' => true, + ), + ), + ); + + return $this->add_additional_fields_schema( $schema ); + } +} diff --git a/includes/api/class-wc-rest-order-notes-controller.php b/includes/api/class-wc-rest-order-notes-controller.php index 035b64fce3f..da13e38b97d 100644 --- a/includes/api/class-wc-rest-order-notes-controller.php +++ b/includes/api/class-wc-rest-order-notes-controller.php @@ -24,4 +24,108 @@ class WC_REST_Order_Notes_Controller extends WC_REST_Order_Notes_V2_Controller { * @var string */ protected $namespace = 'wc/v3'; + + /** + * Prepare a single order note output for response. + * + * @param WP_Comment $note Order note object. + * @param WP_REST_Request $request Request object. + * @return WP_REST_Response $response Response data. + */ + public function prepare_item_for_response( $note, $request ) { + $data = array( + 'id' => (int) $note->comment_ID, + 'author' => __( 'WooCommerce', 'woocommerce' ) === $note->comment_author ? 'system' : $note->comment_author, + 'date_created' => wc_rest_prepare_date_response( $note->comment_date ), + 'date_created_gmt' => wc_rest_prepare_date_response( $note->comment_date_gmt ), + 'note' => $note->comment_content, + 'customer_note' => (bool) get_comment_meta( $note->comment_ID, 'is_customer_note', true ), + ); + + $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; + $data = $this->add_additional_fields_to_object( $data, $request ); + $data = $this->filter_response_by_context( $data, $context ); + + // Wrap the data in a response object. + $response = rest_ensure_response( $data ); + + $response->add_links( $this->prepare_links( $note ) ); + + /** + * Filter order note object returned from the REST API. + * + * @param WP_REST_Response $response The response object. + * @param WP_Comment $note Order note object used to create response. + * @param WP_REST_Request $request Request object. + */ + return apply_filters( 'woocommerce_rest_prepare_order_note', $response, $note, $request ); + } + + /** + * Create a single order note. + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_Error|WP_REST_Response + */ + public function create_item( $request ) { + if ( ! empty( $request['id'] ) ) { + /* translators: %s: post type */ + return new WP_Error( "woocommerce_rest_{$this->post_type}_exists", sprintf( __( 'Cannot create existing %s.', 'woocommerce' ), $this->post_type ), array( 'status' => 400 ) ); + } + + $order = wc_get_order( (int) $request['order_id'] ); + + if ( ! $order || $this->post_type !== $order->get_type() ) { + return new WP_Error( 'woocommerce_rest_order_invalid_id', __( 'Invalid order ID.', 'woocommerce' ), array( 'status' => 404 ) ); + } + + // Create the note. + $note_id = $order->add_order_note( $request['note'], $request['customer_note'], $request['added_by_user'] ); + + if ( ! $note_id ) { + return new WP_Error( 'woocommerce_api_cannot_create_order_note', __( 'Cannot create order note, please try again.', 'woocommerce' ), array( 'status' => 500 ) ); + } + + $note = get_comment( $note_id ); + $this->update_additional_fields_for_object( $note, $request ); + + /** + * Fires after a order note is created or updated via the REST API. + * + * @param WP_Comment $note New order note object. + * @param WP_REST_Request $request Request object. + * @param boolean $creating True when creating item, false when updating. + */ + do_action( 'woocommerce_rest_insert_order_note', $note, $request, true ); + + $request->set_param( 'context', 'edit' ); + $response = $this->prepare_item_for_response( $note, $request ); + $response = rest_ensure_response( $response ); + $response->set_status( 201 ); + $response->header( 'Location', rest_url( sprintf( '/%s/%s/%d', $this->namespace, str_replace( '(?P[\d]+)', $order->get_id(), $this->rest_base ), $note_id ) ) ); + + return $response; + } + + /** + * Get the Order Notes schema, conforming to JSON Schema. + * + * @return array + */ + public function get_item_schema() { + $schema = parent::get_item_schema(); + $schema['properties']['author'] = array( + 'description' => __( 'Order note author.', 'woocommerce' ), + 'type' => 'string', + 'readonly' => true, + 'context' => array( 'view', 'edit' ), + ); + $schema['properties']['added_by_user'] = array( + 'description' => __( 'If true, this note will be attributed to the current user. If false, the note will be attributed to the system.', 'woocommerce' ), + 'type' => 'boolean', + 'default' => false, + 'context' => array( 'edit' ), + ); + return $schema; + } } diff --git a/includes/api/class-wc-rest-order-refunds-controller.php b/includes/api/class-wc-rest-order-refunds-controller.php index 29546886019..0834a2b9f04 100644 --- a/includes/api/class-wc-rest-order-refunds-controller.php +++ b/includes/api/class-wc-rest-order-refunds-controller.php @@ -24,4 +24,63 @@ class WC_REST_Order_Refunds_Controller extends WC_REST_Order_Refunds_V2_Controll * @var string */ protected $namespace = 'wc/v3'; + + /** + * Prepares one object for create or update operation. + * + * @since 3.0.0 + * @param WP_REST_Request $request Request object. + * @param bool $creating If is creating a new object. + * @return WP_Error|WC_Data The prepared item, or WP_Error object on failure. + */ + protected function prepare_object_for_database( $request, $creating = false ) { + $order = wc_get_order( (int) $request['order_id'] ); + + if ( ! $order ) { + return new WP_Error( 'woocommerce_rest_invalid_order_id', __( 'Invalid order ID.', 'woocommerce' ), 404 ); + } + + if ( 0 > $request['amount'] ) { + return new WP_Error( 'woocommerce_rest_invalid_order_refund', __( 'Refund amount must be greater than zero.', 'woocommerce' ), 400 ); + } + + // Create the refund. + $refund = wc_create_refund( + array( + 'order_id' => $order->get_id(), + 'amount' => $request['amount'], + 'reason' => empty( $request['reason'] ) ? null : $request['reason'], + 'line_items' => empty( $request['line_items'] ) ? array() : $request['line_items'], + 'refund_payment' => is_bool( $request['api_refund'] ) ? $request['api_refund'] : true, + 'restock_items' => true, + ) + ); + + if ( is_wp_error( $refund ) ) { + return new WP_Error( 'woocommerce_rest_cannot_create_order_refund', $refund->get_error_message(), 500 ); + } + + if ( ! $refund ) { + return new WP_Error( 'woocommerce_rest_cannot_create_order_refund', __( 'Cannot create order refund, please try again.', 'woocommerce' ), 500 ); + } + + if ( ! empty( $request['meta_data'] ) && is_array( $request['meta_data'] ) ) { + foreach ( $request['meta_data'] as $meta ) { + $refund->update_meta_data( $meta['key'], $meta['value'], isset( $meta['id'] ) ? $meta['id'] : '' ); + } + $refund->save_meta_data(); + } + + /** + * Filters an object before it is inserted via the REST API. + * + * The dynamic portion of the hook name, `$this->post_type`, + * refers to the object type slug. + * + * @param WC_Data $coupon Object object. + * @param WP_REST_Request $request Request object. + * @param bool $creating If is creating a new object. + */ + return apply_filters( "woocommerce_rest_pre_insert_{$this->post_type}_object", $refund, $request, $creating ); + } } diff --git a/includes/api/class-wc-rest-orders-controller.php b/includes/api/class-wc-rest-orders-controller.php index 0075619ce40..1e7b2bfa3ea 100644 --- a/includes/api/class-wc-rest-orders-controller.php +++ b/includes/api/class-wc-rest-orders-controller.php @@ -24,4 +24,52 @@ class WC_REST_Orders_Controller extends WC_REST_Orders_V2_Controller { * @var string */ protected $namespace = 'wc/v3'; + + /** + * Prepare objects query. + * + * @since 3.0.0 + * @param WP_REST_Request $request Full details about the request. + * @return array + */ + protected function prepare_objects_query( $request ) { + // This is needed to get around an array to string notice in WC_REST_Orders_Controller::prepare_objects_query. + $statuses = $request['status']; + unset( $request['status'] ); + $args = parent::prepare_objects_query( $request ); + + $args['post_status'] = array(); + foreach ( $statuses as $status ) { + if ( 'any' === $status ) { + // Set status to "any" and short-circuit out. + $args['post_status'] = 'any'; + break; + } + $args['post_status'][] = 'wc-' . $status; + } + + return $args; + } + + /** + * Get the query params for collections. + * + * @return array + */ + public function get_collection_params() { + $params = parent::get_collection_params(); + + $params['status'] = array( + 'default' => 'any', + 'description' => __( 'Limit result set to orders assigned a specific status.', 'woocommerce' ), + 'type' => 'array', + 'items' => array( + 'type' => 'string', + 'enum' => array_merge( array( 'any' ), $this->get_order_statuses() ), + ), + 'validate_callback' => 'rest_validate_request_arg', + ); + + return $params; + } } diff --git a/includes/api/class-wc-rest-payment-gateways-controller.php b/includes/api/class-wc-rest-payment-gateways-controller.php index 17bec9c2901..88f09312425 100644 --- a/includes/api/class-wc-rest-payment-gateways-controller.php +++ b/includes/api/class-wc-rest-payment-gateways-controller.php @@ -24,4 +24,203 @@ class WC_REST_Payment_Gateways_Controller extends WC_REST_Payment_Gateways_V2_Co * @var string */ protected $namespace = 'wc/v3'; + + /** + * Prepare a payment gateway for response. + * + * @param WC_Payment_Gateway $gateway Payment gateway object. + * @param WP_REST_Request $request Request object. + * @return WP_REST_Response $response Response data. + */ + public function prepare_item_for_response( $gateway, $request ) { + $order = (array) get_option( 'woocommerce_gateway_order' ); + $item = array( + 'id' => $gateway->id, + 'title' => $gateway->title, + 'description' => $gateway->description, + 'order' => isset( $order[ $gateway->id ] ) ? $order[ $gateway->id ] : '', + 'enabled' => ( 'yes' === $gateway->enabled ), + 'method_title' => $gateway->get_method_title(), + 'method_description' => $gateway->get_method_description(), + 'method_supports' => $gateway->supports, + 'settings' => $this->get_settings( $gateway ), + ); + + $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; + $data = $this->add_additional_fields_to_object( $item, $request ); + $data = $this->filter_response_by_context( $data, $context ); + + $response = rest_ensure_response( $data ); + $response->add_links( $this->prepare_links( $gateway, $request ) ); + + /** + * Filter payment gateway objects returned from the REST API. + * + * @param WP_REST_Response $response The response object. + * @param WC_Payment_Gateway $gateway Payment gateway object. + * @param WP_REST_Request $request Request object. + */ + return apply_filters( 'woocommerce_rest_prepare_payment_gateway', $response, $gateway, $request ); + } + + /** + * Return settings associated with this payment gateway. + * + * @param WC_Payment_Gateway $gateway Gateway instance. + * + * @return array + */ + public function get_settings( $gateway ) { + $settings = array(); + $gateway->init_form_fields(); + foreach ( $gateway->form_fields as $id => $field ) { + // Make sure we at least have a title and type. + if ( empty( $field['title'] ) || empty( $field['type'] ) ) { + continue; + } + + // Ignore 'enabled' and 'description' which get included elsewhere. + if ( in_array( $id, array( 'enabled', 'description' ), true ) ) { + continue; + } + + $data = array( + 'id' => $id, + 'label' => empty( $field['label'] ) ? $field['title'] : $field['label'], + 'description' => empty( $field['description'] ) ? '' : $field['description'], + 'type' => $field['type'], + 'value' => empty( $gateway->settings[ $id ] ) ? '' : $gateway->settings[ $id ], + 'default' => empty( $field['default'] ) ? '' : $field['default'], + 'tip' => empty( $field['description'] ) ? '' : $field['description'], + 'placeholder' => empty( $field['placeholder'] ) ? '' : $field['placeholder'], + ); + if ( ! empty( $field['options'] ) ) { + $data['options'] = $field['options']; + } + $settings[ $id ] = $data; + } + return $settings; + } + + /** + * Get the payment gateway schema, conforming to JSON Schema. + * + * @return array + */ + public function get_item_schema() { + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => 'payment_gateway', + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Payment gateway ID.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'title' => array( + 'description' => __( 'Payment gateway title on checkout.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'description' => array( + 'description' => __( 'Payment gateway description on checkout.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'order' => array( + 'description' => __( 'Payment gateway sort order.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'arg_options' => array( + 'sanitize_callback' => 'absint', + ), + ), + 'enabled' => array( + 'description' => __( 'Payment gateway enabled status.', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view', 'edit' ), + ), + 'method_title' => array( + 'description' => __( 'Payment gateway method title.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'method_description' => array( + 'description' => __( 'Payment gateway method description.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'method_supports' => array( + 'description' => __( 'Supported features for this payment gateway.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + 'items' => array( + 'type' => 'string', + ), + ), + 'settings' => array( + 'description' => __( 'Payment gateway settings.', 'woocommerce' ), + 'type' => 'object', + 'context' => array( 'view', 'edit' ), + 'properties' => array( + 'id' => array( + 'description' => __( 'A unique identifier for the setting.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'label' => array( + 'description' => __( 'A human readable label for the setting used in interfaces.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'description' => array( + 'description' => __( 'A human readable description for the setting used in interfaces.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'type' => array( + 'description' => __( 'Type of setting.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'enum' => array( 'text', 'email', 'number', 'color', 'password', 'textarea', 'select', 'multiselect', 'radio', 'image_width', 'checkbox' ), + 'readonly' => true, + ), + 'value' => array( + 'description' => __( 'Setting value.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'default' => array( + 'description' => __( 'Default value for the setting.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'tip' => array( + 'description' => __( 'Additional help text shown to the user about the setting.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'placeholder' => array( + 'description' => __( 'Placeholder text to be displayed in text inputs.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + ), + ), + ), + ); + + return $this->add_additional_fields_schema( $schema ); + } } diff --git a/includes/api/class-wc-rest-product-variations-controller.php b/includes/api/class-wc-rest-product-variations-controller.php index 1334edbe279..3f73093ec0e 100644 --- a/includes/api/class-wc-rest-product-variations-controller.php +++ b/includes/api/class-wc-rest-product-variations-controller.php @@ -24,4 +24,716 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Product_Variations_V * @var string */ protected $namespace = 'wc/v3'; + + /** + * Prepare a single variation output for response. + * + * @param WC_Data $object Object data. + * @param WP_REST_Request $request Request object. + * @return WP_REST_Response + */ + public function prepare_object_for_response( $object, $request ) { + $data = array( + 'id' => $object->get_id(), + 'date_created' => wc_rest_prepare_date_response( $object->get_date_created(), false ), + 'date_created_gmt' => wc_rest_prepare_date_response( $object->get_date_created() ), + 'date_modified' => wc_rest_prepare_date_response( $object->get_date_modified(), false ), + 'date_modified_gmt' => wc_rest_prepare_date_response( $object->get_date_modified() ), + 'description' => wc_format_content( $object->get_description() ), + 'permalink' => $object->get_permalink(), + 'sku' => $object->get_sku(), + 'price' => $object->get_price(), + 'regular_price' => $object->get_regular_price(), + 'sale_price' => $object->get_sale_price(), + 'date_on_sale_from' => wc_rest_prepare_date_response( $object->get_date_on_sale_from(), false ), + 'date_on_sale_from_gmt' => wc_rest_prepare_date_response( $object->get_date_on_sale_from() ), + 'date_on_sale_to' => wc_rest_prepare_date_response( $object->get_date_on_sale_to(), false ), + 'date_on_sale_to_gmt' => wc_rest_prepare_date_response( $object->get_date_on_sale_to() ), + 'on_sale' => $object->is_on_sale(), + 'status' => $object->get_status(), + 'purchasable' => $object->is_purchasable(), + 'virtual' => $object->is_virtual(), + 'downloadable' => $object->is_downloadable(), + 'downloads' => $this->get_downloads( $object ), + 'download_limit' => '' !== $object->get_download_limit() ? (int) $object->get_download_limit() : -1, + 'download_expiry' => '' !== $object->get_download_expiry() ? (int) $object->get_download_expiry() : -1, + 'tax_status' => $object->get_tax_status(), + 'tax_class' => $object->get_tax_class(), + 'manage_stock' => $object->managing_stock(), + 'stock_quantity' => $object->get_stock_quantity(), + 'in_stock' => $object->is_in_stock(), + 'backorders' => $object->get_backorders(), + 'backorders_allowed' => $object->backorders_allowed(), + 'backordered' => $object->is_on_backorder(), + 'weight' => $object->get_weight(), + 'dimensions' => array( + 'length' => $object->get_length(), + 'width' => $object->get_width(), + 'height' => $object->get_height(), + ), + 'shipping_class' => $object->get_shipping_class(), + 'shipping_class_id' => $object->get_shipping_class_id(), + 'image' => $this->get_image( $object ), + 'attributes' => $this->get_attributes( $object ), + 'menu_order' => $object->get_menu_order(), + 'meta_data' => $object->get_meta_data(), + ); + + $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; + $data = $this->add_additional_fields_to_object( $data, $request ); + $data = $this->filter_response_by_context( $data, $context ); + $response = rest_ensure_response( $data ); + $response->add_links( $this->prepare_links( $object, $request ) ); + + /** + * Filter the data for a response. + * + * The dynamic portion of the hook name, $this->post_type, + * refers to object type being prepared for the response. + * + * @param WP_REST_Response $response The response object. + * @param WC_Data $object Object data. + * @param WP_REST_Request $request Request object. + */ + return apply_filters( "woocommerce_rest_prepare_{$this->post_type}_object", $response, $object, $request ); + } + + /** + * Prepare a single variation for create or update. + * + * @param WP_REST_Request $request Request object. + * @param bool $creating If is creating a new object. + * @return WP_Error|WC_Data + */ + protected function prepare_object_for_database( $request, $creating = false ) { + if ( isset( $request['id'] ) ) { + $variation = wc_get_product( absint( $request['id'] ) ); + } else { + $variation = new WC_Product_Variation(); + } + + $variation->set_parent_id( absint( $request['product_id'] ) ); + + // Status. + if ( isset( $request['status'] ) ) { + $variation->set_status( get_post_status_object( $request['status'] ) ? $request['status'] : 'draft' ); + } + + // SKU. + if ( isset( $request['sku'] ) ) { + $variation->set_sku( wc_clean( $request['sku'] ) ); + } + + // Thumbnail. + if ( isset( $request['image'] ) ) { + if ( is_array( $request['image'] ) ) { + $variation = $this->set_variation_image( $variation, $request['image'] ); + } else { + $variation->set_image_id( '' ); + } + } + + // Virtual variation. + if ( isset( $request['virtual'] ) ) { + $variation->set_virtual( $request['virtual'] ); + } + + // Downloadable variation. + if ( isset( $request['downloadable'] ) ) { + $variation->set_downloadable( $request['downloadable'] ); + } + + // Downloads. + if ( $variation->get_downloadable() ) { + // Downloadable files. + if ( isset( $request['downloads'] ) && is_array( $request['downloads'] ) ) { + $variation = $this->save_downloadable_files( $variation, $request['downloads'] ); + } + + // Download limit. + if ( isset( $request['download_limit'] ) ) { + $variation->set_download_limit( $request['download_limit'] ); + } + + // Download expiry. + if ( isset( $request['download_expiry'] ) ) { + $variation->set_download_expiry( $request['download_expiry'] ); + } + } + + // Shipping data. + $variation = $this->save_product_shipping_data( $variation, $request ); + + // Stock handling. + if ( isset( $request['manage_stock'] ) ) { + $variation->set_manage_stock( $request['manage_stock'] ); + } + + if ( isset( $request['in_stock'] ) ) { + $variation->set_stock_status( true === $request['in_stock'] ? 'instock' : 'outofstock' ); + } + + if ( isset( $request['backorders'] ) ) { + $variation->set_backorders( $request['backorders'] ); + } + + if ( $variation->get_manage_stock() ) { + if ( isset( $request['stock_quantity'] ) ) { + $variation->set_stock_quantity( $request['stock_quantity'] ); + } elseif ( isset( $request['inventory_delta'] ) ) { + $stock_quantity = wc_stock_amount( $variation->get_stock_quantity() ); + $stock_quantity += wc_stock_amount( $request['inventory_delta'] ); + $variation->set_stock_quantity( $stock_quantity ); + } + } else { + $variation->set_backorders( 'no' ); + $variation->set_stock_quantity( '' ); + } + + // Regular Price. + if ( isset( $request['regular_price'] ) ) { + $variation->set_regular_price( $request['regular_price'] ); + } + + // Sale Price. + if ( isset( $request['sale_price'] ) ) { + $variation->set_sale_price( $request['sale_price'] ); + } + + if ( isset( $request['date_on_sale_from'] ) ) { + $variation->set_date_on_sale_from( $request['date_on_sale_from'] ); + } + + if ( isset( $request['date_on_sale_from_gmt'] ) ) { + $variation->set_date_on_sale_from( $request['date_on_sale_from_gmt'] ? strtotime( $request['date_on_sale_from_gmt'] ) : null ); + } + + if ( isset( $request['date_on_sale_to'] ) ) { + $variation->set_date_on_sale_to( $request['date_on_sale_to'] ); + } + + if ( isset( $request['date_on_sale_to_gmt'] ) ) { + $variation->set_date_on_sale_to( $request['date_on_sale_to_gmt'] ? strtotime( $request['date_on_sale_to_gmt'] ) : null ); + } + + // Tax class. + if ( isset( $request['tax_class'] ) ) { + $variation->set_tax_class( $request['tax_class'] ); + } + + // Description. + if ( isset( $request['description'] ) ) { + $variation->set_description( wp_kses_post( $request['description'] ) ); + } + + // Update taxonomies. + if ( isset( $request['attributes'] ) ) { + $attributes = array(); + $parent = wc_get_product( $variation->get_parent_id() ); + $parent_attributes = $parent->get_attributes(); + + foreach ( $request['attributes'] as $attribute ) { + $attribute_id = 0; + $attribute_name = ''; + + // Check ID for global attributes or name for product attributes. + if ( ! empty( $attribute['id'] ) ) { + $attribute_id = absint( $attribute['id'] ); + $attribute_name = wc_attribute_taxonomy_name_by_id( $attribute_id ); + } elseif ( ! empty( $attribute['name'] ) ) { + $attribute_name = sanitize_title( $attribute['name'] ); + } + + if ( ! $attribute_id && ! $attribute_name ) { + continue; + } + + if ( ! isset( $parent_attributes[ $attribute_name ] ) || ! $parent_attributes[ $attribute_name ]->get_variation() ) { + continue; + } + + $attribute_key = sanitize_title( $parent_attributes[ $attribute_name ]->get_name() ); + $attribute_value = isset( $attribute['option'] ) ? wc_clean( stripslashes( $attribute['option'] ) ) : ''; + + if ( $parent_attributes[ $attribute_name ]->is_taxonomy() ) { + // If dealing with a taxonomy, we need to get the slug from the name posted to the API. + $term = get_term_by( 'name', $attribute_value, $attribute_name ); + + if ( $term && ! is_wp_error( $term ) ) { + $attribute_value = $term->slug; + } else { + $attribute_value = sanitize_title( $attribute_value ); + } + } + + $attributes[ $attribute_key ] = $attribute_value; + } + + $variation->set_attributes( $attributes ); + } + + // Menu order. + if ( $request['menu_order'] ) { + $variation->set_menu_order( $request['menu_order'] ); + } + + // Meta data. + if ( is_array( $request['meta_data'] ) ) { + foreach ( $request['meta_data'] as $meta ) { + $variation->update_meta_data( $meta['key'], $meta['value'], isset( $meta['id'] ) ? $meta['id'] : '' ); + } + } + + /** + * Filters an object before it is inserted via the REST API. + * + * The dynamic portion of the hook name, `$this->post_type`, + * refers to the object type slug. + * + * @param WC_Data $variation Object object. + * @param WP_REST_Request $request Request object. + * @param bool $creating If is creating a new object. + */ + return apply_filters( "woocommerce_rest_pre_insert_{$this->post_type}_object", $variation, $request, $creating ); + } + + /** + * Get the image for a product variation. + * + * @param WC_Product_Variation $variation Variation data. + * @return array + */ + protected function get_image( $variation ) { + if ( ! has_post_thumbnail( $variation->get_id() ) ) { + return; + } + + $attachment_id = $variation->get_image_id(); + $attachment_post = get_post( $attachment_id ); + if ( is_null( $attachment_post ) ) { + return; + } + + $attachment = wp_get_attachment_image_src( $attachment_id, 'full' ); + if ( ! is_array( $attachment ) ) { + return; + } + + if ( ! isset( $image ) ) { + return array( + 'id' => (int) $attachment_id, + 'date_created' => wc_rest_prepare_date_response( $attachment_post->post_date, false ), + 'date_created_gmt' => wc_rest_prepare_date_response( strtotime( $attachment_post->post_date_gmt ) ), + 'date_modified' => wc_rest_prepare_date_response( $attachment_post->post_modified, false ), + 'date_modified_gmt' => wc_rest_prepare_date_response( strtotime( $attachment_post->post_modified_gmt ) ), + 'src' => current( $attachment ), + 'name' => get_the_title( $attachment_id ), + 'alt' => get_post_meta( $attachment_id, '_wp_attachment_image_alt', true ), + ); + } + } + + /** + * Set variation image. + * + * @throws WC_REST_Exception REST API exceptions. + * @param WC_Product_Variation $variation Variation instance. + * @param array $image Image data. + * @return WC_Product_Variation + */ + protected function set_variation_image( $variation, $image ) { + $attachment_id = isset( $image['id'] ) ? absint( $image['id'] ) : 0; + + if ( 0 === $attachment_id && isset( $image['src'] ) ) { + $upload = wc_rest_upload_image_from_url( esc_url_raw( $image['src'] ) ); + + if ( is_wp_error( $upload ) ) { + if ( ! apply_filters( 'woocommerce_rest_suppress_image_upload_error', false, $upload, $variation->get_id(), array( $image ) ) ) { + throw new WC_REST_Exception( 'woocommerce_variation_image_upload_error', $upload->get_error_message(), 400 ); + } + } + + $attachment_id = wc_rest_set_uploaded_image_as_attachment( $upload, $variation->get_id() ); + } + + if ( ! wp_attachment_is_image( $attachment_id ) ) { + /* translators: %s: attachment ID */ + throw new WC_REST_Exception( 'woocommerce_variation_invalid_image_id', sprintf( __( '#%s is an invalid image ID.', 'woocommerce' ), $attachment_id ), 400 ); + } + + $variation->set_image_id( $attachment_id ); + + // Set the image alt if present. + if ( ! empty( $image['alt'] ) ) { + update_post_meta( $attachment_id, '_wp_attachment_image_alt', wc_clean( $image['alt'] ) ); + } + + // Set the image name if present. + if ( ! empty( $image['name'] ) ) { + wp_update_post( + array( + 'ID' => $attachment_id, + 'post_title' => $image['name'], + ) + ); + } + + return $variation; + } + + /** + * Get the Variation's schema, conforming to JSON Schema. + * + * @return array + */ + public function get_item_schema() { + $weight_unit = get_option( 'woocommerce_weight_unit' ); + $dimension_unit = get_option( 'woocommerce_dimension_unit' ); + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => $this->post_type, + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_created' => array( + 'description' => __( "The date the variation was created, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_modified' => array( + 'description' => __( "The date the variation was last modified, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'description' => array( + 'description' => __( 'Variation description.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'permalink' => array( + 'description' => __( 'Variation URL.', 'woocommerce' ), + 'type' => 'string', + 'format' => 'uri', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'sku' => array( + 'description' => __( 'Unique identifier.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'price' => array( + 'description' => __( 'Current variation price.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'regular_price' => array( + 'description' => __( 'Variation regular price.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'sale_price' => array( + 'description' => __( 'Variation sale price.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'date_on_sale_from' => array( + 'description' => __( "Start date of sale price, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + ), + 'date_on_sale_from_gmt' => array( + 'description' => __( 'Start date of sale price, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + ), + 'date_on_sale_to' => array( + 'description' => __( "End date of sale price, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + ), + 'date_on_sale_to_gmt' => array( + 'description' => __( "End date of sale price, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + ), + 'on_sale' => array( + 'description' => __( 'Shows if the variation is on sale.', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'status' => array( + 'description' => __( 'Variation status.', 'woocommerce' ), + 'type' => 'string', + 'default' => 'publish', + 'enum' => array_keys( get_post_statuses() ), + 'context' => array( 'view', 'edit' ), + ), + 'purchasable' => array( + 'description' => __( 'Shows if the variation can be bought.', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'virtual' => array( + 'description' => __( 'If the variation is virtual.', 'woocommerce' ), + 'type' => 'boolean', + 'default' => false, + 'context' => array( 'view', 'edit' ), + ), + 'downloadable' => array( + 'description' => __( 'If the variation is downloadable.', 'woocommerce' ), + 'type' => 'boolean', + 'default' => false, + 'context' => array( 'view', 'edit' ), + ), + 'downloads' => array( + 'description' => __( 'List of downloadable files.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'File MD5 hash.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'name' => array( + 'description' => __( 'File name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'file' => array( + 'description' => __( 'File URL.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + ), + 'download_limit' => array( + 'description' => __( 'Number of times downloadable files can be downloaded after purchase.', 'woocommerce' ), + 'type' => 'integer', + 'default' => -1, + 'context' => array( 'view', 'edit' ), + ), + 'download_expiry' => array( + 'description' => __( 'Number of days until access to downloadable files expires.', 'woocommerce' ), + 'type' => 'integer', + 'default' => -1, + 'context' => array( 'view', 'edit' ), + ), + 'tax_status' => array( + 'description' => __( 'Tax status.', 'woocommerce' ), + 'type' => 'string', + 'default' => 'taxable', + 'enum' => array( 'taxable', 'shipping', 'none' ), + 'context' => array( 'view', 'edit' ), + ), + 'tax_class' => array( + 'description' => __( 'Tax class.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'manage_stock' => array( + 'description' => __( 'Stock management at variation level.', 'woocommerce' ), + 'type' => 'boolean', + 'default' => false, + 'context' => array( 'view', 'edit' ), + ), + 'stock_quantity' => array( + 'description' => __( 'Stock quantity.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'in_stock' => array( + 'description' => __( 'Controls whether or not the variation is listed as "in stock" or "out of stock" on the frontend.', 'woocommerce' ), + 'type' => 'boolean', + 'default' => true, + 'context' => array( 'view', 'edit' ), + ), + 'backorders' => array( + 'description' => __( 'If managing stock, this controls if backorders are allowed.', 'woocommerce' ), + 'type' => 'string', + 'default' => 'no', + 'enum' => array( 'no', 'notify', 'yes' ), + 'context' => array( 'view', 'edit' ), + ), + 'backorders_allowed' => array( + 'description' => __( 'Shows if backorders are allowed.', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'backordered' => array( + 'description' => __( 'Shows if the variation is on backordered.', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'weight' => array( + /* translators: %s: weight unit */ + 'description' => sprintf( __( 'Variation weight (%s).', 'woocommerce' ), $weight_unit ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'dimensions' => array( + 'description' => __( 'Variation dimensions.', 'woocommerce' ), + 'type' => 'object', + 'context' => array( 'view', 'edit' ), + 'properties' => array( + 'length' => array( + /* translators: %s: dimension unit */ + 'description' => sprintf( __( 'Variation length (%s).', 'woocommerce' ), $dimension_unit ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'width' => array( + /* translators: %s: dimension unit */ + 'description' => sprintf( __( 'Variation width (%s).', 'woocommerce' ), $dimension_unit ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'height' => array( + /* translators: %s: dimension unit */ + 'description' => sprintf( __( 'Variation height (%s).', 'woocommerce' ), $dimension_unit ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + 'shipping_class' => array( + 'description' => __( 'Shipping class slug.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'shipping_class_id' => array( + 'description' => __( 'Shipping class ID.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'image' => array( + 'description' => __( 'Variation image data.', 'woocommerce' ), + 'type' => 'object', + 'context' => array( 'view', 'edit' ), + 'properties' => array( + 'id' => array( + 'description' => __( 'Image ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'date_created' => array( + 'description' => __( "The date the image was created, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_created_gmt' => array( + 'description' => __( 'The date the image was created, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_modified' => array( + 'description' => __( "The date the image was last modified, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_modified_gmt' => array( + 'description' => __( 'The date the image was last modified, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'src' => array( + 'description' => __( 'Image URL.', 'woocommerce' ), + 'type' => 'string', + 'format' => 'uri', + 'context' => array( 'view', 'edit' ), + ), + 'name' => array( + 'description' => __( 'Image name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'alt' => array( + 'description' => __( 'Image alternative text.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + 'attributes' => array( + 'description' => __( 'List of attributes.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Attribute ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'name' => array( + 'description' => __( 'Attribute name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'option' => array( + 'description' => __( 'Selected attribute term name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + ), + 'menu_order' => array( + 'description' => __( 'Menu order, used to custom sort products.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'meta_data' => array( + 'description' => __( 'Meta data.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Meta ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'key' => array( + 'description' => __( 'Meta key.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'value' => array( + 'description' => __( 'Meta value.', 'woocommerce' ), + 'type' => 'mixed', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + ), + ), + ); + return $this->add_additional_fields_schema( $schema ); + } } diff --git a/includes/api/class-wc-rest-products-controller.php b/includes/api/class-wc-rest-products-controller.php index 1073cf6ef40..9583e9a1fd2 100644 --- a/includes/api/class-wc-rest-products-controller.php +++ b/includes/api/class-wc-rest-products-controller.php @@ -24,4 +24,767 @@ class WC_REST_Products_Controller extends WC_REST_Products_V2_Controller { * @var string */ protected $namespace = 'wc/v3'; + + /** + * Get the images for a product or product variation. + * + * @param WC_Product|WC_Product_Variation $product Product instance. + * @return array + */ + protected function get_images( $product ) { + $images = array(); + $attachment_ids = array(); + + // Add featured image. + if ( has_post_thumbnail( $product->get_id() ) ) { + $attachment_ids[] = $product->get_image_id(); + } + + // Add gallery images. + $attachment_ids = array_merge( $attachment_ids, $product->get_gallery_image_ids() ); + + // Build image data. + foreach ( $attachment_ids as $attachment_id ) { + $attachment_post = get_post( $attachment_id ); + if ( is_null( $attachment_post ) ) { + continue; + } + + $attachment = wp_get_attachment_image_src( $attachment_id, 'full' ); + if ( ! is_array( $attachment ) ) { + continue; + } + + $images[] = array( + 'id' => (int) $attachment_id, + 'date_created' => wc_rest_prepare_date_response( $attachment_post->post_date, false ), + 'date_created_gmt' => wc_rest_prepare_date_response( strtotime( $attachment_post->post_date_gmt ) ), + 'date_modified' => wc_rest_prepare_date_response( $attachment_post->post_modified, false ), + 'date_modified_gmt' => wc_rest_prepare_date_response( strtotime( $attachment_post->post_modified_gmt ) ), + 'src' => current( $attachment ), + 'name' => get_the_title( $attachment_id ), + 'alt' => get_post_meta( $attachment_id, '_wp_attachment_image_alt', true ), + ); + } + + return $images; + } + + /** + * Make extra product orderby features supported by WooCommerce available to the WC API. + * This includes 'price', 'popularity', and 'rating'. + * + * @param WP_REST_Request $request Request data. + * @return array + */ + protected function prepare_objects_query( $request ) { + $args = parent::prepare_objects_query( $request ); + + $orderby = $request->get_param( 'orderby' ); + $order = $request->get_param( 'order' ); + + $ordering_args = WC()->query->get_catalog_ordering_args( $orderby, $order ); + $args['orderby'] = $ordering_args['orderby']; + $args['order'] = $ordering_args['order']; + if ( $ordering_args['meta_key'] ) { + $args['meta_key'] = $ordering_args['meta_key']; // WPCS: slow query ok. + } + + return $args; + } + + /** + * Set product images. + * + * @throws WC_REST_Exception REST API exceptions. + * @param WC_Product $product Product instance. + * @param array $images Images data. + * @return WC_Product + */ + protected function set_product_images( $product, $images ) { + if ( is_array( $images ) ) { + $gallery = array(); + + foreach ( $images as $index => $image ) { + $attachment_id = isset( $image['id'] ) ? absint( $image['id'] ) : 0; + + if ( 0 === $attachment_id && isset( $image['src'] ) ) { + $upload = wc_rest_upload_image_from_url( esc_url_raw( $image['src'] ) ); + + if ( is_wp_error( $upload ) ) { + if ( ! apply_filters( 'woocommerce_rest_suppress_image_upload_error', false, $upload, $product->get_id(), $images ) ) { + throw new WC_REST_Exception( 'woocommerce_product_image_upload_error', $upload->get_error_message(), 400 ); + } else { + continue; + } + } + + $attachment_id = wc_rest_set_uploaded_image_as_attachment( $upload, $product->get_id() ); + } + + if ( ! wp_attachment_is_image( $attachment_id ) ) { + /* translators: %s: image ID */ + throw new WC_REST_Exception( 'woocommerce_product_invalid_image_id', sprintf( __( '#%s is an invalid image ID.', 'woocommerce' ), $attachment_id ), 400 ); + } + + $featured_image = $product->get_image_id(); + + if ( 0 === $index ) { + $product->set_image_id( $attachment_id ); + } else { + $gallery[] = $attachment_id; + } + + // Set the image alt if present. + if ( ! empty( $image['alt'] ) ) { + update_post_meta( $attachment_id, '_wp_attachment_image_alt', wc_clean( $image['alt'] ) ); + } + + // Set the image name if present. + if ( ! empty( $image['name'] ) ) { + wp_update_post( + array( + 'ID' => $attachment_id, + 'post_title' => $image['name'], + ) + ); + } + } + + $product->set_gallery_image_ids( $gallery ); + } else { + $product->set_image_id( '' ); + $product->set_gallery_image_ids( array() ); + } + + return $product; + } + + /** + * Add new options for 'orderby' to the collection params. + * + * @return array + */ + public function get_collection_params() { + $params = parent::get_collection_params(); + $params['orderby']['enum'] = array_merge( $params['orderby']['enum'], array( 'price', 'popularity', 'rating' ) ); + return $params; + } + + /** + * Get the Product's schema, conforming to JSON Schema. + * + * @return array + */ + public function get_item_schema() { + $weight_unit = get_option( 'woocommerce_weight_unit' ); + $dimension_unit = get_option( 'woocommerce_dimension_unit' ); + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => $this->post_type, + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'name' => array( + 'description' => __( 'Product name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'slug' => array( + 'description' => __( 'Product slug.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'permalink' => array( + 'description' => __( 'Product URL.', 'woocommerce' ), + 'type' => 'string', + 'format' => 'uri', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_created' => array( + 'description' => __( "The date the product was created, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_created_gmt' => array( + 'description' => __( 'The date the product was created, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_modified' => array( + 'description' => __( "The date the product was last modified, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_modified_gmt' => array( + 'description' => __( 'The date the product was last modified, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'type' => array( + 'description' => __( 'Product type.', 'woocommerce' ), + 'type' => 'string', + 'default' => 'simple', + 'enum' => array_keys( wc_get_product_types() ), + 'context' => array( 'view', 'edit' ), + ), + 'status' => array( + 'description' => __( 'Product status (post status).', 'woocommerce' ), + 'type' => 'string', + 'default' => 'publish', + 'enum' => array_keys( get_post_statuses() ), + 'context' => array( 'view', 'edit' ), + ), + 'featured' => array( + 'description' => __( 'Featured product.', 'woocommerce' ), + 'type' => 'boolean', + 'default' => false, + 'context' => array( 'view', 'edit' ), + ), + 'catalog_visibility' => array( + 'description' => __( 'Catalog visibility.', 'woocommerce' ), + 'type' => 'string', + 'default' => 'visible', + 'enum' => array( 'visible', 'catalog', 'search', 'hidden' ), + 'context' => array( 'view', 'edit' ), + ), + 'description' => array( + 'description' => __( 'Product description.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'short_description' => array( + 'description' => __( 'Product short description.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'sku' => array( + 'description' => __( 'Unique identifier.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'price' => array( + 'description' => __( 'Current product price.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'regular_price' => array( + 'description' => __( 'Product regular price.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'sale_price' => array( + 'description' => __( 'Product sale price.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'date_on_sale_from' => array( + 'description' => __( "Start date of sale price, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + ), + 'date_on_sale_from_gmt' => array( + 'description' => __( 'Start date of sale price, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + ), + 'date_on_sale_to' => array( + 'description' => __( "End date of sale price, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + ), + 'date_on_sale_to_gmt' => array( + 'description' => __( "End date of sale price, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + ), + 'price_html' => array( + 'description' => __( 'Price formatted in HTML.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'on_sale' => array( + 'description' => __( 'Shows if the product is on sale.', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'purchasable' => array( + 'description' => __( 'Shows if the product can be bought.', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'total_sales' => array( + 'description' => __( 'Amount of sales.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'virtual' => array( + 'description' => __( 'If the product is virtual.', 'woocommerce' ), + 'type' => 'boolean', + 'default' => false, + 'context' => array( 'view', 'edit' ), + ), + 'downloadable' => array( + 'description' => __( 'If the product is downloadable.', 'woocommerce' ), + 'type' => 'boolean', + 'default' => false, + 'context' => array( 'view', 'edit' ), + ), + 'downloads' => array( + 'description' => __( 'List of downloadable files.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'File MD5 hash.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'name' => array( + 'description' => __( 'File name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'file' => array( + 'description' => __( 'File URL.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + ), + 'download_limit' => array( + 'description' => __( 'Number of times downloadable files can be downloaded after purchase.', 'woocommerce' ), + 'type' => 'integer', + 'default' => -1, + 'context' => array( 'view', 'edit' ), + ), + 'download_expiry' => array( + 'description' => __( 'Number of days until access to downloadable files expires.', 'woocommerce' ), + 'type' => 'integer', + 'default' => -1, + 'context' => array( 'view', 'edit' ), + ), + 'external_url' => array( + 'description' => __( 'Product external URL. Only for external products.', 'woocommerce' ), + 'type' => 'string', + 'format' => 'uri', + 'context' => array( 'view', 'edit' ), + ), + 'button_text' => array( + 'description' => __( 'Product external button text. Only for external products.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'tax_status' => array( + 'description' => __( 'Tax status.', 'woocommerce' ), + 'type' => 'string', + 'default' => 'taxable', + 'enum' => array( 'taxable', 'shipping', 'none' ), + 'context' => array( 'view', 'edit' ), + ), + 'tax_class' => array( + 'description' => __( 'Tax class.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'manage_stock' => array( + 'description' => __( 'Stock management at product level.', 'woocommerce' ), + 'type' => 'boolean', + 'default' => false, + 'context' => array( 'view', 'edit' ), + ), + 'stock_quantity' => array( + 'description' => __( 'Stock quantity.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'in_stock' => array( + 'description' => __( 'Controls whether or not the product is listed as "in stock" or "out of stock" on the frontend.', 'woocommerce' ), + 'type' => 'boolean', + 'default' => true, + 'context' => array( 'view', 'edit' ), + ), + 'backorders' => array( + 'description' => __( 'If managing stock, this controls if backorders are allowed.', 'woocommerce' ), + 'type' => 'string', + 'default' => 'no', + 'enum' => array( 'no', 'notify', 'yes' ), + 'context' => array( 'view', 'edit' ), + ), + 'backorders_allowed' => array( + 'description' => __( 'Shows if backorders are allowed.', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'backordered' => array( + 'description' => __( 'Shows if the product is on backordered.', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'sold_individually' => array( + 'description' => __( 'Allow one item to be bought in a single order.', 'woocommerce' ), + 'type' => 'boolean', + 'default' => false, + 'context' => array( 'view', 'edit' ), + ), + 'weight' => array( + /* translators: %s: weight unit */ + 'description' => sprintf( __( 'Product weight (%s).', 'woocommerce' ), $weight_unit ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'dimensions' => array( + 'description' => __( 'Product dimensions.', 'woocommerce' ), + 'type' => 'object', + 'context' => array( 'view', 'edit' ), + 'properties' => array( + 'length' => array( + /* translators: %s: dimension unit */ + 'description' => sprintf( __( 'Product length (%s).', 'woocommerce' ), $dimension_unit ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'width' => array( + /* translators: %s: dimension unit */ + 'description' => sprintf( __( 'Product width (%s).', 'woocommerce' ), $dimension_unit ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'height' => array( + /* translators: %s: dimension unit */ + 'description' => sprintf( __( 'Product height (%s).', 'woocommerce' ), $dimension_unit ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + 'shipping_required' => array( + 'description' => __( 'Shows if the product need to be shipped.', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'shipping_taxable' => array( + 'description' => __( 'Shows whether or not the product shipping is taxable.', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'shipping_class' => array( + 'description' => __( 'Shipping class slug.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'shipping_class_id' => array( + 'description' => __( 'Shipping class ID.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'reviews_allowed' => array( + 'description' => __( 'Allow reviews.', 'woocommerce' ), + 'type' => 'boolean', + 'default' => true, + 'context' => array( 'view', 'edit' ), + ), + 'average_rating' => array( + 'description' => __( 'Reviews average rating.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'rating_count' => array( + 'description' => __( 'Amount of reviews that the product have.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'related_ids' => array( + 'description' => __( 'List of related products IDs.', 'woocommerce' ), + 'type' => 'array', + 'items' => array( + 'type' => 'integer', + ), + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'upsell_ids' => array( + 'description' => __( 'List of up-sell products IDs.', 'woocommerce' ), + 'type' => 'array', + 'items' => array( + 'type' => 'integer', + ), + 'context' => array( 'view', 'edit' ), + ), + 'cross_sell_ids' => array( + 'description' => __( 'List of cross-sell products IDs.', 'woocommerce' ), + 'type' => 'array', + 'items' => array( + 'type' => 'integer', + ), + 'context' => array( 'view', 'edit' ), + ), + 'parent_id' => array( + 'description' => __( 'Product parent ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'purchase_note' => array( + 'description' => __( 'Optional note to send the customer after purchase.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'categories' => array( + 'description' => __( 'List of categories.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Category ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'name' => array( + 'description' => __( 'Category name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'slug' => array( + 'description' => __( 'Category slug.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + ), + ), + ), + 'tags' => array( + 'description' => __( 'List of tags.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Tag ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'name' => array( + 'description' => __( 'Tag name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'slug' => array( + 'description' => __( 'Tag slug.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + ), + ), + ), + 'images' => array( + 'description' => __( 'List of images.', 'woocommerce' ), + 'type' => 'object', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Image ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'date_created' => array( + 'description' => __( "The date the image was created, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_created_gmt' => array( + 'description' => __( 'The date the image was created, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_modified' => array( + 'description' => __( "The date the image was last modified, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_modified_gmt' => array( + 'description' => __( 'The date the image was last modified, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'src' => array( + 'description' => __( 'Image URL.', 'woocommerce' ), + 'type' => 'string', + 'format' => 'uri', + 'context' => array( 'view', 'edit' ), + ), + 'name' => array( + 'description' => __( 'Image name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'alt' => array( + 'description' => __( 'Image alternative text.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + ), + 'attributes' => array( + 'description' => __( 'List of attributes.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Attribute ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'name' => array( + 'description' => __( 'Attribute name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'position' => array( + 'description' => __( 'Attribute position.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'visible' => array( + 'description' => __( "Define if the attribute is visible on the \"Additional information\" tab in the product's page.", 'woocommerce' ), + 'type' => 'boolean', + 'default' => false, + 'context' => array( 'view', 'edit' ), + ), + 'variation' => array( + 'description' => __( 'Define if the attribute can be used as variation.', 'woocommerce' ), + 'type' => 'boolean', + 'default' => false, + 'context' => array( 'view', 'edit' ), + ), + 'options' => array( + 'description' => __( 'List of available term names of the attribute.', 'woocommerce' ), + 'type' => 'array', + 'items' => array( + 'type' => 'string', + ), + 'context' => array( 'view', 'edit' ), + ), + ), + ), + ), + 'default_attributes' => array( + 'description' => __( 'Defaults variation attributes.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Attribute ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'name' => array( + 'description' => __( 'Attribute name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'option' => array( + 'description' => __( 'Selected attribute term name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + ), + 'variations' => array( + 'description' => __( 'List of variations IDs.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'integer', + ), + 'readonly' => true, + ), + 'grouped_products' => array( + 'description' => __( 'List of grouped products ID.', 'woocommerce' ), + 'type' => 'array', + 'items' => array( + 'type' => 'integer', + ), + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'menu_order' => array( + 'description' => __( 'Menu order, used to custom sort products.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'meta_data' => array( + 'description' => __( 'Meta data.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Meta ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'key' => array( + 'description' => __( 'Meta key.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'value' => array( + 'description' => __( 'Meta value.', 'woocommerce' ), + 'type' => 'mixed', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + ), + ), + ); + return $this->add_additional_fields_schema( $schema ); + } } diff --git a/includes/api/class-wc-rest-setting-options-controller.php b/includes/api/class-wc-rest-setting-options-controller.php index 4516e49d497..9613ce818eb 100644 --- a/includes/api/class-wc-rest-setting-options-controller.php +++ b/includes/api/class-wc-rest-setting-options-controller.php @@ -24,4 +24,227 @@ class WC_REST_Setting_Options_Controller extends WC_REST_Setting_Options_V2_Cont * @var string */ protected $namespace = 'wc/v3'; + + /** + * Get setting data. + * + * @param string $group_id Group ID. + * @param string $setting_id Setting ID. + * @return stdClass|WP_Error + */ + public function get_setting( $group_id, $setting_id ) { + $setting = parent::get_setting( $group_id, $setting_id ); + if ( is_wp_error( $setting ) ) { + return $setting; + } + $setting['group_id'] = $group_id; + return $setting; + } + + /** + * Callback for allowed keys for each setting response. + * + * @param string $key Key to check. + * @return boolean + */ + public function allowed_setting_keys( $key ) { + return in_array( + $key, array( + 'id', + 'group_id', + 'label', + 'description', + 'default', + 'tip', + 'placeholder', + 'type', + 'options', + 'value', + 'option_key', + ), true + ); + } + + /** + * Get all settings in a group. + * + * @param string $group_id Group ID. + * @return array|WP_Error + */ + public function get_group_settings( $group_id ) { + if ( empty( $group_id ) ) { + return new WP_Error( 'rest_setting_setting_group_invalid', __( 'Invalid setting group.', 'woocommerce' ), array( 'status' => 404 ) ); + } + + $settings = apply_filters( 'woocommerce_settings-' . $group_id, array() ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores + + if ( empty( $settings ) ) { + return new WP_Error( 'rest_setting_setting_group_invalid', __( 'Invalid setting group.', 'woocommerce' ), array( 'status' => 404 ) ); + } + + $filtered_settings = array(); + foreach ( $settings as $setting ) { + $option_key = $setting['option_key']; + $setting = $this->filter_setting( $setting ); + $default = isset( $setting['default'] ) ? $setting['default'] : ''; + // Get the option value. + if ( is_array( $option_key ) ) { + $option = get_option( $option_key[0] ); + $setting['value'] = isset( $option[ $option_key[1] ] ) ? $option[ $option_key[1] ] : $default; + } else { + $admin_setting_value = WC_Admin_Settings::get_option( $option_key, $default ); + $setting['value'] = $admin_setting_value; + } + + if ( 'multi_select_countries' === $setting['type'] ) { + $setting['options'] = WC()->countries->get_countries(); + $setting['type'] = 'multiselect'; + } elseif ( 'single_select_country' === $setting['type'] ) { + $setting['type'] = 'select'; + $setting['options'] = $this->get_countries_and_states(); + } elseif ( 'single_select_page' === $setting['type'] ) { + $pages = get_pages( + array( + 'sort_column' => 'menu_order', + 'sort_order' => 'ASC', + 'hierarchical' => 0, + ) + ); + $options = array(); + foreach ( $pages as $page ) { + $options[ $page->ID ] = ! empty( $page->post_title ) ? $page->post_title : '#' . $page->ID; + } + $setting['type'] = 'select'; + $setting['options'] = $options; + } + + $filtered_settings[] = $setting; + } + + return $filtered_settings; + } + + /** + * Returns a list of countries and states for use in the base location setting. + * + * @since 3.0.7 + * @return array Array of states and countries. + */ + private function get_countries_and_states() { + $countries = WC()->countries->get_countries(); + if ( ! $countries ) { + return array(); + } + $output = array(); + foreach ( $countries as $key => $value ) { + $states = WC()->countries->get_states( $key ); + + if ( $states ) { + foreach ( $states as $state_key => $state_value ) { + $output[ $key . ':' . $state_key ] = $value . ' - ' . $state_value; + } + } else { + $output[ $key ] = $value; + } + } + return $output; + } + + /** + * Get the settings schema, conforming to JSON Schema. + * + * @return array + */ + public function get_item_schema() { + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => 'setting', + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'A unique identifier for the setting.', 'woocommerce' ), + 'type' => 'string', + 'arg_options' => array( + 'sanitize_callback' => 'sanitize_title', + ), + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'group_id' => array( + 'description' => __( 'An identifier for the group this setting belongs to.', 'woocommerce' ), + 'type' => 'string', + 'arg_options' => array( + 'sanitize_callback' => 'sanitize_title', + ), + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'label' => array( + 'description' => __( 'A human readable label for the setting used in interfaces.', 'woocommerce' ), + 'type' => 'string', + 'arg_options' => array( + 'sanitize_callback' => 'sanitize_text_field', + ), + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'description' => array( + 'description' => __( 'A human readable description for the setting used in interfaces.', 'woocommerce' ), + 'type' => 'string', + 'arg_options' => array( + 'sanitize_callback' => 'sanitize_text_field', + ), + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'value' => array( + 'description' => __( 'Setting value.', 'woocommerce' ), + 'type' => 'mixed', + 'context' => array( 'view', 'edit' ), + ), + 'default' => array( + 'description' => __( 'Default value for the setting.', 'woocommerce' ), + 'type' => 'mixed', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'tip' => array( + 'description' => __( 'Additional help text shown to the user about the setting.', 'woocommerce' ), + 'type' => 'string', + 'arg_options' => array( + 'sanitize_callback' => 'sanitize_text_field', + ), + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'placeholder' => array( + 'description' => __( 'Placeholder text to be displayed in text inputs.', 'woocommerce' ), + 'type' => 'string', + 'arg_options' => array( + 'sanitize_callback' => 'sanitize_text_field', + ), + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'type' => array( + 'description' => __( 'Type of setting.', 'woocommerce' ), + 'type' => 'string', + 'arg_options' => array( + 'sanitize_callback' => 'sanitize_text_field', + ), + 'context' => array( 'view', 'edit' ), + 'enum' => array( 'text', 'email', 'number', 'color', 'password', 'textarea', 'select', 'multiselect', 'radio', 'image_width', 'checkbox' ), + 'readonly' => true, + ), + 'options' => array( + 'description' => __( 'Array of options (key value pairs) for inputs such as select, multiselect, and radio buttons.', 'woocommerce' ), + 'type' => 'object', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + ), + ); + + return $this->add_additional_fields_schema( $schema ); + } } diff --git a/includes/api/class-wc-rest-settings-controller.php b/includes/api/class-wc-rest-settings-controller.php index e26a6731247..00b4beffbc0 100644 --- a/includes/api/class-wc-rest-settings-controller.php +++ b/includes/api/class-wc-rest-settings-controller.php @@ -24,4 +24,46 @@ class WC_REST_Settings_Controller extends WC_REST_Settings_V2_Controller { * @var string */ protected $namespace = 'wc/v3'; + + /** + * Register routes. + */ + public function register_routes() { + parent::register_routes(); + register_rest_route( $this->namespace, '/' . $this->rest_base . '/batch', array( + array( + 'methods' => WP_REST_Server::EDITABLE, + 'callback' => array( $this, 'batch_items' ), + 'permission_callback' => array( $this, 'update_items_permissions_check' ), + ), + 'schema' => array( $this, 'get_public_batch_schema' ), + ) ); + } + + /** + * Makes sure the current user has access to WRITE the settings APIs. + * + * @param WP_REST_Request $request Full data about the request. + * @return WP_Error|bool + */ + public function update_items_permissions_check( $request ) { + if ( ! wc_rest_check_manager_permissions( 'settings', 'edit' ) ) { + return new WP_Error( 'woocommerce_rest_cannot_edit', __( 'Sorry, you cannot edit this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); + } + + return true; + } + + /** + * Update a setting. + * + * @param WP_REST_Request $request Request data. + * @return WP_Error|WP_REST_Response + */ + public function update_item( $request ) { + $options_controller = new WC_REST_Dev_Setting_Options_Controller(); + $response = $options_controller->update_item( $request ); + + return $response; + } } diff --git a/includes/api/v2/class-wc-rest-order-refunds-v2-controller.php b/includes/api/v2/class-wc-rest-order-refunds-v2-controller.php index 9fb35b27fbb..202ed5e718d 100644 --- a/includes/api/v2/class-wc-rest-order-refunds-v2-controller.php +++ b/includes/api/v2/class-wc-rest-order-refunds-v2-controller.php @@ -455,7 +455,7 @@ class WC_REST_Order_Refunds_V2_Controller extends WC_REST_Orders_V2_Controller { ), 'tax_class' => array( 'description' => __( 'Tax class of product.', 'woocommerce' ), - 'type' => 'integer', + 'type' => 'string', 'context' => array( 'view', 'edit' ), 'readonly' => true, ), @@ -549,7 +549,7 @@ class WC_REST_Order_Refunds_V2_Controller extends WC_REST_Orders_V2_Controller { ), 'price' => array( 'description' => __( 'Product price.', 'woocommerce' ), - 'type' => 'string', + 'type' => 'number', 'context' => array( 'view', 'edit' ), 'readonly' => true, ), diff --git a/includes/class-wc-api.php b/includes/class-wc-api.php index 88defee0af9..98cfef48fd0 100644 --- a/includes/class-wc-api.php +++ b/includes/class-wc-api.php @@ -228,6 +228,10 @@ class WC_API extends WC_Legacy_API { include_once dirname( __FILE__ ) . '/api/class-wc-rest-system-status-tools-controller.php'; include_once dirname( __FILE__ ) . '/api/class-wc-rest-shipping-methods-controller.php'; include_once dirname( __FILE__ ) . '/api/class-wc-rest-payment-gateways-controller.php'; + include_once dirname( __FILE__ ) . '/api/includes/api/class-wc-rest-data-continents-controller.php'; + include_once dirname( __FILE__ ) . '/api/includes/api/class-wc-rest-data-controller.php'; + include_once dirname( __FILE__ ) . '/api/includes/api/class-wc-rest-data-countries-controller.php'; + include_once dirname( __FILE__ ) . '/api/includes/api/class-wc-rest-data-currencies-controller.php'; } /** From dd9fe541f7926f5b672cd0a063397a7686912a70 Mon Sep 17 00:00:00 2001 From: Peter Fabian Date: Thu, 17 May 2018 16:38:47 +0100 Subject: [PATCH 014/984] Updated schema for v3 API. --- ...-wc-rest-product-categories-controller.php | 122 ++++++++++++++++++ 1 file changed, 122 insertions(+) diff --git a/includes/api/class-wc-rest-product-categories-controller.php b/includes/api/class-wc-rest-product-categories-controller.php index a32daa3804d..329c87cd400 100644 --- a/includes/api/class-wc-rest-product-categories-controller.php +++ b/includes/api/class-wc-rest-product-categories-controller.php @@ -87,4 +87,126 @@ class WC_REST_Product_Categories_Controller extends WC_REST_Product_Categories_V */ return apply_filters( "woocommerce_rest_prepare_{$this->taxonomy}", $response, $item, $request ); } + + /** + * Get the Category schema, conforming to JSON Schema. + * + * @return array + */ + public function get_item_schema() { + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => $this->taxonomy, + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'name' => array( + 'description' => __( 'Category name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'arg_options' => array( + 'sanitize_callback' => 'sanitize_text_field', + ), + ), + 'slug' => array( + 'description' => __( 'An alphanumeric identifier for the resource unique to its type.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'arg_options' => array( + 'sanitize_callback' => 'sanitize_title', + ), + ), + 'parent' => array( + 'description' => __( 'The ID for the parent of the resource.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'description' => array( + 'description' => __( 'HTML description of the resource.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'arg_options' => array( + 'sanitize_callback' => 'wp_filter_post_kses', + ), + ), + 'display' => array( + 'description' => __( 'Category archive display type.', 'woocommerce' ), + 'type' => 'string', + 'default' => 'default', + 'enum' => array( 'default', 'products', 'subcategories', 'both' ), + 'context' => array( 'view', 'edit' ), + ), + 'image' => array( + 'description' => __( 'Image data.', 'woocommerce' ), + 'type' => 'object', + 'context' => array( 'view', 'edit' ), + 'properties' => array( + 'id' => array( + 'description' => __( 'Image ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'date_created' => array( + 'description' => __( "The date the image was created, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_created_gmt' => array( + 'description' => __( 'The date the image was created, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_modified' => array( + 'description' => __( "The date the image was last modified, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_modified_gmt' => array( + 'description' => __( 'The date the image was last modified, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'src' => array( + 'description' => __( 'Image URL.', 'woocommerce' ), + 'type' => 'string', + 'format' => 'uri', + 'context' => array( 'view', 'edit' ), + ), + 'name' => array( + 'description' => __( 'Image name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'alt' => array( + 'description' => __( 'Image alternative text.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + 'menu_order' => array( + 'description' => __( 'Menu order, used to custom sort the resource.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + 'count' => array( + 'description' => __( 'Number of published products for the resource.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + ), + ); + + return $this->add_additional_fields_schema( $schema ); + } } From fc6da6d4eef1afeb4cba17b71233fd4d7d24db57 Mon Sep 17 00:00:00 2001 From: Claudio Sanches Date: Tue, 22 May 2018 13:44:00 -0300 Subject: [PATCH 015/984] Introducing inline documention to WC_REST_Controller --- includes/abstracts/abstract-wc-rest-controller.php | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/includes/abstracts/abstract-wc-rest-controller.php b/includes/abstracts/abstract-wc-rest-controller.php index 077ad8fc225..b5a1fd6bb77 100644 --- a/includes/abstracts/abstract-wc-rest-controller.php +++ b/includes/abstracts/abstract-wc-rest-controller.php @@ -2,8 +2,18 @@ /** * REST Controller * - * @class WC_REST_Controller + * This class extend `WP_REST_Controller` in order to include /batch endpoint + * for almost all endpoints in WooCommerce REST API. + * + * It's required to follow "Controller Classes" guide before extending this class: + * + * + * NOTE THAT ONLY CODE RELEVANT FOR MOST ENDPOINTS SHOULD BE INCLUDED INTO THIS CLASS. + * If necessary extend this class and create new abstract classes like `WC_REST_CRUD_Controller` or `WC_REST_Terms_Controller`. + * + * @class WC_REST_Controller * @package WooCommerce/Abstracts + * @see https://developer.wordpress.org/rest-api/extending-the-rest-api/controller-classes/ */ if ( ! defined( 'ABSPATH' ) ) { From b08b55a6514676d32d4d169b8e50e9de6accd5af Mon Sep 17 00:00:00 2001 From: Joey Date: Sun, 27 May 2018 05:40:58 +0100 Subject: [PATCH 016/984] added changes for low stock notifications per product --- includes/abstracts/abstract-wc-product.php | 24 +++++++++++++++++- ...ass-wc-product-csv-importer-controller.php | 1 + includes/admin/importers/mappings/default.php | 1 + .../class-wc-admin-list-table-products.php | 1 + .../class-wc-meta-box-product-data.php | 14 ++++++----- .../views/html-product-data-inventory.php | 14 +++++++++++ .../meta-boxes/views/html-variation-admin.php | 18 +++++++++++++ ...-wc-rest-product-variations-controller.php | 11 ++++++++ .../api/class-wc-rest-products-controller.php | 14 +++++++++++ .../v1/class-wc-rest-products-controller.php | 25 +++++++++++++++++++ includes/class-wc-product-query.php | 1 + includes/class-wc-product-variable.php | 1 + .../class-wc-product-data-store-cpt.php | 3 +++ ...ss-wc-product-variation-data-store-cpt.php | 2 ++ .../export/class-wc-product-csv-exporter.php | 1 + .../import/abstract-wc-product-importer.php | 2 +- .../import/class-wc-product-csv-importer.php | 1 + includes/wc-stock-functions.php | 23 ++++++++++++++++- 18 files changed, 148 insertions(+), 9 deletions(-) diff --git a/includes/abstracts/abstract-wc-product.php b/includes/abstracts/abstract-wc-product.php index 62cb870d511..bdea516b040 100644 --- a/includes/abstracts/abstract-wc-product.php +++ b/includes/abstracts/abstract-wc-product.php @@ -74,6 +74,7 @@ class WC_Product extends WC_Abstract_Legacy_Product { 'stock_quantity' => null, 'stock_status' => 'instock', 'backorders' => 'no', + 'low_stock_amount' => -1, 'sold_individually' => false, 'weight' => '', 'length' => '', @@ -389,6 +390,17 @@ class WC_Product extends WC_Abstract_Legacy_Product { return $this->get_prop( 'backorders', $context ); } + /** + * Get low stock amount. + * + * @param string $context What the value is for. Valid values are view and edit. + * @since 3.4.0 + * @return int|null + */ + public function get_low_stock_amount( $context = 'view' ) { + return $this->get_prop( 'low_stock_amount', $context ); + } + /** * Return if should be sold individually. * @@ -963,6 +975,15 @@ class WC_Product extends WC_Abstract_Legacy_Product { $this->set_prop( 'backorders', $backorders ); } + /** + * Set low stock amount. + * + * @param $amount + */ + public function set_low_stock_amount( $amount ) { + $this->set_prop( 'low_stock_amount', $amount ); + } + /** * Set if should be sold individually. * @@ -1300,10 +1321,11 @@ class WC_Product extends WC_Abstract_Legacy_Product { * @since 3.0.0 */ public function validate_props() { - // Before updating, ensure stock props are all aligned. Qty and backorders are not needed if not stock managed. + // Before updating, ensure stock props are all aligned. Qty, backorders and low stock amount are not needed if not stock managed. if ( ! $this->get_manage_stock() ) { $this->set_stock_quantity( '' ); $this->set_backorders( 'no' ); + $this->set_low_stock_amount( '' ); // If we are stock managing and we don't have stock, force out of stock status. } elseif ( $this->get_stock_quantity() <= get_option( 'woocommerce_notify_no_stock_amount', 0 ) && 'no' === $this->get_backorders() ) { diff --git a/includes/admin/importers/class-wc-product-csv-importer-controller.php b/includes/admin/importers/class-wc-product-csv-importer-controller.php index 8e164e5015d..2e50ff8805d 100644 --- a/includes/admin/importers/class-wc-product-csv-importer-controller.php +++ b/includes/admin/importers/class-wc-product-csv-importer-controller.php @@ -640,6 +640,7 @@ class WC_Product_CSV_Importer_Controller { 'stock_status' => __( 'In stock?', 'woocommerce' ), 'stock_quantity' => _x( 'Stock', 'Quantity in stock', 'woocommerce' ), 'backorders' => __( 'Backorders allowed?', 'woocommerce' ), + 'low_stock_amount' => __( 'Low Stock Amount', 'woocommerce' ), 'sold_individually' => __( 'Sold individually?', 'woocommerce' ), /* translators: %s: weight unit */ 'weight' => sprintf( __( 'Weight (%s)', 'woocommerce' ), $weight_unit ), diff --git a/includes/admin/importers/mappings/default.php b/includes/admin/importers/mappings/default.php index b22a2a260d5..f07ead9ac2d 100644 --- a/includes/admin/importers/mappings/default.php +++ b/includes/admin/importers/mappings/default.php @@ -55,6 +55,7 @@ function wc_importer_default_english_mappings( $mappings ) { 'In stock?' => 'stock_status', 'Stock' => 'stock_quantity', 'Backorders allowed?' => 'backorders', + 'Low Stock Amount' => 'low_stock_amount', 'Sold individually?' => 'sold_individually', sprintf( 'Weight (%s)', $weight_unit ) => 'weight', sprintf( 'Length (%s)', $dimension_unit ) => 'length', diff --git a/includes/admin/list-tables/class-wc-admin-list-table-products.php b/includes/admin/list-tables/class-wc-admin-list-table-products.php index 424f4512fd1..28a1a9c2a81 100644 --- a/includes/admin/list-tables/class-wc-admin-list-table-products.php +++ b/includes/admin/list-tables/class-wc-admin-list-table-products.php @@ -187,6 +187,7 @@ class WC_Admin_List_Table_Products extends WC_Admin_List_Table {
' . esc_html( $this->object->get_tax_status() ) . '
' . esc_html( $this->object->get_tax_class() ) . '
' . esc_html( $this->object->get_backorders() ) . '
+
' . esc_html( $this->object->get_low_stock_amount() ) . '
'; } diff --git a/includes/admin/meta-boxes/class-wc-meta-box-product-data.php b/includes/admin/meta-boxes/class-wc-meta-box-product-data.php index e3e0a300367..43f21f8161b 100644 --- a/includes/admin/meta-boxes/class-wc-meta-box-product-data.php +++ b/includes/admin/meta-boxes/class-wc-meta-box-product-data.php @@ -365,6 +365,7 @@ class WC_Meta_Box_Product_Data { 'backorders' => isset( $_POST['_backorders'] ) ? wc_clean( wp_unslash( $_POST['_backorders'] ) ) : null, 'stock_status' => wc_clean( wp_unslash( $_POST['_stock_status'] ) ), 'stock_quantity' => $stock, + 'low_stock_amount' => '' === $_POST['_low_stock_amount'] ? '' : absint( wp_unslash( $_POST['_low_stock_amount'] ) ), 'download_limit' => '' === $_POST['_download_limit'] ? '' : absint( wp_unslash( $_POST['_download_limit'] ) ), 'download_expiry' => '' === $_POST['_download_expiry'] ? '' : absint( wp_unslash( $_POST['_download_expiry'] ) ), 'downloads' => self::prepare_downloads( @@ -372,12 +373,12 @@ class WC_Meta_Box_Product_Data { isset( $_POST['_wc_file_urls'] ) ? wp_unslash( $_POST['_wc_file_urls'] ) : array(), isset( $_POST['_wc_file_hashes'] ) ? wp_unslash( $_POST['_wc_file_hashes'] ) : array() ), - 'product_url' => esc_url_raw( wp_unslash( $_POST['_product_url'] ) ), - 'button_text' => wc_clean( wp_unslash( $_POST['_button_text'] ) ), - 'children' => 'grouped' === $product_type ? self::prepare_children() : null, - 'reviews_allowed' => ! empty( $_POST['comment_status'] ) && 'open' === $_POST['comment_status'], - 'attributes' => $attributes, - 'default_attributes' => self::prepare_set_attributes( $attributes, 'default_attribute_' ), + 'product_url' => esc_url_raw( wp_unslash( $_POST['_product_url'] ) ), + 'button_text' => wc_clean( wp_unslash( $_POST['_button_text'] ) ), + 'children' => 'grouped' === $product_type ? self::prepare_children() : null, + 'reviews_allowed' => ! empty( $_POST['comment_status'] ) && 'open' === $_POST['comment_status'], + 'attributes' => $attributes, + 'default_attributes' => self::prepare_set_attributes( $attributes, 'default_attribute_' ), ) ); @@ -455,6 +456,7 @@ class WC_Meta_Box_Product_Data { 'manage_stock' => isset( $_POST['variable_manage_stock'][ $i ] ), 'stock_quantity' => $stock, 'backorders' => isset( $_POST['variable_backorders'], $_POST['variable_backorders'][ $i ] ) ? wc_clean( $_POST['variable_backorders'][ $i ] ) : null, + 'low_stock_amount' => wc_clean( $_POST['variable_low_stock_amount'][ $i ] ), 'stock_status' => wc_clean( $_POST['variable_stock_status'][ $i ] ), 'image_id' => wc_clean( $_POST['upload_image_id'][ $i ] ), 'attributes' => self::prepare_set_attributes( $parent->get_attributes(), 'attribute_', $i ), diff --git a/includes/admin/meta-boxes/views/html-product-data-inventory.php b/includes/admin/meta-boxes/views/html-product-data-inventory.php index 30ece552b87..51219ccd38d 100644 --- a/includes/admin/meta-boxes/views/html-product-data-inventory.php +++ b/includes/admin/meta-boxes/views/html-product-data-inventory.php @@ -65,6 +65,20 @@ if ( ! defined( 'ABSPATH' ) ) { ) ); + woocommerce_wp_text_input( array( + 'id' => '_low_stock_amount', + 'value' => -1 === $product_object->get_low_stock_amount( 'edit' ) ? '' : $product_object->get_low_stock_amount( 'edit' ), + 'label' => __( 'Low stock threshold', 'woocommerce' ), + 'desc_tip' => true, + 'description' => __( 'When product stock reaches this amount you will be notified by email', 'woocommerce' ), + 'type' => 'number', + 'custom_attributes' => array( + 'min' => 0, + 'step' => 1, + ), + 'data_type' => 'stock', + ) ); + do_action( 'woocommerce_product_options_stock_fields' ); echo ''; diff --git a/includes/admin/meta-boxes/views/html-variation-admin.php b/includes/admin/meta-boxes/views/html-variation-admin.php index 175fb94baf9..1405375bb2d 100644 --- a/includes/admin/meta-boxes/views/html-variation-admin.php +++ b/includes/admin/meta-boxes/views/html-variation-admin.php @@ -195,6 +195,24 @@ if ( ! defined( 'ABSPATH' ) ) { ) ); + woocommerce_wp_text_input( + array( + 'id' => "variable_low_stock_amount{$loop}", + 'name' => "variable_low_stock_amount[{$loop}]", + 'value' => wc_stock_amount( $variation_object->get_low_stock_amount( 'edit' ) ), + 'label' => __( 'Low stock threshold', 'woocommerce' ), + 'desc_tip' => true, + 'description' => __( 'When product stock reaches this amount you will be notified by email', 'woocommerce' ), + 'type' => 'number', + 'custom_attributes' => array( + 'min' => 0, + 'step' => 1, + ), + 'data_type' => 'stock', + 'wrapper_class' => 'form-row form-row-first', + ) + ); + /** * woocommerce_variation_options_inventory action. * diff --git a/includes/api/class-wc-rest-product-variations-controller.php b/includes/api/class-wc-rest-product-variations-controller.php index 621bffd7e5e..1fd8dec63ab 100644 --- a/includes/api/class-wc-rest-product-variations-controller.php +++ b/includes/api/class-wc-rest-product-variations-controller.php @@ -208,6 +208,7 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller 'manage_stock' => $object->managing_stock(), 'stock_quantity' => $object->get_stock_quantity(), 'in_stock' => $object->is_in_stock(), + 'low_stock_amount' => $object->get_low_stock_amount(), 'backorders' => $object->get_backorders(), 'backorders_allowed' => $object->backorders_allowed(), 'backordered' => $object->is_on_backorder(), @@ -346,6 +347,10 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller $variation->set_stock_status( true === $request['in_stock'] ? 'instock' : 'outofstock' ); } + if ( isset( $request['low_stock_amount'] ) ) { + $variation->set_low_stock_amount( $request['low_stock_amount'] ); + } + if ( isset( $request['backorders'] ) ) { $variation->set_backorders( $request['backorders'] ); } @@ -821,6 +826,12 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller 'default' => true, 'context' => array( 'view', 'edit' ), ), + 'low_stock_amount' => array( + 'description' => __( 'If managing stock, this controls when low stock notifications are sent.', 'woocommerce' ), + 'type' => 'integer', + 'default' => -1, + 'context' => array( 'view', 'edit' ), + ), 'backorders' => array( 'description' => __( 'If managing stock, this controls if backorders are allowed.', 'woocommerce' ), 'type' => 'string', diff --git a/includes/api/class-wc-rest-products-controller.php b/includes/api/class-wc-rest-products-controller.php index 1f2af73999c..1243288628d 100644 --- a/includes/api/class-wc-rest-products-controller.php +++ b/includes/api/class-wc-rest-products-controller.php @@ -608,6 +608,7 @@ class WC_REST_Products_Controller extends WC_REST_Legacy_Products_Controller { 'manage_stock' => $product->managing_stock(), 'stock_quantity' => $product->get_stock_quantity( $context ), 'in_stock' => $product->is_in_stock(), + 'low_stock_amount' => $product->get_low_stock_amount( $context ), 'backorders' => $product->get_backorders( $context ), 'backorders_allowed' => $product->backorders_allowed(), 'backordered' => $product->is_on_backorder(), @@ -901,6 +902,11 @@ class WC_REST_Products_Controller extends WC_REST_Legacy_Products_Controller { $product->set_manage_stock( $request['manage_stock'] ); } + // Low stock amount. + if ( isset( $request['low_stock_amount'] ) ) { + $product->set_low_stock_amount( $request['low_stock_amount'] ); + } + // Backorders. if ( isset( $request['backorders'] ) ) { $product->set_backorders( $request['backorders'] ); @@ -911,11 +917,13 @@ class WC_REST_Products_Controller extends WC_REST_Legacy_Products_Controller { $product->set_backorders( 'no' ); $product->set_stock_quantity( '' ); $product->set_stock_status( $stock_status ); + $product->set_low_stock_amount( '' ); } elseif ( $product->is_type( 'external' ) ) { $product->set_manage_stock( 'no' ); $product->set_backorders( 'no' ); $product->set_stock_quantity( '' ); $product->set_stock_status( 'instock' ); + $product->set_low_stock_amount( '' ); } elseif ( $product->get_manage_stock() ) { // Stock status is always determined by children so sync later. if ( ! $product->is_type( 'variable' ) ) { @@ -1664,6 +1672,12 @@ class WC_REST_Products_Controller extends WC_REST_Legacy_Products_Controller { 'default' => true, 'context' => array( 'view', 'edit' ), ), + 'low_stock_amount' => array( + 'description' => __( 'If managing stock, this controls when low stock notifications are sent.', 'woocommerce' ), + 'type' => 'integer', + 'default' => -1, + 'context' => array( 'view', 'edit' ), + ), 'backorders' => array( 'description' => __( 'If managing stock, this controls if backorders are allowed.', 'woocommerce' ), 'type' => 'string', diff --git a/includes/api/v1/class-wc-rest-products-controller.php b/includes/api/v1/class-wc-rest-products-controller.php index 137ebca40d9..247ab65eaa8 100644 --- a/includes/api/v1/class-wc-rest-products-controller.php +++ b/includes/api/v1/class-wc-rest-products-controller.php @@ -494,6 +494,7 @@ class WC_REST_Products_V1_Controller extends WC_REST_Posts_Controller { 'manage_stock' => $product->managing_stock(), 'stock_quantity' => $product->get_stock_quantity(), 'in_stock' => $product->is_in_stock(), + 'low_stock_amount' => $product->get_low_stock_amount(), 'backorders' => $product->get_backorders(), 'backorders_allowed' => $product->backorders_allowed(), 'backordered' => $product->is_on_backorder(), @@ -568,6 +569,7 @@ class WC_REST_Products_V1_Controller extends WC_REST_Posts_Controller { 'manage_stock' => $variation->managing_stock(), 'stock_quantity' => $variation->get_stock_quantity(), 'in_stock' => $variation->is_in_stock(), + 'low_stock_amount' => $variation->get_low_stock_amount(), 'backorders' => $variation->get_backorders(), 'backorders_allowed' => $variation->backorders_allowed(), 'backordered' => $variation->is_on_backorder(), @@ -1230,6 +1232,11 @@ class WC_REST_Products_V1_Controller extends WC_REST_Posts_Controller { $product->set_manage_stock( $request['manage_stock'] ); } + // Low stock amount. + if ( isset( $request['low_stock_amount'] ) ) { + $product->set_low_stock_amount( $request['low_stock_amount'] ); + } + // Backorders. if ( isset( $request['backorders'] ) ) { $product->set_backorders( $request['backorders'] ); @@ -1240,11 +1247,13 @@ class WC_REST_Products_V1_Controller extends WC_REST_Posts_Controller { $product->set_backorders( 'no' ); $product->set_stock_quantity( '' ); $product->set_stock_status( $stock_status ); + $product->set_low_stock_amount( '' ); } elseif ( $product->is_type( 'external' ) ) { $product->set_manage_stock( 'no' ); $product->set_backorders( 'no' ); $product->set_stock_quantity( '' ); $product->set_stock_status( 'instock' ); + $product->set_low_stock_amount( '' ); } elseif ( $product->get_manage_stock() ) { // Stock status is always determined by children so sync later. if ( ! $product->is_type( 'variable' ) ) { @@ -1440,6 +1449,10 @@ class WC_REST_Products_V1_Controller extends WC_REST_Posts_Controller { $variation->set_stock_status( true === $data['in_stock'] ? 'instock' : 'outofstock' ); } + if ( isset( $data['low_stock_amount'] ) ) { + $variation->set_low_stock_amount( $data['low_stock_amount'] ); + } + if ( isset( $data['backorders'] ) ) { $variation->set_backorders( $data['backorders'] ); } @@ -1954,6 +1967,12 @@ class WC_REST_Products_V1_Controller extends WC_REST_Posts_Controller { 'default' => true, 'context' => array( 'view', 'edit' ), ), + 'low_stock_amount' => array( + 'description' => __( 'If managing stock, this controls when low stock notifications are sent.', 'woocommerce' ), + 'type' => 'integer', + 'default' => -1, + 'context' => array( 'view', 'edit' ), + ), 'backorders' => array( 'description' => __( 'If managing stock, this controls if backorders are allowed.', 'woocommerce' ), 'type' => 'string', @@ -2414,6 +2433,12 @@ class WC_REST_Products_V1_Controller extends WC_REST_Posts_Controller { 'default' => true, 'context' => array( 'view', 'edit' ), ), + 'low_stock_amount' => array( + 'description' => __( 'If managing stock, this controls when low stock notifications are sent.', 'woocommerce' ), + 'type' => 'integer', + 'default' => -1, + 'context' => array( 'view', 'edit' ), + ), 'backorders' => array( 'description' => __( 'If managing stock, this controls if backorders are allowed.', 'woocommerce' ), 'type' => 'string', diff --git a/includes/class-wc-product-query.php b/includes/class-wc-product-query.php index d6780241cb0..1de8bf210d5 100644 --- a/includes/class-wc-product-query.php +++ b/includes/class-wc-product-query.php @@ -46,6 +46,7 @@ class WC_Product_Query extends WC_Object_Query { 'stock_quantity' => '', 'stock_status' => '', 'backorders' => '', + 'low_stock_amount' => '', 'sold_individually' => '', 'weight' => '', 'length' => '', diff --git a/includes/class-wc-product-variable.php b/includes/class-wc-product-variable.php index 5a148156983..37bf5beedc7 100644 --- a/includes/class-wc-product-variable.php +++ b/includes/class-wc-product-variable.php @@ -406,6 +406,7 @@ class WC_Product_Variable extends WC_Product { if ( ! $this->get_manage_stock() ) { $this->set_stock_quantity( '' ); $this->set_backorders( 'no' ); + $this->set_low_stock_amount( '' ); $this->data_store->sync_stock_status( $this ); // If we are stock managing, backorders are allowed, and we don't have stock, force on backorder status. diff --git a/includes/data-stores/class-wc-product-data-store-cpt.php b/includes/data-stores/class-wc-product-data-store-cpt.php index ef96e39718a..dad2e5a296c 100644 --- a/includes/data-stores/class-wc-product-data-store-cpt.php +++ b/includes/data-stores/class-wc-product-data-store-cpt.php @@ -37,6 +37,7 @@ class WC_Product_Data_Store_CPT extends WC_Data_Store_WP implements WC_Object_Da '_stock', '_stock_status', '_backorders', + '_low_stock_amount', '_sold_individually', '_weight', '_length', @@ -333,6 +334,7 @@ class WC_Product_Data_Store_CPT extends WC_Data_Store_WP implements WC_Object_Da 'stock_quantity' => get_post_meta( $id, '_stock', true ), 'stock_status' => get_post_meta( $id, '_stock_status', true ), 'backorders' => get_post_meta( $id, '_backorders', true ), + 'low_stock_amount' => get_post_meta( $id, '_low_stock_amount', true ), 'sold_individually' => get_post_meta( $id, '_sold_individually', true ), 'weight' => get_post_meta( $id, '_weight', true ), 'length' => get_post_meta( $id, '_length', true ), @@ -499,6 +501,7 @@ class WC_Product_Data_Store_CPT extends WC_Data_Store_WP implements WC_Object_Da '_tax_class' => 'tax_class', '_manage_stock' => 'manage_stock', '_backorders' => 'backorders', + '_low_stock_amount' => 'low_stock_amount', '_sold_individually' => 'sold_individually', '_weight' => 'weight', '_length' => 'length', diff --git a/includes/data-stores/class-wc-product-variation-data-store-cpt.php b/includes/data-stores/class-wc-product-variation-data-store-cpt.php index e98d178711e..9a90b8670df 100644 --- a/includes/data-stores/class-wc-product-variation-data-store-cpt.php +++ b/includes/data-stores/class-wc-product-variation-data-store-cpt.php @@ -314,6 +314,7 @@ class WC_Product_Variation_Data_Store_CPT extends WC_Product_Data_Store_CPT impl 'download_expiry' => get_post_meta( $id, '_download_expiry', true ), 'image_id' => get_post_thumbnail_id( $id ), 'backorders' => get_post_meta( $id, '_backorders', true ), + 'low_stock_amount' => get_post_meta( $id, '_low_stock_amount', true ), 'sku' => get_post_meta( $id, '_sku', true ), 'stock_quantity' => get_post_meta( $id, '_stock', true ), 'weight' => get_post_meta( $id, '_weight', true ), @@ -353,6 +354,7 @@ class WC_Product_Variation_Data_Store_CPT extends WC_Product_Data_Store_CPT impl 'sku' => get_post_meta( $product->get_parent_id(), '_sku', true ), 'manage_stock' => get_post_meta( $product->get_parent_id(), '_manage_stock', true ), 'backorders' => get_post_meta( $product->get_parent_id(), '_backorders', true ), + 'low_stock_amount' => get_post_meta( $product->get_parent_id(), '_low_stock_amount', true ), 'stock_quantity' => wc_stock_amount( get_post_meta( $product->get_parent_id(), '_stock', true ) ), 'weight' => get_post_meta( $product->get_parent_id(), '_weight', true ), 'length' => get_post_meta( $product->get_parent_id(), '_length', true ), diff --git a/includes/export/class-wc-product-csv-exporter.php b/includes/export/class-wc-product-csv-exporter.php index c9f3f0ed25d..aa583d240cc 100644 --- a/includes/export/class-wc-product-csv-exporter.php +++ b/includes/export/class-wc-product-csv-exporter.php @@ -94,6 +94,7 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter { 'tax_class' => __( 'Tax class', 'woocommerce' ), 'stock_status' => __( 'In stock?', 'woocommerce' ), 'stock' => __( 'Stock', 'woocommerce' ), + 'low_stock_amount' => __( 'Low stock amount', 'woocommerce' ), 'backorders' => __( 'Backorders allowed?', 'woocommerce' ), 'sold_individually' => __( 'Sold individually?', 'woocommerce' ), /* translators: %s: weight */ diff --git a/includes/import/abstract-wc-product-importer.php b/includes/import/abstract-wc-product-importer.php index 6eb0e562794..54df946f924 100644 --- a/includes/import/abstract-wc-product-importer.php +++ b/includes/import/abstract-wc-product-importer.php @@ -234,7 +234,7 @@ abstract class WC_Product_Importer implements WC_Importer_Interface { } if ( 'external' === $object->get_type() ) { - unset( $data['manage_stock'], $data['stock_status'], $data['backorders'] ); + unset( $data['manage_stock'], $data['stock_status'], $data['backorders'], $data['low_stock_amount'] ); } if ( 'importing' === $object->get_status() ) { diff --git a/includes/import/class-wc-product-csv-importer.php b/includes/import/class-wc-product-csv-importer.php index ade2e756930..b632bc60be5 100644 --- a/includes/import/class-wc-product-csv-importer.php +++ b/includes/import/class-wc-product-csv-importer.php @@ -571,6 +571,7 @@ class WC_Product_CSV_Importer extends WC_Product_Importer { 'short_description' => array( $this, 'parse_skip_field' ), 'description' => array( $this, 'parse_skip_field' ), 'manage_stock' => array( $this, 'parse_bool_field' ), + 'low_stock_amount' => array( $this, 'parse_int_field' ), 'backorders' => array( $this, 'parse_backorders_field' ), 'stock_status' => array( $this, 'parse_bool_field' ), 'sold_individually' => array( $this, 'parse_bool_field' ), diff --git a/includes/wc-stock-functions.php b/includes/wc-stock-functions.php index 9903280971a..4b0dfc52644 100644 --- a/includes/wc-stock-functions.php +++ b/includes/wc-stock-functions.php @@ -52,6 +52,11 @@ function wc_update_product_stock( $product, $stock_quantity = null, $operation = do_action( 'woocommerce_product_set_stock', $product_with_stock ); } + // Send low stock notification for variable products + if ( ( $product->get_id() !== $product_id_with_stock ) && absint( $product_with_stock->get_stock_quantity() ) <= wc_get_low_stock_amount( $product_with_stock ) ) { + do_action( 'woocommerce_low_stock', $product_with_stock ); + } + return $product_with_stock->get_stock_quantity(); } return $product->get_stock_quantity(); @@ -120,7 +125,7 @@ function wc_reduce_stock_levels( $order_id ) { if ( '' !== get_option( 'woocommerce_notify_no_stock_amount' ) && $new_stock <= get_option( 'woocommerce_notify_no_stock_amount' ) ) { do_action( 'woocommerce_no_stock', $product ); - } elseif ( '' !== get_option( 'woocommerce_notify_low_stock_amount' ) && $new_stock <= get_option( 'woocommerce_notify_low_stock_amount' ) ) { + } elseif ( $new_stock <= wc_get_low_stock_amount( $product ) ) { do_action( 'woocommerce_low_stock', $product ); } @@ -143,3 +148,19 @@ function wc_reduce_stock_levels( $order_id ) { do_action( 'woocommerce_reduce_order_stock', $order ); } } + +/** + * Return low stock amount to determine if notification needs to be sent + * + * @param WC_Product $product + * + * @return int + */ +function wc_get_low_stock_amount( WC_Product $product ) { + $low_stock_amount = absint( $product->get_low_stock_amount() ); + if ( ! is_int( $low_stock_amount ) ) { + $low_stock_amount = absint( get_option( 'woocommerce_notify_low_stock_amount', 2 ) ); + } + + return $low_stock_amount; +} \ No newline at end of file From 5f36ba44cdb7af91fe4af99ed96a44b910e02e7f Mon Sep 17 00:00:00 2001 From: Joey Date: Sun, 27 May 2018 05:49:01 +0100 Subject: [PATCH 017/984] variable product confirmed before processing low stock notifications in function 'wc_update_product_stock' --- includes/wc-stock-functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/wc-stock-functions.php b/includes/wc-stock-functions.php index 4b0dfc52644..ff1d8b4be88 100644 --- a/includes/wc-stock-functions.php +++ b/includes/wc-stock-functions.php @@ -53,7 +53,7 @@ function wc_update_product_stock( $product, $stock_quantity = null, $operation = } // Send low stock notification for variable products - if ( ( $product->get_id() !== $product_id_with_stock ) && absint( $product_with_stock->get_stock_quantity() ) <= wc_get_low_stock_amount( $product_with_stock ) ) { + if ( $product_with_stock->is_type( 'variable' ) && absint( $product_with_stock->get_stock_quantity() ) <= wc_get_low_stock_amount( $product_with_stock ) ) { do_action( 'woocommerce_low_stock', $product_with_stock ); } From d815f7bad51773b2164704efe501fb423178ca63 Mon Sep 17 00:00:00 2001 From: Joey Date: Sun, 27 May 2018 06:00:20 +0100 Subject: [PATCH 018/984] updated import/export functions for low_stock_amount --- .../class-wc-product-csv-importer-controller.php | 3 ++- includes/admin/importers/mappings/default.php | 2 +- includes/export/class-wc-product-csv-exporter.php | 10 ++++++++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/includes/admin/importers/class-wc-product-csv-importer-controller.php b/includes/admin/importers/class-wc-product-csv-importer-controller.php index 2e50ff8805d..dbdd5c3f006 100644 --- a/includes/admin/importers/class-wc-product-csv-importer-controller.php +++ b/includes/admin/importers/class-wc-product-csv-importer-controller.php @@ -475,6 +475,7 @@ class WC_Product_CSV_Importer_Controller { __( 'In stock?', 'woocommerce' ) => 'stock_status', __( 'Stock', 'woocommerce' ) => 'stock_quantity', __( 'Backorders allowed?', 'woocommerce' ) => 'backorders', + __( 'Low stock amount', 'woocommerce' ) => 'low_stock_amount', __( 'Sold individually?', 'woocommerce' ) => 'sold_individually', /* translators: %s: Weight unit */ sprintf( __( 'Weight (%s)', 'woocommerce' ), $weight_unit ) => 'weight', @@ -640,7 +641,7 @@ class WC_Product_CSV_Importer_Controller { 'stock_status' => __( 'In stock?', 'woocommerce' ), 'stock_quantity' => _x( 'Stock', 'Quantity in stock', 'woocommerce' ), 'backorders' => __( 'Backorders allowed?', 'woocommerce' ), - 'low_stock_amount' => __( 'Low Stock Amount', 'woocommerce' ), + 'low_stock_amount' => __( 'Low stock amount', 'woocommerce' ), 'sold_individually' => __( 'Sold individually?', 'woocommerce' ), /* translators: %s: weight unit */ 'weight' => sprintf( __( 'Weight (%s)', 'woocommerce' ), $weight_unit ), diff --git a/includes/admin/importers/mappings/default.php b/includes/admin/importers/mappings/default.php index f07ead9ac2d..4de9337d89c 100644 --- a/includes/admin/importers/mappings/default.php +++ b/includes/admin/importers/mappings/default.php @@ -55,7 +55,7 @@ function wc_importer_default_english_mappings( $mappings ) { 'In stock?' => 'stock_status', 'Stock' => 'stock_quantity', 'Backorders allowed?' => 'backorders', - 'Low Stock Amount' => 'low_stock_amount', + 'Low stock amount' => 'low_stock_amount', 'Sold individually?' => 'sold_individually', sprintf( 'Weight (%s)', $weight_unit ) => 'weight', sprintf( 'Length (%s)', $dimension_unit ) => 'length', diff --git a/includes/export/class-wc-product-csv-exporter.php b/includes/export/class-wc-product-csv-exporter.php index aa583d240cc..c4111717e8c 100644 --- a/includes/export/class-wc-product-csv-exporter.php +++ b/includes/export/class-wc-product-csv-exporter.php @@ -444,6 +444,16 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter { } } + /** + * Get low stock amount value. + * + * @param WC_Product $product Product being exported. + * @return string + */ + protected function get_column_value_low_stock_amount( $product ) { + return $product->managing_stock() && $product->get_low_stock_amount( 'edit' ) ? $product->get_low_stock_amount( 'edit' ) : ''; + } + /** * Get type value. * From e5800b66b0b684a4e00a4b2f44955be06267f2e0 Mon Sep 17 00:00:00 2001 From: Joey Date: Sun, 27 May 2018 06:43:23 +0100 Subject: [PATCH 019/984] updated low_stock_amount fields to use global value if no value is entered --- .../admin/meta-boxes/views/html-product-data-inventory.php | 4 ++-- includes/admin/meta-boxes/views/html-variation-admin.php | 4 ++-- includes/wc-stock-functions.php | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/includes/admin/meta-boxes/views/html-product-data-inventory.php b/includes/admin/meta-boxes/views/html-product-data-inventory.php index 51219ccd38d..0937315ce9e 100644 --- a/includes/admin/meta-boxes/views/html-product-data-inventory.php +++ b/includes/admin/meta-boxes/views/html-product-data-inventory.php @@ -67,14 +67,14 @@ if ( ! defined( 'ABSPATH' ) ) { woocommerce_wp_text_input( array( 'id' => '_low_stock_amount', - 'value' => -1 === $product_object->get_low_stock_amount( 'edit' ) ? '' : $product_object->get_low_stock_amount( 'edit' ), + 'value' => '' === $product_object->get_low_stock_amount( 'edit' ) ? get_option( 'woocommerce_notify_low_stock_amount', 2 ) : $product_object->get_low_stock_amount( 'edit' ), 'label' => __( 'Low stock threshold', 'woocommerce' ), 'desc_tip' => true, 'description' => __( 'When product stock reaches this amount you will be notified by email', 'woocommerce' ), 'type' => 'number', 'custom_attributes' => array( 'min' => 0, - 'step' => 1, + 'step' => 'any', ), 'data_type' => 'stock', ) ); diff --git a/includes/admin/meta-boxes/views/html-variation-admin.php b/includes/admin/meta-boxes/views/html-variation-admin.php index 1405375bb2d..c468511e6d1 100644 --- a/includes/admin/meta-boxes/views/html-variation-admin.php +++ b/includes/admin/meta-boxes/views/html-variation-admin.php @@ -199,14 +199,14 @@ if ( ! defined( 'ABSPATH' ) ) { array( 'id' => "variable_low_stock_amount{$loop}", 'name' => "variable_low_stock_amount[{$loop}]", - 'value' => wc_stock_amount( $variation_object->get_low_stock_amount( 'edit' ) ), + 'value' => '' === $variation_object->get_low_stock_amount( 'edit' ) ? get_option( 'woocommerce_notify_low_stock_amount', 2 ) : $variation_object->get_low_stock_amount( 'edit' ), 'label' => __( 'Low stock threshold', 'woocommerce' ), 'desc_tip' => true, 'description' => __( 'When product stock reaches this amount you will be notified by email', 'woocommerce' ), 'type' => 'number', 'custom_attributes' => array( 'min' => 0, - 'step' => 1, + 'step' => 'any', ), 'data_type' => 'stock', 'wrapper_class' => 'form-row form-row-first', diff --git a/includes/wc-stock-functions.php b/includes/wc-stock-functions.php index ff1d8b4be88..fb725526f06 100644 --- a/includes/wc-stock-functions.php +++ b/includes/wc-stock-functions.php @@ -158,7 +158,7 @@ function wc_reduce_stock_levels( $order_id ) { */ function wc_get_low_stock_amount( WC_Product $product ) { $low_stock_amount = absint( $product->get_low_stock_amount() ); - if ( ! is_int( $low_stock_amount ) ) { + if ( ! is_int( $low_stock_amount ) || -1 === $low_stock_amount ) { $low_stock_amount = absint( get_option( 'woocommerce_notify_low_stock_amount', 2 ) ); } From 2ae09ce1cef8f334bbac32d598af95dac9b356b4 Mon Sep 17 00:00:00 2001 From: Peter Fabian Date: Tue, 29 May 2018 14:55:22 +0200 Subject: [PATCH 020/984] Removed 'orders_count' and 'total_spent' fields from v3 API. --- .../class-wc-rest-customers-controller.php | 323 ++++++++++++++++++ 1 file changed, 323 insertions(+) diff --git a/includes/api/class-wc-rest-customers-controller.php b/includes/api/class-wc-rest-customers-controller.php index 2bdacd95ba0..ab205628946 100644 --- a/includes/api/class-wc-rest-customers-controller.php +++ b/includes/api/class-wc-rest-customers-controller.php @@ -24,4 +24,327 @@ class WC_REST_Customers_Controller extends WC_REST_Customers_V2_Controller { * @var string */ protected $namespace = 'wc/v3'; + + /** + * Get formatted item data. + * + * @since 3.0.0 + * @param WC_Data $object WC_Data instance. + * @return array + */ + protected function get_formatted_item_data( $object ) { + $data = $object->get_data(); + $format_date = array( 'date_created', 'date_modified' ); + + // Format date values. + foreach ( $format_date as $key ) { + $datetime = $data[ $key ]; + $data[ $key ] = wc_rest_prepare_date_response( $datetime, false ); + $data[ $key . '_gmt' ] = wc_rest_prepare_date_response( $datetime ); + } + + return array( + 'id' => $object->get_id(), + 'date_created' => $data['date_created'], + 'date_created_gmt' => $data['date_created_gmt'], + 'date_modified' => $data['date_modified'], + 'date_modified_gmt' => $data['date_modified_gmt'], + 'email' => $data['email'], + 'first_name' => $data['first_name'], + 'last_name' => $data['last_name'], + 'role' => $data['role'], + 'username' => $data['username'], + 'billing' => $data['billing'], + 'shipping' => $data['shipping'], + 'is_paying_customer' => $data['is_paying_customer'], + 'avatar_url' => $object->get_avatar_url(), + 'meta_data' => $data['meta_data'], + ); + } + + /** + * Prepare a single customer output for response. + * + * @param WP_User $user_data User object. + * @param WP_REST_Request $request Request object. + * @return WP_REST_Response $response Response data. + */ + public function prepare_item_for_response( $user_data, $request ) { + $customer = new WC_Customer( $user_data->ID ); + $data = $this->get_formatted_item_data( $customer ); + $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; + $data = $this->add_additional_fields_to_object( $data, $request ); + $data = $this->filter_response_by_context( $data, $context ); + $response = rest_ensure_response( $data ); + $response->add_links( $this->prepare_links( $user_data ) ); + + /** + * Filter customer data returned from the REST API. + * + * @param WP_REST_Response $response The response object. + * @param WP_User $user_data User object used to create response. + * @param WP_REST_Request $request Request object. + */ + return apply_filters( 'woocommerce_rest_prepare_customer', $response, $user_data, $request ); + } + + /** + * Update customer meta fields. + * + * @param WC_Customer $customer Customer data. + * @param WP_REST_Request $request Request data. + */ + protected function update_customer_meta_fields( $customer, $request ) { + parent::update_customer_meta_fields( $customer, $request ); + + // Meta data. + if ( isset( $request['meta_data'] ) ) { + if ( is_array( $request['meta_data'] ) ) { + foreach ( $request['meta_data'] as $meta ) { + $customer->update_meta_data( $meta['key'], $meta['value'], isset( $meta['id'] ) ? $meta['id'] : '' ); + } + } + } + } + + /** + * Get the Customer's schema, conforming to JSON Schema. + * + * @return array + */ + public function get_item_schema() { + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => 'customer', + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_created' => array( + 'description' => __( "The date the customer was created, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_created_gmt' => array( + 'description' => __( 'The date the order was created, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_modified' => array( + 'description' => __( "The date the customer was last modified, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_modified_gmt' => array( + 'description' => __( 'The date the customer was last modified, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'email' => array( + 'description' => __( 'The email address for the customer.', 'woocommerce' ), + 'type' => 'string', + 'format' => 'email', + 'context' => array( 'view', 'edit' ), + ), + 'first_name' => array( + 'description' => __( 'Customer first name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'arg_options' => array( + 'sanitize_callback' => 'sanitize_text_field', + ), + ), + 'last_name' => array( + 'description' => __( 'Customer last name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'arg_options' => array( + 'sanitize_callback' => 'sanitize_text_field', + ), + ), + 'role' => array( + 'description' => __( 'Customer role.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'username' => array( + 'description' => __( 'Customer login name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'arg_options' => array( + 'sanitize_callback' => 'sanitize_user', + ), + ), + 'password' => array( + 'description' => __( 'Customer password.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'edit' ), + ), + 'billing' => array( + 'description' => __( 'List of billing address data.', 'woocommerce' ), + 'type' => 'object', + 'context' => array( 'view', 'edit' ), + 'properties' => array( + 'first_name' => array( + 'description' => __( 'First name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'last_name' => array( + 'description' => __( 'Last name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'company' => array( + 'description' => __( 'Company name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'address_1' => array( + 'description' => __( 'Address line 1', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'address_2' => array( + 'description' => __( 'Address line 2', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'city' => array( + 'description' => __( 'City name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'state' => array( + 'description' => __( 'ISO code or name of the state, province or district.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'postcode' => array( + 'description' => __( 'Postal code.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'country' => array( + 'description' => __( 'ISO code of the country.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'email' => array( + 'description' => __( 'Email address.', 'woocommerce' ), + 'type' => 'string', + 'format' => 'email', + 'context' => array( 'view', 'edit' ), + ), + 'phone' => array( + 'description' => __( 'Phone number.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + 'shipping' => array( + 'description' => __( 'List of shipping address data.', 'woocommerce' ), + 'type' => 'object', + 'context' => array( 'view', 'edit' ), + 'properties' => array( + 'first_name' => array( + 'description' => __( 'First name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'last_name' => array( + 'description' => __( 'Last name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'company' => array( + 'description' => __( 'Company name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'address_1' => array( + 'description' => __( 'Address line 1', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'address_2' => array( + 'description' => __( 'Address line 2', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'city' => array( + 'description' => __( 'City name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'state' => array( + 'description' => __( 'ISO code or name of the state, province or district.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'postcode' => array( + 'description' => __( 'Postal code.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'country' => array( + 'description' => __( 'ISO code of the country.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + 'is_paying_customer' => array( + 'description' => __( 'Is the customer a paying customer?', 'woocommerce' ), + 'type' => 'bool', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'avatar_url' => array( + 'description' => __( 'Avatar URL.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'meta_data' => array( + 'description' => __( 'Meta data.', 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Meta ID.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'key' => array( + 'description' => __( 'Meta key.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'value' => array( + 'description' => __( 'Meta value.', 'woocommerce' ), + 'type' => 'mixed', + 'context' => array( 'view', 'edit' ), + ), + ), + ), + ), + ), + ); + + return $this->add_additional_fields_schema( $schema ); + } } From a8351df826cd22c5cf065ea37366669909543728 Mon Sep 17 00:00:00 2001 From: Claudio Sanches Date: Tue, 29 May 2018 11:22:18 -0300 Subject: [PATCH 021/984] Introduced new helper to check reviews permissions --- includes/wc-rest-functions.php | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/includes/wc-rest-functions.php b/includes/wc-rest-functions.php index ecf460ed404..26fb94673b9 100644 --- a/includes/wc-rest-functions.php +++ b/includes/wc-rest-functions.php @@ -331,3 +331,27 @@ function wc_rest_check_manager_permissions( $object, $context = 'read' ) { return apply_filters( 'woocommerce_rest_check_permissions', $permission, $context, 0, $object ); } + +/** + * Check product reviews permissions on REST API. + * + * @since 3.5.0 + * @param string $context Request context. + * @param string $object_id Object ID. + * @return bool + */ +function wc_rest_check_product_reviews_permissions( $context = 'read', $object_id = 0 ) { + $contexts = array( + 'read' => 'read_private_posts', + 'create' => 'publish_posts', + 'edit' => 'edit_post', + 'delete' => 'delete_post', + 'batch' => 'edit_others_posts', + ); + + $cap = $contexts[ $context ]; + $post_type_object = get_post_type_object( $post_type ); + $permission = current_user_can( $post_type_object->cap->$cap ); + + return apply_filters( 'woocommerce_rest_check_permissions', $permission, $context, $object_id, 'product_review' ); +} From c427b92c8e4637304f4541c788a1771338c61ee3 Mon Sep 17 00:00:00 2001 From: Claudio Sanches Date: Tue, 29 May 2018 11:22:32 -0300 Subject: [PATCH 022/984] Schema and endpoints for new reviews endpoint --- ...ass-wc-rest-product-reviews-controller.php | 262 +++++++++++++++++- 1 file changed, 258 insertions(+), 4 deletions(-) diff --git a/includes/api/class-wc-rest-product-reviews-controller.php b/includes/api/class-wc-rest-product-reviews-controller.php index 8481d5eda08..cd261152639 100644 --- a/includes/api/class-wc-rest-product-reviews-controller.php +++ b/includes/api/class-wc-rest-product-reviews-controller.php @@ -2,10 +2,10 @@ /** * REST API Product Reviews Controller * - * Handles requests to /products//reviews. + * Handles requests to /products/reviews. * * @package WooCommerce/API - * @since 2.6.0 + * @since 3.5.0 */ defined( 'ABSPATH' ) || exit; @@ -14,9 +14,9 @@ defined( 'ABSPATH' ) || exit; * REST API Product Reviews Controller Class. * * @package WooCommerce/API - * @extends WC_REST_Product_Reviews_V2_Controller + * @extends WC_REST_Controller */ -class WC_REST_Product_Reviews_Controller extends WC_REST_Product_Reviews_V2_Controller { +class WC_REST_Product_Reviews_Controller extends WC_REST_Controller { /** * Endpoint namespace. @@ -24,4 +24,258 @@ class WC_REST_Product_Reviews_Controller extends WC_REST_Product_Reviews_V2_Cont * @var string */ protected $namespace = 'wc/v3'; + + /** + * Route base. + * + * @var string + */ + protected $rest_base = 'products/reviews'; + + /** + * Register the routes for product reviews. + */ + public function register_routes() { + register_rest_route( + $this->namespace, '/' . $this->rest_base, array( + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_items' ), + 'permission_callback' => array( $this, 'get_items_permissions_check' ), + 'args' => $this->get_collection_params(), + ), + array( + 'methods' => WP_REST_Server::CREATABLE, + 'callback' => array( $this, 'create_item' ), + 'permission_callback' => array( $this, 'create_item_permissions_check' ), + 'args' => array_merge( + $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ), array( + 'product_id' => array( + 'required' => true, + 'description' => __( 'Unique identifier for the product.', 'woocommerce' ), + 'type' => 'integer', + ), + 'review' => array( + 'required' => true, + 'type' => 'string', + 'description' => __( 'Review content.', 'woocommerce' ), + ), + 'name' => array( + 'required' => true, + 'type' => 'string', + 'description' => __( 'Name of the reviewer.', 'woocommerce' ), + ), + 'email' => array( + 'required' => true, + 'type' => 'string', + 'description' => __( 'Email of the reviewer.', 'woocommerce' ), + ), + ) + ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + + register_rest_route( + $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)', array( + 'args' => array( + 'id' => array( + 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), + 'type' => 'integer', + ), + ), + array( + 'methods' => WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_item' ), + 'permission_callback' => array( $this, 'get_item_permissions_check' ), + 'args' => array( + 'context' => $this->get_context_param( array( 'default' => 'view' ) ), + ), + ), + array( + 'methods' => WP_REST_Server::EDITABLE, + 'callback' => array( $this, 'update_item' ), + 'permission_callback' => array( $this, 'update_item_permissions_check' ), + 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ), + ), + array( + 'methods' => WP_REST_Server::DELETABLE, + 'callback' => array( $this, 'delete_item' ), + 'permission_callback' => array( $this, 'delete_item_permissions_check' ), + 'args' => array( + 'force' => array( + 'default' => false, + 'type' => 'boolean', + 'description' => __( 'Whether to bypass trash and force deletion.', 'woocommerce' ), + ), + ), + ), + 'schema' => array( $this, 'get_public_item_schema' ), + ) + ); + } + + /** + * Check whether a given request has permission to read webhook deliveries. + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_Error|boolean + */ + public function get_items_permissions_check( $request ) { + if ( ! wc_rest_check_product_reviews_permissions( 'read' ) ) { + return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot list resources.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); + } + + return true; + } + + /** + * Check if a given request has access to read a product review. + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_Error|boolean + */ + public function get_item_permissions_check( $request ) { + $review = get_comment( (int) $request['id'] ); + + if ( $review && ! wc_rest_check_product_reviews_permissions( 'read', $review->ID ) ) { + return new WP_Error( 'woocommerce_rest_cannot_view', __( 'Sorry, you cannot view this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); + } + + return true; + } + + /** + * Check if a given request has access to create a new product review. + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_Error|boolean + */ + public function create_item_permissions_check( $request ) { + if ( ! wc_rest_check_product_reviews_permissions( 'create' ) ) { + return new WP_Error( 'woocommerce_rest_cannot_create', __( 'Sorry, you are not allowed to create resources.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); + } + + return true; + } + + /** + * Check if a given request has access to update a product review. + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_Error|boolean + */ + public function update_item_permissions_check( $request ) { + $review = get_comment( (int) $request['id'] ); + + if ( $review && ! wc_rest_check_product_reviews_permissions( 'edit', $review->ID ) ) { + return new WP_Error( 'woocommerce_rest_cannot_edit', __( 'Sorry, you cannot edit this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); + } + + return true; + } + + /** + * Check if a given request has access to delete a product review. + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_Error|boolean + */ + public function delete_item_permissions_check( $request ) { + $review = get_comment( (int) $request['id'] ); + + if ( $review && ! wc_rest_check_product_reviews_permissions( 'delete', $review->ID ) ) { + return new WP_Error( 'woocommerce_rest_cannot_edit', __( 'Sorry, you cannot delete this resource.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); + } + + return true; + } + + /** + * Get the Product Review's schema, conforming to JSON Schema. + * + * @return array + */ + public function get_item_schema() { + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => 'product_review', + 'type' => 'object', + 'properties' => array( + 'id' => array( + 'description' => __( 'Unique identifier for the resource.', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'product_id' => array( + 'description' => __( 'Unique identifier for the product that the review belongs to.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'status' => array( + 'description' => __( 'Status of the review', 'woocommerce' ), + 'type' => 'string', + 'enum' => array( 'pending', 'approved', 'trash', 'spam' ), + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'date_created' => array( + 'description' => __( "The date the review was created, in the site's timezone.", 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + ), + 'date_created_gmt' => array( + 'description' => __( 'The date the review was created, as GMT.', 'woocommerce' ), + 'type' => 'date-time', + 'context' => array( 'view', 'edit' ), + ), + 'reviewer' => array( + 'description' => __( 'Reviewer name.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'email' => array( + 'description' => __( 'Reviewer email.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'avatar_urls' => array( + 'description' => __( "URLs for the reviewer's avatar.", 'woocommerce' ), + 'type' => 'array', + 'context' => array( 'view', 'edit' ), + ), + 'verified' => array( + 'description' => __( 'Shows if the reviewer bought the product or not.', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'review' => array( + 'description' => __( 'The content of the review.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + ), + 'rating' => array( + 'description' => __( 'Review rating (0 to 5).', 'woocommerce' ), + 'type' => 'integer', + 'context' => array( 'view', 'edit' ), + ), + ), + ); + + return $this->add_additional_fields_schema( $schema ); + } + + /** + * Get the query params for collections. + * + * @return array + */ + public function get_collection_params() { + return array( + 'context' => $this->get_context_param( array( 'default' => 'view' ) ), + ); + } } From 3b91c765e5e2efad70757955585de2083b1586ef Mon Sep 17 00:00:00 2001 From: Peter Fabian Date: Wed, 30 May 2018 18:05:35 +0200 Subject: [PATCH 023/984] Removed functions unchanged vs v2. --- .../class-wc-rest-customers-controller.php | 45 ------------------- 1 file changed, 45 deletions(-) diff --git a/includes/api/class-wc-rest-customers-controller.php b/includes/api/class-wc-rest-customers-controller.php index ab205628946..a83061a8b4e 100644 --- a/includes/api/class-wc-rest-customers-controller.php +++ b/includes/api/class-wc-rest-customers-controller.php @@ -62,51 +62,6 @@ class WC_REST_Customers_Controller extends WC_REST_Customers_V2_Controller { ); } - /** - * Prepare a single customer output for response. - * - * @param WP_User $user_data User object. - * @param WP_REST_Request $request Request object. - * @return WP_REST_Response $response Response data. - */ - public function prepare_item_for_response( $user_data, $request ) { - $customer = new WC_Customer( $user_data->ID ); - $data = $this->get_formatted_item_data( $customer ); - $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; - $data = $this->add_additional_fields_to_object( $data, $request ); - $data = $this->filter_response_by_context( $data, $context ); - $response = rest_ensure_response( $data ); - $response->add_links( $this->prepare_links( $user_data ) ); - - /** - * Filter customer data returned from the REST API. - * - * @param WP_REST_Response $response The response object. - * @param WP_User $user_data User object used to create response. - * @param WP_REST_Request $request Request object. - */ - return apply_filters( 'woocommerce_rest_prepare_customer', $response, $user_data, $request ); - } - - /** - * Update customer meta fields. - * - * @param WC_Customer $customer Customer data. - * @param WP_REST_Request $request Request data. - */ - protected function update_customer_meta_fields( $customer, $request ) { - parent::update_customer_meta_fields( $customer, $request ); - - // Meta data. - if ( isset( $request['meta_data'] ) ) { - if ( is_array( $request['meta_data'] ) ) { - foreach ( $request['meta_data'] as $meta ) { - $customer->update_meta_data( $meta['key'], $meta['value'], isset( $meta['id'] ) ? $meta['id'] : '' ); - } - } - } - } - /** * Get the Customer's schema, conforming to JSON Schema. * From 9ce165d75e25e3bd25f0a1d7705d58429880ae8e Mon Sep 17 00:00:00 2001 From: Peter Fabian Date: Tue, 5 Jun 2018 13:22:22 +0200 Subject: [PATCH 024/984] Added extra join with parent product to filter variable products from REST API --- ...-wc-rest-product-variations-controller.php | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/includes/api/class-wc-rest-product-variations-controller.php b/includes/api/class-wc-rest-product-variations-controller.php index 621bffd7e5e..fe4b986796c 100644 --- a/includes/api/class-wc-rest-product-variations-controller.php +++ b/includes/api/class-wc-rest-product-variations-controller.php @@ -244,6 +244,43 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller return apply_filters( "woocommerce_rest_prepare_{$this->post_type}_object", $response, $object, $request ); } + /** + * Update JOIN part of WP_Query with parent table and taxonomies, if needed. + * + * @param string $join JOIN clause from WP_Query. + * @param WP_Query $wp_query WP_Query object. + * + * @return string + */ + public function parent_product_taxonomies_query_join( $join, $wp_query ) { + global $wpdb; + + // TODO: add some more checks here, probably only run in case one of the following filters are active: category, prod type, visibility, tag, shipping class, attribute; post_type == product_variation. + if ( isset( $wp_query->query_vars['post_parent'] ) && isset( $wp_query->query_vars['post_type'] ) && 'product_variation' === $wp_query->query_vars['post_type'] ) { + $join .= " LEFT JOIN {$wpdb->posts} AS p_wc_variation_parent ON ({$wpdb->posts}.post_parent = p_wc_variation_parent.ID) "; + $join .= $this->clauses['join']; + } + + return $join; + } + + /** + * Update WHERE part of WP_Query to match parent product with taxonomies, if needed. + * + * @param string $where WHERE clause from WP_Query. + * @param WP_Query $wp_query WP_Query object. + * + * @return string + */ + public function parent_product_taxonomies_query_where( $where, $wp_query ) { + // TODO: add some more checks here, probably only run in case one of the following filters are active: category, prod type, visibility, tag, shipping class, attribute; post_type == product_variation. + if ( isset( $wp_query->query_vars['post_parent'] ) && isset( $wp_query->query_vars['post_type'] ) && 'product_variation' === $wp_query->query_vars['post_type'] ) { + $where .= $this->clauses['where']; + } + + return $where; + } + /** * Prepare objects query. * @@ -255,6 +292,42 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller $args = parent::prepare_objects_query( $request ); $args['post_parent'] = $request['product_id']; + // TODO: check if WC_Product_Data_Store_CPT::find_matching_product_variation could not be used... + // fix the filtering, otherwise taxonomy is not mapped correctly to variable product. + $taxonomies = $args['tax_query']; + // maybe do this only if there are taxonomies as categories etc, not attributes and terms? + $query_for_parent = new WP_Query( $args ); + $query_for_parent->parse_tax_query( $query_for_parent->query_vars ); + + $this->clauses = $query_for_parent->tax_query->get_sql( 'p_wc_variation_parent', 'ID' ); + + // this does not work anyway as these are not assigned to variation. + unset( $args['tax_query'] ); + + // these properties should filter parent product: + // - product_type, _visibility_, cat, tag, shipping_class + // this will run a bit later. + add_filter( 'posts_where', array( $this, 'parent_product_taxonomies_query_where' ), 10, 2 ); + add_filter( 'posts_join', array( $this, 'parent_product_taxonomies_query_join' ), 10, 2 ); + + // These properties needs to be transformed to meta query. + foreach ( $taxonomies as $taxonomy ) { + if ( in_array( $taxonomy['taxonomy'], array( 'product_type', 'product_visibility', 'product_cat', 'product_tag', 'product_shipping_class' ), true ) ) { + continue; + } + if ( 'term_id' === $taxonomy['field'] ) { + $terms = wc_get_product_terms( 10, $taxonomy['taxonomy'], array( 'fields' => 'slugs' ) ); + $value = isset( $terms[ $taxonomy['terms'][0] ] ) ? $terms[ $taxonomy['terms'][0] ] : null; + } else { + $value = $taxonomy['terms'][0]; + } + $args['meta_query'] = $this->add_meta_query( // WPCS: slow query ok. + $args, array( + 'key' => 'attribute_' . $taxonomy['taxonomy'], + 'value' => $value, + ) + ); + } return $args; } From 98e44092e73188cb13eb2ee113f4ed0df23fe0a0 Mon Sep 17 00:00:00 2001 From: Joey Date: Thu, 7 Jun 2018 14:37:06 +0100 Subject: [PATCH 025/984] updating suggested changes --- includes/abstracts/abstract-wc-product.php | 2 +- includes/admin/meta-boxes/class-wc-meta-box-product-data.php | 2 +- includes/admin/meta-boxes/views/html-product-data-inventory.php | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/includes/abstracts/abstract-wc-product.php b/includes/abstracts/abstract-wc-product.php index bdea516b040..496f5f0642f 100644 --- a/includes/abstracts/abstract-wc-product.php +++ b/includes/abstracts/abstract-wc-product.php @@ -74,7 +74,7 @@ class WC_Product extends WC_Abstract_Legacy_Product { 'stock_quantity' => null, 'stock_status' => 'instock', 'backorders' => 'no', - 'low_stock_amount' => -1, + 'low_stock_amount' => '', 'sold_individually' => false, 'weight' => '', 'length' => '', diff --git a/includes/admin/meta-boxes/class-wc-meta-box-product-data.php b/includes/admin/meta-boxes/class-wc-meta-box-product-data.php index 43f21f8161b..543d3a34f1a 100644 --- a/includes/admin/meta-boxes/class-wc-meta-box-product-data.php +++ b/includes/admin/meta-boxes/class-wc-meta-box-product-data.php @@ -456,7 +456,7 @@ class WC_Meta_Box_Product_Data { 'manage_stock' => isset( $_POST['variable_manage_stock'][ $i ] ), 'stock_quantity' => $stock, 'backorders' => isset( $_POST['variable_backorders'], $_POST['variable_backorders'][ $i ] ) ? wc_clean( $_POST['variable_backorders'][ $i ] ) : null, - 'low_stock_amount' => wc_clean( $_POST['variable_low_stock_amount'][ $i ] ), + 'low_stock_amount' => wc_stock_amount( $_POST['variable_low_stock_amount'][ $i ] ), 'stock_status' => wc_clean( $_POST['variable_stock_status'][ $i ] ), 'image_id' => wc_clean( $_POST['upload_image_id'][ $i ] ), 'attributes' => self::prepare_set_attributes( $parent->get_attributes(), 'attribute_', $i ), diff --git a/includes/admin/meta-boxes/views/html-product-data-inventory.php b/includes/admin/meta-boxes/views/html-product-data-inventory.php index 0937315ce9e..5f178a55cf9 100644 --- a/includes/admin/meta-boxes/views/html-product-data-inventory.php +++ b/includes/admin/meta-boxes/views/html-product-data-inventory.php @@ -73,7 +73,6 @@ if ( ! defined( 'ABSPATH' ) ) { 'description' => __( 'When product stock reaches this amount you will be notified by email', 'woocommerce' ), 'type' => 'number', 'custom_attributes' => array( - 'min' => 0, 'step' => 'any', ), 'data_type' => 'stock', From 007fc6e0caf8996b95cdf98d267a45617e7095d4 Mon Sep 17 00:00:00 2001 From: dezio1900 Date: Mon, 11 Jun 2018 20:27:32 +0200 Subject: [PATCH 026/984] Allow items to be changed in wc_save_order_items function Allow other plugins to be able to change $item object, for example to adjust line subtotal/total before its saved. My need for this change is because I have custom booking product item, and attached custom inputs for the item ( checkin / checkout dates etc ). So whenever those inputs are changed in order edit page and ajax save is triggered, I need to auto adjust booking item's line subtotal/total ( because of booking dates changed ) before item is saved. --- includes/admin/wc-admin-functions.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/includes/admin/wc-admin-functions.php b/includes/admin/wc-admin-functions.php index c8f89781bae..7cea9ca2351 100644 --- a/includes/admin/wc-admin-functions.php +++ b/includes/admin/wc-admin-functions.php @@ -250,6 +250,9 @@ function wc_save_order_items( $order_id, $items ) { } } } + + // Allow other plugins to change item object before it is saved. + do_action( 'woocommerce_before_save_order_item', $item, $item_data, $order_id ); $item->save(); } From cb2980596c87501960a37ffbc3c2b3c26092491c Mon Sep 17 00:00:00 2001 From: dezio1900 Date: Mon, 11 Jun 2018 20:56:40 +0200 Subject: [PATCH 027/984] Update wc-admin-functions.php --- includes/admin/wc-admin-functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/admin/wc-admin-functions.php b/includes/admin/wc-admin-functions.php index 7cea9ca2351..1dae377b8d2 100644 --- a/includes/admin/wc-admin-functions.php +++ b/includes/admin/wc-admin-functions.php @@ -250,7 +250,7 @@ function wc_save_order_items( $order_id, $items ) { } } } - + // Allow other plugins to change item object before it is saved. do_action( 'woocommerce_before_save_order_item', $item, $item_data, $order_id ); From 1a3b5b165dbfa4b44d879128706bc90d98bd4e34 Mon Sep 17 00:00:00 2001 From: Peter Fabian Date: Mon, 18 Jun 2018 10:15:36 +0200 Subject: [PATCH 028/984] Factor out parent table name to variable, allow big SELECT. --- ...-wc-rest-product-variations-controller.php | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/includes/api/class-wc-rest-product-variations-controller.php b/includes/api/class-wc-rest-product-variations-controller.php index fe4b986796c..00a2fe6fb18 100644 --- a/includes/api/class-wc-rest-product-variations-controller.php +++ b/includes/api/class-wc-rest-product-variations-controller.php @@ -39,6 +39,20 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller */ protected $post_type = 'product_variation'; + /** + * Name of parent product table in SQL query. + * + * @var string + */ + protected $parent_product_table_name = 'p_wc_variation_parent'; + + /** + * Extra clauses to add to WP_Query. + * + * @var array + */ + protected $clauses = array(); + /** * Initialize product actions (parent). */ @@ -255,9 +269,11 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller public function parent_product_taxonomies_query_join( $join, $wp_query ) { global $wpdb; - // TODO: add some more checks here, probably only run in case one of the following filters are active: category, prod type, visibility, tag, shipping class, attribute; post_type == product_variation. - if ( isset( $wp_query->query_vars['post_parent'] ) && isset( $wp_query->query_vars['post_type'] ) && 'product_variation' === $wp_query->query_vars['post_type'] ) { - $join .= " LEFT JOIN {$wpdb->posts} AS p_wc_variation_parent ON ({$wpdb->posts}.post_parent = p_wc_variation_parent.ID) "; + // TODO: add some more checks here, probably only run in case one of the following filters are active: + // category, prod type, visibility, tag, shipping class, attribute; post_type == product_variation. + if ( isset( $wp_query->query_vars['post_parent'] ) && $wp_query->query_vars['meta_query'] + && isset( $wp_query->query_vars['post_type'] ) && 'product_variation' === $wp_query->query_vars['post_type'] ) { + $join .= " LEFT JOIN {$wpdb->posts} AS {$this->parent_product_table_name} ON ({$wpdb->posts}.post_parent = {$this->parent_product_table_name}.ID) "; $join .= $this->clauses['join']; } @@ -273,8 +289,10 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller * @return string */ public function parent_product_taxonomies_query_where( $where, $wp_query ) { - // TODO: add some more checks here, probably only run in case one of the following filters are active: category, prod type, visibility, tag, shipping class, attribute; post_type == product_variation. - if ( isset( $wp_query->query_vars['post_parent'] ) && isset( $wp_query->query_vars['post_type'] ) && 'product_variation' === $wp_query->query_vars['post_type'] ) { + // TODO: add some more checks here, probably only run in case one of the following filters are active: + // category, prod type, visibility, tag, shipping class, attribute; post_type == product_variation. + if ( isset( $wp_query->query_vars['post_parent'] ) + && isset( $wp_query->query_vars['post_type'] ) && 'product_variation' === $wp_query->query_vars['post_type'] ) { $where .= $this->clauses['where']; } @@ -299,7 +317,7 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller $query_for_parent = new WP_Query( $args ); $query_for_parent->parse_tax_query( $query_for_parent->query_vars ); - $this->clauses = $query_for_parent->tax_query->get_sql( 'p_wc_variation_parent', 'ID' ); + $this->clauses = $query_for_parent->tax_query->get_sql( $this->parent_product_table_name, 'ID' ); // this does not work anyway as these are not assigned to variation. unset( $args['tax_query'] ); @@ -310,6 +328,7 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller add_filter( 'posts_where', array( $this, 'parent_product_taxonomies_query_where' ), 10, 2 ); add_filter( 'posts_join', array( $this, 'parent_product_taxonomies_query_join' ), 10, 2 ); + $GLOBALS['wpdb']->query( 'SET SESSION SQL_BIG_SELECTS=1' ); // These properties needs to be transformed to meta query. foreach ( $taxonomies as $taxonomy ) { if ( in_array( $taxonomy['taxonomy'], array( 'product_type', 'product_visibility', 'product_cat', 'product_tag', 'product_shipping_class' ), true ) ) { From cd8416122f45963955ad494188604998d42e2455 Mon Sep 17 00:00:00 2001 From: Joey Date: Tue, 19 Jun 2018 12:40:27 +0100 Subject: [PATCH 029/984] removed low stock options for variations, and addressed changes --- includes/abstracts/abstract-wc-product.php | 9 +++++---- .../class-wc-admin-list-table-products.php | 2 +- .../class-wc-meta-box-product-data.php | 3 +-- .../views/html-product-data-inventory.php | 3 ++- .../meta-boxes/views/html-variation-admin.php | 18 ------------------ ...s-wc-rest-product-variations-controller.php | 11 ----------- .../api/class-wc-rest-products-controller.php | 2 +- .../v1/class-wc-rest-products-controller.php | 13 +------------ ...ass-wc-product-variation-data-store-cpt.php | 1 - .../export/class-wc-product-csv-exporter.php | 3 ++- .../import/class-wc-product-csv-importer.php | 2 +- includes/wc-stock-functions.php | 6 +++--- 12 files changed, 17 insertions(+), 56 deletions(-) diff --git a/includes/abstracts/abstract-wc-product.php b/includes/abstracts/abstract-wc-product.php index 496f5f0642f..b94fe79f1e5 100644 --- a/includes/abstracts/abstract-wc-product.php +++ b/includes/abstracts/abstract-wc-product.php @@ -394,8 +394,8 @@ class WC_Product extends WC_Abstract_Legacy_Product { * Get low stock amount. * * @param string $context What the value is for. Valid values are view and edit. - * @since 3.4.0 - * @return int|null + * @since 3.5.0 + * @return int|string Returns empty string if value not set */ public function get_low_stock_amount( $context = 'view' ) { return $this->get_prop( 'low_stock_amount', $context ); @@ -978,10 +978,11 @@ class WC_Product extends WC_Abstract_Legacy_Product { /** * Set low stock amount. * - * @param $amount + * @param int|string $amount Empty string if value not set + * @since 3.5.0 */ public function set_low_stock_amount( $amount ) { - $this->set_prop( 'low_stock_amount', $amount ); + $this->set_prop( 'low_stock_amount', '' === $amount ? '' : absint( $amount ) ); } /** diff --git a/includes/admin/list-tables/class-wc-admin-list-table-products.php b/includes/admin/list-tables/class-wc-admin-list-table-products.php index 28a1a9c2a81..55026eacab7 100644 --- a/includes/admin/list-tables/class-wc-admin-list-table-products.php +++ b/includes/admin/list-tables/class-wc-admin-list-table-products.php @@ -145,7 +145,7 @@ class WC_Admin_List_Table_Products extends WC_Admin_List_Table { } /** - * Render columm: name. + * Render column: name. */ protected function render_name_column() { global $post; diff --git a/includes/admin/meta-boxes/class-wc-meta-box-product-data.php b/includes/admin/meta-boxes/class-wc-meta-box-product-data.php index 543d3a34f1a..20b27491a4c 100644 --- a/includes/admin/meta-boxes/class-wc-meta-box-product-data.php +++ b/includes/admin/meta-boxes/class-wc-meta-box-product-data.php @@ -365,7 +365,7 @@ class WC_Meta_Box_Product_Data { 'backorders' => isset( $_POST['_backorders'] ) ? wc_clean( wp_unslash( $_POST['_backorders'] ) ) : null, 'stock_status' => wc_clean( wp_unslash( $_POST['_stock_status'] ) ), 'stock_quantity' => $stock, - 'low_stock_amount' => '' === $_POST['_low_stock_amount'] ? '' : absint( wp_unslash( $_POST['_low_stock_amount'] ) ), + 'low_stock_amount' => wc_stock_amount( wp_unslash( $_POST['_low_stock_amount'] ) ), 'download_limit' => '' === $_POST['_download_limit'] ? '' : absint( wp_unslash( $_POST['_download_limit'] ) ), 'download_expiry' => '' === $_POST['_download_expiry'] ? '' : absint( wp_unslash( $_POST['_download_expiry'] ) ), 'downloads' => self::prepare_downloads( @@ -456,7 +456,6 @@ class WC_Meta_Box_Product_Data { 'manage_stock' => isset( $_POST['variable_manage_stock'][ $i ] ), 'stock_quantity' => $stock, 'backorders' => isset( $_POST['variable_backorders'], $_POST['variable_backorders'][ $i ] ) ? wc_clean( $_POST['variable_backorders'][ $i ] ) : null, - 'low_stock_amount' => wc_stock_amount( $_POST['variable_low_stock_amount'][ $i ] ), 'stock_status' => wc_clean( $_POST['variable_stock_status'][ $i ] ), 'image_id' => wc_clean( $_POST['upload_image_id'][ $i ] ), 'attributes' => self::prepare_set_attributes( $parent->get_attributes(), 'attribute_', $i ), diff --git a/includes/admin/meta-boxes/views/html-product-data-inventory.php b/includes/admin/meta-boxes/views/html-product-data-inventory.php index 5f178a55cf9..21bb37f8241 100644 --- a/includes/admin/meta-boxes/views/html-product-data-inventory.php +++ b/includes/admin/meta-boxes/views/html-product-data-inventory.php @@ -67,7 +67,8 @@ if ( ! defined( 'ABSPATH' ) ) { woocommerce_wp_text_input( array( 'id' => '_low_stock_amount', - 'value' => '' === $product_object->get_low_stock_amount( 'edit' ) ? get_option( 'woocommerce_notify_low_stock_amount', 2 ) : $product_object->get_low_stock_amount( 'edit' ), + 'value' => $product_object->get_low_stock_amount( 'edit' ), + 'placeholder' => get_option( 'woocommerce_notify_low_stock_amount' ), 'label' => __( 'Low stock threshold', 'woocommerce' ), 'desc_tip' => true, 'description' => __( 'When product stock reaches this amount you will be notified by email', 'woocommerce' ), diff --git a/includes/admin/meta-boxes/views/html-variation-admin.php b/includes/admin/meta-boxes/views/html-variation-admin.php index c468511e6d1..175fb94baf9 100644 --- a/includes/admin/meta-boxes/views/html-variation-admin.php +++ b/includes/admin/meta-boxes/views/html-variation-admin.php @@ -195,24 +195,6 @@ if ( ! defined( 'ABSPATH' ) ) { ) ); - woocommerce_wp_text_input( - array( - 'id' => "variable_low_stock_amount{$loop}", - 'name' => "variable_low_stock_amount[{$loop}]", - 'value' => '' === $variation_object->get_low_stock_amount( 'edit' ) ? get_option( 'woocommerce_notify_low_stock_amount', 2 ) : $variation_object->get_low_stock_amount( 'edit' ), - 'label' => __( 'Low stock threshold', 'woocommerce' ), - 'desc_tip' => true, - 'description' => __( 'When product stock reaches this amount you will be notified by email', 'woocommerce' ), - 'type' => 'number', - 'custom_attributes' => array( - 'min' => 0, - 'step' => 'any', - ), - 'data_type' => 'stock', - 'wrapper_class' => 'form-row form-row-first', - ) - ); - /** * woocommerce_variation_options_inventory action. * diff --git a/includes/api/class-wc-rest-product-variations-controller.php b/includes/api/class-wc-rest-product-variations-controller.php index 1fd8dec63ab..621bffd7e5e 100644 --- a/includes/api/class-wc-rest-product-variations-controller.php +++ b/includes/api/class-wc-rest-product-variations-controller.php @@ -208,7 +208,6 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller 'manage_stock' => $object->managing_stock(), 'stock_quantity' => $object->get_stock_quantity(), 'in_stock' => $object->is_in_stock(), - 'low_stock_amount' => $object->get_low_stock_amount(), 'backorders' => $object->get_backorders(), 'backorders_allowed' => $object->backorders_allowed(), 'backordered' => $object->is_on_backorder(), @@ -347,10 +346,6 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller $variation->set_stock_status( true === $request['in_stock'] ? 'instock' : 'outofstock' ); } - if ( isset( $request['low_stock_amount'] ) ) { - $variation->set_low_stock_amount( $request['low_stock_amount'] ); - } - if ( isset( $request['backorders'] ) ) { $variation->set_backorders( $request['backorders'] ); } @@ -826,12 +821,6 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller 'default' => true, 'context' => array( 'view', 'edit' ), ), - 'low_stock_amount' => array( - 'description' => __( 'If managing stock, this controls when low stock notifications are sent.', 'woocommerce' ), - 'type' => 'integer', - 'default' => -1, - 'context' => array( 'view', 'edit' ), - ), 'backorders' => array( 'description' => __( 'If managing stock, this controls if backorders are allowed.', 'woocommerce' ), 'type' => 'string', diff --git a/includes/api/class-wc-rest-products-controller.php b/includes/api/class-wc-rest-products-controller.php index 1243288628d..9888add3808 100644 --- a/includes/api/class-wc-rest-products-controller.php +++ b/includes/api/class-wc-rest-products-controller.php @@ -1675,7 +1675,7 @@ class WC_REST_Products_Controller extends WC_REST_Legacy_Products_Controller { 'low_stock_amount' => array( 'description' => __( 'If managing stock, this controls when low stock notifications are sent.', 'woocommerce' ), 'type' => 'integer', - 'default' => -1, + 'default' => '', 'context' => array( 'view', 'edit' ), ), 'backorders' => array( diff --git a/includes/api/v1/class-wc-rest-products-controller.php b/includes/api/v1/class-wc-rest-products-controller.php index 247ab65eaa8..cf87ec9b420 100644 --- a/includes/api/v1/class-wc-rest-products-controller.php +++ b/includes/api/v1/class-wc-rest-products-controller.php @@ -569,7 +569,6 @@ class WC_REST_Products_V1_Controller extends WC_REST_Posts_Controller { 'manage_stock' => $variation->managing_stock(), 'stock_quantity' => $variation->get_stock_quantity(), 'in_stock' => $variation->is_in_stock(), - 'low_stock_amount' => $variation->get_low_stock_amount(), 'backorders' => $variation->get_backorders(), 'backorders_allowed' => $variation->backorders_allowed(), 'backordered' => $variation->is_on_backorder(), @@ -1449,10 +1448,6 @@ class WC_REST_Products_V1_Controller extends WC_REST_Posts_Controller { $variation->set_stock_status( true === $data['in_stock'] ? 'instock' : 'outofstock' ); } - if ( isset( $data['low_stock_amount'] ) ) { - $variation->set_low_stock_amount( $data['low_stock_amount'] ); - } - if ( isset( $data['backorders'] ) ) { $variation->set_backorders( $data['backorders'] ); } @@ -1970,7 +1965,7 @@ class WC_REST_Products_V1_Controller extends WC_REST_Posts_Controller { 'low_stock_amount' => array( 'description' => __( 'If managing stock, this controls when low stock notifications are sent.', 'woocommerce' ), 'type' => 'integer', - 'default' => -1, + 'default' => '', 'context' => array( 'view', 'edit' ), ), 'backorders' => array( @@ -2433,12 +2428,6 @@ class WC_REST_Products_V1_Controller extends WC_REST_Posts_Controller { 'default' => true, 'context' => array( 'view', 'edit' ), ), - 'low_stock_amount' => array( - 'description' => __( 'If managing stock, this controls when low stock notifications are sent.', 'woocommerce' ), - 'type' => 'integer', - 'default' => -1, - 'context' => array( 'view', 'edit' ), - ), 'backorders' => array( 'description' => __( 'If managing stock, this controls if backorders are allowed.', 'woocommerce' ), 'type' => 'string', diff --git a/includes/data-stores/class-wc-product-variation-data-store-cpt.php b/includes/data-stores/class-wc-product-variation-data-store-cpt.php index 9a90b8670df..b209f4b485c 100644 --- a/includes/data-stores/class-wc-product-variation-data-store-cpt.php +++ b/includes/data-stores/class-wc-product-variation-data-store-cpt.php @@ -314,7 +314,6 @@ class WC_Product_Variation_Data_Store_CPT extends WC_Product_Data_Store_CPT impl 'download_expiry' => get_post_meta( $id, '_download_expiry', true ), 'image_id' => get_post_thumbnail_id( $id ), 'backorders' => get_post_meta( $id, '_backorders', true ), - 'low_stock_amount' => get_post_meta( $id, '_low_stock_amount', true ), 'sku' => get_post_meta( $id, '_sku', true ), 'stock_quantity' => get_post_meta( $id, '_stock', true ), 'weight' => get_post_meta( $id, '_weight', true ), diff --git a/includes/export/class-wc-product-csv-exporter.php b/includes/export/class-wc-product-csv-exporter.php index c4111717e8c..c740e9bb634 100644 --- a/includes/export/class-wc-product-csv-exporter.php +++ b/includes/export/class-wc-product-csv-exporter.php @@ -448,7 +448,8 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter { * Get low stock amount value. * * @param WC_Product $product Product being exported. - * @return string + * @since 3.5.0 + * @return int|string Empty string if value not set */ protected function get_column_value_low_stock_amount( $product ) { return $product->managing_stock() && $product->get_low_stock_amount( 'edit' ) ? $product->get_low_stock_amount( 'edit' ) : ''; diff --git a/includes/import/class-wc-product-csv-importer.php b/includes/import/class-wc-product-csv-importer.php index b632bc60be5..93707b5d8a8 100644 --- a/includes/import/class-wc-product-csv-importer.php +++ b/includes/import/class-wc-product-csv-importer.php @@ -571,7 +571,7 @@ class WC_Product_CSV_Importer extends WC_Product_Importer { 'short_description' => array( $this, 'parse_skip_field' ), 'description' => array( $this, 'parse_skip_field' ), 'manage_stock' => array( $this, 'parse_bool_field' ), - 'low_stock_amount' => array( $this, 'parse_int_field' ), + 'low_stock_amount' => array( $this, 'parse_stock_quantity_field' ), 'backorders' => array( $this, 'parse_backorders_field' ), 'stock_status' => array( $this, 'parse_bool_field' ), 'sold_individually' => array( $this, 'parse_bool_field' ), diff --git a/includes/wc-stock-functions.php b/includes/wc-stock-functions.php index fb725526f06..9b25638a33a 100644 --- a/includes/wc-stock-functions.php +++ b/includes/wc-stock-functions.php @@ -152,13 +152,13 @@ function wc_reduce_stock_levels( $order_id ) { /** * Return low stock amount to determine if notification needs to be sent * - * @param WC_Product $product - * + * @param WC_Product $product + * @since 3.5.0 * @return int */ function wc_get_low_stock_amount( WC_Product $product ) { $low_stock_amount = absint( $product->get_low_stock_amount() ); - if ( ! is_int( $low_stock_amount ) || -1 === $low_stock_amount ) { + if ( ! is_int( $low_stock_amount ) || '' === $low_stock_amount ) { $low_stock_amount = absint( get_option( 'woocommerce_notify_low_stock_amount', 2 ) ); } From 97983a2d45fb46956e2d066908228f21bc2e441a Mon Sep 17 00:00:00 2001 From: Peter Fabian Date: Sat, 23 Jun 2018 13:50:31 +0200 Subject: [PATCH 030/984] Fixed missing terms in unit tests. in teardown method, terms are deleted, so e.g. Uncategorized product_cat was only avaialble if test was run individually, not in the whole batch. Should now be fixed. --- tests/framework/class-wc-unit-test-case.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/framework/class-wc-unit-test-case.php b/tests/framework/class-wc-unit-test-case.php index 0eda33d48c0..90632fde6fe 100644 --- a/tests/framework/class-wc-unit-test-case.php +++ b/tests/framework/class-wc-unit-test-case.php @@ -44,6 +44,16 @@ class WC_Unit_Test_Case extends WP_UnitTestCase { WC_Post_types::register_taxonomies(); } + /** + * Set up class unit test. + * + * @since 3.5.0 + */ + public static function setUpBeforeClass() { + // Terms are deleted in WP_UnitTestCase::tearDownAfterClass, then e.g. Uncategorized product_cat is missing. + WC_Install::create_terms(); + } + /** * Mock the WC session using the abstract class as cookies are not available. * during tests. From 60cd5caac2253a357ad02b0ab061fa3ab02030e9 Mon Sep 17 00:00:00 2001 From: Peter Fabian Date: Sat, 23 Jun 2018 13:53:50 +0200 Subject: [PATCH 031/984] Fixed terms fetching bug introduced in #20079. --- includes/wc-term-functions.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/includes/wc-term-functions.php b/includes/wc-term-functions.php index 5b1caf08a2c..96373a04f18 100644 --- a/includes/wc-term-functions.php +++ b/includes/wc-term-functions.php @@ -25,11 +25,11 @@ function wc_get_object_terms( $object_id, $taxonomy, $field = null, $index_key = // Test if terms exists. get_the_terms() return false when it finds no terms. $terms = get_the_terms( $object_id, $taxonomy ); - if ( ! $terms || is_wp_error( $terms ) || is_null( $field ) ) { + if ( ! $terms || is_wp_error( $terms ) ) { return array(); } - return wp_list_pluck( $terms, $field, $index_key ); + return is_null( $field ) ? $terms : wp_list_pluck( $terms, $field, $index_key ); } /** From 6ba409b772db1beac05f77d8092eedcb52ff7821 Mon Sep 17 00:00:00 2001 From: Peter Fabian Date: Sat, 23 Jun 2018 13:54:36 +0200 Subject: [PATCH 032/984] Added category related unit tests for products API. --- tests/unit-tests/api/products.php | 48 +++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/tests/unit-tests/api/products.php b/tests/unit-tests/api/products.php index 29ada6281ac..bd185e13e44 100644 --- a/tests/unit-tests/api/products.php +++ b/tests/unit-tests/api/products.php @@ -520,4 +520,52 @@ class Products_API extends WC_REST_Unit_Test_Case { $properties = $data['schema']['properties']; $this->assertEquals( 65, count( $properties ) ); } + + /** + * Test product category. + * + * @since 3.5.0 + */ + public function test_get_products_by_category() { + wp_set_current_user( $this->user ); + + // Test product assigned to a single category. + $category = wp_insert_term( 'Some Category', 'product_cat' ); + + $product = new WC_Product_Simple(); + $product->set_category_ids( array( $category['term_id'] ) ); + $product->save(); + + $args = array( + 'args' => array( + 'category' => $category['term_id'], + ), + ); + $response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v2/products', $args ) ); + $response_products = $response->get_data(); + + $this->assertEquals( 200, $response->get_status() ); + foreach ( $response_products as $response_product ) { + $this->assertEquals( $product->get_id(), $response_product['id'] ); + $this->assertEquals( $product->get_category_ids(), wp_list_pluck( $response_product['categories'], 'id' ) ); + } + + $product->delete( true ); + wp_delete_term( $category['term_id'], 'product_cat' ); + + // Test product without categories. + $product_2 = new WC_Product_Simple(); + $product_2->save(); + + $request = new WP_REST_Request( 'GET', '/wc/v2/products/' . $product_2->get_id() ); + $response = $this->server->dispatch( $request ); + $response_product = $response->get_data(); + + $this->assertEquals( 200, $response->get_status() ); + $this->assertCount( 1, $response_product['categories'] ); + $this->assertEquals( 'uncategorized', $response_product['categories'][0]['slug'] ); + + $product_2->delete( true ); + + } } From ef3d32699ce0f17527e0c1cceb058c7728f1545e Mon Sep 17 00:00:00 2001 From: Peter Fabian Date: Sat, 23 Jun 2018 13:55:42 +0200 Subject: [PATCH 033/984] Fixed missing key errors. --- includes/api/class-wc-rest-product-variations-controller.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/includes/api/class-wc-rest-product-variations-controller.php b/includes/api/class-wc-rest-product-variations-controller.php index 00a2fe6fb18..1ae7320e7a6 100644 --- a/includes/api/class-wc-rest-product-variations-controller.php +++ b/includes/api/class-wc-rest-product-variations-controller.php @@ -271,7 +271,7 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller // TODO: add some more checks here, probably only run in case one of the following filters are active: // category, prod type, visibility, tag, shipping class, attribute; post_type == product_variation. - if ( isset( $wp_query->query_vars['post_parent'] ) && $wp_query->query_vars['meta_query'] + if ( isset( $wp_query->query_vars['post_parent'] ) && isset( $wp_query->query_vars['meta_query'] ) && isset( $wp_query->query_vars['post_type'] ) && 'product_variation' === $wp_query->query_vars['post_type'] ) { $join .= " LEFT JOIN {$wpdb->posts} AS {$this->parent_product_table_name} ON ({$wpdb->posts}.post_parent = {$this->parent_product_table_name}.ID) "; $join .= $this->clauses['join']; @@ -312,7 +312,7 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller $args['post_parent'] = $request['product_id']; // TODO: check if WC_Product_Data_Store_CPT::find_matching_product_variation could not be used... // fix the filtering, otherwise taxonomy is not mapped correctly to variable product. - $taxonomies = $args['tax_query']; + $taxonomies = isset( $args['tax_query'] ) ? $args['tax_query'] : array(); // maybe do this only if there are taxonomies as categories etc, not attributes and terms? $query_for_parent = new WP_Query( $args ); $query_for_parent->parse_tax_query( $query_for_parent->query_vars ); From 8fd4777fb4e5ec274c73ede3782190c0c25978c5 Mon Sep 17 00:00:00 2001 From: Peter Fabian Date: Mon, 25 Jun 2018 10:57:52 +0200 Subject: [PATCH 034/984] Fixed PHPCS whitespace. --- tests/unit-tests/api/products.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/unit-tests/api/products.php b/tests/unit-tests/api/products.php index bd185e13e44..d3854aa2fbc 100644 --- a/tests/unit-tests/api/products.php +++ b/tests/unit-tests/api/products.php @@ -541,8 +541,8 @@ class Products_API extends WC_REST_Unit_Test_Case { 'category' => $category['term_id'], ), ); - $response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v2/products', $args ) ); - $response_products = $response->get_data(); + $response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v2/products', $args ) ); + $response_products = $response->get_data(); $this->assertEquals( 200, $response->get_status() ); foreach ( $response_products as $response_product ) { @@ -557,9 +557,9 @@ class Products_API extends WC_REST_Unit_Test_Case { $product_2 = new WC_Product_Simple(); $product_2->save(); - $request = new WP_REST_Request( 'GET', '/wc/v2/products/' . $product_2->get_id() ); - $response = $this->server->dispatch( $request ); - $response_product = $response->get_data(); + $request = new WP_REST_Request( 'GET', '/wc/v2/products/' . $product_2->get_id() ); + $response = $this->server->dispatch( $request ); + $response_product = $response->get_data(); $this->assertEquals( 200, $response->get_status() ); $this->assertCount( 1, $response_product['categories'] ); From 64b589f0325a729a1914942801f4b2cae929e013 Mon Sep 17 00:00:00 2001 From: Mike Jolley Date: Thu, 28 Jun 2018 13:10:25 +0100 Subject: [PATCH 035/984] Get image from ID, not post thumbnail --- includes/abstracts/abstract-wc-product.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/includes/abstracts/abstract-wc-product.php b/includes/abstracts/abstract-wc-product.php index 714fa95d1e5..1bc55db0eb3 100644 --- a/includes/abstracts/abstract-wc-product.php +++ b/includes/abstracts/abstract-wc-product.php @@ -1798,10 +1798,11 @@ class WC_Product extends WC_Abstract_Legacy_Product { * @return string */ public function get_image( $size = 'woocommerce_thumbnail', $attr = array(), $placeholder = true ) { - if ( has_post_thumbnail( $this->get_id() ) ) { - $image = get_the_post_thumbnail( $this->get_id(), $size, $attr ); - } elseif ( ( $parent_id = wp_get_post_parent_id( $this->get_id() ) ) && has_post_thumbnail( $parent_id ) ) { // @phpcs:ignore Squiz.PHP.DisallowMultipleAssignments.Found - $image = get_the_post_thumbnail( $parent_id, $size, $attr ); + if ( $this->get_image_id() ) { + $image = wp_get_attachment_image( $this->get_image_id(), $size ); + } elseif ( $this->get_parent_id() ) { + $parent_product = wc_get_product( $this->get_parent_id() ); + $image = $parent_product->get_image(); } elseif ( $placeholder ) { $image = wc_placeholder_img( $size ); } else { From 3174aff57f46323bce8a491a33fab0e68b37becf Mon Sep 17 00:00:00 2001 From: Mike Jolley Date: Thu, 28 Jun 2018 14:59:04 +0100 Subject: [PATCH 036/984] Hide preview button --- .../admin/meta-boxes/views/html-product-data-panel.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/includes/admin/meta-boxes/views/html-product-data-panel.php b/includes/admin/meta-boxes/views/html-product-data-panel.php index b2fe47c4965..b0ec6ade962 100644 --- a/includes/admin/meta-boxes/views/html-product-data-panel.php +++ b/includes/admin/meta-boxes/views/html-product-data-panel.php @@ -1,8 +1,17 @@ +
");o.unblock()}})}}))}(jQuery); \ No newline at end of file +!function(e){new(Backbone.View.extend({el:e("#key-fields"),events:{"click input#update_api_key":"saveKey"},initialize:function(){_.bindAll(this,"saveKey")},block:function(){e(this.el).block({message:null,overlayCSS:{background:"#fff",opacity:.6}})},unblock:function(){e(this.el).unblock()},initTipTip:function(i){e(document.body).on("click",i,function(o){o.preventDefault(),document.queryCommandSupported("copy")?(e("#copy-error").text(""),wcClearClipboard(),wcSetClipboard(e.trim(e(this).prev("input").val()),e(i))):(e(i).parent().find("input").focus().select(),e("#copy-error").text(woocommerce_admin_api_keys.clipboard_failed))}).on("aftercopy",i,function(){e("#copy-error").text(""),e(i).tipTip({attribute:"data-tip",activation:"focus",fadeIn:50,fadeOut:50,delay:0}).focus()}).on("aftercopyerror",i,function(){e(i).parent().find("input").focus().select(),e("#copy-error").text(woocommerce_admin_api_keys.clipboard_failed)})},createQRCode:function(i,o){e("#keys-qrcode").qrcode({text:i+"|"+o,width:120,height:120})},saveKey:function(i){i.preventDefault();var o=this;o.block(),Backbone.ajax({method:"POST",dataType:"json",url:woocommerce_admin_api_keys.ajax_url,data:{action:"woocommerce_update_api_key",security:woocommerce_admin_api_keys.update_api_nonce,key_id:e("#key_id",o.el).val(),description:e("#key_description",o.el).val(),user:e("#key_user",o.el).val(),permissions:e("#key_permissions",o.el).val()},success:function(i){if(e(".wc-api-message",o.el).remove(),i.success){var t=i.data;if(e("h2, h3",o.el).first().append('

'+t.message+"

"),0

'+i.data.message+"

");o.unblock()}})}}))}(jQuery); \ No newline at end of file From b044e4c46db0c6716b0609af478e7253ef12747e Mon Sep 17 00:00:00 2001 From: Claudio Sanches Date: Wed, 4 Jul 2018 16:24:27 -0300 Subject: [PATCH 068/984] Fixed missing bulk action notices for REST API keys --- includes/admin/class-wc-admin-api-keys.php | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/includes/admin/class-wc-admin-api-keys.php b/includes/admin/class-wc-admin-api-keys.php index 36c77100dff..5e601fcc2c3 100644 --- a/includes/admin/class-wc-admin-api-keys.php +++ b/includes/admin/class-wc-admin-api-keys.php @@ -172,8 +172,11 @@ class WC_Admin_API_Keys { * Notices. */ public static function notices() { - if ( isset( $_GET['revoked'] ) && 1 === $_GET['revoked'] ) { // WPCS: input var okay, CSRF ok. - WC_Admin_Settings::add_message( __( 'API key revoked successfully.', 'woocommerce' ) ); + if ( isset( $_GET['revoked'] ) ) { // WPCS: input var okay, CSRF ok. + $revoked = absint( $_GET['revoked'] ); // WPCS: input var okay, CSRF ok. + + /* translators: %d: count */ + WC_Admin_Settings::add_message( sprintf( _n( '%d API key permanently revoked.', '%d API keys permanently revoked.', $revoked, 'woocommerce' ), $revoked ) ); } } @@ -191,7 +194,7 @@ class WC_Admin_API_Keys { } } - wp_redirect( esc_url_raw( add_query_arg( array( 'revoked' => 1 ), admin_url( 'admin.php?page=wc-settings&tab=advanced§ion=keys' ) ) ) ); + wp_safe_redirect( esc_url_raw( add_query_arg( array( 'revoked' => 1 ), admin_url( 'admin.php?page=wc-settings&tab=advanced§ion=keys' ) ) ) ); exit(); } @@ -221,9 +224,18 @@ class WC_Admin_API_Keys { * @param array $keys API Keys. */ private function bulk_revoke_key( $keys ) { + $qty = 0; foreach ( $keys as $key_id ) { - $this->remove_key( $key_id ); + $result = $this->remove_key( $key_id ); + + if ( $result ) { + $qty++; + } } + + // Redirect to webhooks page. + wp_safe_redirect( esc_url_raw( add_query_arg( array( 'revoked' => $qty ), admin_url( 'admin.php?page=wc-settings&tab=advanced§ion=keys' ) ) ) ); + exit(); } /** From 97269fc5d9e7b95de617081095aa250ba3fd7824 Mon Sep 17 00:00:00 2001 From: Andrew Lazarus Date: Thu, 5 Jul 2018 16:10:32 +0200 Subject: [PATCH 069/984] Added filter on item name in quotes Filter added to item in quotes. Initially was thinking that is it needed to translate the quotes only? I can't find any languages that do this specifically, but if it's a RTL language, perhaps you'd swap around the quote direction. The function `wc_add_to_cart_message` gives you the filter `wc_add_to_cart_message` to play with, but is already set in stone as HTML, and if you truly want to change the HTML of this message, you would need to rewrite the function. Simply adding `` to the product title is not possible without preg_replacing or hooking into gettext --- includes/wc-cart-functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/wc-cart-functions.php b/includes/wc-cart-functions.php index 0da8c1281ba..fcdd04613a6 100644 --- a/includes/wc-cart-functions.php +++ b/includes/wc-cart-functions.php @@ -107,7 +107,7 @@ function wc_add_to_cart_message( $products, $show_qty = false, $return = false ) foreach ( $products as $product_id => $qty ) { /* translators: %s: product name */ - $titles[] = ( $qty > 1 ? absint( $qty ) . ' × ' : '' ) . sprintf( _x( '“%s”', 'Item name in quotes', 'woocommerce' ), strip_tags( get_the_title( $product_id ) ) ); + $titles[] = ( $qty > 1 ? absint( $qty ) . ' × ' : '' ) . apply_filters( 'wc_add_to_cart_item_name_in_quotes', sprintf( _x( '“%s”', 'Item name in quotes', 'woocommerce' ), strip_tags( get_the_title( $product_id ) ) ), $product_id ); $count += $qty; } From 10c4a515e40b9d3f5903b15e97376bb153e38c61 Mon Sep 17 00:00:00 2001 From: Brent Shepherd Date: Fri, 6 Jul 2018 15:40:54 +1000 Subject: [PATCH 070/984] Squashed 'includes/libraries/action-scheduler/' content from commit 6b3282f33 git-subtree-dir: includes/libraries/action-scheduler git-subtree-split: 6b3282f3324c1896bd7143db9c7c1fdd64765478 --- .gitignore | 3 + .travis.yml | 37 + README.md | 433 +++ action-scheduler.php | 47 + classes/ActionScheduler.php | 122 + .../ActionScheduler_Abstract_ListTable.php | 656 ++++ .../ActionScheduler_Abstract_QueueRunner.php | 89 + classes/ActionScheduler_Action.php | 75 + classes/ActionScheduler_ActionClaim.php | 23 + classes/ActionScheduler_ActionFactory.php | 111 + classes/ActionScheduler_AdminView.php | 78 + .../ActionScheduler_AdminView_Deprecated.php | 147 + classes/ActionScheduler_CanceledAction.php | 21 + classes/ActionScheduler_CronSchedule.php | 50 + classes/ActionScheduler_DateTime.php | 20 + classes/ActionScheduler_FatalErrorMonitor.php | 54 + classes/ActionScheduler_FinishedAction.php | 16 + classes/ActionScheduler_IntervalSchedule.php | 62 + classes/ActionScheduler_ListTable.php | 526 +++ classes/ActionScheduler_LogEntry.php | 67 + classes/ActionScheduler_Logger.php | 47 + classes/ActionScheduler_NullAction.php | 16 + classes/ActionScheduler_NullLogEntry.php | 11 + classes/ActionScheduler_NullSchedule.php | 19 + classes/ActionScheduler_QueueCleaner.php | 144 + classes/ActionScheduler_QueueRunner.php | 169 + classes/ActionScheduler_Schedule.php | 18 + classes/ActionScheduler_SimpleSchedule.php | 44 + classes/ActionScheduler_Store.php | 210 ++ classes/ActionScheduler_TimezoneHelper.php | 44 + classes/ActionScheduler_Versions.php | 62 + classes/ActionScheduler_WPCLI_QueueRunner.php | 204 ++ ...ctionScheduler_WPCLI_Scheduler_command.php | 145 + classes/ActionScheduler_wpCommentLogger.php | 278 ++ classes/ActionScheduler_wpPostStore.php | 732 +++++ ...eduler_wpPostStore_PostStatusRegistrar.php | 57 + ...cheduler_wpPostStore_PostTypeRegistrar.php | 50 + ...cheduler_wpPostStore_TaxonomyRegistrar.php | 26 + codecov.yml | 13 + composer.json | 12 + composer.lock | 2909 +++++++++++++++++ functions.php | 186 ++ lib/cron-expression/CronExpression.php | 318 ++ .../CronExpression_AbstractField.php | 100 + .../CronExpression_DayOfMonthField.php | 110 + .../CronExpression_DayOfWeekField.php | 124 + .../CronExpression_FieldFactory.php | 55 + .../CronExpression_FieldInterface.php | 39 + .../CronExpression_HoursField.php | 47 + .../CronExpression_MinutesField.php | 39 + .../CronExpression_MonthField.php | 55 + .../CronExpression_YearField.php | 43 + lib/cron-expression/LICENSE | 19 + lib/cron-expression/README.md | 92 + license.txt | 674 ++++ tests/ActionScheduler_UnitTestCase.php | 44 + tests/bootstrap.php | 31 + tests/phpunit.xml.dist | 32 + .../ActionScheduler_UnitTestCase.php | 44 + .../jobs/ActionScheduler_Action_Test.php | 55 + .../jobs/ActionScheduler_NullAction_Test.php | 16 + .../ActionScheduler_wpPostStore_Test.php | 352 ++ .../ActionScheduler_wpCommentLogger_Test.php | 166 + .../procedural_api/procedural_api_Test.php | 142 + .../wc_get_scheduled_actions_Test.php | 100 + .../ActionScheduler_QueueCleaner_Test.php | 151 + .../ActionScheduler_QueueRunner_Test.php | 209 ++ .../ActionScheduler_CronSchedule_Test.php | 45 + .../ActionScheduler_IntervalSchedule_Test.php | 28 + .../ActionScheduler_NullSchedule_Test.php | 18 + .../ActionScheduler_SimpleSchedule_Test.php | 37 + .../ActionScheduler_Versions_Test.php | 43 + tests/travis/setup.sh | 38 + tests/travis/wp-tests-config.php | 38 + 74 files changed, 11337 insertions(+) create mode 100644 .gitignore create mode 100644 .travis.yml create mode 100644 README.md create mode 100644 action-scheduler.php create mode 100644 classes/ActionScheduler.php create mode 100644 classes/ActionScheduler_Abstract_ListTable.php create mode 100644 classes/ActionScheduler_Abstract_QueueRunner.php create mode 100644 classes/ActionScheduler_Action.php create mode 100644 classes/ActionScheduler_ActionClaim.php create mode 100644 classes/ActionScheduler_ActionFactory.php create mode 100644 classes/ActionScheduler_AdminView.php create mode 100644 classes/ActionScheduler_AdminView_Deprecated.php create mode 100644 classes/ActionScheduler_CanceledAction.php create mode 100644 classes/ActionScheduler_CronSchedule.php create mode 100644 classes/ActionScheduler_DateTime.php create mode 100644 classes/ActionScheduler_FatalErrorMonitor.php create mode 100644 classes/ActionScheduler_FinishedAction.php create mode 100644 classes/ActionScheduler_IntervalSchedule.php create mode 100644 classes/ActionScheduler_ListTable.php create mode 100644 classes/ActionScheduler_LogEntry.php create mode 100644 classes/ActionScheduler_Logger.php create mode 100644 classes/ActionScheduler_NullAction.php create mode 100644 classes/ActionScheduler_NullLogEntry.php create mode 100644 classes/ActionScheduler_NullSchedule.php create mode 100644 classes/ActionScheduler_QueueCleaner.php create mode 100644 classes/ActionScheduler_QueueRunner.php create mode 100644 classes/ActionScheduler_Schedule.php create mode 100644 classes/ActionScheduler_SimpleSchedule.php create mode 100644 classes/ActionScheduler_Store.php create mode 100644 classes/ActionScheduler_TimezoneHelper.php create mode 100644 classes/ActionScheduler_Versions.php create mode 100644 classes/ActionScheduler_WPCLI_QueueRunner.php create mode 100644 classes/ActionScheduler_WPCLI_Scheduler_command.php create mode 100644 classes/ActionScheduler_wpCommentLogger.php create mode 100644 classes/ActionScheduler_wpPostStore.php create mode 100644 classes/ActionScheduler_wpPostStore_PostStatusRegistrar.php create mode 100644 classes/ActionScheduler_wpPostStore_PostTypeRegistrar.php create mode 100644 classes/ActionScheduler_wpPostStore_TaxonomyRegistrar.php create mode 100644 codecov.yml create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 functions.php create mode 100755 lib/cron-expression/CronExpression.php create mode 100755 lib/cron-expression/CronExpression_AbstractField.php create mode 100755 lib/cron-expression/CronExpression_DayOfMonthField.php create mode 100755 lib/cron-expression/CronExpression_DayOfWeekField.php create mode 100755 lib/cron-expression/CronExpression_FieldFactory.php create mode 100755 lib/cron-expression/CronExpression_FieldInterface.php create mode 100755 lib/cron-expression/CronExpression_HoursField.php create mode 100755 lib/cron-expression/CronExpression_MinutesField.php create mode 100755 lib/cron-expression/CronExpression_MonthField.php create mode 100755 lib/cron-expression/CronExpression_YearField.php create mode 100755 lib/cron-expression/LICENSE create mode 100755 lib/cron-expression/README.md create mode 100644 license.txt create mode 100644 tests/ActionScheduler_UnitTestCase.php create mode 100644 tests/bootstrap.php create mode 100644 tests/phpunit.xml.dist create mode 100644 tests/phpunit/deprecated/ActionScheduler_UnitTestCase.php create mode 100644 tests/phpunit/jobs/ActionScheduler_Action_Test.php create mode 100644 tests/phpunit/jobs/ActionScheduler_NullAction_Test.php create mode 100644 tests/phpunit/jobstore/ActionScheduler_wpPostStore_Test.php create mode 100644 tests/phpunit/logging/ActionScheduler_wpCommentLogger_Test.php create mode 100644 tests/phpunit/procedural_api/procedural_api_Test.php create mode 100644 tests/phpunit/procedural_api/wc_get_scheduled_actions_Test.php create mode 100644 tests/phpunit/runner/ActionScheduler_QueueCleaner_Test.php create mode 100644 tests/phpunit/runner/ActionScheduler_QueueRunner_Test.php create mode 100644 tests/phpunit/schedules/ActionScheduler_CronSchedule_Test.php create mode 100644 tests/phpunit/schedules/ActionScheduler_IntervalSchedule_Test.php create mode 100644 tests/phpunit/schedules/ActionScheduler_NullSchedule_Test.php create mode 100644 tests/phpunit/schedules/ActionScheduler_SimpleSchedule_Test.php create mode 100644 tests/phpunit/versioning/ActionScheduler_Versions_Test.php create mode 100755 tests/travis/setup.sh create mode 100644 tests/travis/wp-tests-config.php diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000000..e779da84a38 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +phpunit.xml +vendor +.idea diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000000..675301bc543 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,37 @@ +# Travis CI Configuration File + +# Tell Travis CI we're using PHP +language: php + +# We nee to use Precise, not Trusty, to test against PHP 5.3, see https://github.com/travis-ci/travis-ci/issues/8219 +dist: precise + +# Versions of PHP to test against +php: + - "5.3" + - "5.4" + - "5.5" + - "5.6" + - "7.0" + - "7.1" + +# Specify versions of WordPress to test against +# WP_VERSION = WordPress version number (use "master" for SVN trunk) +# WP_MULTISITE = whether to test multisite (use either "0" or "1") +env: + - WP_VERSION=4.8 WP_MULTISITE=0 + - WP_VERSION=4.7 WP_MULTISITE=0 + - WP_VERSION=4.6 WP_MULTISITE=0 + - WP_VERSION=4.8 WP_MULTISITE=1 + - WP_VERSION=4.7 WP_MULTISITE=1 + - WP_VERSION=4.6 WP_MULTISITE=1 + +# Grab the setup script and execute +before_script: + - source tests/travis/setup.sh $TRAVIS_PHP_VERSION + +script: + - if [[ "$TRAVIS_PHP_VERSION" == "7.1" ]] && [[ "$WP_VERSION" == "4.8" ]] && [[ "$WP_MULTISITE" == "0" ]] && [[ "$TRAVIS_BRANCH" == "master" ]]; then phpunit --configuration tests/phpunit.xml.dist --coverage-clover clover.xml; else phpunit --configuration tests/phpunit.xml.dist; fi + +after_script: + - bash <(curl -s https://codecov.io/bash) diff --git a/README.md b/README.md new file mode 100644 index 00000000000..0d915a1c866 --- /dev/null +++ b/README.md @@ -0,0 +1,433 @@ +# Action Scheduler [![Build Status](https://travis-ci.org/Prospress/action-scheduler.png?branch=master)](https://travis-ci.org/Prospress/action-scheduler) [![codecov](https://codecov.io/gh/Prospress/action-scheduler/branch/master/graph/badge.svg)](https://codecov.io/gh/Prospress/action-scheduler) + +A robust scheduling library for use in WordPress plugins. + +## Overview + +Action Scheduler uses a WordPress [custom post type](http://codex.wordpress.org/Post_Types), creatively named `scheduled-action`, to store the hook name, arguments and scheduled date for an action that should be triggered at some time in the future. + +The scheduler will run every minute by attaching itself as a callback to the `'action_scheduler_run_schedule'` hook, which is scheduled using WordPress's built-in [WP-Cron](http://codex.wordpress.org/Function_Reference/wp_cron) system. + +When triggered, Action Scheduler will check for posts of the `scheduled-action` type that have a `post_date` at or before this point in time i.e. actions scheduled to run now or at sometime in the past. + +### Batch Processing + +If there are actions to be processed, Action Scheduler will stake a unique claim for a batch of 20 actions and begin processing that batch. The PHP process spawned to run the batch will then continue processing batches of 20 actions until it times out or exhausts available memory. + +If your site has a large number of actions scheduled to run at the same time, Action Scheduler will process more than one batch at a time. Specifically, when the `'action_scheduler_run_schedule'` hook is triggered approximately one minute after the first batch began processing, a new PHP process will stake a new claim to a batch of actions which were not claimed by the previous process. It will then begin to process that batch. + +This will continue until all actions are processed using a maximum of 5 concurrent queues. + +### Housekeeping + +Before processing a batch, the scheduler will remove any existing claims on actions which have been sitting in a queue for more than five minutes. + +Action Scheduler will also trash any actions which were completed more than a month ago. + +If an action runs for more than 5 minutes, Action Scheduler will assume the action has timed out and will mark it as failed. However, if all callbacks attached to the action were to successfully complete sometime after that 5 minute timeout, its status would later be updated to completed. + +### Record Keeping + +Events for each action will be also logged in the [comments table](http://codex.wordpress.org/Database_Description#Table_Overview). + +The events logged by default include when an action: + * is created + * starts + * completes + * fails + +Actions can also be grouped together using a custom taxonomy named `action-group`. + +## Managing Scheduled Actions + +Action Scheduler has a built in administration screen for monitoring, debugging and manually triggering scheduled actions. + +The administration interface is accesible through both: + +1. **Tools > Scheduled Actions** +1. **WooCommerce > Status > Scheduled Actions**, when WooCommerce is installed. + +![](https://cldup.com/5BA2BNB1sw.png) + +Among other tasks, from the admin screen you can: + +* run a pending action +* view the scheduled actions with a specific status, like the all actions which have failed or are in-progress (https://cldup.com/NNTwE88Xl8.png). +* view the log entries for a specific action to find out why it failed. +* sort scheduled actions by hook name, scheduled date, claim ID or group name. + +Still have questions? Check out the [FAQ below](#faq). + +## WP CLI + +Action Scheduler has custom [WP CLI](http://wp-cli.org) commands available for processing actions. + +For many sites, WP CLI is a much better choice for running queues of actions than the default WP Cron runner. These are some common cases where WP CLI is a better option: + +* long-running tasks - Tasks that take a significant amount of time to run +* large queues - A large number of tasks will naturally take a longer time +* other plugins with extensive WP Cron usage - WP Cron's limited resources are spread across more tasks + +With a regular web request, you may have to deal with script timeouts enforced by hosts, or other restraints that make it more challenging to run Action Scheduler tasks. Utilizing WP CLI to run commands directly on the server give you more freedom. This means that you typically don't have the same constraints of a normal web request. + +If you choose to utilize WP CLI exclusively, you can disable the normal WP CLI queue runner by installing the [Action Scheduler - Disable Default Queue Runner](https://github.com/Prospress/action-scheduler-disable-default-runner) plugin. Note that if you do this, you **must** run Action Scheduler manually. + +### Commands + +These are the commands available to use with Action Scheduler: + +* `action-scheduler run` + + Options: + * `--batch-size` - This is the number of actions to run in a single batch. The default is `100`. + * `--batches` - This is the number of batches to run. Using 0 means that batches will continue running until there are no more actions to run. + * `--hooks` - Process only actions with specific hook or hooks, like `'woocommerce_scheduled_subscription_payment'`. By default, actions with any hook will be processed. Define multiple hooks as a comma separated string (without spaces), e.g. `--hooks=woocommerce_scheduled_subscription_trial_end,woocommerce_scheduled_subscription_payment,woocommerce_scheduled_subscription_expiration` + * `--group` - Process only actions in a specific group, like `'woocommerce-memberships'`. By default, actions in any group (or no group) will be processed. + * `--force` - By default, Action Scheduler limits the number of concurrent batches that can be run at once to ensure the server does not get overwhelmed. Using the `--force` flag overrides this behavior to force the WP CLI queue to run. + +The best way to get a full list of commands and their available options is to use WP CLI itself. This can be done by running `wp action-scheduler` to list all Action Scheduler commands, or by including the `--help` flag with any of the individual commands. This will provide all relevant parameters and flags for the command. + +### Improving Performance with `--group` + +Being able to run queues for specific groups of actions is valuable at scale. Why? Because it means you can restrict the concurrency for similar actions. + +For example, let's say you have 300,000 actions queued up comprised of: + +* 100,000 renewals payments +* 100,000 email notifications +* 100,000 membership status updates + +Action Scheduler's default WP Cron queue runner will process them all together. e.g. when it claims a batch of actions, some may be emails, some membership updates and some renewals. + +When you add concurrency to that, you can end up with issues. For example, if you have 3 queues running, they may all be attempting to process similar actions at the same time, which can lead to querying the same database tables with similar queries. Depending on the code/queries running, this can lead to database locks or other issues. + +If you can batch based on each action's group, then you can improve performance by processing like actions consecutively, but still processing the full set of actions concurrently. + +For example, if one queue is created to process emails, another to process membership updates, and another to process renewal payments, then the same queries won't be run at the same time, and 3 separate queues will be able to run more efficiently. + +The WP CLI runner can achieve this using the `--group` option. + +## API Functions + +### Action Scheduler API vs. WP-Cron API + +The Action Scheduler API functions are designed to mirror the WordPress [WP-Cron API functions](http://codex.wordpress.org/Category:WP-Cron_Functions). + +Functions return similar values and accept similar arguments to their WP-Cron counterparts. The notable differences are: + +* `wc_schedule_single_action()` & `wc_schedule_recurring_action()` will return the post ID of the scheduled action rather than boolean indicating whether the event was scheduled +* `wc_schedule_recurring_action()` takes an interval in seconds as the recurring interval rather than an arbitrary string +* `wc_schedule_single_action()` & `wc_schedule_recurring_action()` can accept a `$group` parameter to group different actions for the one plugin together. +* the `wp_` prefix is substituted with `wc_` and the term `event` is replaced with `action` + + +#### Function Reference / `wc_schedule_single_action()` + +##### Description + +Schedule an action to run one time. + +##### Usage + +```php + +```` + +##### Parameters + +- **$timestamp** (integer)(required) The Unix timestamp representing the date you want the action to run. Default: _none_. +- **$hook** (string)(required) Name of the action hook. Default: _none_. +- **$args** (array) Arguments to pass to callbacks when the hook triggers. Default: _`array()`_. +- **$group** (array) The group to assign this job to. Default: _''_. + +##### Return value + +(integer) the action's ID in the [posts](http://codex.wordpress.org/Database_Description#Table_Overview) table. + + +#### Function Reference / `wc_schedule_recurring_action()` + +##### Description + +Schedule an action to run repeatedly with a specified interval in seconds. + +##### Usage + +```php + +```` + +##### Parameters + +- **$timestamp** (integer)(required) The Unix timestamp representing the date you want the action to run. Default: _none_. +- **$interval_in_seconds** (integer)(required) How long to wait between runs. Default: _none_. +- **$hook** (string)(required) Name of the action hook. Default: _none_. +- **$args** (array) Arguments to pass to callbacks when the hook triggers. Default: _`array()`_. +- **$group** (array) The group to assign this job to. Default: _''_. + +##### Return value + +(integer) the action's ID in the [posts](http://codex.wordpress.org/Database_Description#Table_Overview) table. + + +#### Function Reference / `wc_schedule_cron_action()` + +##### Description + +Schedule an action that recurs on a cron-like schedule. + +##### Usage + +```php + +```` + +##### Parameters + +- **$timestamp** (integer)(required) The Unix timestamp representing the date you want the action to run. Default: _none_. +- **$schedule** (string)(required) $schedule A cron-link schedule string, see http://en.wikipedia.org/wiki/Cron. Default: _none_. +- **$hook** (string)(required) Name of the action hook. Default: _none_. +- **$args** (array) Arguments to pass to callbacks when the hook triggers. Default: _`array()`_. +- **$group** (array) The group to assign this job to. Default: _''_. + +##### Return value + +(integer) the action's ID in the [posts](http://codex.wordpress.org/Database_Description#Table_Overview) table. + + +#### Function Reference / `wc_unschedule_action()` + +##### Description + +Cancel the next occurrence of a job. + +##### Usage + +```php + +```` + +##### Parameters + +- **$hook** (string)(required) Name of the action hook. Default: _none_. +- **$args** (array) Arguments to pass to callbacks when the hook triggers. Default: _`array()`_. +- **$group** (array) The group to assign this job to. Default: _''_. + +##### Return value + +(null) + + +#### Function Reference / `wc_next_scheduled_action()` + +##### Description + +Returns the next timestamp for a scheduled action. + +##### Usage + +```php + +```` + +##### Parameters + +- **$hook** (string)(required) Name of the action hook. Default: _none_. +- **$args** (array) Arguments to pass to callbacks when the hook triggers. Default: _`array()`_. +- **$group** (array) The group to assign this job to. Default: _''_. + +##### Return value + +(integer|boolean) The timestamp for the next occurrence, or false if nothing was found. + + +#### Function Reference / `wc_get_scheduled_actions()` + +##### Description + +Find scheduled actions. + +##### Usage + +```php + +```` + +##### Parameters + +- **$args** (array) Arguments to search and filter results by. Possible arguments, with their default values: + * `'hook' => ''` - the name of the action that will be triggered + * `'args' => NULL` - the args array that will be passed with the action + * `'date' => NULL` - the scheduled date of the action. Expects a DateTime object, a unix timestamp, or a string that can parsed with strtotime(). + * `'date_compare' => '<=`' - operator for testing "date". accepted values are '!=', '>', '>=', '<', '<=', '=' + * `'modified' => NULL` - the date the action was last updated. Expects a DateTime object, a unix timestamp, or a string that can parsed with strtotime(). + * `'modified_compare' => '<='` - operator for testing "modified". accepted values are '!=', '>', '>=', '<', '<=', '=' + * `'group' => ''` - the group the action belongs to + * `'status' => ''` - ActionScheduler_Store::STATUS_COMPLETE or ActionScheduler_Store::STATUS_PENDING + * `'claimed' => NULL` - TRUE to find claimed actions, FALSE to find unclaimed actions, a string to find a specific claim ID + * `'per_page' => 5` - Number of results to return + * `'offset' => 0` + * `'orderby' => 'date'` - accepted values are 'hook', 'group', 'modified', or 'date' + * `'order' => 'ASC'` +- **$return_format** (string) The format in which to return the scheduled actions: 'OBJECT', 'ARRAY_A', or 'ids'. Default: _'OBJECT'_. + +##### Return value + +(array) Array of the actions matching the criteria specified with `$args`. + + +## Performance Tuning + +By default, Action Scheduler will process a minimum of 1,200 actions per hour. On servers which allow long running PHP processes, this will be significantly higher as processes will be able loop over queues indefinitely. + +The batch size and number of concurrent queues that may be processed simultaneously is low by default to ensure the scheduler runs on low powered servers; however, you can configure these settings to increase performance on your site. + +#### Increasing Batch Size + +By default, Action Scheduler will claim a batch of 20 actions. This small batch size is to minimise the risk of causing a fatal error due to memory exhaustion. + +If you know the callbacks attached to your actions use very little memory, or you've tested the number of actions you can process before memory limits are exceeded, you can increase the batch size using the `'action_scheduler_queue_runner_batch_size'` filter. + +For example, to increase the batch size to 100, we can use the following function: + +``` + +``` + +### Increasing Concurrent Batches + +By default, Action Scheduler will run up to 5 concurrent batches of actions. This is to prevent consuming all the available connections or processes on your webserver. + +However, your server may allow a large number of connection, for example, because it has a high value for Apache's `MaxClients` setting or PHP-FPM's `pm.max_children` setting. + +If this is the case, you can use the `'action_scheduler_queue_runner_concurrent_batches'` filter to increase the number of conncurrent batches allowed, and therefore speed up processing large numbers of actions scheduled to be processed simultaneously. + +For example, to increase the allowed number of concurrent queues to 25, we can use the following code: + +``` + +``` + +## FAQ + +### Is it safe to release Action Scheduler in my plugin? Won't its functions conflict with another copy of the library? + +Action Scheduler is designed to be used and released in plugins. It avoids redeclaring public API functions when more than one copy of the library is being loaded by different plugins. It will also load only the most recent version of itself (by checking registered versions after all plugins are loaded on the `'plugins_loaded'` hook). + +To use it in your plugin, simply require the `action-scheduler/action-scheduler.php` file. Action Scheduler will take care of the rest. + +### I don't want to use WP-Cron. Does Action Scheduler depend on WP-Cron? + +By default, Action Scheduler is initiated by WP-Cron. However, it has no dependency on the WP-Cron system. You can initiate the Action Scheduler queue in other ways with just one or two lines of code. + +For example, you can start a queue directly by calling: + +```php +ActionScheduler::runner()->run(); +``` + +Or trigger the `'action_scheduler_run_queue'` hook and let Action Scheduler do it for you: + +```php +do_action( 'action_scheduler_run_queue' ); +``` + +Further customization can be done by extending the `ActionScheduler_Abstract_QueueRunner` class to create a custom Queue Runner. For an example of a customized queue runner, see the [`ActionScheduler_WPCLI_QueueRunner`](https://github.com/Prospress/action-scheduler/blob/master/classes/ActionScheduler_WPCLI_QueueRunner.php), which is used when running WP CLI. + +Want to create some other method for initiating Action Scheduler? [Open a new issue](https://github.com/Prospress/action-scheduler/issues/new), we'd love to help you with it. + +### I don't want to use WP-Cron, ever. Does Action Scheduler replace WP-Cron? + +By default, Action Scheduler is designed to work alongside WP-Cron and not change any of its behaviour. This helps avoid unexpectedly overriding WP-Cron on sites installing your plugin, which may have nothing to do with WP-Cron. + +However, we can understand why you might want to replace WP-Cron completely in environments within you control, especially as it gets you the advantages of Action Scheduler. This should be possible without too much code. + +You could use the `'schedule_event'` hook in WordPress to use Action Scheduler for only newly scheduled WP-Cron jobs and map the `$event` param to Action Scheduler API functions. + +Alternatively, you can use a combination of the `'pre_update_option_cron'` and `'pre_option_cron'` hooks to override all new and previously scheduled WP-Cron jobs (similar to the way [Cavalcade](https://github.com/humanmade/Cavalcade) does it). + +If you'd like to create a plugin to do this automatically and want to share your work with others, [open a new issue to let us know](https://github.com/Prospress/action-scheduler/issues/new), we'd love to help you with it. + +### Eww gross, Custom Post Types! That's _so_ 2010. Can I use a different storage scheme? + +Of course! Action Scheduler data storage is completely swappable, and always has been. + +You can store scheduled actions in custom tables in the WordPress site's database. Some sites using it already are. You can actually store them anywhere for that matter, like in a remote storage service from Amazon Web Services. + +To implement a custom store: + +1. extend the abstract `ActionScheduler_Store` class, being careful to implement each of its methods +2. attach a callback to `'action_scheduler_store_class'` to tell Action Scheduler your class is the one which should be used to manage storage, e.g. + +``` +function eg_define_custom_store( $existing_storage_class ) { + return 'My_Radical_Action_Scheduler_Store'; +} +add_filter( 'action_scheduler_store_class', 'eg_define_custom_store', 10, 1 ); +``` + +Take a look at the `ActionScheduler_wpPostStore` class for an example implementation of `ActionScheduler_Store`. + +If you'd like to create a plugin to do this automatically and release it publicly to help others, [open a new issue to let us know](https://github.com/Prospress/action-scheduler/issues/new), we'd love to help you with it. + +> Note: we're also moving Action Scheduler itself to use [custom tables for better scalability](https://github.com/Prospress/action-scheduler/issues/77). + +### Can I use a different storage scheme just for logging? + +Of course! Action Scheduler's logger is completely swappable, and always has been. You can also customise where logs are stored, and the storage mechanism. + +To implement a custom logger: + +1. extend the abstract `ActionScheduler_Logger` class, being careful to implement each of its methods +2. attach a callback to `'action_scheduler_logger_class'` to tell Action Scheduler your class is the one which should be used to manage logging, e.g. + +``` +function eg_define_custom_logger( $existing_storage_class ) { + return 'My_Radical_Action_Scheduler_Logger'; +} +add_filter( 'action_scheduler_logger_class', 'eg_define_custom_logger', 10, 1 ); +``` + +Take a look at the `ActionScheduler_wpCommentLogger` class for an example implementation of `ActionScheduler_Logger`. + +### I want to run Action Scheduler only on a dedicated application server in my cluster. Can I do that? + +Wow, now you're really asking the tough questions. In theory, yes, this is possible. The `ActionScheduler_QueueRunner` class, which is responsible for running queues, is swappable via the `'action_scheduler_queue_runner_class'` filter. + +Because of this, you can effectively customise queue running however you need. Whether that means tweaking minor things, like not using WP-Cron at all to initiate queues by overriding `ActionScheduler_QueueRunner::init()`, or completely changing how and where queues are run, by overriding `ActionScheduler_QueueRunner::run()`. + +### Is Action Scheduler safe to use on my production site? + +Yes, absolutely! Action Scheduler is actively used on tens of thousands of production sites already. Right now it's responsible for scheduling everything from emails to payments. + +In fact, every month, Action Scheduler processes millions of payments as part of the [WooCommerce Subscriptions](https://woocommerce.com/products/woocommerce-subscriptions/) extension. + +It requires no setup, and won't override any WordPress APIs (unless you want it to). + +### How does Action Scheduler work on WordPress Multisite? + +Action Scheduler is designed to manage the scheduled actions on a single site. It has no special handling for running queues across multiple sites in a multisite network. That said, because it's storage and Queue Runner are completely swappable, it would be possible to write multisite handling classes to use with it. + +If you'd like to create a multisite plugin to do this and release it publicly to help others, [open a new issue to let us know](https://github.com/Prospress/action-scheduler/issues/new), we'd love to help you with it. + +## Credits + +This extension is developed and maintained as a collaboration between the teams at [Prospress](http://prospress.com/) and [Flightless](https://flightless.us/). + +Collaboration is cool. We'd love to work with you to improve Action Scheduler. Pull Requests welcome. + +--- + +

+ +

diff --git a/action-scheduler.php b/action-scheduler.php new file mode 100644 index 00000000000..96595cd4a2c --- /dev/null +++ b/action-scheduler.php @@ -0,0 +1,47 @@ +. + * + */ + +if ( ! function_exists( 'action_scheduler_register_2_dot_0_dot_0' ) ) { + + if ( ! class_exists( 'ActionScheduler_Versions' ) ) { + require_once( 'classes/ActionScheduler_Versions.php' ); + add_action( 'plugins_loaded', array( 'ActionScheduler_Versions', 'initialize_latest_version' ), 1, 0 ); + } + + add_action( 'plugins_loaded', 'action_scheduler_register_2_dot_0_dot_0', 0, 0 ); + + function action_scheduler_register_2_dot_0_dot_0() { + $versions = ActionScheduler_Versions::instance(); + $versions->register( '2.0.0', 'action_scheduler_initialize_2_dot_0_dot_0' ); + } + + function action_scheduler_initialize_2_dot_0_dot_0() { + require_once( 'classes/ActionScheduler.php' ); + ActionScheduler::init( __FILE__ ); + } + +} diff --git a/classes/ActionScheduler.php b/classes/ActionScheduler.php new file mode 100644 index 00000000000..5e1ad36d704 --- /dev/null +++ b/classes/ActionScheduler.php @@ -0,0 +1,122 @@ + value pair. The + * key must much the table column name and the value is the label, which is + * automatically translated. + */ + protected $columns = array(); + + /** + * Defines the row-actions. It expects an array where the key + * is the column name and the value is an array of actions. + * + * The array of actions are key => value, where key is the method name + * (with the prefix row_action_) and the value is the label + * and title. + */ + protected $row_actions = array(); + + /** + * The Primary key of our table + */ + protected $ID = 'ID'; + + /** + * Enables sorting, it expects an array + * of columns (the column names are the values) + */ + protected $sort_by = array(); + + protected $filter_by = array(); + + /** + * @var array The status name => count combinations for this table's items. Used to display status filters. + */ + protected $status_counts = array(); + + /** + * @var array Notices to display when loading the table. Array of arrays of form array( 'class' => {updated|error}, 'message' => 'This is the notice text display.' ). + */ + protected $admin_notices = array(); + + /** + * @var string Localised string displayed in the

element above the able. + */ + protected $table_header; + + /** + * Enables bulk actions. It must be an array where the key is the action name + * and the value is the label (which is translated automatically). It is important + * to notice that it will check that the method exists (`bulk_$name`) and will throw + * an exception if it does not exists. + * + * This class will automatically check if the current request has a bulk action, will do the + * validations and afterwards will execute the bulk method, with two arguments. The first argument + * is the array with primary keys, the second argument is a string with a list of the primary keys, + * escaped and ready to use (with `IN`). + */ + protected $bulk_actions = array(); + + /** + * Makes translation easier, it basically just wraps + * `_x` with some default (the package name) + */ + protected function translate( $text, $context = '' ) { + return _x( $text, $context, $this->package ); + } + + /** + * Reads `$this->bulk_actions` and returns an array that WP_List_Table understands. It + * also validates that the bulk method handler exists. It throws an exception because + * this is a library meant for developers and missing a bulk method is a development-time error. + */ + protected function get_bulk_actions() { + $actions = array(); + + foreach ( $this->bulk_actions as $action => $label ) { + if ( ! is_callable( array( $this, 'bulk_' . $action ) ) ) { + throw new RuntimeException( "The bulk action $action does not have a callback method" ); + } + + $actions[ $action ] = $this->translate( $label ); + } + + return $actions; + } + + /** + * Checks if the current request has a bulk action. If that is the case it will validate and will + * execute the bulk method handler. Regardless if the action is valid or not it will redirect to + * the previous page removing the current arguments that makes this request a bulk action. + */ + protected function process_bulk_action() { + global $wpdb; + // Detect when a bulk action is being triggered. + $action = $this->current_action(); + + if ( ! $action ) { + return; + } + + check_admin_referer( 'bulk-' . $this->_args['plural'] ); + + $method = 'bulk_' . $action; + if ( array_key_exists( $action, $this->bulk_actions ) && is_callable( array( $this, $method ) ) && ! empty( $_GET['ID'] ) && is_array( $_GET['ID'] ) ) { + $ids_sql = '(' . implode( ',', array_fill( 0, count( $_GET['ID'] ), '%s' ) ) . ')'; + $this->$method( $_GET['ID'], $wpdb->prepare( $ids_sql, $_GET['ID'] ) ); + } + + wp_redirect( remove_query_arg( + array( '_wp_http_referer', '_wpnonce', 'ID', 'action', 'action2' ), + wp_unslash( $_SERVER['REQUEST_URI'] ) + ) ); + exit; + } + + /** + * Default code for deleting entries. We trust ids_sql because it is + * validated already by process_bulk_action() + */ + protected function bulk_delete( array $ids, $ids_sql ) { + global $wpdb; + + $wpdb->query( "DELETE FROM {$this->table_name} WHERE {$this->ID} IN $ids_sql" ); + } + + /** + * Prepares the _column_headers property which is used by WP_Table_List at rendering. + * It merges the columns and the sortable columns. + */ + protected function prepare_column_headers() { + $this->_column_headers = array( + $this->get_columns(), + array(), + $this->get_sortable_columns(), + ); + } + + /** + * Reads $this->sort_by and returns the columns name in a format that WP_Table_List + * expects + */ + public function get_sortable_columns() { + $sort_by = array(); + foreach ( $this->sort_by as $column ) { + $sort_by[ $column ] = array( $column, true ); + } + return $sort_by; + } + + /** + * Returns the columns names for rendering. It adds a checkbox for selecting everything + * as the first column + */ + public function get_columns() { + $columns = array_merge( + array( 'cb' => '' ), + array_map( array( $this, 'translate' ), $this->columns ) + ); + + return $columns; + } + + /** + * Get prepared LIMIT clause for items query + * + * @global wpdb $wpdb + * + * @return string Prepared LIMIT clause for items query. + */ + protected function get_items_query_limit() { + global $wpdb; + + $per_page = $this->get_items_per_page( $this->package . '_items_per_page', $this->items_per_page ); + return $wpdb->prepare( 'LIMIT %d', $per_page ); + } + + /** + * Returns the number of items to offset/skip for this current view. + * + * @return int + */ + protected function get_items_offset() { + $per_page = $this->get_items_per_page( $this->package . '_items_per_page', $this->items_per_page ); + $current_page = $this->get_pagenum(); + if ( 1 < $current_page ) { + $offset = $per_page * ( $current_page - 1 ); + } else { + $offset = 0; + } + + return $offset; + } + + /** + * Get prepared OFFSET clause for items query + * + * @global wpdb $wpdb + * + * @return string Prepared OFFSET clause for items query. + */ + protected function get_items_query_offset() { + global $wpdb; + + return $wpdb->prepare( 'OFFSET %d', $this->get_items_offset() ); + } + + /** + * Prepares the ORDER BY sql statement. It uses `$this->sort_by` to know which + * columns are sortable. This requests validates the orderby $_GET parameter is a valid + * column and sortable. It will also use order (ASC|DESC) using DESC by default. + */ + protected function get_items_query_order() { + if ( empty( $this->sort_by ) ) { + return ''; + } + + $orderby = esc_sql( $this->get_request_orderby() ); + $order = esc_sql( $this->get_request_order() ); + + return "ORDER BY {$orderby} {$order}"; + } + + /** + * Return the sortable column specified for this request to order the results by, if any. + * + * @return string + */ + protected function get_request_orderby() { + + $valid_sortable_columns = array_values( $this->sort_by ); + + if ( ! empty( $_GET['orderby'] ) && in_array( $_GET['orderby'], $valid_sortable_columns ) ) { + $orderby = wc_clean( $_GET['orderby'] ); + } else { + $orderby = $valid_sortable_columns[0]; + } + + return $orderby; + } + + /** + * Return the sortable column order specified for this request. + * + * @return string + */ + protected function get_request_order() { + + if ( ! empty( $_GET['order'] ) && 'desc' === strtolower( $_GET['order'] ) ) { + $order = 'DESC'; + } else { + $order = 'ASC'; + } + + return $order; + } + + /** + * Return the status filter for this request, if any. + * + * @return string + */ + protected function get_request_status() { + $status = ( ! empty( $_GET['status'] ) ) ? $_GET['status'] : ''; + return $status; + } + + /** + * Return the search filter for this request, if any. + * + * @return string + */ + protected function get_request_search_query() { + $search_query = ( ! empty( $_GET['s'] ) ) ? $_GET['s'] : ''; + return $search_query; + } + + /** + * Process and return the columns name. This is meant for using with SQL, this means it + * always includes the primary key. + * + * @return array + */ + protected function get_table_columns() { + $columns = array_keys( $this->columns ); + if ( ! in_array( $this->ID, $columns ) ) { + $columns[] = $this->ID; + } + + return $columns; + } + + /** + * Check if the current request is doing a "full text" search. If that is the case + * prepares the SQL to search texts using LIKE. + * + * If the current request does not have any search or if this list table does not support + * that feature it will return an empty string. + * + * TODO: + * - Improve search doing LIKE by word rather than by phrases. + * + * @return string + */ + protected function get_items_query_search() { + global $wpdb; + + if ( empty( $_GET['s'] ) || empty( $this->search_by ) ) { + return ''; + } + + $filter = array(); + foreach ( $this->search_by as $column ) { + $filter[] = '`' . $column . '` like "%' . $wpdb->esc_like( $_GET['s'] ) . '%"'; + } + return implode( ' OR ', $filter ); + } + + /** + * Prepares the SQL to filter rows by the options defined at `$this->filter_by`. Before trusting + * any data sent by the user it validates that it is a valid option. + */ + protected function get_items_query_filters() { + global $wpdb; + + if ( ! $this->filter_by || empty( $_GET['filter_by'] ) || ! is_array( $_GET['filter_by'] ) ) { + return ''; + } + + $filter = array(); + + foreach ( $this->filter_by as $column => $options ) { + if ( empty( $_GET['filter_by'][ $column ] ) || empty( $options[ $_GET['filter_by'][ $column ] ] ) ) { + continue; + } + + $filter[] = $wpdb->prepare( "`$column` = %s", $_GET['filter_by'][ $column ] ); + } + + return implode( ' AND ', $filter ); + + } + + /** + * Prepares the data to feed WP_Table_List. + * + * This has the core for selecting, sorting and filting data. To keep the code simple + * its logic is split among many methods (get_items_query_*). + * + * Beside populating the items this function will also count all the records that matches + * the filtering criteria and will do fill the pagination variables. + */ + public function prepare_items() { + global $wpdb; + + $this->process_bulk_action(); + + $this->process_row_actions(); + + if ( ! empty( $_REQUEST['_wp_http_referer'] ) ) { + // _wp_http_referer is used only on bulk actions, we remove it to keep the $_GET shorter + wp_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), wp_unslash( $_SERVER['REQUEST_URI'] ) ) ); + exit; + } + + $this->prepare_column_headers(); + + $limit = $this->get_items_query_limit(); + $offset = $this->get_items_query_offset(); + $order = $this->get_items_query_order(); + $where = array_filter(array( + $this->get_items_query_search(), + $this->get_items_query_filters(), + )); + $columns = '`' . implode( '`, `', $this->get_table_columns() ) . '`'; + + if ( ! empty( $where ) ) { + $where = 'WHERE ('. implode( ') AND (', $where ) . ')'; + } else { + $where = ''; + } + + $sql = "SELECT $columns FROM {$this->table_name} {$where} {$order} {$limit} {$offset}"; + + $this->set_items( $wpdb->get_results( $sql, ARRAY_A ) ); + + $query_count = "SELECT COUNT({$this->ID}) FROM {$this->table_name} {$where}"; + $total_items = $wpdb->get_var( $query_count ); + $per_page = $this->get_items_per_page( $this->package . '_items_per_page', $this->items_per_page ); + $this->set_pagination_args( array( + 'total_items' => $total_items, + 'per_page' => $per_page, + 'total_pages' => ceil( $total_items / $per_page ), + ) ); + } + + public function extra_tablenav( $which ) { + if ( ! $this->filter_by || 'top' !== $which ) { + return; + } + + echo '
'; + + foreach ( $this->filter_by as $id => $options ) { + $default = ! empty( $_GET['filter_by'][ $id ] ) ? $_GET['filter_by'][ $id ] : ''; + if ( empty( $options[ $default ] ) ) { + $default = ''; + } + + echo ''; + } + + submit_button( $this->translate( 'Filter' ), '', 'filter_action', false, array( 'id' => 'post-query-submit' ) ); + echo '
'; + } + + /** + * Set the data for displaying. It will attempt to unserialize (There is a chance that some columns + * are serialized). This can be override in child classes for futher data transformation. + */ + protected function set_items( array $items ) { + $this->items = array(); + foreach ( $items as $item ) { + $this->items[ $item[ $this->ID ] ] = array_map( 'maybe_unserialize', $item ); + } + } + + /** + * Renders the checkbox for each row, this is the first column and it is named ID regardless + * of how the primary key is named (to keep the code simpler). The bulk actions will do the proper + * name transformation though using `$this->ID`. + */ + public function column_cb( $row ) { + return ''; + } + + /** + * Renders the row-actions. + * + * This method renders the action menu, it reads the definition from the $row_actions property, + * and it checks that the row action method exists before rendering it. + * + * @param array $row Row to render + * @param $column_name Current row + * @return + */ + protected function maybe_render_actions( $row, $column_name ) { + if ( empty( $this->row_actions[ $column_name ] ) ) { + return; + } + + $row_id = $row[ $this->ID ]; + + $actions = '
'; + $action_count = 0; + foreach ( $this->row_actions[ $column_name ] as $action_key => $action ) { + + $action_count++; + + if ( ! method_exists( $this, 'row_action_' . $action_key ) ) { + continue; + } + + $action_link = ! empty( $action['link'] ) ? $action['link'] : add_query_arg( array( 'row_action' => $action_key, 'row_id' => $row_id, 'nonce' => wp_create_nonce( $action_key . '::' . $row_id ) ) ); + $span_class = ! empty( $action['class'] ) ? $action['class'] : $action_key; + $separator = ( $action_count < count( $this->row_actions[ $column_name ] ) ) ? ' | ' : ''; + + $actions .= sprintf( '', esc_attr( $span_class ) ); + $actions .= sprintf( '%3$s', esc_url( $action_link ), esc_attr( $action['desc'] ), esc_html( $action['name'] ) ); + $actions .= sprintf( '%s', $separator ); + } + $actions .= '
'; + return $actions; + } + + protected function process_row_actions() { + $parameters = array( 'row_action', 'row_id', 'nonce' ); + foreach ( $parameters as $parameter ) { + if ( empty( $_REQUEST[ $parameter ] ) ) { + return; + } + } + + $method = 'row_action_' . $_REQUEST['row_action']; + + if ( $_REQUEST['nonce'] === wp_create_nonce( $_REQUEST[ 'row_action' ] . '::' . $_REQUEST[ 'row_id' ] ) && method_exists( $this, $method ) ) { + $this->$method( $_REQUEST['row_id'] ); + } + + wp_redirect( remove_query_arg( + array( 'row_id', 'row_action', 'nonce' ), + wp_unslash( $_SERVER['REQUEST_URI'] ) + ) ); + exit; + } + + /** + * Default column formatting, it will escape everythig for security. + */ + public function column_default( $item, $column_name ) { + $column_html = esc_html( $item[ $column_name ] ); + $column_html .= $this->maybe_render_actions( $item, $column_name ); + return $column_html; + } + + /** + * Display the table heading and search query, if any + */ + protected function display_header() { + echo '

' . esc_attr( $this->table_header ) . '

'; + if ( $this->get_request_search_query() ) { + echo '' . esc_attr( $this->translate( sprintf( 'Search results for "%s"', $this->get_request_search_query() ) ) ) . ''; + } + echo '
'; + } + + /** + * Display the table heading and search query, if any + */ + protected function display_admin_notices() { + foreach ( $this->admin_notices as $notice ) { + echo '
'; + echo '

' . wp_kses_post( $notice['message'] ) . '

'; + echo '
'; + } + } + + /** + * Prints the available statuses so the user can click to filter. + */ + protected function display_filter_by_status() { + + $status_list_items = array(); + $request_status = $this->get_request_status(); + + // Helper to set 'all' filter when not set on status counts passed in + if ( ! isset( $this->status_counts['all'] ) ) { + $this->status_counts = array( 'all' => array_sum( $this->status_counts ) ) + $this->status_counts; + } + + foreach ( $this->status_counts as $status_name => $count ) { + + if ( 0 === $count ) { + continue; + } + + if ( $status_name === $request_status || ( empty( $request_status ) && 'all' === $status_name ) ) { + $status_list_item = '
  • %3$s (%4$d)
  • '; + } else { + $status_list_item = '
  • %3$s (%4$d)
  • '; + } + + $status_filter_url = ( 'all' === $status_name ) ? remove_query_arg( 'status' ) : add_query_arg( 'status', $status_name ); + $status_list_items[] = sprintf( $status_list_item, esc_attr( $status_name ), esc_url( $status_filter_url ), esc_html( ucfirst( $status_name ) ), absint( $count ) ); + } + + if ( $status_list_items ) { + echo '
      '; + echo implode( " | \n", $status_list_items ); + echo '
    '; + } + } + + /** + * Renders the table list, we override the original class to render the table inside a form + * and to render any needed HTML (like the search box). By doing so the callee of a function can simple + * forget about any extra HTML. + */ + protected function display_table() { + echo '
    '; + foreach ( $_GET as $key => $value ) { + if ( '_' === $key[0] || 'paged' === $key ) { + continue; + } + echo ''; + } + if ( ! empty( $this->search_by ) ) { + echo $this->search_box( $this->get_search_box_button_text(), 'plugin' ); // WPCS: XSS OK + } + parent::display(); + echo '
    '; + } + + /** + * Render the list table page, including header, notices, status filters and table. + */ + public function display_page() { + $this->prepare_items(); + + echo '
    '; + $this->display_header(); + $this->display_admin_notices(); + $this->display_filter_by_status(); + $this->display_table(); + echo '
    '; + } + + /** + * Get the text to display in the search box on the list table. + */ + protected function get_search_box_placeholder() { + return $this->translate( 'Search' ); + } +} diff --git a/classes/ActionScheduler_Abstract_QueueRunner.php b/classes/ActionScheduler_Abstract_QueueRunner.php new file mode 100644 index 00000000000..21f9ee0025f --- /dev/null +++ b/classes/ActionScheduler_Abstract_QueueRunner.php @@ -0,0 +1,89 @@ +store = $store ? $store : ActionScheduler_Store::instance(); + $this->monitor = $monitor ? $monitor : new ActionScheduler_FatalErrorMonitor( $this->store ); + $this->cleaner = $cleaner ? $cleaner : new ActionScheduler_QueueCleaner( $this->store ); + } + + /** + * Process an individual action. + * + * @param int $action_id The action ID to process. + */ + public function process_action( $action_id ) { + try { + do_action( 'action_scheduler_before_execute', $action_id ); + $action = $this->store->fetch_action( $action_id ); + $this->store->log_execution( $action_id ); + $action->execute(); + do_action( 'action_scheduler_after_execute', $action_id ); + $this->store->mark_complete( $action_id ); + } catch ( Exception $e ) { + $this->store->mark_failure( $action_id ); + do_action( 'action_scheduler_failed_execution', $action_id, $e ); + } + $this->schedule_next_instance( $action ); + } + + /** + * Schedule the next instance of the action if necessary. + * + * @param ActionScheduler_Action $action + */ + protected function schedule_next_instance( ActionScheduler_Action $action ) { + $schedule = $action->get_schedule(); + $next = $schedule->next( as_get_datetime_object() ); + + if ( ! is_null( $next ) && $schedule->is_recurring() ) { + $this->store->save_action( $action, $next ); + } + } + + /** + * Run the queue cleaner. + * + * @author Jeremy Pry + */ + protected function run_cleanup() { + $this->cleaner->clean(); + } + + /** + * Get the number of concurrent batches a runner allows. + * + * @return int + */ + public function get_allowed_concurrent_batches() { + return apply_filters( 'action_scheduler_queue_runner_concurrent_batches', 5 ); + } + + /** + * Process actions in the queue. + * + * @author Jeremy Pry + * @return int The number of actions processed. + */ + abstract public function run(); +} diff --git a/classes/ActionScheduler_Action.php b/classes/ActionScheduler_Action.php new file mode 100644 index 00000000000..6258ba1637a --- /dev/null +++ b/classes/ActionScheduler_Action.php @@ -0,0 +1,75 @@ +set_hook($hook); + $this->set_schedule($schedule); + $this->set_args($args); + $this->set_group($group); + } + + public function execute() { + return do_action_ref_array($this->get_hook(), $this->get_args()); + } + + /** + * @param string $hook + */ + protected function set_hook( $hook ) { + $this->hook = $hook; + } + + public function get_hook() { + return $this->hook; + } + + protected function set_schedule( ActionScheduler_Schedule $schedule ) { + $this->schedule = $schedule; + } + + /** + * @return ActionScheduler_Schedule + */ + public function get_schedule() { + return $this->schedule; + } + + protected function set_args( array $args ) { + $this->args = $args; + } + + public function get_args() { + return $this->args; + } + + /** + * @param string $group + */ + protected function set_group( $group ) { + $this->group = $group; + } + + /** + * @return string + */ + public function get_group() { + return $this->group; + } + + /** + * @return bool If the action has been finished + */ + public function is_finished() { + return FALSE; + } +} diff --git a/classes/ActionScheduler_ActionClaim.php b/classes/ActionScheduler_ActionClaim.php new file mode 100644 index 00000000000..8b5681620e3 --- /dev/null +++ b/classes/ActionScheduler_ActionClaim.php @@ -0,0 +1,23 @@ +id = $id; + $this->action_ids = $action_ids; + } + + public function get_id() { + return $this->id; + } + + public function get_actions() { + return $this->action_ids; + } +} + \ No newline at end of file diff --git a/classes/ActionScheduler_ActionFactory.php b/classes/ActionScheduler_ActionFactory.php new file mode 100644 index 00000000000..8d97417c5f2 --- /dev/null +++ b/classes/ActionScheduler_ActionFactory.php @@ -0,0 +1,111 @@ +store( $action ); + } + + /** + * @param string $hook The hook to trigger when this action runs + * @param array $args Args to pass when the hook is triggered + * @param int $first Unix timestamp for the first run + * @param int $interval Seconds between runs + * @param string $group A group to put the action in + * + * @return string The ID of the stored action + */ + public function recurring( $hook, $args = array(), $first = null, $interval = null, $group = '' ) { + if ( empty($interval) ) { + return $this->single( $hook, $args, $first, $group ); + } + $date = as_get_datetime_object( $first ); + $schedule = new ActionScheduler_IntervalSchedule( $date, $interval ); + $action = new ActionScheduler_Action( $hook, $args, $schedule, $group ); + return $this->store( $action ); + } + + + /** + * @param string $hook The hook to trigger when this action runs + * @param array $args Args to pass when the hook is triggered + * @param int $first Unix timestamp for the first run + * @param int $schedule A cron definition string + * @param string $group A group to put the action in + * + * @return string The ID of the stored action + */ + public function cron( $hook, $args = array(), $first = null, $schedule = null, $group = '' ) { + if ( empty($schedule) ) { + return $this->single( $hook, $args, $first, $group ); + } + $date = as_get_datetime_object( $first ); + $cron = CronExpression::factory( $schedule ); + $schedule = new ActionScheduler_CronSchedule( $date, $cron ); + $action = new ActionScheduler_Action( $hook, $args, $schedule, $group ); + return $this->store( $action ); + } + + /** + * @param ActionScheduler_Action $action + * + * @return string The ID of the stored action + */ + protected function store( ActionScheduler_Action $action ) { + $store = ActionScheduler_Store::instance(); + return $store->save_action( $action ); + } +} diff --git a/classes/ActionScheduler_AdminView.php b/classes/ActionScheduler_AdminView.php new file mode 100644 index 00000000000..b1abf124b6e --- /dev/null +++ b/classes/ActionScheduler_AdminView.php @@ -0,0 +1,78 @@ + System status. + * + * @param array $tabs An associative array of tab key => label. + * @return array $tabs An associative array of tab key => label, including Action Scheduler's tabs + */ + public function register_system_status_tab( array $tabs ) { + $tabs['action-scheduler'] = __( 'Scheduled Actions', 'action-scheduler' ); + + return $tabs; + } + + /** + * Include Action Scheduler's administration under the Tools menu. + * + * A menu under the Tools menu is important for backward compatibility (as that's + * where it started), and also provides more convenient access than the WooCommerce + * System Status page, and for sites where WooCommerce isn't active. + */ + public function register_menu() { + add_submenu_page( + 'tools.php', + __( 'Scheduled Actions', 'action-scheduler' ), + __( 'Scheduled Actions', 'action-scheduler' ), + 'manage_options', + 'action-scheduler', + array( $this, 'render_admin_ui' ) + ); + } + + /** + * Renders the Admin UI + */ + public function render_admin_ui() { + $table = new ActionScheduler_ListTable( ActionScheduler::store(), ActionScheduler::logger(), ActionScheduler::runner() ); + $table->display_page(); + } +} diff --git a/classes/ActionScheduler_AdminView_Deprecated.php b/classes/ActionScheduler_AdminView_Deprecated.php new file mode 100644 index 00000000000..69b46d7bd4a --- /dev/null +++ b/classes/ActionScheduler_AdminView_Deprecated.php @@ -0,0 +1,147 @@ +set_schedule( new ActionScheduler_NullSchedule() ); + } +} diff --git a/classes/ActionScheduler_CronSchedule.php b/classes/ActionScheduler_CronSchedule.php new file mode 100644 index 00000000000..3e7db8b85ef --- /dev/null +++ b/classes/ActionScheduler_CronSchedule.php @@ -0,0 +1,50 @@ +start = $start; + $this->cron = $cron; + } + + /** + * @param DateTime $after + * @return DateTime|null + */ + public function next( DateTime $after = NULL ) { + $after = empty($after) ? clone $this->start : clone $after; + return $this->cron->getNextRunDate($after, 0, false); + } + + /** + * @return bool + */ + public function is_recurring() { + return true; + } + + /** + * For PHP 5.2 compat, since DateTime objects can't be serialized + * @return array + */ + public function __sleep() { + $this->start_timestamp = $this->start->getTimestamp(); + return array( + 'start_timestamp', + 'cron' + ); + } + + public function __wakeup() { + $this->start = as_get_datetime_object($this->start_timestamp); + } +} + diff --git a/classes/ActionScheduler_DateTime.php b/classes/ActionScheduler_DateTime.php new file mode 100644 index 00000000000..13d8c274c2f --- /dev/null +++ b/classes/ActionScheduler_DateTime.php @@ -0,0 +1,20 @@ +format( 'U' ); + } +} diff --git a/classes/ActionScheduler_FatalErrorMonitor.php b/classes/ActionScheduler_FatalErrorMonitor.php new file mode 100644 index 00000000000..19bac0b14ba --- /dev/null +++ b/classes/ActionScheduler_FatalErrorMonitor.php @@ -0,0 +1,54 @@ +store = $store; + } + + public function attach( ActionScheduler_ActionClaim $claim ) { + $this->claim = $claim; + add_action( 'shutdown', array( $this, 'handle_unexpected_shutdown' ) ); + add_action( 'action_scheduler_before_execute', array( $this, 'track_current_action' ), 0, 1 ); + add_action( 'action_scheduler_after_execute', array( $this, 'untrack_action' ), 0, 0 ); + add_action( 'action_scheduler_failed_execution', array( $this, 'untrack_action' ), 0, 0 ); + } + + public function detach() { + $this->claim = NULL; + $this->untrack_action(); + remove_action( 'shutdown', array( $this, 'handle_unexpected_shutdown' ) ); + remove_action( 'action_scheduler_before_execute', array( $this, 'track_current_action' ), 0, 1 ); + remove_action( 'action_scheduler_after_execute', array( $this, 'untrack_action' ), 0, 0 ); + remove_action( 'action_scheduler_failed_execution', array( $this, 'untrack_action' ), 0, 0 ); + } + + public function track_current_action( $action_id ) { + $this->action_id = $action_id; + } + + public function untrack_action() { + $this->action_id = 0; + } + + public function handle_unexpected_shutdown() { + if ( $error = error_get_last() ) { + if ( in_array( $error['type'], array( E_ERROR, E_PARSE, E_COMPILE_ERROR, E_USER_ERROR, E_RECOVERABLE_ERROR ) ) ) { + if ( !empty($this->action_id) ) { + $this->store->mark_failure( $this->action_id ); + do_action( 'action_scheduler_unexpected_shutdown', $this->action_id, $error ); + } + } + $this->store->release_claim( $this->claim ); + } + } +} + \ No newline at end of file diff --git a/classes/ActionScheduler_FinishedAction.php b/classes/ActionScheduler_FinishedAction.php new file mode 100644 index 00000000000..b23a56c66b7 --- /dev/null +++ b/classes/ActionScheduler_FinishedAction.php @@ -0,0 +1,16 @@ +start = $start; + $this->interval_in_seconds = (int)$interval; + } + + /** + * @param DateTime $after + * + * @return DateTime|null + */ + public function next( DateTime $after = NULL ) { + $after = empty($after) ? as_get_datetime_object('@0') : clone $after; + if ( $after > $this->start ) { + $after->modify('+'.$this->interval_in_seconds.' seconds'); + return $after; + } + return clone $this->start; + } + + /** + * @return bool + */ + public function is_recurring() { + return true; + } + + /** + * @param DateTime $after + * + * @return DateTime|null + */ + public function interval_in_seconds() { + return $this->interval_in_seconds; + } + + /** + * For PHP 5.2 compat, since DateTime objects can't be serialized + * @return array + */ + public function __sleep() { + $this->start_timestamp = $this->start->getTimestamp(); + return array( + 'start_timestamp', + 'interval_in_seconds' + ); + } + + public function __wakeup() { + $this->start = as_get_datetime_object($this->start_timestamp); + } +} diff --git a/classes/ActionScheduler_ListTable.php b/classes/ActionScheduler_ListTable.php new file mode 100644 index 00000000000..69dea5b3b87 --- /dev/null +++ b/classes/ActionScheduler_ListTable.php @@ -0,0 +1,526 @@ + label). + * + * @var array + */ + protected $columns = array(); + + /** + * Actions (name => label). + * + * @var array + */ + protected $row_actions = array(); + + /** + * The active data stores + * + * @var ActionScheduler_Store + */ + protected $store; + + /** + * A logger to use for getting action logs to display + * + * @var ActionScheduler_Logger + */ + protected $logger; + + /** + * A ActionScheduler_QueueRunner runner instance (or child class) + * + * @var ActionScheduler_QueueRunner + */ + protected $runner; + + /** + * Bulk actions. The key of the array is the method name of the implementation: + * + * bulk_(array $ids, string $sql_in). + * + * See the comments in the parent class for further details + * + * @var array + */ + protected $bulk_actions = array(); + + /** + * Flag variable to render our notifications, if any, once. + * + * @var bool + */ + protected static $did_notification = false; + + /** + * Array of seconds for common time periods, like week or month, alongside an internationalised string representation, i.e. "Day" or "Days" + * + * @var array + */ + private static $time_periods; + + /** + * Sets the current data store object into `store->action` and initialises the object. + * + * @param ActionScheduler_Store $store + * @param ActionScheduler_Logger $logger + * @param ActionScheduler_QueueRunner $runner + */ + public function __construct( ActionScheduler_Store $store, ActionScheduler_Logger $logger, ActionScheduler_QueueRunner $runner ) { + + $this->store = $store; + $this->logger = $logger; + $this->runner = $runner; + + $this->table_header = __( 'Scheduled Actions', 'action-scheduler' ); + + $this->bulk_actions = array( + 'delete' => __( 'Delete', 'action-scheduler' ), + ); + + $this->columns = array( + 'hook' => __( 'Hook', 'action-scheduler' ), + 'status' => __( 'Status', 'action-scheduler' ), + 'args' => __( 'Arguments', 'action-scheduler' ), + 'group' => __( 'Group', 'action-scheduler' ), + 'recurrence' => __( 'Recurrence', 'action-scheduler' ), + 'schedule' => __( 'Scheduled Date', 'action-scheduler' ), + 'log_entries' => __( 'Log', 'action-scheduler' ), + ); + + $this->sort_by = array( + 'schedule', + 'hook', + 'group', + ); + + $this->search_by = array( + 'hook', + 'args', + 'claim_id', + ); + + $request_status = $this->get_request_status(); + + if ( empty( $request_status ) ) { + $this->sort_by[] = 'status'; + } elseif ( in_array( $request_status, array( 'in-progress', 'failed' ) ) ) { + $this->columns += array( 'claim_id' => __( 'Claim ID', 'action-scheduler' ) ); + $this->sort_by[] = 'claim_id'; + } + + $this->row_actions = array( + 'hook' => array( + 'run' => array( + 'name' => __( 'Run', 'action-scheduler' ), + 'desc' => __( 'Process the action now as if it were run as part of a queue', 'action-scheduler' ), + ), + 'cancel' => array( + 'name' => __( 'Cancel', 'action-scheduler' ), + 'desc' => __( 'Cancel the action now to avoid it being run in future', 'action-scheduler' ), + 'class' => 'cancel trash', + ), + ), + ); + + self::$time_periods = array( + array( + 'seconds' => YEAR_IN_SECONDS, + 'names' => _n_noop( '%s year', '%s years', 'action-scheduler' ), + ), + array( + 'seconds' => MONTH_IN_SECONDS, + 'names' => _n_noop( '%s month', '%s months', 'action-scheduler' ), + ), + array( + 'seconds' => WEEK_IN_SECONDS, + 'names' => _n_noop( '%s week', '%s weeks', 'action-scheduler' ), + ), + array( + 'seconds' => DAY_IN_SECONDS, + 'names' => _n_noop( '%s day', '%s days', 'action-scheduler' ), + ), + array( + 'seconds' => HOUR_IN_SECONDS, + 'names' => _n_noop( '%s hour', '%s hours', 'action-scheduler' ), + ), + array( + 'seconds' => MINUTE_IN_SECONDS, + 'names' => _n_noop( '%s minute', '%s minutes', 'action-scheduler' ), + ), + array( + 'seconds' => 1, + 'names' => _n_noop( '%s second', '%s seconds', 'action-scheduler' ), + ), + ); + + parent::__construct( array( + 'singular' => 'action-scheduler', + 'plural' => 'action-scheduler', + 'ajax' => false, + ) ); + } + + /** + * Convert an interval of seconds into a two part human friendly string. + * + * The WordPress human_time_diff() function only calculates the time difference to one degree, meaning + * even if an action is 1 day and 11 hours away, it will display "1 day". This function goes one step + * further to display two degrees of accuracy. + * + * Inspired by the Crontrol::interval() function by Edward Dale: https://wordpress.org/plugins/wp-crontrol/ + * + * @param int $interval A interval in seconds. + * @param int $periods_to_include Depth of time periods to include, e.g. for an interval of 70, and $periods_to_include of 2, both minutes and seconds would be included. With a value of 1, only minutes would be included. + * @return string A human friendly string representation of the interval. + */ + private static function human_interval( $interval, $periods_to_include = 2 ) { + + if ( $interval <= 0 ) { + return __( 'Now!', 'action-scheduler' ); + } + + $output = ''; + + for ( $time_period_index = 0, $periods_included = 0, $seconds_remaining = $interval; $time_period_index < count( self::$time_periods ) && $seconds_remaining > 0 && $periods_included < $periods_to_include; $time_period_index++ ) { + + $periods_in_interval = floor( $seconds_remaining / self::$time_periods[ $time_period_index ]['seconds'] ); + + if ( $periods_in_interval > 0 ) { + if ( ! empty( $output ) ) { + $output .= ' '; + } + $output .= sprintf( _n( self::$time_periods[ $time_period_index ]['names'][0], self::$time_periods[ $time_period_index ]['names'][1], $periods_in_interval, 'action-scheduler' ), $periods_in_interval ); + $seconds_remaining -= $periods_in_interval * self::$time_periods[ $time_period_index ]['seconds']; + $periods_included++; + } + } + + return $output; + } + + /** + * Returns the recurrence of an action or 'Non-repeating'. The output is human readable. + * + * @param ActionScheduler_Action $action + * + * @return string + */ + protected function get_recurrence( $action ) { + $recurrence = $action->get_schedule(); + if ( method_exists( $recurrence, 'interval_in_seconds' ) ) { + return sprintf( __( 'Every %s', 'action-scheduler' ), self::human_interval( $recurrence->interval_in_seconds() ) ); + } + return __( 'Non-repeating', 'action-scheduler' ); + } + + /** + * Serializes the argument of an action to render it in a human friendly format. + * + * @param array $row The array representation of the current row of the table + * + * @return string + */ + public function column_args( array $row ) { + if ( empty( $row['args'] ) ) { + return ''; + } + + $row_html = '
      '; + foreach ( $row['args'] as $key => $value ) { + $row_html .= sprintf( '
    • %s => %s
    • ', esc_html( $key ), esc_html( $value ) ); + } + $row_html .= '
    '; + + return apply_filters( 'action_scheduler_list_table_column_args', $row_html, $row ); + } + + /** + * Prints the logs entries inline. We do so to avoid loading Javascript and other hacks to show it in a modal. + * + * @param array $row Action array. + * @return string + */ + public function column_log_entries( array $row ) { + + $log_entries_html = '
      '; + + $timezone = new DateTimezone( 'UTC' ); + + foreach ( $row['log_entries'] as $log_entry ) { + $log_entries_html .= $this->get_log_entry_html( $log_entry, $timezone ); + } + + $log_entries_html .= '
    '; + + return $log_entries_html; + } + + /** + * Prints the logs entries inline. We do so to avoid loading Javascript and other hacks to show it in a modal. + * + * @param ActionScheduler_LogEntry $log_entry + * @param DateTimezone $timezone + * @return string + */ + protected function get_log_entry_html( ActionScheduler_LogEntry $log_entry, DateTimezone $timezone ) { + $date = $log_entry->get_date(); + $date->setTimezone( $timezone ); + return sprintf( '
  • %s
    %s
  • ', esc_html( $date->format( 'Y-m-d H:i:s e' ) ), esc_html( $log_entry->get_message() ) ); + } + + /** + * Only display row actions for pending actions. + * + * @param array $row Row to render + * @param string $column_name Current row + * + * @return string + */ + protected function maybe_render_actions( $row, $column_name ) { + if ( 'pending' === strtolower( $row['status'] ) ) { + return parent::maybe_render_actions( $row, $column_name ); + } + + return ''; + } + + /** + * Renders admin notifications + * + * Notifications: + * 1. When the maximum number of tasks are being executed simultaneously + * 2. Notifications when a task us manually executed + */ + public function display_admin_notices() { + + if ( $this->store->get_claim_count() >= $this->runner->get_allowed_concurrent_batches() ) { + $this->admin_notices[] = array( + 'class' => 'updated', + 'message' => sprintf( __( 'Maximum simultaneous batches already in progress (%s queues). No actions will be processed until the current batches are complete.', 'action-scheduler' ), $this->store->get_claim_count() ), + ); + } + + $notification = get_transient( 'action_scheduler_admin_notice' ); + + if ( is_array( $notification ) ) { + delete_transient( 'action_scheduler_admin_notice' ); + + $action = $this->store->fetch_action( $notification['action_id'] ); + $action_hook_html = '' . $action->get_hook() . ''; + if ( 1 == $notification['success'] ) { + $class = 'updated'; + switch ( $notification['row_action_type'] ) { + case 'run' : + $action_message_html = sprintf( __( 'Successfully executed action: %s', 'action-scheduler' ), $action_hook_html ); + break; + case 'cancel' : + $action_message_html = sprintf( __( 'Successfully canceled action: %s', 'action-scheduler' ), $action_hook_html ); + break; + default : + $action_message_html = sprintf( __( 'Successfully processed change for action: %s', 'action-scheduler' ), $action_hook_html ); + break; + } + } else { + $class = 'error'; + $action_message_html = sprintf( __( 'Could not process change for action: "%s" (ID: %d). Error: %s', 'action-scheduler' ), $action_hook_html, esc_html( $notification['action_id'] ), esc_html( $notification['error_message'] ) ); + } + + $action_message_html = apply_filters( 'action_scheduler_admin_notice_html', $action_message_html, $action, $notification ); + + $this->admin_notices[] = array( + 'class' => $class, + 'message' => $action_message_html, + ); + } + + parent::display_admin_notices(); + } + + /** + * Prints the scheduled date in a human friendly format. + * + * @param array $row The array representation of the current row of the table + * + * @return string + */ + public function column_schedule( $row ) { + return $this->get_schedule_display_string( $row['schedule'] ); + } + + /** + * Get the scheduled date in a human friendly format. + * + * @param ActionScheduler_Schedule $schedule + * @return string + */ + protected function get_schedule_display_string( ActionScheduler_Schedule $schedule ) { + + $schedule_display_string = ''; + + if ( ! $schedule->next() ) { + return $schedule_display_string; + } + + $next_timestamp = $schedule->next()->getTimestamp(); + + $schedule_display_string .= $schedule->next()->format( 'Y-m-d H:i:s e' ); + $schedule_display_string .= '
    '; + + if ( gmdate( 'U' ) > $next_timestamp ) { + $schedule_display_string .= sprintf( __( ' (%s ago)', 'action-scheduler' ), self::human_interval( gmdate( 'U' ) - $next_timestamp ) ); + } else { + $schedule_display_string .= sprintf( __( ' (%s)', 'action-scheduler' ), self::human_interval( $next_timestamp - gmdate( 'U' ) ) ); + } + + return $schedule_display_string; + } + + /** + * Bulk delete + * + * Deletes actions based on their ID. This is the handler for the bulk delete. It assumes the data + * properly validated by the callee and it will delete the actions without any extra validation. + * + * @param array $ids + * @param string $ids_sql Inherited and unused + */ + protected function bulk_delete( array $ids, $ids_sql ) { + foreach ( $ids as $id ) { + $this->store->delete_action( $id ); + } + } + + /** + * Implements the logic behind running an action. ActionScheduler_Abstract_ListTable validates the request and their + * parameters are valid. + * + * @param int $action_id + */ + protected function row_action_cancel( $action_id ) { + $this->process_row_action( $action_id, 'cancel' ); + } + + /** + * Implements the logic behind running an action. ActionScheduler_Abstract_ListTable validates the request and their + * parameters are valid. + * + * @param int $action_id + */ + protected function row_action_run( $action_id ) { + $this->process_row_action( $action_id, 'run' ); + } + + /** + * Implements the logic behind processing an action once an action link is clicked on the list table. + * + * @param int $action_id + * @param string $row_action_type The type of action to perform on the action. + */ + protected function process_row_action( $action_id, $row_action_type ) { + try { + switch ( $row_action_type ) { + case 'run' : + $this->runner->process_action( $action_id ); + break; + case 'cancel' : + $this->store->cancel_action( $action_id ); + break; + } + $success = 1; + $error_message = ''; + } catch ( Exception $e ) { + $success = 0; + $error_message = $e->getMessage(); + } + + set_transient( 'action_scheduler_admin_notice', compact( 'action_id', 'success', 'error_message', 'row_action_type' ), 30 ); + } + + /** + * {@inheritDoc} + */ + public function prepare_items() { + $this->process_bulk_action(); + + $this->process_row_actions(); + + if ( ! empty( $_REQUEST['_wp_http_referer'] ) ) { + // _wp_http_referer is used only on bulk actions, we remove it to keep the $_GET shorter + wp_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), wp_unslash( $_SERVER['REQUEST_URI'] ) ) ); + exit; + } + + $this->prepare_column_headers(); + + $per_page = $this->get_items_per_page( $this->package . '_items_per_page', $this->items_per_page ); + $query = array( + 'per_page' => $per_page, + 'offset' => $this->get_items_offset(), + 'status' => $this->get_request_status(), + 'orderby' => $this->get_request_orderby(), + 'order' => $this->get_request_order(), + 'search' => $this->get_request_search_query(), + ); + + $this->items = array(); + + $total_items = $this->store->query_actions( $query, 'count' ); + + $status_labels = $this->store->get_status_labels(); + + foreach ( $this->store->query_actions( $query ) as $action_id ) { + try { + $action = $this->store->fetch_action( $action_id ); + } catch ( Exception $e ) { + continue; + } + $this->items[ $action_id ] = array( + 'ID' => $action_id, + 'hook' => $action->get_hook(), + 'status' => $status_labels[ $this->store->get_status( $action_id ) ], + 'args' => $action->get_args(), + 'group' => $action->get_group(), + 'log_entries' => $this->logger->get_logs( $action_id ), + 'claim_id' => $this->store->get_claim_id( $action_id ), + 'recurrence' => $this->get_recurrence( $action ), + 'schedule' => $action->get_schedule(), + ); + } + + $this->set_pagination_args( array( + 'total_items' => $total_items, + 'per_page' => $per_page, + 'total_pages' => ceil( $total_items / $per_page ), + ) ); + } + + /** + * Prints the available statuses so the user can click to filter. + */ + protected function display_filter_by_status() { + $this->status_counts = $this->store->action_counts(); + parent::display_filter_by_status(); + } + + /** + * Get the text to display in the search box on the list table. + */ + protected function get_search_box_button_text() { + return __( 'Search hook, args and claim ID', 'action-scheduler' ); + } +} diff --git a/classes/ActionScheduler_LogEntry.php b/classes/ActionScheduler_LogEntry.php new file mode 100644 index 00000000000..649636debf7 --- /dev/null +++ b/classes/ActionScheduler_LogEntry.php @@ -0,0 +1,67 @@ +comment_type + * to ActionScheduler_LogEntry::__construct(), goodness knows why, and the Follow-up Emails plugin + * hard-codes loading its own version of ActionScheduler_wpCommentLogger with that out-dated method, + * goodness knows why, so we need to guard against that here instead of using a DateTime type declaration + * for the constructor's 3rd param of $date and causing a fatal error with older versions of FUE. + */ + if ( null !== $date && ! is_a( $date, 'DateTime' ) ) { + _doing_it_wrong( __METHOD__, 'The third parameter must be a valid DateTime instance, or null.', '2.0.0' ); + $date = null; + } + + $this->action_id = $action_id; + $this->message = $message; + $this->date = $date ? $date : new Datetime; + } + + /** + * Returns the date when this log entry was created + * + * @return Datetime + */ + public function get_date() { + return $this->date; + } + + public function get_action_id() { + return $this->action_id; + } + + public function get_message() { + return $this->message; + } +} + diff --git a/classes/ActionScheduler_Logger.php b/classes/ActionScheduler_Logger.php new file mode 100644 index 00000000000..601e5679c99 --- /dev/null +++ b/classes/ActionScheduler_Logger.php @@ -0,0 +1,47 @@ +set_schedule( new ActionScheduler_NullSchedule() ); + } + + public function execute() { + // don't execute + } +} + \ No newline at end of file diff --git a/classes/ActionScheduler_NullLogEntry.php b/classes/ActionScheduler_NullLogEntry.php new file mode 100644 index 00000000000..6f8f218aab4 --- /dev/null +++ b/classes/ActionScheduler_NullLogEntry.php @@ -0,0 +1,11 @@ +store = $store ? $store : ActionScheduler_Store::instance(); + $this->batch_size = $batch_size; + } + + public function delete_old_actions() { + $lifespan = apply_filters( 'action_scheduler_retention_period', $this->month_in_seconds ); + $cutoff = as_get_datetime_object($lifespan.' seconds ago'); + + $statuses_to_purge = array( + ActionScheduler_Store::STATUS_COMPLETE, + ActionScheduler_Store::STATUS_CANCELED, + ); + + foreach ( $statuses_to_purge as $status ) { + $actions_to_delete = $this->store->query_actions( array( + 'status' => $status, + 'modified' => $cutoff, + 'modified_compare' => '<=', + 'per_page' => $this->get_batch_size(), + ) ); + + foreach ( $actions_to_delete as $action_id ) { + try { + $this->store->delete_action( $action_id ); + } catch ( Exception $e ) { + + /** + * Notify 3rd party code of exceptions when deleting a completed action older than the retention period + * + * This hook provides a way for 3rd party code to log or otherwise handle exceptions relating to their + * actions. + * + * @since 2.0.0 + * + * @param int $action_id The scheduled actions ID in the data store + * @param Exception $e The exception thrown when attempting to delete the action from the data store + * @param int $lifespan The retention period, in seconds, for old actions + * @param int $count_of_actions_to_delete The number of old actions being deleted in this batch + */ + do_action( 'action_scheduler_failed_old_action_deletion', $action_id, $e, $lifespan, count( $actions_to_delete ) ); + } + } + } + } + + public function reset_timeouts() { + $timeout = apply_filters( 'action_scheduler_timeout_period', $this->five_minutes ); + if ( $timeout < 0 ) { + return; + } + $cutoff = as_get_datetime_object($timeout.' seconds ago'); + $actions_to_reset = $this->store->query_actions( array( + 'status' => ActionScheduler_Store::STATUS_PENDING, + 'modified' => $cutoff, + 'modified_compare' => '<=', + 'claimed' => true, + 'per_page' => $this->get_batch_size(), + ) ); + + foreach ( $actions_to_reset as $action_id ) { + $this->store->unclaim_action( $action_id ); + do_action( 'action_scheduler_reset_action', $action_id ); + } + } + + public function mark_failures() { + $timeout = apply_filters( 'action_scheduler_failure_period', $this->five_minutes ); + if ( $timeout < 0 ) { + return; + } + $cutoff = as_get_datetime_object($timeout.' seconds ago'); + $actions_to_reset = $this->store->query_actions( array( + 'status' => ActionScheduler_Store::STATUS_RUNNING, + 'modified' => $cutoff, + 'modified_compare' => '<=', + 'per_page' => $this->get_batch_size(), + ) ); + + foreach ( $actions_to_reset as $action_id ) { + $this->store->mark_failure( $action_id ); + do_action( 'action_scheduler_failed_action', $action_id, $timeout ); + } + } + + /** + * Do all of the cleaning actions. + * + * @author Jeremy Pry + */ + public function clean() { + $this->delete_old_actions(); + $this->reset_timeouts(); + $this->mark_failures(); + } + + /** + * Get the batch size for cleaning the queue. + * + * @author Jeremy Pry + * @return int + */ + protected function get_batch_size() { + /** + * Filter the batch size when cleaning the queue. + * + * @param int $batch_size The number of actions to clean in one batch. + */ + return absint( apply_filters( 'action_scheduler_cleanup_batch_size', $this->batch_size ) ); + } +} diff --git a/classes/ActionScheduler_QueueRunner.php b/classes/ActionScheduler_QueueRunner.php new file mode 100644 index 00000000000..387bb516fe0 --- /dev/null +++ b/classes/ActionScheduler_QueueRunner.php @@ -0,0 +1,169 @@ +created_time = microtime( true ); + } + + /** + * @codeCoverageIgnore + */ + public function init() { + + add_filter( 'cron_schedules', array( self::instance(), 'add_wp_cron_schedule' ) ); + + if ( !wp_next_scheduled(self::WP_CRON_HOOK) ) { + $schedule = apply_filters( 'action_scheduler_run_schedule', self::WP_CRON_SCHEDULE ); + wp_schedule_event( time(), $schedule, self::WP_CRON_HOOK ); + } + + add_action( self::WP_CRON_HOOK, array( self::instance(), 'run' ) ); + } + + public function run() { + @ini_set( 'memory_limit', apply_filters( 'admin_memory_limit', WP_MAX_MEMORY_LIMIT ) ); + @set_time_limit( apply_filters( 'action_scheduler_queue_runner_time_limit', 600 ) ); + do_action( 'action_scheduler_before_process_queue' ); + $this->run_cleanup(); + $count = 0; + if ( $this->store->get_claim_count() < $this->get_allowed_concurrent_batches() ) { + $batch_size = apply_filters( 'action_scheduler_queue_runner_batch_size', 25 ); + $count = $this->do_batch( $batch_size ); + } + + do_action( 'action_scheduler_after_process_queue' ); + return $count; + } + + protected function do_batch( $size = 100 ) { + $claim = $this->store->stake_claim($size); + $this->monitor->attach($claim); + $processed_actions = 0; + $maximum_execution_time = $this->get_maximum_execution_time(); + + foreach ( $claim->get_actions() as $action_id ) { + if ( 0 !== $processed_actions ) { + $time_elapsed = $this->get_execution_time(); + $average_processing_time = $time_elapsed / $processed_actions; + + // Bail early if the time it has taken to process this batch is approaching the maximum execution time. + if ( $time_elapsed + ( $average_processing_time * 2 ) > $maximum_execution_time ) { + break; + } + } + + // bail if we lost the claim + if ( ! in_array( $action_id, $this->store->find_actions_by_claim_id( $claim->get_id() ) ) ) { + break; + } + $this->process_action( $action_id ); + $processed_actions++; + } + $this->store->release_claim($claim); + $this->monitor->detach(); + $this->clear_caches(); + return $processed_actions; + } + + /** + * Running large batches can eat up memory, as WP adds data to its object cache. + * + * If using a persistent object store, this has the side effect of flushing that + * as well, so this is disabled by default. To enable: + * + * add_filter( 'action_scheduler_queue_runner_flush_cache', '__return_true' ); + */ + protected function clear_caches() { + if ( ! wp_using_ext_object_cache() || apply_filters( 'action_scheduler_queue_runner_flush_cache', false ) ) { + wp_cache_flush(); + } + } + + public function add_wp_cron_schedule( $schedules ) { + $schedules['every_minute'] = array( + 'interval' => 60, // in seconds + 'display' => __( 'Every minute' ), + ); + + return $schedules; + } + + /** + * Get the maximum number of seconds a batch can run for. + * + * @return int The number of seconds. + */ + protected function get_maximum_execution_time() { + + // There are known hosts with a strict 60 second execution time. + if ( defined( 'WPENGINE_ACCOUNT' ) || defined( 'PANTHEON_ENVIRONMENT' ) ) { + $maximum_execution_time = 60; + } elseif ( false !== strpos( getenv( 'HOSTNAME' ), '.siteground.' ) ) { + $maximum_execution_time = 120; + } else { + $maximum_execution_time = ini_get( 'max_execution_time' ); + } + + return absint( apply_filters( 'action_scheduler_maximum_execution_time', $maximum_execution_time ) ); + } + + /** + * Get the number of seconds a batch has run for. + * + * @return int The number of seconds. + */ + protected function get_execution_time() { + $execution_time = microtime( true ) - $this->created_time; + + // Get the CPU time if the hosting environment uses it rather than wall-clock time to calculate a process's execution time. + if ( function_exists( 'getrusage' ) && apply_filters( 'action_scheduler_use_cpu_execution_time', defined( 'PANTHEON_ENVIRONMENT' ) ) ) { + $resource_usages = getrusage(); + + if ( isset( $resource_usages['ru_stime.tv_usec'], $resource_usages['ru_stime.tv_usec'] ) ) { + $execution_time = $resource_usages['ru_stime.tv_sec'] + ( $resource_usages['ru_stime.tv_usec'] / 1000000 ); + } + } + + return $execution_time; + } +} diff --git a/classes/ActionScheduler_Schedule.php b/classes/ActionScheduler_Schedule.php new file mode 100644 index 00000000000..d61a9f7c920 --- /dev/null +++ b/classes/ActionScheduler_Schedule.php @@ -0,0 +1,18 @@ +date = clone $date; + } + + /** + * @param DateTime $after + * + * @return DateTime|null + */ + public function next( DateTime $after = NULL ) { + $after = empty($after) ? as_get_datetime_object('@0') : $after; + return ( $after > $this->date ) ? NULL : clone $this->date; + } + + /** + * @return bool + */ + public function is_recurring() { + return false; + } + + /** + * For PHP 5.2 compat, since DateTime objects can't be serialized + * @return array + */ + public function __sleep() { + $this->timestamp = $this->date->getTimestamp(); + return array( + 'timestamp', + ); + } + + public function __wakeup() { + $this->date = as_get_datetime_object($this->timestamp); + } +} diff --git a/classes/ActionScheduler_Store.php b/classes/ActionScheduler_Store.php new file mode 100644 index 00000000000..d967b593de8 --- /dev/null +++ b/classes/ActionScheduler_Store.php @@ -0,0 +1,210 @@ +', '>=', '<', '<=', '=') ) ) { + return $comparison_operator; + } + return '='; + } + + /** + * Get the time MySQL formated date/time string for an action's (next) scheduled date. + * + * @param ActionScheduler_Action $action + * @param DateTime $scheduled_date (optional) + * @return string + */ + protected function get_scheduled_date_string( ActionScheduler_Action $action, DateTime $scheduled_date = NULL ) { + $next = null === $scheduled_date ? $action->get_schedule()->next() : $scheduled_date; + if ( ! $next ) { + throw new InvalidArgumentException( __( 'Invalid schedule. Cannot save action.', 'action-scheduler' ) ); + } + $next->setTimezone( new DateTimeZone( 'UTC' ) ); + + return $next->format( 'Y-m-d H:i:s' ); + } + + /** + * Get the time MySQL formated date/time string for an action's (next) scheduled date. + * + * @param ActionScheduler_Action $action + * @param DateTime $scheduled_date (optional) + * @return string + */ + protected function get_scheduled_date_string_local( ActionScheduler_Action $action, DateTime $scheduled_date = NULL ) { + $next = null === $scheduled_date ? $action->get_schedule()->next() : $scheduled_date; + if ( ! $next ) { + throw new InvalidArgumentException( __( 'Invalid schedule. Cannot save action.', 'action-scheduler' ) ); + } + $next->setTimezone( $this->get_local_timezone() ); + + return $next->format( 'Y-m-d H:i:s' ); + } + + /** + * Get the site's local time. Wrapper for ActionScheduler_TimezoneHelper::get_local_timezone(). + * + * @return DateTimeZone + */ + protected function get_local_timezone() { + return ActionScheduler_TimezoneHelper::get_local_timezone(); + } + + /** + * @return array + */ + public function get_status_labels() { + return array( + self::STATUS_COMPLETE => __( 'Complete', 'action-scheduler' ), + self::STATUS_PENDING => __( 'Pending', 'action-scheduler' ), + self::STATUS_RUNNING => __( 'In-progress', 'action-scheduler' ), + self::STATUS_FAILED => __( 'Failed', 'action-scheduler' ), + self::STATUS_CANCELED => __( 'Canceled', 'action-scheduler' ), + ); + } + + public function init() {} + + /** + * @return ActionScheduler_Store + */ + public static function instance() { + if ( empty(self::$store) ) { + $class = apply_filters('action_scheduler_store_class', 'ActionScheduler_wpPostStore'); + self::$store = new $class(); + } + return self::$store; + } +} diff --git a/classes/ActionScheduler_TimezoneHelper.php b/classes/ActionScheduler_TimezoneHelper.php new file mode 100644 index 00000000000..0c8d6e4b0ca --- /dev/null +++ b/classes/ActionScheduler_TimezoneHelper.php @@ -0,0 +1,44 @@ +versions[$version_string]) ) { + return FALSE; + } + $this->versions[$version_string] = $initialization_callback; + return TRUE; + } + + public function get_versions() { + return $this->versions; + } + + public function latest_version() { + $keys = array_keys($this->versions); + if ( empty($keys) ) { + return false; + } + uasort( $keys, 'version_compare' ); + return end($keys); + } + + public function latest_version_callback() { + $latest = $this->latest_version(); + if ( empty($latest) || !isset($this->versions[$latest]) ) { + return '__return_null'; + } + return $this->versions[$latest]; + } + + /** + * @return ActionScheduler_Versions + * @codeCoverageIgnore + */ + public static function instance() { + if ( empty(self::$instance) ) { + self::$instance = new self(); + } + return self::$instance; + } + + /** + * @codeCoverageIgnore + */ + public static function initialize_latest_version() { + $self = self::instance(); + call_user_func($self->latest_version_callback()); + } +} + \ No newline at end of file diff --git a/classes/ActionScheduler_WPCLI_QueueRunner.php b/classes/ActionScheduler_WPCLI_QueueRunner.php new file mode 100644 index 00000000000..b3f1730d97c --- /dev/null +++ b/classes/ActionScheduler_WPCLI_QueueRunner.php @@ -0,0 +1,204 @@ +run_cleanup(); + $this->add_hooks(); + + // Check to make sure there aren't too many concurrent processes running. + $claim_count = $this->store->get_claim_count(); + $too_many = $claim_count >= $this->get_allowed_concurrent_batches(); + if ( $too_many ) { + if ( $force ) { + WP_CLI::warning( __( 'There are too many concurrent batches, but the run is forced to continue.', 'action-scheduler' ) ); + } else { + WP_CLI::error( __( 'There are too many concurrent batches.', 'action-scheduler' ) ); + } + } + + // Stake a claim and store it. + $this->claim = $this->store->stake_claim( $batch_size, null, $hooks, $group ); + $this->monitor->attach( $this->claim ); + $this->actions = $this->claim->get_actions(); + + return count( $this->actions ); + } + + /** + * Add our hooks to the appropriate actions. + * + * @author Jeremy Pry + */ + protected function add_hooks() { + add_action( 'action_scheduler_before_execute', array( $this, 'before_execute' ) ); + add_action( 'action_scheduler_after_execute', array( $this, 'after_execute' ) ); + add_action( 'action_scheduler_failed_execution', array( $this, 'action_failed' ), 10, 2 ); + } + + /** + * Set up the WP CLI progress bar. + * + * @author Jeremy Pry + */ + protected function setup_progress_bar() { + $count = count( $this->actions ); + $this->progress_bar = \WP_CLI\Utils\make_progress_bar( + sprintf( _n( 'Running %d action', 'Running %d actions', $count, 'action-scheduler' ), number_format_i18n( $count ) ), + $count + ); + } + + /** + * Process actions in the queue. + * + * @author Jeremy Pry + * @return int The number of actions processed. + */ + public function run() { + do_action( 'action_scheduler_before_process_queue' ); + $this->setup_progress_bar(); + foreach ( $this->actions as $action_id ) { + // Error if we lost the claim. + if ( ! in_array( $action_id, $this->store->find_actions_by_claim_id( $this->claim->get_id() ) ) ) { + WP_CLI::warning( __( 'The claim has been lost. Aborting current batch.', 'action-scheduler' ) ); + break; + } + + $this->process_action( $action_id ); + $this->progress_bar->tick(); + + // Free up memory after every 50 items + if ( 0 === $this->progress_bar->current() % 50 ) { + $this->stop_the_insanity(); + } + } + + $completed = $this->progress_bar->current(); + $this->progress_bar->finish(); + $this->store->release_claim( $this->claim ); + do_action( 'action_scheduler_after_process_queue' ); + + return $completed; + } + + /** + * Handle WP CLI message when the action is starting. + * + * @author Jeremy Pry + * + * @param $action_id + */ + public function before_execute( $action_id ) { + /* translators: %s refers to the action ID */ + WP_CLI::log( sprintf( __( 'Started processing action %s', 'action-scheduler' ), $action_id ) ); + } + + /** + * Handle WP CLI message when the action has completed. + * + * @author Jeremy Pry + * + * @param $action_id + */ + public function after_execute( $action_id ) { + /* translators: %s refers to the action ID */ + WP_CLI::log( sprintf( __( 'Completed processing action %s', 'action-scheduler' ), $action_id ) ); + } + + /** + * Handle WP CLI message when the action has failed. + * + * @author Jeremy Pry + * + * @param int $action_id + * @param Exception $exception + * @throws \WP_CLI\ExitException With failure message. + */ + public function action_failed( $action_id, $exception ) { + WP_CLI::error( + /* translators: %1$s refers to the action ID, %2$s refers to the Exception message */ + sprintf( __( 'Error processing action %1$s: %2$s', 'action-scheduler' ), $action_id, $exception->getMessage() ), + false + ); + } + + /** + * Sleep and help avoid hitting memory limit + * + * @param int $sleep_time Amount of seconds to sleep + */ + protected function stop_the_insanity( $sleep_time = 0 ) { + if ( 0 < $sleep_time ) { + WP_CLI::warning( sprintf( 'Stopped the insanity for %d %s', $sleep_time, _n( 'second', 'seconds', $sleep_time ) ) ); + sleep( $sleep_time ); + } + + WP_CLI::warning( __( 'Attempting to reduce used memory...', 'action-scheduler' ) ); + + /** + * @var $wpdb \wpdb + * @var $wp_object_cache \WP_Object_Cache + */ + global $wpdb, $wp_object_cache; + + $wpdb->queries = array(); + + if ( ! is_object( $wp_object_cache ) ) { + return; + } + + $wp_object_cache->group_ops = array(); + $wp_object_cache->stats = array(); + $wp_object_cache->memcache_debug = array(); + $wp_object_cache->cache = array(); + + if ( is_callable( array( $wp_object_cache, '__remoteset' ) ) ) { + call_user_func( array( $wp_object_cache, '__remoteset' ) ); // important + } + } +} diff --git a/classes/ActionScheduler_WPCLI_Scheduler_command.php b/classes/ActionScheduler_WPCLI_Scheduler_command.php new file mode 100644 index 00000000000..30d0974510d --- /dev/null +++ b/classes/ActionScheduler_WPCLI_Scheduler_command.php @@ -0,0 +1,145 @@ +] + * : The maximum number of actions to run. Defaults to 100. + * + * [--batches=] + * : Limit execution to a number of batches. Defaults to 0, meaning batches will continue being executed until all actions are complete. + * + * [--cleanup-batch-size=] + * : The maximum number of actions to clean up. Defaults to the value of --batch-size. + * + * [--hooks=] + * : Only run actions with the specified hook. Omitting this option runs actions with any hook. Define multiple hooks as a comma separated string (without spaces), e.g. `--hooks=hook_one,hook_two,hook_three` + * + * [--group=] + * : Only run actions from the specified group. Omitting this option runs actions from all groups. + * + * [--force] + * : Whether to force execution despite the maximum number of concurrent processes being exceeded. + * + * @param array $args Positional arguments. + * @param array $assoc_args Keyed arguments. + * @throws \WP_CLI\ExitException When an error occurs. + */ + public function run( $args, $assoc_args ) { + // Handle passed arguments. + $batch = absint( \WP_CLI\Utils\get_flag_value( $assoc_args, 'batch-size', 100 ) ); + $batches = absint( \WP_CLI\Utils\get_flag_value( $assoc_args, 'batches', 0 ) ); + $clean = absint( \WP_CLI\Utils\get_flag_value( $assoc_args, 'cleanup-batch-size', $batch ) ); + $hooks = explode( ',', WP_CLI\Utils\get_flag_value( $assoc_args, 'hooks', '' ) ); + $hooks = array_filter( array_map( 'trim', $hooks ) ); + $group = \WP_CLI\Utils\get_flag_value( $assoc_args, 'group', '' ); + $force = \WP_CLI\Utils\get_flag_value( $assoc_args, 'force', false ); + + $batches_completed = 0; + $actions_completed = 0; + $unlimited = $batches === 0; + + try { + // Custom queue cleaner instance. + $cleaner = new ActionScheduler_QueueCleaner( null, $clean ); + + // Get the queue runner instance + $runner = new ActionScheduler_WPCLI_QueueRunner( null, null, $cleaner ); + + // Determine how many tasks will be run in the first batch. + $total = $runner->setup( $batch, $hooks, $group, $force ); + + // Run actions for as long as possible. + while ( $total > 0 ) { + $this->print_total_actions( $total ); + $actions_completed += $runner->run(); + $batches_completed++; + + // Maybe set up tasks for the next batch. + $total = ( $unlimited || $batches_completed < $batches ) ? $runner->setup( $batch, $hooks, $group, $force ) : 0; + } + } catch ( Exception $e ) { + $this->print_error( $e ); + } + + $this->print_total_batches( $batches_completed ); + $this->print_success( $actions_completed ); + } + + /** + * Print WP CLI message about how many actions are about to be processed. + * + * @author Jeremy Pry + * + * @param int $total + */ + protected function print_total_actions( $total ) { + WP_CLI::log( + sprintf( + /* translators: %d refers to how many scheduled taks were found to run */ + _n( 'Found %d scheduled task', 'Found %d scheduled tasks', $total, 'action-scheduler' ), + number_format_i18n( $total ) + ) + ); + } + + /** + * Print WP CLI message about how many batches of actions were processed. + * + * @author Jeremy Pry + * + * @param int $batches_completed + */ + protected function print_total_batches( $batches_completed ) { + WP_CLI::log( + sprintf( + /* translators: %d refers to the total number of batches executed */ + _n( '%d batch executed.', '%d batches executed.', $batches_completed, 'action-scheduler' ), + number_format_i18n( $batches_completed ) + ) + ); + } + + /** + * Convert an exception into a WP CLI error. + * + * @author Jeremy Pry + * + * @param Exception $e The error object. + * + * @throws \WP_CLI\ExitException + */ + protected function print_error( Exception $e ) { + WP_CLI::error( + sprintf( + /* translators: %s refers to the exception error message. */ + __( 'There was an error running the action scheduler: %s', 'action-scheduler' ), + $e->getMessage() + ) + ); + } + + /** + * Print a success message with the number of completed actions. + * + * @author Jeremy Pry + * + * @param int $actions_completed + */ + protected function print_success( $actions_completed ) { + WP_CLI::success( + sprintf( + /* translators: %d refers to the total number of taskes completed */ + _n( '%d scheduled task completed.', '%d scheduled tasks completed.', $actions_completed, 'action-scheduler' ), + number_format_i18n( $actions_completed ) + ) + ); + } +} diff --git a/classes/ActionScheduler_wpCommentLogger.php b/classes/ActionScheduler_wpCommentLogger.php new file mode 100644 index 00000000000..78a9c29a615 --- /dev/null +++ b/classes/ActionScheduler_wpCommentLogger.php @@ -0,0 +1,278 @@ +create_wp_comment( $action_id, $message, $date ); + return $comment_id; + } + + protected function create_wp_comment( $action_id, $message, DateTime $date ) { + $comment_date_gmt = $date->format('Y-m-d H:i:s'); + $date->setTimezone( ActionScheduler_TimezoneHelper::get_local_timezone() ); + $comment_data = array( + 'comment_post_ID' => $action_id, + 'comment_date' => $date->format('Y-m-d H:i:s'), + 'comment_date_gmt' => $comment_date_gmt, + 'comment_author' => self::AGENT, + 'comment_content' => $message, + 'comment_agent' => self::AGENT, + 'comment_type' => self::TYPE, + ); + return wp_insert_comment($comment_data); + } + + /** + * @param string $entry_id + * + * @return ActionScheduler_LogEntry + */ + public function get_entry( $entry_id ) { + $comment = $this->get_comment( $entry_id ); + if ( empty($comment) || $comment->comment_type != self::TYPE ) { + return new ActionScheduler_NullLogEntry(); + } + + $date = as_get_datetime_object( $comment->comment_date_gmt ); + $date->setTimezone( ActionScheduler_TimezoneHelper::get_local_timezone() ); + return new ActionScheduler_LogEntry( $comment->comment_post_ID, $comment->comment_content, $date ); + } + + /** + * @param string $action_id + * + * @return ActionScheduler_LogEntry[] + */ + public function get_logs( $action_id ) { + $status = 'all'; + if ( get_post_status($action_id) == 'trash' ) { + $status = 'post-trashed'; + } + $comments = get_comments(array( + 'post_id' => $action_id, + 'orderby' => 'comment_date_gmt', + 'order' => 'ASC', + 'type' => self::TYPE, + 'status' => $status, + )); + $logs = array(); + foreach ( $comments as $c ) { + $entry = $this->get_entry( $c ); + if ( !empty($entry) ) { + $logs[] = $entry; + } + } + return $logs; + } + + protected function get_comment( $comment_id ) { + return get_comment( $comment_id ); + } + + + + /** + * @param WP_Comment_Query $query + */ + public function filter_comment_queries( $query ) { + foreach ( array('ID', 'parent', 'post_author', 'post_name', 'post_parent', 'type', 'post_type', 'post_id', 'post_ID') as $key ) { + if ( !empty($query->query_vars[$key]) ) { + return; // don't slow down queries that wouldn't include action_log comments anyway + } + } + $query->query_vars['action_log_filter'] = TRUE; + add_filter( 'comments_clauses', array( $this, 'filter_comment_query_clauses' ), 10, 2 ); + } + + /** + * @param array $clauses + * @param WP_Comment_Query $query + * + * @return array + */ + public function filter_comment_query_clauses( $clauses, $query ) { + if ( !empty($query->query_vars['action_log_filter']) ) { + $clauses['where'] .= $this->get_where_clause(); + } + return $clauses; + } + + /** + * Make sure Action Scheduler logs are excluded from comment feeds, which use WP_Query, not + * the WP_Comment_Query class handled by @see self::filter_comment_queries(). + * + * @param string $where + * @param WP_Query $query + * + * @return string + */ + public function filter_comment_feed( $where, $query ) { + if ( is_comment_feed() ) { + $where .= $this->get_where_clause(); + } + return $where; + } + + /** + * Return a SQL clause to exclude Action Scheduler comments. + * + * @return string + */ + protected function get_where_clause() { + global $wpdb; + return sprintf( " AND {$wpdb->comments}.comment_type != '%s'", self::TYPE ); + } + + /** + * Remove action log entries from wp_count_comments() + * + * @param array $stats + * @param int $post_id + * + * @return object + */ + public function filter_comment_count( $stats, $post_id ) { + global $wpdb; + + if ( 0 === $post_id ) { + $stats = $this->get_comment_count(); + } + + return $stats; + } + + /** + * Retrieve the comment counts from our cache, or the database if the cached version isn't set. + * + * @return object + */ + protected function get_comment_count() { + global $wpdb; + + $stats = get_transient( 'as_comment_count' ); + + if ( ! $stats ) { + $stats = array(); + + $count = $wpdb->get_results( "SELECT comment_approved, COUNT( * ) AS num_comments FROM {$wpdb->comments} WHERE comment_type NOT IN('order_note','action_log') GROUP BY comment_approved", ARRAY_A ); + + $total = 0; + $stats = array(); + $approved = array( '0' => 'moderated', '1' => 'approved', 'spam' => 'spam', 'trash' => 'trash', 'post-trashed' => 'post-trashed' ); + + foreach ( (array) $count as $row ) { + // Don't count post-trashed toward totals + if ( 'post-trashed' != $row['comment_approved'] && 'trash' != $row['comment_approved'] ) { + $total += $row['num_comments']; + } + if ( isset( $approved[ $row['comment_approved'] ] ) ) { + $stats[ $approved[ $row['comment_approved'] ] ] = $row['num_comments']; + } + } + + $stats['total_comments'] = $total; + $stats['all'] = $total; + + foreach ( $approved as $key ) { + if ( empty( $stats[ $key ] ) ) { + $stats[ $key ] = 0; + } + } + + $stats = (object) $stats; + set_transient( 'as_comment_count', $stats ); + } + + return $stats; + } + + /** + * Delete comment count cache whenever there is new comment or the status of a comment changes. Cache + * will be regenerated next time ActionScheduler_wpCommentLogger::filter_comment_count() is called. + */ + public function delete_comment_count_cache() { + delete_transient( 'as_comment_count' ); + } + + /** + * @codeCoverageIgnore + */ + public function init() { + add_action( 'action_scheduler_before_process_queue', array( $this, 'disable_comment_counting' ), 10, 0 ); + add_action( 'action_scheduler_after_process_queue', array( $this, 'enable_comment_counting' ), 10, 0 ); + add_action( 'action_scheduler_stored_action', array( $this, 'log_stored_action' ), 10, 1 ); + add_action( 'action_scheduler_canceled_action', array( $this, 'log_canceled_action' ), 10, 1 ); + add_action( 'action_scheduler_before_execute', array( $this, 'log_started_action' ), 10, 1 ); + add_action( 'action_scheduler_after_execute', array( $this, 'log_completed_action' ), 10, 1 ); + add_action( 'action_scheduler_failed_execution', array( $this, 'log_failed_action' ), 10, 2 ); + add_action( 'action_scheduler_failed_action', array( $this, 'log_timed_out_action' ), 10, 2 ); + add_action( 'action_scheduler_unexpected_shutdown', array( $this, 'log_unexpected_shutdown' ), 10, 2 ); + add_action( 'action_scheduler_reset_action', array( $this, 'log_reset_action' ), 10, 1 ); + add_action( 'pre_get_comments', array( $this, 'filter_comment_queries' ), 10, 1 ); + add_action( 'wp_count_comments', array( $this, 'filter_comment_count' ), 20, 2 ); // run after WC_Comments::wp_count_comments() to make sure we exclude order notes and action logs + add_action( 'comment_feed_where', array( $this, 'filter_comment_feed' ), 10, 2 ); + + // Delete comments count cache whenever there is a new comment or a comment status changes + add_action( 'wp_insert_comment', array( $this, 'delete_comment_count_cache' ) ); + add_action( 'wp_set_comment_status', array( $this, 'delete_comment_count_cache' ) ); + } + + public function disable_comment_counting() { + wp_defer_comment_counting(true); + } + public function enable_comment_counting() { + wp_defer_comment_counting(false); + } + + public function log_stored_action( $action_id ) { + $this->log( $action_id, __('action created', 'action-scheduler') ); + } + + public function log_canceled_action( $action_id ) { + $this->log( $action_id, __('action canceled', 'action-scheduler') ); + } + + public function log_started_action( $action_id ) { + $this->log( $action_id, __('action started', 'action-scheduler') ); + } + + public function log_completed_action( $action_id ) { + $this->log( $action_id, __('action complete', 'action-scheduler') ); + } + + public function log_failed_action( $action_id, Exception $exception ) { + $this->log( $action_id, sprintf(__('action failed: %s', 'action-scheduler'), $exception->getMessage() )); + } + + public function log_timed_out_action( $action_id, $timeout) { + $this->log( $action_id, sprintf( __('action timed out after %s seconds', 'action-scheduler'), $timeout ) ); + } + + public function log_unexpected_shutdown( $action_id, $error ) { + if ( !empty($error) ) { + $this->log( $action_id, sprintf(__('unexpected shutdown: PHP Fatal error %s in %s on line %s', 'action-scheduler'), $error['message'], $error['file'], $error['line'] ) ); + } + } + + public function log_reset_action( $action_id ) { + $this->log( $action_id, __('action reset', 'action_scheduler') ); + } + +} diff --git a/classes/ActionScheduler_wpPostStore.php b/classes/ActionScheduler_wpPostStore.php new file mode 100644 index 00000000000..030e65d8505 --- /dev/null +++ b/classes/ActionScheduler_wpPostStore.php @@ -0,0 +1,732 @@ +create_post_array( $action, $scheduled_date ); + $post_id = $this->save_post_array( $post_array ); + $this->save_post_schedule( $post_id, $action->get_schedule() ); + $this->save_action_group( $post_id, $action->get_group() ); + do_action( 'action_scheduler_stored_action', $post_id ); + return $post_id; + } catch ( Exception $e ) { + throw new RuntimeException( sprintf( __('Error saving action: %s', 'action-scheduler'), $e->getMessage() ), 0 ); + } + } + + protected function create_post_array( ActionScheduler_Action $action, DateTime $scheduled_date = NULL ) { + $post = array( + 'post_type' => self::POST_TYPE, + 'post_title' => $action->get_hook(), + 'post_content' => json_encode($action->get_args()), + 'post_status' => ( $action->is_finished() ? 'publish' : 'pending' ), + 'post_date_gmt' => $this->get_scheduled_date_string( $action, $scheduled_date ), + 'post_date' => $this->get_scheduled_date_string_local( $action, $scheduled_date ), + ); + return $post; + } + + protected function save_post_array( $post_array ) { + add_filter( 'wp_insert_post_data', array( $this, 'filter_insert_post_data' ), 10, 1 ); + $post_id = wp_insert_post($post_array); + remove_filter( 'wp_insert_post_data', array( $this, 'filter_insert_post_data' ), 10 ); + + if ( is_wp_error($post_id) || empty($post_id) ) { + throw new RuntimeException(__('Unable to save action.', 'action-scheduler')); + } + return $post_id; + } + + public function filter_insert_post_data( $postdata ) { + if ( $postdata['post_type'] == self::POST_TYPE ) { + $postdata['post_author'] = 0; + if ( $postdata['post_status'] == 'future' ) { + $postdata['post_status'] = 'publish'; + } + } + return $postdata; + } + + protected function save_post_schedule( $post_id, $schedule ) { + update_post_meta( $post_id, self::SCHEDULE_META_KEY, $schedule ); + } + + protected function save_action_group( $post_id, $group ) { + if ( empty($group) ) { + wp_set_object_terms( $post_id, array(), self::GROUP_TAXONOMY, FALSE ); + } else { + wp_set_object_terms( $post_id, array($group), self::GROUP_TAXONOMY, FALSE ); + } + } + + public function fetch_action( $action_id ) { + $post = $this->get_post( $action_id ); + if ( empty($post) || $post->post_type != self::POST_TYPE ) { + return $this->get_null_action(); + } + return $this->make_action_from_post($post); + } + + protected function get_post( $action_id ) { + if ( empty($action_id) ) { + return NULL; + } + return get_post($action_id); + } + + protected function get_null_action() { + return new ActionScheduler_NullAction(); + } + + protected function make_action_from_post( $post ) { + $hook = $post->post_title; + $args = json_decode( $post->post_content, true ); + $schedule = get_post_meta( $post->ID, self::SCHEDULE_META_KEY, true ); + if ( empty($schedule) ) { + $schedule = new ActionScheduler_NullSchedule(); + } + $group = wp_get_object_terms( $post->ID, self::GROUP_TAXONOMY, array('fields' => 'names') ); + $group = empty( $group ) ? '' : reset($group); + + return ActionScheduler::factory()->get_stored_action( $this->get_action_status_by_post_status( $post->post_status ), $hook, $args, $schedule, $group ); + } + + /** + * @param string $post_status + * + * @throws InvalidArgumentException if $post_status not in known status fields returned by $this->get_status_labels() + * @return string + */ + protected function get_action_status_by_post_status( $post_status ) { + + switch ( $post_status ) { + case 'publish' : + $action_status = self::STATUS_COMPLETE; + break; + case 'trash' : + $action_status = self::STATUS_CANCELED; + break; + default : + if ( ! array_key_exists( $post_status, $this->get_status_labels() ) ) { + throw new InvalidArgumentException( sprintf( 'Invalid post status: "%s". No matching action status available.', $post_status ) ); + } + $action_status = $post_status; + break; + } + + return $action_status; + } + + /** + * @param string $action_status + * @throws InvalidArgumentException if $post_status not in known status fields returned by $this->get_status_labels() + * @return string + */ + protected function get_post_status_by_action_status( $action_status ) { + + switch ( $action_status ) { + case self::STATUS_COMPLETE : + $post_status = 'publish'; + break; + case self::STATUS_CANCELED : + $post_status = 'trash'; + break; + default : + if ( ! array_key_exists( $action_status, $this->get_status_labels() ) ) { + throw new InvalidArgumentException( sprintf( 'Invalid action status: "%s".', $action_status ) ); + } + $post_status = $action_status; + break; + } + + return $post_status; + } + + /** + * @param string $hook + * @param array $params + * + * @return string ID of the next action matching the criteria or NULL if not found + */ + public function find_action( $hook, $params = array() ) { + $params = wp_parse_args( $params, array( + 'args' => NULL, + 'status' => ActionScheduler_Store::STATUS_PENDING, + 'group' => '', + )); + /** @var wpdb $wpdb */ + global $wpdb; + $query = "SELECT p.ID FROM {$wpdb->posts} p"; + $args = array(); + if ( !empty($params['group']) ) { + $query .= " INNER JOIN {$wpdb->term_relationships} tr ON tr.object_id=p.ID"; + $query .= " INNER JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id=tt.term_taxonomy_id"; + $query .= " INNER JOIN {$wpdb->terms} t ON tt.term_id=t.term_id AND t.slug=%s"; + $args[] = $params['group']; + } + $query .= " WHERE p.post_title=%s"; + $args[] = $hook; + $query .= " AND p.post_type=%s"; + $args[] = self::POST_TYPE; + if ( !is_null($params['args']) ) { + $query .= " AND p.post_content=%s"; + $args[] = json_encode($params['args']); + } + + if ( ! empty( $params['status'] ) ) { + $query .= " AND p.post_status=%s"; + $args[] = $this->get_post_status_by_action_status( $params['status'] ); + } + + switch ( $params['status'] ) { + case self::STATUS_COMPLETE: + case self::STATUS_RUNNING: + case self::STATUS_FAILED: + $order = 'DESC'; // Find the most recent action that matches + break; + case self::STATUS_PENDING: + default: + $order = 'ASC'; // Find the next action that matches + break; + } + $query .= " ORDER BY post_date_gmt $order LIMIT 1"; + + $query = $wpdb->prepare( $query, $args ); + + $id = $wpdb->get_var($query); + return $id; + } + + /** + * Returns the SQL statement to query (or count) actions. + * + * @param array $query Filtering options + * @param string $select_or_count Whether the SQL should select and return the IDs or just the row count + * @throws InvalidArgumentException if $select_or_count not count or select + * @return string SQL statement. The returned SQL is already properly escaped. + */ + protected function get_query_actions_sql( array $query, $select_or_count = 'select' ) { + + if ( ! in_array( $select_or_count, array( 'select', 'count' ) ) ) { + throw new InvalidArgumentException(__('Invalid schedule. Cannot save action.', 'action-scheduler')); + } + + $query = wp_parse_args( $query, array( + 'hook' => '', + 'args' => NULL, + 'date' => NULL, + 'date_compare' => '<=', + 'modified' => NULL, + 'modified_compare' => '<=', + 'group' => '', + 'status' => '', + 'claimed' => NULL, + 'per_page' => 5, + 'offset' => 0, + 'orderby' => 'date', + 'order' => 'ASC', + 'search' => '', + ) ); + + /** @var wpdb $wpdb */ + global $wpdb; + $sql = ( 'count' === $select_or_count ) ? 'SELECT count(p.ID)' : 'SELECT p.ID '; + $sql .= "FROM {$wpdb->posts} p"; + $sql_params = array(); + if ( ! empty( $query['group'] ) || 'group' === $query['orderby'] ) { + $sql .= " INNER JOIN {$wpdb->term_relationships} tr ON tr.object_id=p.ID"; + $sql .= " INNER JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id=tt.term_taxonomy_id"; + $sql .= " INNER JOIN {$wpdb->terms} t ON tt.term_id=t.term_id"; + + if ( ! empty( $query['group'] ) ) { + $sql .= " AND t.slug=%s"; + $sql_params[] = $query['group']; + } + } + $sql .= " WHERE post_type=%s"; + $sql_params[] = self::POST_TYPE; + if ( $query['hook'] ) { + $sql .= " AND p.post_title=%s"; + $sql_params[] = $query['hook']; + } + if ( !is_null($query['args']) ) { + $sql .= " AND p.post_content=%s"; + $sql_params[] = json_encode($query['args']); + } + + if ( ! empty( $query['status'] ) ) { + $sql .= " AND p.post_status=%s"; + $sql_params[] = $this->get_post_status_by_action_status( $query['status'] ); + } + + if ( $query['date'] instanceof DateTime ) { + $date = clone $query['date']; + $date->setTimezone( new DateTimeZone('UTC') ); + $date_string = $date->format('Y-m-d H:i:s'); + $comparator = $this->validate_sql_comparator($query['date_compare']); + $sql .= " AND p.post_date_gmt $comparator %s"; + $sql_params[] = $date_string; + } + + if ( $query['modified'] instanceof DateTime ) { + $modified = clone $query['modified']; + $modified->setTimezone( new DateTimeZone('UTC') ); + $date_string = $modified->format('Y-m-d H:i:s'); + $comparator = $this->validate_sql_comparator($query['modified_compare']); + $sql .= " AND p.post_modified_gmt $comparator %s"; + $sql_params[] = $date_string; + } + + if ( $query['claimed'] === TRUE ) { + $sql .= " AND p.post_password != ''"; + } elseif ( $query['claimed'] === FALSE ) { + $sql .= " AND p.post_password = ''"; + } elseif ( !is_null($query['claimed']) ) { + $sql .= " AND p.post_password = %s"; + $sql_params[] = $query['claimed']; + } + + if ( ! empty( $query['search'] ) ) { + $sql .= " AND (p.post_title LIKE %s OR p.post_content LIKE %s OR p.post_password LIKE %s)"; + for( $i = 0; $i < 3; $i++ ) { + $sql_params[] = sprintf( '%%%s%%', $query['search'] ); + } + } + + if ( 'select' === $select_or_count ) { + switch ( $query['orderby'] ) { + case 'hook': + $orderby = 'p.post_title'; + break; + case 'group': + $orderby = 't.name'; + break; + case 'status': + $orderby = 'p.post_status'; + break; + case 'modified': + $orderby = 'p.post_modified'; + break; + case 'claim_id': + $orderby = 'p.post_password'; + break; + case 'schedule': + case 'date': + default: + $orderby = 'p.post_date_gmt'; + break; + } + if ( 'ASC' === strtoupper( $query['order'] ) ) { + $order = 'ASC'; + } else { + $order = 'DESC'; + } + $sql .= " ORDER BY $orderby $order"; + if ( $query['per_page'] > 0 ) { + $sql .= " LIMIT %d, %d"; + $sql_params[] = $query['offset']; + $sql_params[] = $query['per_page']; + } + } + + return $wpdb->prepare( $sql, $sql_params ); + } + + /** + * @param array $query + * @param string $query_type Whether to select or count the results. Default, select. + * @return string|array The IDs of actions matching the query + */ + public function query_actions( $query = array(), $query_type = 'select' ) { + /** @var wpdb $wpdb */ + global $wpdb; + + $sql = $this->get_query_actions_sql( $query, $query_type ); + + return ( 'count' === $query_type ) ? $wpdb->get_var( $sql ) : $wpdb->get_col( $sql ); + } + + /** + * Get a count of all actions in the store, grouped by status + * + * @return array + */ + public function action_counts() { + + $action_counts_by_status = array(); + $action_stati_and_labels = $this->get_status_labels(); + $posts_count_by_status = (array) wp_count_posts( self::POST_TYPE, 'readable' ); + + foreach ( $posts_count_by_status as $post_status_name => $count ) { + + try { + $action_status_name = $this->get_action_status_by_post_status( $post_status_name ); + } catch ( Exception $e ) { + // Ignore any post statuses that aren't for actions + continue; + } + if ( array_key_exists( $action_status_name, $action_stati_and_labels ) ) { + $action_counts_by_status[ $action_status_name ] = $count; + } + } + + return $action_counts_by_status; + } + + /** + * @param string $action_id + * + * @throws InvalidArgumentException + */ + public function cancel_action( $action_id ) { + $post = get_post($action_id); + if ( empty($post) || ($post->post_type != self::POST_TYPE) ) { + throw new InvalidArgumentException(sprintf(__('Unidentified action %s', 'action-scheduler'), $action_id)); + } + do_action( 'action_scheduler_canceled_action', $action_id ); + wp_trash_post($action_id); + } + + public function delete_action( $action_id ) { + $post = get_post($action_id); + if ( empty($post) || ($post->post_type != self::POST_TYPE) ) { + throw new InvalidArgumentException(sprintf(__('Unidentified action %s', 'action-scheduler'), $action_id)); + } + do_action( 'action_scheduler_deleted_action', $action_id ); + wp_delete_post($action_id, TRUE); + } + + /** + * @param string $action_id + * + * @throws InvalidArgumentException + * @return DateTime The date the action is schedule to run, or the date that it ran. + */ + public function get_date( $action_id ) { + $date = $this->get_date_gmt( $action_id ); + return $date->setTimezone( $this->get_local_timezone() ); + } + + /** + * @param string $action_id + * + * @throws InvalidArgumentException + * @return DateTime The date the action is schedule to run, or the date that it ran. + */ + public function get_date_gmt( $action_id ) { + $post = get_post($action_id); + if ( empty($post) || ($post->post_type != self::POST_TYPE) ) { + throw new InvalidArgumentException(sprintf(__('Unidentified action %s', 'action-scheduler'), $action_id)); + } + if ( $post->post_status == 'publish' ) { + return as_get_datetime_object($post->post_modified_gmt); + } else { + return as_get_datetime_object($post->post_date_gmt); + } + } + + /** + * @param int $max_actions + * @param DateTime $before_date Jobs must be schedule before this date. Defaults to now. + * @param array $hooks Claim only actions with a hook or hooks. + * @param string $group Claim only actions in the given group. + * + * @return ActionScheduler_ActionClaim + * @throws RuntimeException When there is an error staking a claim. + * @throws InvalidArgumentException When the given group is not valid. + */ + public function stake_claim( $max_actions = 10, DateTime $before_date = null, $hooks = array(), $group = '' ) { + $claim_id = $this->generate_claim_id(); + $this->claim_actions( $claim_id, $max_actions, $before_date, $hooks, $group ); + $action_ids = $this->find_actions_by_claim_id( $claim_id ); + + return new ActionScheduler_ActionClaim( $claim_id, $action_ids ); + } + + /** + * @return int + */ + public function get_claim_count(){ + global $wpdb; + + $sql = "SELECT COUNT(DISTINCT post_password) FROM {$wpdb->posts} WHERE post_password != '' AND post_type = %s AND post_status IN ('in-progress','pending')"; + $sql = $wpdb->prepare( $sql, array( self::POST_TYPE ) ); + + return $wpdb->get_var( $sql ); + } + + protected function generate_claim_id() { + $claim_id = md5(microtime(true) . rand(0,1000)); + return substr($claim_id, 0, 20); // to fit in db field with 20 char limit + } + + /** + * @param string $claim_id + * @param int $limit + * @param DateTime $before_date Should use UTC timezone. + * @param array $hooks Claim only actions with a hook or hooks. + * @param string $group Claim only actions in the given group. + * + * @return int The number of actions that were claimed + * @throws RuntimeException When there is a database error. + * @throws InvalidArgumentException When the group is invalid. + */ + protected function claim_actions( $claim_id, $limit, DateTime $before_date = null, $hooks = array(), $group = '' ) { + // Set up initial variables. + $date = null === $before_date ? as_get_datetime_object() : clone $before_date; + $limit_ids = ! empty( $group ); + $ids = $limit_ids ? $this->get_actions_by_group( $group, $limit, $date ) : array(); + + // If limiting by IDs and no posts found, then return early since we have nothing to update. + if ( $limit_ids && 0 === count( $ids ) ) { + return 0; + } + + /** @var wpdb $wpdb */ + global $wpdb; + + /* + * Build up custom query to update the affected posts. Parameters are built as a separate array + * to make it easier to identify where they are in the query. + * + * We can't use $wpdb->update() here because of the "ID IN ..." clause. + */ + $update = "UPDATE {$wpdb->posts} SET post_password = %s, post_modified_gmt = %s, post_modified = %s"; + $params = array( + $claim_id, + current_time( 'mysql', true ), + current_time( 'mysql' ), + ); + + // Build initial WHERE clause. + $where = "WHERE post_type = %s AND post_status = %s AND post_password = ''"; + $params[] = self::POST_TYPE; + $params[] = ActionScheduler_Store::STATUS_PENDING; + + if ( ! empty( $hooks ) ) { + $placeholders = array_fill( 0, count( $hooks ), '%s' ); + $where .= ' AND post_title IN (' . join( ', ', $placeholders ) . ')'; + $params = array_merge( $params, array_values( $hooks ) ); + } + + /* + * Add the IDs to the WHERE clause. IDs not escaped because they came directly from a prior DB query. + * + * If we're not limiting by IDs, then include the post_date_gmt clause. + */ + if ( $limit_ids ) { + $where .= ' AND ID IN (' . join( ',', $ids ) . ')'; + } else { + $where .= ' AND post_date_gmt <= %s'; + $params[] = $date->format( 'Y-m-d H:i:s' ); + } + + // Add the ORDER BY clause and,ms limit. + $order = 'ORDER BY menu_order ASC, post_date_gmt ASC, ID ASC LIMIT %d'; + $params[] = $limit; + + // Run the query and gather results. + $rows_affected = $wpdb->query( $wpdb->prepare( "{$update} {$where} {$order}", $params ) ); + if ( $rows_affected === false ) { + throw new RuntimeException( __( 'Unable to claim actions. Database error.', 'action-scheduler' ) ); + } + + return (int) $rows_affected; + } + + /** + * Get IDs of actions within a certain group and up to a certain date/time. + * + * @param string $group The group to use in finding actions. + * @param int $limit The number of actions to retrieve. + * @param DateTime $date DateTime object representing cutoff time for actions. Actions retrieved will be + * up to and including this DateTime. + * + * @return array IDs of actions in the appropriate group and before the appropriate time. + * @throws InvalidArgumentException When the group does not exist. + */ + protected function get_actions_by_group( $group, $limit, DateTime $date ) { + // Ensure the group exists before continuing. + if ( ! term_exists( $group, self::GROUP_TAXONOMY )) { + throw new InvalidArgumentException( sprintf( __( 'The group "%s" does not exist.', 'action-scheduler' ), $group ) ); + } + + // Set up a query for post IDs to use later. + $query = new WP_Query(); + $query_args = array( + 'fields' => 'ids', + 'post_type' => self::POST_TYPE, + 'post_status' => ActionScheduler_Store::STATUS_PENDING, + 'has_password' => false, + 'posts_per_page' => $limit * 3, + 'suppress_filters' => true, + 'no_found_rows' => true, + 'orderby' => array( + 'menu_order' => 'ASC', + 'date' => 'ASC', + 'ID' => 'ASC', + ), + 'date_query' => array( + 'column' => 'post_date', + array( + 'compare' => '<=', + 'year' => $date->format( 'Y' ), + 'month' => $date->format( 'n' ), + 'day' => $date->format( 'j' ), + 'hour' => $date->format( 'G' ), + 'minute' => $date->format( 'i' ), + 'second' => $date->format( 's' ), + ), + ), + 'tax_query' => array( + array( + 'taxonomy' => self::GROUP_TAXONOMY, + 'field' => 'slug', + 'terms' => $group, + 'include_children' => false, + ), + ), + ); + + return $query->query( $query_args ); + } + + /** + * @param string $claim_id + * @return array + */ + public function find_actions_by_claim_id( $claim_id ) { + /** @var wpdb $wpdb */ + global $wpdb; + $sql = "SELECT ID FROM {$wpdb->posts} WHERE post_type = %s AND post_password = %s"; + $sql = $wpdb->prepare( $sql, array( self::POST_TYPE, $claim_id ) ); + $action_ids = $wpdb->get_col( $sql ); + return $action_ids; + } + + public function release_claim( ActionScheduler_ActionClaim $claim ) { + $action_ids = $this->find_actions_by_claim_id( $claim->get_id() ); + if ( empty($action_ids) ) { + return; // nothing to do + } + $action_id_string = implode(',', array_map('intval', $action_ids)); + /** @var wpdb $wpdb */ + global $wpdb; + $sql = "UPDATE {$wpdb->posts} SET post_password = '' WHERE ID IN ($action_id_string) AND post_password = %s"; + $sql = $wpdb->prepare( $sql, array( $claim->get_id() ) ); + $result = $wpdb->query($sql); + if ( $result === false ) { + throw new RuntimeException( sprintf( __('Unable to unlock claim %s. Database error.', 'action-scheduler'), $claim->get_id() ) ); + } + } + + /** + * @param string $action_id + */ + public function unclaim_action( $action_id ) { + /** @var wpdb $wpdb */ + global $wpdb; + $sql = "UPDATE {$wpdb->posts} SET post_password = '' WHERE ID = %d AND post_type = %s"; + $sql = $wpdb->prepare( $sql, $action_id, self::POST_TYPE ); + $result = $wpdb->query($sql); + if ( $result === false ) { + throw new RuntimeException( sprintf( __('Unable to unlock claim on action %s. Database error.', 'action-scheduler'), $action_id ) ); + } + } + + public function mark_failure( $action_id ) { + /** @var wpdb $wpdb */ + global $wpdb; + $sql = "UPDATE {$wpdb->posts} SET post_status = %s WHERE ID = %d AND post_type = %s"; + $sql = $wpdb->prepare( $sql, self::STATUS_FAILED, $action_id, self::POST_TYPE ); + $result = $wpdb->query($sql); + if ( $result === false ) { + throw new RuntimeException( sprintf( __('Unable to mark failure on action %s. Database error.', 'action-scheduler'), $action_id ) ); + } + } + + /** + * Return an action's claim ID, as stored in the post password column + * + * @param string $action_id + * @return mixed + */ + public function get_claim_id( $action_id ) { + return $this->get_post_column( $action_id, 'post_password' ); + } + + /** + * Return an action's status, as stored in the post status column + * + * @param string $action_id + * @return mixed + */ + public function get_status( $action_id ) { + $status = $this->get_post_column( $action_id, 'post_status' ); + + if ( $status === null ) { + throw new \InvalidArgumentException( __( 'Invalid action ID. No status found.', 'action-scheduler' ) ); + } + + return $this->get_action_status_by_post_status( $status ); + } + + private function get_post_column( $action_id, $column_name ) { + /** @var \wpdb $wpdb */ + global $wpdb; + return $wpdb->get_var( $wpdb->prepare( "SELECT {$column_name} FROM {$wpdb->posts} WHERE ID=%d AND post_type=%s", $action_id, self::POST_TYPE ) ); + } + + /** + * @param string $action_id + */ + public function log_execution( $action_id ) { + /** @var wpdb $wpdb */ + global $wpdb; + + $sql = "UPDATE {$wpdb->posts} SET menu_order = menu_order+1, post_status=%s, post_modified_gmt = %s, post_modified = %s WHERE ID = %d AND post_type = %s"; + $sql = $wpdb->prepare( $sql, self::STATUS_RUNNING, current_time('mysql', true), current_time('mysql'), $action_id, self::POST_TYPE ); + $wpdb->query($sql); + } + + + public function mark_complete( $action_id ) { + $post = get_post($action_id); + if ( empty($post) || ($post->post_type != self::POST_TYPE) ) { + throw new InvalidArgumentException(sprintf(__('Unidentified action %s', 'action-scheduler'), $action_id)); + } + add_filter( 'wp_insert_post_data', array( $this, 'filter_insert_post_data' ), 10, 1 ); + $result = wp_update_post(array( + 'ID' => $action_id, + 'post_status' => 'publish', + ), TRUE); + remove_filter( 'wp_insert_post_data', array( $this, 'filter_insert_post_data' ), 10 ); + if ( is_wp_error($result) ) { + throw new RuntimeException($result->get_error_message()); + } + } + + /** + * @codeCoverageIgnore + */ + public function init() { + $post_type_registrar = new ActionScheduler_wpPostStore_PostTypeRegistrar(); + $post_type_registrar->register(); + + $post_status_registrar = new ActionScheduler_wpPostStore_PostStatusRegistrar(); + $post_status_registrar->register(); + + $taxonomy_registrar = new ActionScheduler_wpPostStore_TaxonomyRegistrar(); + $taxonomy_registrar->register(); + } +} diff --git a/classes/ActionScheduler_wpPostStore_PostStatusRegistrar.php b/classes/ActionScheduler_wpPostStore_PostStatusRegistrar.php new file mode 100644 index 00000000000..a85b154f3a3 --- /dev/null +++ b/classes/ActionScheduler_wpPostStore_PostStatusRegistrar.php @@ -0,0 +1,57 @@ +post_status_args(), $this->post_status_running_labels() ) ); + register_post_status( ActionScheduler_Store::STATUS_FAILED, array_merge( $this->post_status_args(), $this->post_status_failed_labels() ) ); + } + + /** + * Build the args array for the post type definition + * + * @return array + */ + protected function post_status_args() { + $args = array( + 'public' => false, + 'exclude_from_search' => false, + 'show_in_admin_all_list' => true, + 'show_in_admin_status_list' => true, + ); + + return apply_filters( 'action_scheduler_post_status_args', $args ); + } + + /** + * Build the args array for the post type definition + * + * @return array + */ + protected function post_status_failed_labels() { + $labels = array( + 'label' => _x( 'Failed', 'post' ), + 'label_count' => _n_noop( 'Failed (%s)', 'Failed (%s)' ), + ); + + return apply_filters( 'action_scheduler_post_status_failed_labels', $labels ); + } + + /** + * Build the args array for the post type definition + * + * @return array + */ + protected function post_status_running_labels() { + $labels = array( + 'label' => _x( 'In-Progress', 'post' ), + 'label_count' => _n_noop( 'In-Progress (%s)', 'In-Progress (%s)' ), + ); + + return apply_filters( 'action_scheduler_post_status_running_labels', $labels ); + } +} + \ No newline at end of file diff --git a/classes/ActionScheduler_wpPostStore_PostTypeRegistrar.php b/classes/ActionScheduler_wpPostStore_PostTypeRegistrar.php new file mode 100644 index 00000000000..8c63bd0f7ab --- /dev/null +++ b/classes/ActionScheduler_wpPostStore_PostTypeRegistrar.php @@ -0,0 +1,50 @@ +post_type_args() ); + } + + /** + * Build the args array for the post type definition + * + * @return array + */ + protected function post_type_args() { + $args = array( + 'label' => __( 'Scheduled Actions', 'action-scheduler' ), + 'description' => __( 'Scheduled actions are hooks triggered on a cetain date and time.', 'action-scheduler' ), + 'public' => false, + 'map_meta_cap' => true, + 'hierarchical' => false, + 'supports' => array('title', 'editor','comments'), + 'rewrite' => false, + 'query_var' => false, + 'can_export' => true, + 'ep_mask' => EP_NONE, + 'labels' => array( + 'name' => __( 'Scheduled Actions', 'action-scheduler' ), + 'singular_name' => __( 'Scheduled Action', 'action-scheduler' ), + 'menu_name' => _x( 'Scheduled Actions', 'Admin menu name', 'action-scheduler' ), + 'add_new' => __( 'Add', 'action-scheduler' ), + 'add_new_item' => __( 'Add New Scheduled Action', 'action-scheduler' ), + 'edit' => __( 'Edit', 'action-scheduler' ), + 'edit_item' => __( 'Edit Scheduled Action', 'action-scheduler' ), + 'new_item' => __( 'New Scheduled Action', 'action-scheduler' ), + 'view' => __( 'View Action', 'action-scheduler' ), + 'view_item' => __( 'View Action', 'action-scheduler' ), + 'search_items' => __( 'Search Scheduled Actions', 'action-scheduler' ), + 'not_found' => __( 'No actions found', 'action-scheduler' ), + 'not_found_in_trash' => __( 'No actions found in trash', 'action-scheduler' ), + ), + ); + + $args = apply_filters('action_scheduler_post_type_args', $args); + return $args; + } +} + \ No newline at end of file diff --git a/classes/ActionScheduler_wpPostStore_TaxonomyRegistrar.php b/classes/ActionScheduler_wpPostStore_TaxonomyRegistrar.php new file mode 100644 index 00000000000..026d6257e81 --- /dev/null +++ b/classes/ActionScheduler_wpPostStore_TaxonomyRegistrar.php @@ -0,0 +1,26 @@ +taxonomy_args() ); + } + + protected function taxonomy_args() { + $args = array( + 'label' => __('Action Group', 'action-scheduler'), + 'public' => false, + 'hierarchical' => false, + 'show_admin_column' => true, + 'query_var' => false, + 'rewrite' => false, + ); + + $args = apply_filters('action_scheduler_taxonomy_args', $args); + return $args; + } +} + \ No newline at end of file diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 00000000000..fe69f966954 --- /dev/null +++ b/codecov.yml @@ -0,0 +1,13 @@ +codecov: + branch: master + +coverage: + ignore: + - tests/.* + - lib/.* + status: + project: false + patch: false + changes: false + +comment: false diff --git a/composer.json b/composer.json new file mode 100644 index 00000000000..fa07bc6a73d --- /dev/null +++ b/composer.json @@ -0,0 +1,12 @@ +{ + "name": "prospress/action-scheduler", + "version": "2.0.0", + "description": "Action Scheduler for WordPress and WooCommerce", + "type": "wordpress-plugin", + "license": "GPL-3.0", + "minimum-stability": "dev", + "require": {}, + "require-dev": { + "wp-cli/wp-cli": "^1.3" + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 00000000000..de44d8153ec --- /dev/null +++ b/composer.lock @@ -0,0 +1,2909 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "This file is @generated automatically" + ], + "content-hash": "f4556531e7b95173d1b769b3d7350926", + "packages": [], + "packages-dev": [ + { + "name": "composer/ca-bundle", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/composer/ca-bundle.git", + "reference": "b17e6153cb7f33c7e44eb59578dc12eee5dc8e12" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/b17e6153cb7f33c7e44eb59578dc12eee5dc8e12", + "reference": "b17e6153cb7f33c7e44eb59578dc12eee5dc8e12", + "shasum": "" + }, + "require": { + "ext-openssl": "*", + "ext-pcre": "*", + "php": "^5.3.2 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.5", + "psr/log": "^1.0", + "symfony/process": "^2.5 || ^3.0" + }, + "suggest": { + "symfony/process": "This is necessary to reliably check whether openssl_x509_parse is vulnerable on older php versions, but can be ignored on PHP 5.5.6+" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\CaBundle\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", + "keywords": [ + "cabundle", + "cacert", + "certificate", + "ssl", + "tls" + ], + "time": "2017-03-06T11:59:08+00:00" + }, + { + "name": "composer/composer", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/composer/composer.git", + "reference": "82c27a68bc5cb76f3d00b82c27496e3cdbb6d4ff" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/composer/zipball/82c27a68bc5cb76f3d00b82c27496e3cdbb6d4ff", + "reference": "82c27a68bc5cb76f3d00b82c27496e3cdbb6d4ff", + "shasum": "" + }, + "require": { + "composer/ca-bundle": "^1.0", + "composer/semver": "^1.0", + "composer/spdx-licenses": "^1.0", + "justinrainbow/json-schema": "^3.0 || ^4.0 || ^5.0", + "php": "^5.3.2 || ^7.0", + "psr/log": "^1.0", + "seld/cli-prompt": "^1.0", + "seld/jsonlint": "^1.4", + "seld/phar-utils": "^1.0", + "symfony/console": "^2.7 || ^3.0", + "symfony/filesystem": "^2.7 || ^3.0", + "symfony/finder": "^2.7 || ^3.0", + "symfony/process": "^2.7 || ^3.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.5 || ^5.0.5", + "phpunit/phpunit-mock-objects": "^2.3 || ^3.0" + }, + "suggest": { + "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", + "ext-zip": "Enabling the zip extension allows you to unzip archives", + "ext-zlib": "Allow gzip compression of HTTP requests" + }, + "bin": [ + "bin/composer" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.6-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\": "src/Composer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "Composer helps you declare, manage and install dependencies of PHP projects, ensuring you have the right stack everywhere.", + "homepage": "https://getcomposer.org/", + "keywords": [ + "autoload", + "dependency", + "package" + ], + "time": "2017-08-09T14:23:46+00:00" + }, + { + "name": "composer/semver", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/composer/semver.git", + "reference": "7ea669582e6396857cf6d1c0a6cd2728f4e7e383" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/semver/zipball/7ea669582e6396857cf6d1c0a6cd2728f4e7e383", + "reference": "7ea669582e6396857cf6d1c0a6cd2728f4e7e383", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.5 || ^5.0.5", + "phpunit/phpunit-mock-objects": "2.3.0 || ^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Semver\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "Semver library that offers utilities, version constraint parsing and validation.", + "keywords": [ + "semantic", + "semver", + "validation", + "versioning" + ], + "time": "2017-05-15T12:49:06+00:00" + }, + { + "name": "composer/spdx-licenses", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/composer/spdx-licenses.git", + "reference": "2603a0d7ddc00a015deb576fa5297ca43dee6b1c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/2603a0d7ddc00a015deb576fa5297ca43dee6b1c", + "reference": "2603a0d7ddc00a015deb576fa5297ca43dee6b1c", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.5 || ^5.0.5", + "phpunit/phpunit-mock-objects": "2.3.0 || ^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Spdx\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nils Adermann", + "email": "naderman@naderman.de", + "homepage": "http://www.naderman.de" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + }, + { + "name": "Rob Bast", + "email": "rob.bast@gmail.com", + "homepage": "http://robbast.nl" + } + ], + "description": "SPDX licenses list and validation library.", + "keywords": [ + "license", + "spdx", + "validator" + ], + "time": "2017-04-03T19:08:52+00:00" + }, + { + "name": "justinrainbow/json-schema", + "version": "5.x-dev", + "source": { + "type": "git", + "url": "https://github.com/justinrainbow/json-schema.git", + "reference": "36ed4d935f8f5eb958dbd29e1fa5a241ec3ece4d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/36ed4d935f8f5eb958dbd29e1fa5a241ec3ece4d", + "reference": "36ed4d935f8f5eb958dbd29e1fa5a241ec3ece4d", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.1", + "json-schema/json-schema-test-suite": "1.2.0", + "phpunit/phpunit": "^4.8.22" + }, + "bin": [ + "bin/validate-json" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "JsonSchema\\": "src/JsonSchema/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bruno Prieto Reis", + "email": "bruno.p.reis@gmail.com" + }, + { + "name": "Justin Rainbow", + "email": "justin.rainbow@gmail.com" + }, + { + "name": "Igor Wiedler", + "email": "igor@wiedler.ch" + }, + { + "name": "Robert Schönthal", + "email": "seroscho@googlemail.com" + } + ], + "description": "A library to validate a json schema.", + "homepage": "https://github.com/justinrainbow/json-schema", + "keywords": [ + "json", + "schema" + ], + "time": "2017-06-23T11:43:36+00:00" + }, + { + "name": "mustache/mustache", + "version": "v2.12.0", + "source": { + "type": "git", + "url": "https://github.com/bobthecow/mustache.php.git", + "reference": "fe8fe72e9d580591854de404cc59a1b83ca4d19e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/bobthecow/mustache.php/zipball/fe8fe72e9d580591854de404cc59a1b83ca4d19e", + "reference": "fe8fe72e9d580591854de404cc59a1b83ca4d19e", + "shasum": "" + }, + "require": { + "php": ">=5.2.4" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "~1.11", + "phpunit/phpunit": "~3.7|~4.0|~5.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "Mustache": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Justin Hileman", + "email": "justin@justinhileman.info", + "homepage": "http://justinhileman.com" + } + ], + "description": "A Mustache implementation in PHP.", + "homepage": "https://github.com/bobthecow/mustache.php", + "keywords": [ + "mustache", + "templating" + ], + "time": "2017-07-11T12:54:05+00:00" + }, + { + "name": "nb/oxymel", + "version": "v0.1.0", + "source": { + "type": "git", + "url": "https://github.com/nb/oxymel.git", + "reference": "cbe626ef55d5c4cc9b5e6e3904b395861ea76e3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nb/oxymel/zipball/cbe626ef55d5c4cc9b5e6e3904b395861ea76e3c", + "reference": "cbe626ef55d5c4cc9b5e6e3904b395861ea76e3c", + "shasum": "" + }, + "require": { + "php": ">=5.2.4" + }, + "type": "library", + "autoload": { + "psr-0": { + "Oxymel": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nikolay Bachiyski", + "email": "nb@nikolay.bg", + "homepage": "http://extrapolate.me/" + } + ], + "description": "A sweet XML builder", + "homepage": "https://github.com/nb/oxymel", + "keywords": [ + "xml" + ], + "time": "2013-02-24T15:01:54+00:00" + }, + { + "name": "psr/container", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "2cc4a01788191489dc7459446ba832fa79a216a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/2cc4a01788191489dc7459446ba832fa79a216a7", + "reference": "2cc4a01788191489dc7459446ba832fa79a216a7", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2017-06-28T15:35:32+00:00" + }, + { + "name": "psr/log", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "time": "2016-10-10T12:19:37+00:00" + }, + { + "name": "ramsey/array_column", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/ramsey/array_column.git", + "reference": "f8e52eb28e67eb50e613b451dd916abcf783c1db" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/array_column/zipball/f8e52eb28e67eb50e613b451dd916abcf783c1db", + "reference": "f8e52eb28e67eb50e613b451dd916abcf783c1db", + "shasum": "" + }, + "require-dev": { + "jakub-onderka/php-parallel-lint": "0.8.*", + "phpunit/phpunit": "~4.5", + "satooshi/php-coveralls": "0.6.*", + "squizlabs/php_codesniffer": "~2.2" + }, + "type": "library", + "autoload": { + "files": [ + "src/array_column.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "homepage": "http://benramsey.com" + } + ], + "description": "Provides functionality for array_column() to projects using PHP earlier than version 5.5.", + "homepage": "https://github.com/ramsey/array_column", + "keywords": [ + "array", + "array_column", + "column" + ], + "time": "2015-03-20T22:07:39+00:00" + }, + { + "name": "rmccue/requests", + "version": "v1.7.0", + "source": { + "type": "git", + "url": "https://github.com/rmccue/Requests.git", + "reference": "87932f52ffad70504d93f04f15690cf16a089546" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/rmccue/Requests/zipball/87932f52ffad70504d93f04f15690cf16a089546", + "reference": "87932f52ffad70504d93f04f15690cf16a089546", + "shasum": "" + }, + "require": { + "php": ">=5.2" + }, + "require-dev": { + "requests/test-server": "dev-master" + }, + "type": "library", + "autoload": { + "psr-0": { + "Requests": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "ISC" + ], + "authors": [ + { + "name": "Ryan McCue", + "homepage": "http://ryanmccue.info" + } + ], + "description": "A HTTP library written in PHP, for human beings.", + "homepage": "http://github.com/rmccue/Requests", + "keywords": [ + "curl", + "fsockopen", + "http", + "idna", + "ipv6", + "iri", + "sockets" + ], + "time": "2016-10-13T00:11:37+00:00" + }, + { + "name": "seld/cli-prompt", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/cli-prompt.git", + "reference": "a19a7376a4689d4d94cab66ab4f3c816019ba8dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/cli-prompt/zipball/a19a7376a4689d4d94cab66ab4f3c816019ba8dd", + "reference": "a19a7376a4689d4d94cab66ab4f3c816019ba8dd", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Seld\\CliPrompt\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" + } + ], + "description": "Allows you to prompt for user input on the command line, and optionally hide the characters they type", + "keywords": [ + "cli", + "console", + "hidden", + "input", + "prompt" + ], + "time": "2017-03-18T11:32:45+00:00" + }, + { + "name": "seld/jsonlint", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/jsonlint.git", + "reference": "50d63f2858d87c4738d5b76a7dcbb99fa8cf7c77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/50d63f2858d87c4738d5b76a7dcbb99fa8cf7c77", + "reference": "50d63f2858d87c4738d5b76a7dcbb99fa8cf7c77", + "shasum": "" + }, + "require": { + "php": "^5.3 || ^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.5" + }, + "bin": [ + "bin/jsonlint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Seld\\JsonLint\\": "src/Seld/JsonLint/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "JSON Linter", + "keywords": [ + "json", + "linter", + "parser", + "validator" + ], + "time": "2017-06-18T15:11:04+00:00" + }, + { + "name": "seld/phar-utils", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/phar-utils.git", + "reference": "7009b5139491975ef6486545a39f3e6dad5ac30a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/7009b5139491975ef6486545a39f3e6dad5ac30a", + "reference": "7009b5139491975ef6486545a39f3e6dad5ac30a", + "shasum": "" + }, + "require": { + "php": ">=5.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Seld\\PharUtils\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" + } + ], + "description": "PHAR file format utilities, for when PHP phars you up", + "keywords": [ + "phra" + ], + "time": "2015-10-13T18:44:15+00:00" + }, + { + "name": "symfony/config", + "version": "3.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "d668d8c0502d2b485c00d107db65fdbc56c26282" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/d668d8c0502d2b485c00d107db65fdbc56c26282", + "reference": "d668d8c0502d2b485c00d107db65fdbc56c26282", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/filesystem": "~2.8|~3.0|~4.0" + }, + "conflict": { + "symfony/dependency-injection": "<3.3", + "symfony/finder": "<3.3" + }, + "require-dev": { + "symfony/dependency-injection": "~3.3|~4.0", + "symfony/finder": "~3.3|~4.0", + "symfony/yaml": "~3.0|~4.0" + }, + "suggest": { + "symfony/yaml": "To use the yaml reference dumper" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Config Component", + "homepage": "https://symfony.com", + "time": "2017-08-05T17:34:46+00:00" + }, + { + "name": "symfony/console", + "version": "3.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "0e283478c2d68c9bf9cc52592ad1ef1834083a85" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/0e283478c2d68c9bf9cc52592ad1ef1834083a85", + "reference": "0e283478c2d68c9bf9cc52592ad1ef1834083a85", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/debug": "~2.8|~3.0|~4.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/dependency-injection": "<3.3", + "symfony/process": "<3.3" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~3.3|~4.0", + "symfony/dependency-injection": "~3.3|~4.0", + "symfony/event-dispatcher": "~2.8|~3.0|~4.0", + "symfony/http-kernel": "~2.8|~3.0|~4.0", + "symfony/lock": "~3.4|~4.0", + "symfony/process": "~3.3|~4.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "time": "2017-08-10T07:07:17+00:00" + }, + { + "name": "symfony/debug", + "version": "3.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug.git", + "reference": "50bda5b4b8641616d45254c6855bcd45f2f64187" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug/zipball/50bda5b4b8641616d45254c6855bcd45f2f64187", + "reference": "50bda5b4b8641616d45254c6855bcd45f2f64187", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "psr/log": "~1.0" + }, + "conflict": { + "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" + }, + "require-dev": { + "symfony/http-kernel": "~2.8|~3.0|~4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Debug\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Debug Component", + "homepage": "https://symfony.com", + "time": "2017-08-10T07:07:17+00:00" + }, + { + "name": "symfony/dependency-injection", + "version": "3.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "aaee88765cb21a838e8da26d6acda4ca2ae3a2ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/aaee88765cb21a838e8da26d6acda4ca2ae3a2ea", + "reference": "aaee88765cb21a838e8da26d6acda4ca2ae3a2ea", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "psr/container": "^1.0" + }, + "conflict": { + "symfony/config": "<3.3.1", + "symfony/finder": "<3.3", + "symfony/proxy-manager-bridge": "<3.4", + "symfony/yaml": "<3.4" + }, + "provide": { + "psr/container-implementation": "1.0" + }, + "require-dev": { + "symfony/config": "~3.3|~4.0", + "symfony/expression-language": "~2.8|~3.0|~4.0", + "symfony/yaml": "~3.4|~4.0" + }, + "suggest": { + "symfony/config": "", + "symfony/expression-language": "For using expressions in service container configuration", + "symfony/finder": "For using double-star glob patterns or when GLOB_BRACE portability is required", + "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony DependencyInjection Component", + "homepage": "https://symfony.com", + "time": "2017-08-10T19:43:00+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "3.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "cd8b015f859e6b60933324db00067c2f060b4d18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/cd8b015f859e6b60933324db00067c2f060b4d18", + "reference": "cd8b015f859e6b60933324db00067c2f060b4d18", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "conflict": { + "symfony/dependency-injection": "<3.3" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~2.8|~3.0|~4.0", + "symfony/dependency-injection": "~3.3|~4.0", + "symfony/expression-language": "~2.8|~3.0|~4.0", + "symfony/stopwatch": "~2.8|~3.0|~4.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony EventDispatcher Component", + "homepage": "https://symfony.com", + "time": "2017-08-03T09:34:20+00:00" + }, + { + "name": "symfony/filesystem", + "version": "3.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "e4d366b620c8b6e2d4977c154f6a1d5b416db4dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/e4d366b620c8b6e2d4977c154f6a1d5b416db4dd", + "reference": "e4d366b620c8b6e2d4977c154f6a1d5b416db4dd", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Filesystem Component", + "homepage": "https://symfony.com", + "time": "2017-08-03T09:34:20+00:00" + }, + { + "name": "symfony/finder", + "version": "3.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "bf0450cfe7282c5f06539c4733ba64273e91e918" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/bf0450cfe7282c5f06539c4733ba64273e91e918", + "reference": "bf0450cfe7282c5f06539c4733ba64273e91e918", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Finder Component", + "homepage": "https://symfony.com", + "time": "2017-08-03T09:34:20+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "7c8fae0ac1d216eb54349e6a8baa57d515fe8803" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7c8fae0ac1d216eb54349e6a8baa57d515fe8803", + "reference": "7c8fae0ac1d216eb54349e6a8baa57d515fe8803", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "time": "2017-06-14T15:44:48+00:00" + }, + { + "name": "symfony/process", + "version": "3.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "9794f948d9af3be0157185051275d78b24d68b92" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/9794f948d9af3be0157185051275d78b24d68b92", + "reference": "9794f948d9af3be0157185051275d78b24d68b92", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "time": "2017-08-03T09:34:20+00:00" + }, + { + "name": "symfony/translation", + "version": "3.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "62bb068e004874bbe39624101e1aae70ca7c05cd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/62bb068e004874bbe39624101e1aae70ca7c05cd", + "reference": "62bb068e004874bbe39624101e1aae70ca7c05cd", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/config": "<2.8", + "symfony/dependency-injection": "<3.4", + "symfony/yaml": "<3.3" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~2.8|~3.0|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/intl": "^2.8.18|^3.2.5|~4.0", + "symfony/yaml": "~3.3|~4.0" + }, + "suggest": { + "psr/log": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Translation Component", + "homepage": "https://symfony.com", + "time": "2017-08-03T12:04:31+00:00" + }, + { + "name": "symfony/yaml", + "version": "3.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "1395ddba6f65bf46cdf1d80d59223cbab8ff3ccc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/1395ddba6f65bf46cdf1d80d59223cbab8ff3ccc", + "reference": "1395ddba6f65bf46cdf1d80d59223cbab8ff3ccc", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "require-dev": { + "symfony/console": "~2.8|~3.0|~4.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4-dev" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Yaml Component", + "homepage": "https://symfony.com", + "time": "2017-08-04T13:29:48+00:00" + }, + { + "name": "wp-cli/autoload-splitter", + "version": "v0.1.5", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/autoload-splitter.git", + "reference": "fb4302da26390811d2631c62b42b75976d224bb8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/autoload-splitter/zipball/fb4302da26390811d2631c62b42b75976d224bb8", + "reference": "fb4302da26390811d2631c62b42b75976d224bb8", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1" + }, + "type": "composer-plugin", + "extra": { + "class": "WP_CLI\\AutoloadSplitter\\ComposerPlugin" + }, + "autoload": { + "psr-4": { + "WP_CLI\\AutoloadSplitter\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alain Schlesser", + "email": "alain.schlesser@gmail.com", + "homepage": "https://www.alainschlesser.com" + } + ], + "description": "Composer plugin for splitting a generated autoloader into two distinct parts.", + "homepage": "https://wp-cli.org", + "time": "2017-08-03T08:40:16+00:00" + }, + { + "name": "wp-cli/cache-command", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/cache-command.git", + "reference": "485f7cc6630ecabe22bbf9fa9e827958e95a2d21" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/cache-command/zipball/485f7cc6630ecabe22bbf9fa9e827958e95a2d21", + "reference": "485f7cc6630ecabe22bbf9fa9e827958e95a2d21", + "shasum": "" + }, + "require-dev": { + "behat/behat": "~2.5", + "wp-cli/wp-cli": "*" + }, + "type": "wp-cli-package", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "bundled": true, + "commands": [ + "cache", + "transient" + ] + }, + "autoload": { + "psr-4": { + "": "src/" + }, + "files": [ + "cache-command.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Bachhuber", + "email": "daniel@runcommand.io", + "homepage": "https://runcommand.io" + } + ], + "description": "Manage object and transient caches.", + "homepage": "https://github.com/wp-cli/cache-command", + "time": "2017-08-04T11:37:19+00:00" + }, + { + "name": "wp-cli/checksum-command", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/checksum-command.git", + "reference": "88ccde2e82de5c2232842a9fccc2e6ade232dec6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/checksum-command/zipball/88ccde2e82de5c2232842a9fccc2e6ade232dec6", + "reference": "88ccde2e82de5c2232842a9fccc2e6ade232dec6", + "shasum": "" + }, + "require-dev": { + "behat/behat": "~2.5", + "wp-cli/wp-cli": "*" + }, + "type": "wp-cli-package", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "bundled": true, + "commands": [ + "checksum core" + ] + }, + "autoload": { + "psr-4": { + "": "src/" + }, + "files": [ + "checksum-command.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Bachhuber", + "email": "daniel@runcommand.io", + "homepage": "https://runcommand.io" + } + ], + "description": "Verify WordPress core checksums.", + "homepage": "https://github.com/wp-cli/checksum-command", + "time": "2017-08-09T23:34:29+00:00" + }, + { + "name": "wp-cli/config-command", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/config-command.git", + "reference": "ca83ade8fb2d059b561744610947e38123b10c22" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/config-command/zipball/ca83ade8fb2d059b561744610947e38123b10c22", + "reference": "ca83ade8fb2d059b561744610947e38123b10c22", + "shasum": "" + }, + "require-dev": { + "behat/behat": "~2.5", + "wp-cli/wp-cli": "*" + }, + "type": "wp-cli-package", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "bundled": true, + "commands": [ + "config", + "config create", + "config get", + "config path" + ] + }, + "autoload": { + "psr-4": { + "": "src/" + }, + "files": [ + "config-command.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Bachhuber", + "email": "daniel@runcommand.io", + "homepage": "https://runcommand.io" + } + ], + "description": "Manage the wp-config.php file.", + "homepage": "https://github.com/wp-cli/config-command", + "time": "2017-08-04T23:41:35+00:00" + }, + { + "name": "wp-cli/core-command", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/core-command.git", + "reference": "fb743dab792e21b57163c5c0f563987d1471c152" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/core-command/zipball/fb743dab792e21b57163c5c0f563987d1471c152", + "reference": "fb743dab792e21b57163c5c0f563987d1471c152", + "shasum": "" + }, + "require-dev": { + "behat/behat": "~2.5", + "wp-cli/wp-cli": "*" + }, + "type": "wp-cli-package", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "bundled": true, + "commands": [ + "core check-update", + "core download", + "core install", + "core is-installed", + "core multisite-convert", + "core multisite-install", + "core update", + "core update-db", + "core version" + ] + }, + "autoload": { + "psr-4": { + "": "src/" + }, + "files": [ + "core-command.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Bachhuber", + "email": "daniel@runcommand.io", + "homepage": "https://runcommand.io" + } + ], + "description": "Download, install, update and manage a WordPress install.", + "homepage": "https://github.com/wp-cli/core-command", + "time": "2017-08-04T12:31:18+00:00" + }, + { + "name": "wp-cli/cron-command", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/cron-command.git", + "reference": "92114b695ab0253bb705d9bd3e6d2fb47b51fad2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/cron-command/zipball/92114b695ab0253bb705d9bd3e6d2fb47b51fad2", + "reference": "92114b695ab0253bb705d9bd3e6d2fb47b51fad2", + "shasum": "" + }, + "require-dev": { + "behat/behat": "~2.5", + "wp-cli/wp-cli": "*" + }, + "type": "wp-cli-package", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "bundled": true, + "commands": [ + "cron test", + "cron event delete", + "cron event list", + "cron event run", + "cron event schedule", + "cron schedule list" + ] + }, + "autoload": { + "psr-4": { + "": "src/" + }, + "files": [ + "cron-command.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Bachhuber", + "email": "daniel@runcommand.io", + "homepage": "https://runcommand.io" + } + ], + "description": "Manage WP-Cron events and schedules.", + "homepage": "https://github.com/wp-cli/cron-command", + "time": "2017-08-04T12:45:50+00:00" + }, + { + "name": "wp-cli/db-command", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/db-command.git", + "reference": "5c597abb642bcaf329e7da0801c69f4405d41c23" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/db-command/zipball/5c597abb642bcaf329e7da0801c69f4405d41c23", + "reference": "5c597abb642bcaf329e7da0801c69f4405d41c23", + "shasum": "" + }, + "require": { + "wp-cli/wp-cli": "*" + }, + "require-dev": { + "behat/behat": "~2.5" + }, + "type": "wp-cli-package", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "bundled": true, + "commands": [ + "db create", + "db drop", + "db reset", + "db check", + "db optimize", + "db prefix", + "db repair", + "db cli", + "db query", + "db export", + "db import", + "db search", + "db tables", + "db size" + ] + }, + "autoload": { + "psr-4": { + "": "src/" + }, + "files": [ + "db-command.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Bachhuber", + "email": "daniel@runcommand.io", + "homepage": "https://runcommand.io" + } + ], + "description": "Perform basic database operations using credentials stored in wp-config.php.", + "homepage": "https://github.com/wp-cli/db-command", + "time": "2017-08-04T23:21:46+00:00" + }, + { + "name": "wp-cli/entity-command", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/entity-command.git", + "reference": "d0cd99c14e4d01aad368328da97231df0c01f9dc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/entity-command/zipball/d0cd99c14e4d01aad368328da97231df0c01f9dc", + "reference": "d0cd99c14e4d01aad368328da97231df0c01f9dc", + "shasum": "" + }, + "require-dev": { + "behat/behat": "~2.5", + "phpunit/phpunit": "^4.8", + "wp-cli/wp-cli": "*" + }, + "type": "wp-cli-package", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "bundled": true, + "commands": [ + "comment", + "comment meta", + "menu", + "menu item", + "menu location", + "network meta", + "option", + "option add", + "option delete", + "option get", + "option list", + "option update", + "post", + "post meta", + "post term", + "post-type", + "site", + "taxonomy", + "term", + "term meta", + "user", + "user meta", + "user term" + ] + }, + "autoload": { + "psr-4": { + "": "src/", + "WP_CLI\\": "src/WP_CLI" + }, + "files": [ + "entity-command.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Bachhuber", + "email": "daniel@runcommand.io", + "homepage": "https://runcommand.io" + } + ], + "description": "Manage WordPress core entities.", + "homepage": "https://github.com/wp-cli/entity-command", + "time": "2017-08-11T11:53:04+00:00" + }, + { + "name": "wp-cli/eval-command", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/eval-command.git", + "reference": "e3d9502a4f8b8f582130dbb3b8ede76e17ac05a4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/eval-command/zipball/e3d9502a4f8b8f582130dbb3b8ede76e17ac05a4", + "reference": "e3d9502a4f8b8f582130dbb3b8ede76e17ac05a4", + "shasum": "" + }, + "require": { + "wp-cli/wp-cli": "*" + }, + "require-dev": { + "behat/behat": "~2.5" + }, + "type": "wp-cli-package", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "bundled": true, + "commands": [ + "eval", + "eval-file" + ] + }, + "autoload": { + "psr-4": { + "": "src/" + }, + "files": [ + "eval-command.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Bachhuber", + "email": "daniel@runcommand.io", + "homepage": "https://runcommand.io" + } + ], + "description": "Execute arbitrary PHP code.", + "homepage": "https://github.com/wp-cli/eval-command", + "time": "2017-08-04T12:46:58+00:00" + }, + { + "name": "wp-cli/export-command", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/export-command.git", + "reference": "f5647155830d1275de4cb69cfb79748b9449b8ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/export-command/zipball/f5647155830d1275de4cb69cfb79748b9449b8ab", + "reference": "f5647155830d1275de4cb69cfb79748b9449b8ab", + "shasum": "" + }, + "require": { + "nb/oxymel": "~0.1.0", + "wp-cli/wp-cli": "*" + }, + "require-dev": { + "behat/behat": "~2.5" + }, + "type": "wp-cli-package", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "bundled": true, + "commands": [ + "export" + ] + }, + "autoload": { + "psr-4": { + "": "src/" + }, + "files": [ + "export-command.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Bachhuber", + "email": "daniel@runcommand.io", + "homepage": "https://runcommand.io" + } + ], + "description": "Export WordPress content to a WXR file.", + "homepage": "https://github.com/wp-cli/export-command", + "time": "2017-08-04T13:13:08+00:00" + }, + { + "name": "wp-cli/extension-command", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/extension-command.git", + "reference": "08bf48e842b9e1cb579b50cec1b6897cebf65bda" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/extension-command/zipball/08bf48e842b9e1cb579b50cec1b6897cebf65bda", + "reference": "08bf48e842b9e1cb579b50cec1b6897cebf65bda", + "shasum": "" + }, + "require-dev": { + "behat/behat": "~2.5", + "wp-cli/wp-cli": "*" + }, + "type": "wp-cli-package", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "bundled": true, + "commands": [ + "plugin activate", + "plugin deactivate", + "plugin delete", + "plugin get", + "plugin install", + "plugin is-installed", + "plugin list", + "plugin path", + "plugin search", + "plugin status", + "plugin toggle", + "plugin uninstall", + "plugin update", + "theme activate", + "theme delete", + "theme disable", + "theme enable", + "theme get", + "theme install", + "theme is-installed", + "theme list", + "theme mod get", + "theme mod set", + "theme mod remove", + "theme path", + "theme search", + "theme status", + "theme update" + ] + }, + "autoload": { + "psr-4": { + "": "src/", + "WP_CLI\\": "src/WP_CLI" + }, + "files": [ + "extension-command.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Bachhuber", + "email": "daniel@runcommand.io", + "homepage": "https://runcommand.io" + } + ], + "description": "Manage WordPress plugins and themes.", + "homepage": "https://github.com/wp-cli/extension-command", + "time": "2017-08-04T13:43:53+00:00" + }, + { + "name": "wp-cli/import-command", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/import-command.git", + "reference": "89d14aa4b8b621effbe7f9bacad2ea8a096598a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/import-command/zipball/89d14aa4b8b621effbe7f9bacad2ea8a096598a7", + "reference": "89d14aa4b8b621effbe7f9bacad2ea8a096598a7", + "shasum": "" + }, + "require": { + "wp-cli/wp-cli": "*" + }, + "require-dev": { + "behat/behat": "~2.5" + }, + "type": "wp-cli-package", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "bundled": true, + "commands": [ + "import" + ] + }, + "autoload": { + "psr-4": { + "": "src/" + }, + "files": [ + "import-command.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Bachhuber", + "email": "daniel@runcommand.io", + "homepage": "https://runcommand.io" + } + ], + "description": "Import content from a WXR file.", + "homepage": "https://github.com/wp-cli/import-command", + "time": "2017-08-04T13:45:57+00:00" + }, + { + "name": "wp-cli/language-command", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/language-command.git", + "reference": "aff3fb6c6d7698008c7e5d33a97b25457091ae1b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/language-command/zipball/aff3fb6c6d7698008c7e5d33a97b25457091ae1b", + "reference": "aff3fb6c6d7698008c7e5d33a97b25457091ae1b", + "shasum": "" + }, + "require-dev": { + "behat/behat": "~2.5", + "wp-cli/wp-cli": "*" + }, + "type": "wp-cli-package", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "commands": [ + "language core activate", + "language core install", + "language core list", + "language core uninstall", + "language core update" + ], + "bundled": true + }, + "autoload": { + "psr-4": { + "": "src/" + }, + "files": [ + "language-command.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Bachhuber", + "email": "daniel@runcommand.io", + "homepage": "https://runcommand.io" + } + ], + "description": "Manage language packs.", + "homepage": "https://github.com/wp-cli/language-command", + "time": "2017-08-04T23:23:03+00:00" + }, + { + "name": "wp-cli/media-command", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/media-command.git", + "reference": "4a19de54a11c96b21c10719e2b7f9dd131c4261e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/media-command/zipball/4a19de54a11c96b21c10719e2b7f9dd131c4261e", + "reference": "4a19de54a11c96b21c10719e2b7f9dd131c4261e", + "shasum": "" + }, + "require": { + "wp-cli/wp-cli": "*" + }, + "require-dev": { + "behat/behat": "~2.5" + }, + "type": "wp-cli-package", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "commands": [ + "media import", + "media regenerate" + ], + "bundled": true + }, + "autoload": { + "psr-4": { + "": "src/" + }, + "files": [ + "media-command.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Bachhuber", + "email": "daniel@runcommand.io", + "homepage": "https://runcommand.io" + } + ], + "description": "Import new attachments or regenerate existing ones.", + "homepage": "https://github.com/wp-cli/media-command", + "time": "2017-08-05T04:54:48+00:00" + }, + { + "name": "wp-cli/mustangostang-spyc", + "version": "0.6.3", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/spyc.git", + "reference": "6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/spyc/zipball/6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7", + "reference": "6aa0b4da69ce9e9a2c8402dab8d43cf32c581cc7", + "shasum": "" + }, + "require": { + "php": ">=5.3.1" + }, + "require-dev": { + "phpunit/phpunit": "4.3.*@dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.5.x-dev" + } + }, + "autoload": { + "psr-4": { + "Mustangostang\\": "src/" + }, + "files": [ + "includes/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "mustangostang", + "email": "vlad.andersen@gmail.com" + } + ], + "description": "A simple YAML loader/dumper class for PHP (WP-CLI fork)", + "homepage": "https://github.com/mustangostang/spyc/", + "time": "2017-04-25T11:26:20+00:00" + }, + { + "name": "wp-cli/package-command", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/package-command.git", + "reference": "744692180a4240ddc75a3196934cafe396dd9178" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/package-command/zipball/744692180a4240ddc75a3196934cafe396dd9178", + "reference": "744692180a4240ddc75a3196934cafe396dd9178", + "shasum": "" + }, + "require": { + "composer/composer": "^1.2.0", + "wp-cli/wp-cli": "*" + }, + "require-dev": { + "behat/behat": "~2.5" + }, + "type": "wp-cli-package", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "commands": [ + "package browse", + "package install", + "package list", + "package update", + "package uninstall" + ], + "bundled": true + }, + "autoload": { + "psr-4": { + "": "src/" + }, + "files": [ + "package-command.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Bachhuber", + "email": "daniel@runcommand.io", + "homepage": "https://runcommand.io" + } + ], + "description": "Manage WP-CLI packages.", + "homepage": "https://github.com/wp-cli/package-command", + "time": "2017-08-07T12:21:11+00:00" + }, + { + "name": "wp-cli/php-cli-tools", + "version": "v0.11.6", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/php-cli-tools.git", + "reference": "d2a4e2eca9f1cd62a5d30f192d10f74e73eb3a05" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/php-cli-tools/zipball/d2a4e2eca9f1cd62a5d30f192d10f74e73eb3a05", + "reference": "d2a4e2eca9f1cd62a5d30f192d10f74e73eb3a05", + "shasum": "" + }, + "require": { + "php": ">= 5.3.0" + }, + "type": "library", + "autoload": { + "psr-0": { + "cli": "lib/" + }, + "files": [ + "lib/cli/cli.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "James Logsdon", + "email": "jlogsdon@php.net", + "role": "Developer" + }, + { + "name": "Daniel Bachhuber", + "email": "daniel@handbuilt.co", + "role": "Maintainer" + } + ], + "description": "Console utilities for PHP", + "homepage": "http://github.com/wp-cli/php-cli-tools", + "keywords": [ + "cli", + "console" + ], + "time": "2017-08-04T10:42:04+00:00" + }, + { + "name": "wp-cli/rewrite-command", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/rewrite-command.git", + "reference": "e858feac8d3fe053e052d8af43c090ff0b2a4e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/rewrite-command/zipball/e858feac8d3fe053e052d8af43c090ff0b2a4e8a", + "reference": "e858feac8d3fe053e052d8af43c090ff0b2a4e8a", + "shasum": "" + }, + "require-dev": { + "behat/behat": "~2.5", + "wp-cli/wp-cli": "*" + }, + "type": "wp-cli-package", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "commands": [ + "rewrite flush", + "rewrite list", + "rewrite structure" + ], + "bundled": true + }, + "autoload": { + "psr-4": { + "": "src/" + }, + "files": [ + "rewrite-command.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Bachhuber", + "email": "daniel@runcommand.io", + "homepage": "https://runcommand.io" + } + ], + "description": "Manage rewrite rules.", + "homepage": "https://github.com/wp-cli/rewrite-command", + "time": "2017-08-04T15:15:53+00:00" + }, + { + "name": "wp-cli/role-command", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/role-command.git", + "reference": "85ddf53525b14ab040830f385710f4493058d295" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/role-command/zipball/85ddf53525b14ab040830f385710f4493058d295", + "reference": "85ddf53525b14ab040830f385710f4493058d295", + "shasum": "" + }, + "require-dev": { + "behat/behat": "~2.5", + "wp-cli/wp-cli": "*" + }, + "type": "wp-cli-package", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "commands": [ + "role create", + "role delete", + "role exists", + "role list", + "role reset", + "cap add", + "cap list", + "cap remove" + ], + "bundled": true + }, + "autoload": { + "psr-4": { + "": "src/" + }, + "files": [ + "role-command.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Bachhuber", + "email": "daniel@runcommand.io", + "homepage": "https://runcommand.io" + } + ], + "description": "Manage user roles and capabilities.", + "homepage": "https://github.com/wp-cli/role-command", + "time": "2017-08-04T15:17:29+00:00" + }, + { + "name": "wp-cli/scaffold-command", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/scaffold-command.git", + "reference": "41f1e1aa41af76b70d6cf3d21d52995e854acf4c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/scaffold-command/zipball/41f1e1aa41af76b70d6cf3d21d52995e854acf4c", + "reference": "41f1e1aa41af76b70d6cf3d21d52995e854acf4c", + "shasum": "" + }, + "require-dev": { + "behat/behat": "~2.5", + "wp-cli/wp-cli": "*" + }, + "type": "wp-cli-package", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "commands": [ + "scaffold", + "scaffold _s", + "scaffold child-theme", + "scaffold plugin", + "scaffold plugin-tests", + "scaffold post-type", + "scaffold taxonomy", + "scaffold theme-tests" + ], + "bundled": true + }, + "autoload": { + "psr-4": { + "": "src/" + }, + "files": [ + "scaffold-command.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Bachhuber", + "email": "daniel@runcommand.io", + "homepage": "https://runcommand.io" + } + ], + "description": "Generate code for post types, taxonomies, plugins, child themes, etc.", + "homepage": "https://github.com/wp-cli/scaffold-command", + "time": "2017-08-11T08:07:10+00:00" + }, + { + "name": "wp-cli/search-replace-command", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/search-replace-command.git", + "reference": "3e7499a65354e3a322d4d1043123b3fa55ef4f12" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/search-replace-command/zipball/3e7499a65354e3a322d4d1043123b3fa55ef4f12", + "reference": "3e7499a65354e3a322d4d1043123b3fa55ef4f12", + "shasum": "" + }, + "require": { + "wp-cli/wp-cli": "*" + }, + "require-dev": { + "behat/behat": "~2.5" + }, + "type": "wp-cli-package", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "commands": [ + "search-replace" + ], + "bundled": true + }, + "autoload": { + "psr-4": { + "": "src/", + "WP_CLI\\": "src/WP_CLI" + }, + "files": [ + "search-replace-command.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Bachhuber", + "email": "daniel@runcommand.io", + "homepage": "https://runcommand.io" + } + ], + "description": "Search/replace strings in the database.", + "homepage": "https://github.com/wp-cli/search-replace-command", + "time": "2017-08-08T16:41:49+00:00" + }, + { + "name": "wp-cli/server-command", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/server-command.git", + "reference": "ce93df07c33e716adbbd2d329c311a3c1dd3a0b0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/server-command/zipball/ce93df07c33e716adbbd2d329c311a3c1dd3a0b0", + "reference": "ce93df07c33e716adbbd2d329c311a3c1dd3a0b0", + "shasum": "" + }, + "require": { + "wp-cli/wp-cli": "*" + }, + "require-dev": { + "behat/behat": "~2.5" + }, + "type": "wp-cli-package", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "commands": [ + "server" + ], + "bundled": true + }, + "autoload": { + "psr-4": { + "": "src/" + }, + "files": [ + "server-command.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Bachhuber", + "email": "daniel@runcommand.io", + "homepage": "https://runcommand.io" + } + ], + "description": "Launch PHP's built-in web server for this specific WordPress installation.", + "homepage": "https://github.com/wp-cli/server-command", + "time": "2017-08-04T15:19:26+00:00" + }, + { + "name": "wp-cli/shell-command", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/shell-command.git", + "reference": "70681666302cc193a1bd41bade9ecc61e74a8c83" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/shell-command/zipball/70681666302cc193a1bd41bade9ecc61e74a8c83", + "reference": "70681666302cc193a1bd41bade9ecc61e74a8c83", + "shasum": "" + }, + "require": { + "wp-cli/wp-cli": "*" + }, + "require-dev": { + "behat/behat": "~2.5" + }, + "type": "wp-cli-package", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "commands": [ + "shell" + ], + "bundled": true + }, + "autoload": { + "psr-4": { + "": "src/", + "WP_CLI\\": "src/WP_CLI" + }, + "files": [ + "shell-command.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Bachhuber", + "email": "daniel@runcommand.io", + "homepage": "https://runcommand.io" + } + ], + "description": "Interactive PHP console.", + "homepage": "https://github.com/wp-cli/shell-command", + "time": "2017-08-04T15:21:52+00:00" + }, + { + "name": "wp-cli/super-admin-command", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/super-admin-command.git", + "reference": "b650836d13762c764df2bbe70ad34212c0b773cd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/super-admin-command/zipball/b650836d13762c764df2bbe70ad34212c0b773cd", + "reference": "b650836d13762c764df2bbe70ad34212c0b773cd", + "shasum": "" + }, + "require-dev": { + "behat/behat": "~2.5", + "wp-cli/wp-cli": "*" + }, + "type": "wp-cli-package", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "commands": [ + "super-admin add", + "super-admin list", + "super-admin remove" + ], + "bundled": true + }, + "autoload": { + "psr-4": { + "": "src/" + }, + "files": [ + "super-admin-command.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Bachhuber", + "email": "daniel@runcommand.io", + "homepage": "https://runcommand.io" + } + ], + "description": "Manage super admins on WordPress multisite.", + "homepage": "https://github.com/wp-cli/super-admin-command", + "time": "2017-08-04T15:45:41+00:00" + }, + { + "name": "wp-cli/widget-command", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/widget-command.git", + "reference": "727af7c7b661031bc8c04ad176d4f24b862e3402" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/widget-command/zipball/727af7c7b661031bc8c04ad176d4f24b862e3402", + "reference": "727af7c7b661031bc8c04ad176d4f24b862e3402", + "shasum": "" + }, + "require-dev": { + "behat/behat": "~2.5", + "wp-cli/wp-cli": "*" + }, + "type": "wp-cli-package", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "commands": [ + "widget add", + "widget deactivate", + "widget delete", + "widget list", + "widget move", + "widget reset", + "widget update", + "sidebar list" + ], + "bundled": true + }, + "autoload": { + "psr-4": { + "": "src/" + }, + "files": [ + "widget-command.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Daniel Bachhuber", + "email": "daniel@runcommand.io", + "homepage": "https://runcommand.io" + } + ], + "description": "Manage widgets and sidebars.", + "homepage": "https://github.com/wp-cli/widget-command", + "time": "2017-08-04T15:24:29+00:00" + }, + { + "name": "wp-cli/wp-cli", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/wp-cli/wp-cli.git", + "reference": "4ab0d99da0ad5e6ca39453ff5c82d4f06aecb086" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wp-cli/wp-cli/zipball/4ab0d99da0ad5e6ca39453ff5c82d4f06aecb086", + "reference": "4ab0d99da0ad5e6ca39453ff5c82d4f06aecb086", + "shasum": "" + }, + "require": { + "composer/composer": "^1.2.0", + "composer/semver": "~1.0", + "mustache/mustache": "~2.4", + "php": ">=5.3.29", + "ramsey/array_column": "~1.1", + "rmccue/requests": "~1.6", + "symfony/config": "^2.7|^3.0", + "symfony/console": "^2.7|^3.0", + "symfony/debug": "^2.7|^3.0", + "symfony/dependency-injection": "^2.7|^3.0", + "symfony/event-dispatcher": "^2.7|^3.0", + "symfony/filesystem": "^2.7|^3.0", + "symfony/finder": "^2.7|^3.0", + "symfony/process": "^2.1|^3.0", + "symfony/translation": "^2.7|^3.0", + "symfony/yaml": "^2.7|^3.0", + "wp-cli/autoload-splitter": "^0.1.5", + "wp-cli/cache-command": "^1.0", + "wp-cli/checksum-command": "^1.0", + "wp-cli/config-command": "^1.0", + "wp-cli/core-command": "^1.0", + "wp-cli/cron-command": "^1.0", + "wp-cli/db-command": "^1.0", + "wp-cli/entity-command": "^1.0", + "wp-cli/eval-command": "^1.0", + "wp-cli/export-command": "^1.0", + "wp-cli/extension-command": "^1.0", + "wp-cli/import-command": "^1.0", + "wp-cli/language-command": "^1.0", + "wp-cli/media-command": "^1.0", + "wp-cli/mustangostang-spyc": "^0.6.3", + "wp-cli/package-command": "^1.0", + "wp-cli/php-cli-tools": "~0.11.2", + "wp-cli/rewrite-command": "^1.0", + "wp-cli/role-command": "^1.0", + "wp-cli/scaffold-command": "^1.0", + "wp-cli/search-replace-command": "^1.0", + "wp-cli/server-command": "^1.0", + "wp-cli/shell-command": "^1.0", + "wp-cli/super-admin-command": "^1.0", + "wp-cli/widget-command": "^1.0" + }, + "require-dev": { + "behat/behat": "2.5.*", + "phpunit/phpunit": "3.7.*", + "roave/security-advisories": "dev-master" + }, + "suggest": { + "psy/psysh": "Enhanced `wp shell` functionality" + }, + "bin": [ + "bin/wp.bat", + "bin/wp" + ], + "type": "library", + "extra": { + "autoload-splitter": { + "splitter-logic": "WP_CLI\\AutoloadSplitter", + "splitter-location": "php/WP_CLI/AutoloadSplitter.php", + "split-target-prefix-true": "autoload_commands", + "split-target-prefix-false": "autoload_framework" + } + }, + "autoload": { + "psr-0": { + "WP_CLI": "php" + }, + "psr-4": { + "": "php/commands/src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A command line interface for WordPress", + "homepage": "http://wp-cli.org", + "keywords": [ + "cli", + "wordpress" + ], + "time": "2017-08-08T14:28:58+00:00" + } + ], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [] +} diff --git a/functions.php b/functions.php new file mode 100644 index 00000000000..567ba6854b8 --- /dev/null +++ b/functions.php @@ -0,0 +1,186 @@ +single( $hook, $args, $timestamp, $group ); +} + +/** + * Schedule a recurring action + * + * @param int $timestamp When the first instance of the job will run + * @param int $interval_in_seconds How long to wait between runs + * @param string $hook The hook to trigger + * @param array $args Arguments to pass when the hook triggers + * @param string $group The group to assign this job to + * + * @return string The job ID + */ +function wc_schedule_recurring_action( $timestamp, $interval_in_seconds, $hook, $args = array(), $group = '' ) { + return ActionScheduler::factory()->recurring( $hook, $args, $timestamp, $interval_in_seconds, $group ); +} + +/** + * Schedule an action that recurs on a cron-like schedule. + * + * @param int $timestamp The schedule will start on or after this time + * @param string $schedule A cron-link schedule string + * @see http://en.wikipedia.org/wiki/Cron + * * * * * * * + * ┬ ┬ ┬ ┬ ┬ ┬ + * | | | | | | + * | | | | | + year [optional] + * | | | | +----- day of week (0 - 7) (Sunday=0 or 7) + * | | | +---------- month (1 - 12) + * | | +--------------- day of month (1 - 31) + * | +-------------------- hour (0 - 23) + * +------------------------- min (0 - 59) + * @param string $hook The hook to trigger + * @param array $args Arguments to pass when the hook triggers + * @param string $group The group to assign this job to + * + * @return string The job ID + */ +function wc_schedule_cron_action( $timestamp, $schedule, $hook, $args = array(), $group = '' ) { + return ActionScheduler::factory()->cron( $hook, $args, $timestamp, $schedule, $group ); +} + +/** + * Cancel the next occurrence of a job. + * + * @param string $hook The hook that the job will trigger + * @param array $args Args that would have been passed to the job + * @param string $group + */ +function wc_unschedule_action( $hook, $args = array(), $group = '' ) { + $params = array(); + if ( is_array($args) ) { + $params['args'] = $args; + } + if ( !empty($group) ) { + $params['group'] = $group; + } + $job_id = ActionScheduler::store()->find_action( $hook, $params ); + if ( empty($job_id) ) { + return; + } + + ActionScheduler::store()->cancel_action( $job_id ); +} + +/** + * @param string $hook + * @param array $args + * @param string $group + * + * @return int|bool The timestamp for the next occurrence, or false if nothing was found + */ +function wc_next_scheduled_action( $hook, $args = NULL, $group = '' ) { + $params = array(); + if ( is_array($args) ) { + $params['args'] = $args; + } + if ( !empty($group) ) { + $params['group'] = $group; + } + $job_id = ActionScheduler::store()->find_action( $hook, $params ); + if ( empty($job_id) ) { + return false; + } + $job = ActionScheduler::store()->fetch_action( $job_id ); + $next = $job->get_schedule()->next(); + if ( $next ) { + return (int)($next->format('U')); + } + return false; +} + +/** + * Find scheduled actions + * + * @param array $args Possible arguments, with their default values: + * 'hook' => '' - the name of the action that will be triggered + * 'args' => NULL - the args array that will be passed with the action + * 'date' => NULL - the scheduled date of the action. Expects a DateTime object, a unix timestamp, or a string that can parsed with strtotime(). Used in UTC timezone. + * 'date_compare' => '<=' - operator for testing "date". accepted values are '!=', '>', '>=', '<', '<=', '=' + * 'modified' => NULL - the date the action was last updated. Expects a DateTime object, a unix timestamp, or a string that can parsed with strtotime(). Used in UTC timezone. + * 'modified_compare' => '<=' - operator for testing "modified". accepted values are '!=', '>', '>=', '<', '<=', '=' + * 'group' => '' - the group the action belongs to + * 'status' => '' - ActionScheduler_Store::STATUS_COMPLETE or ActionScheduler_Store::STATUS_PENDING + * 'claimed' => NULL - TRUE to find claimed actions, FALSE to find unclaimed actions, a string to find a specific claim ID + * 'per_page' => 5 - Number of results to return + * 'offset' => 0 + * 'orderby' => 'date' - accepted values are 'hook', 'group', 'modified', or 'date' + * 'order' => 'ASC' + * + * @param string $return_format OBJECT, ARRAY_A, or ids + * + * @return array + */ +function wc_get_scheduled_actions( $args = array(), $return_format = OBJECT ) { + $store = ActionScheduler::store(); + foreach ( array('date', 'modified') as $key ) { + if ( isset($args[$key]) ) { + $args[$key] = as_get_datetime_object($args[$key]); + } + } + $ids = $store->query_actions( $args ); + + if ( $return_format == 'ids' || $return_format == 'int' ) { + return $ids; + } + + $actions = array(); + foreach ( $ids as $action_id ) { + $actions[$action_id] = $store->fetch_action( $action_id ); + } + + if ( $return_format == ARRAY_A ) { + foreach ( $actions as $action_id => $action_object ) { + $actions[$action_id] = get_object_vars($action_object); + } + } + + return $actions; +} + +/** + * Helper function to create an instance of DateTime based on a given + * string and timezone. By default, will return the current date/time + * in the UTC timezone. + * + * Needed because new DateTime() called without an explicit timezone + * will create a date/time in PHP's timezone, but we need to have + * assurance that a date/time uses the right timezone (which we almost + * always want to be UTC), which means we need to always include the + * timezone when instantiating datetimes rather than leaving it up to + * the PHP default. + * + * @param mixed $date_string A date/time string. Valid formats are explained in http://php.net/manual/en/datetime.formats.php + * @param string $timezone A timezone identifier, like UTC or Europe/Lisbon. The list of valid identifiers is available http://php.net/manual/en/timezones.php + * + * @return ActionScheduler_DateTime + */ +function as_get_datetime_object( $date_string = null, $timezone = 'UTC' ) { + if ( is_object( $date_string ) && $date_string instanceof DateTime ) { + $date = new ActionScheduler_DateTime( $date_string->format( 'Y-m-d H:i:s' ), new DateTimeZone( $timezone ) ); + } elseif ( is_numeric( $date_string ) ) { + $date = new ActionScheduler_DateTime( '@' . $date_string, new DateTimeZone( $timezone ) ); + } else { + $date = new ActionScheduler_DateTime( $date_string, new DateTimeZone( $timezone ) ); + } + return $date; +} diff --git a/lib/cron-expression/CronExpression.php b/lib/cron-expression/CronExpression.php new file mode 100755 index 00000000000..7f33c378f9e --- /dev/null +++ b/lib/cron-expression/CronExpression.php @@ -0,0 +1,318 @@ + + * @link http://en.wikipedia.org/wiki/Cron + */ +class CronExpression +{ + const MINUTE = 0; + const HOUR = 1; + const DAY = 2; + const MONTH = 3; + const WEEKDAY = 4; + const YEAR = 5; + + /** + * @var array CRON expression parts + */ + private $cronParts; + + /** + * @var CronExpression_FieldFactory CRON field factory + */ + private $fieldFactory; + + /** + * @var array Order in which to test of cron parts + */ + private static $order = array(self::YEAR, self::MONTH, self::DAY, self::WEEKDAY, self::HOUR, self::MINUTE); + + /** + * Factory method to create a new CronExpression. + * + * @param string $expression The CRON expression to create. There are + * several special predefined values which can be used to substitute the + * CRON expression: + * + * @yearly, @annually) - Run once a year, midnight, Jan. 1 - 0 0 1 1 * + * @monthly - Run once a month, midnight, first of month - 0 0 1 * * + * @weekly - Run once a week, midnight on Sun - 0 0 * * 0 + * @daily - Run once a day, midnight - 0 0 * * * + * @hourly - Run once an hour, first minute - 0 * * * * + * +*@param CronExpression_FieldFactory $fieldFactory (optional) Field factory to use + * + * @return CronExpression + */ + public static function factory($expression, CronExpression_FieldFactory $fieldFactory = null) + { + $mappings = array( + '@yearly' => '0 0 1 1 *', + '@annually' => '0 0 1 1 *', + '@monthly' => '0 0 1 * *', + '@weekly' => '0 0 * * 0', + '@daily' => '0 0 * * *', + '@hourly' => '0 * * * *' + ); + + if (isset($mappings[$expression])) { + $expression = $mappings[$expression]; + } + + return new self($expression, $fieldFactory ? $fieldFactory : new CronExpression_FieldFactory()); + } + + /** + * Parse a CRON expression + * + * @param string $expression CRON expression (e.g. '8 * * * *') + * @param CronExpression_FieldFactory $fieldFactory Factory to create cron fields + */ + public function __construct($expression, CronExpression_FieldFactory $fieldFactory) + { + $this->fieldFactory = $fieldFactory; + $this->setExpression($expression); + } + + /** + * Set or change the CRON expression + * + * @param string $value CRON expression (e.g. 8 * * * *) + * + * @return CronExpression + * @throws InvalidArgumentException if not a valid CRON expression + */ + public function setExpression($value) + { + $this->cronParts = preg_split('/\s/', $value, -1, PREG_SPLIT_NO_EMPTY); + if (count($this->cronParts) < 5) { + throw new InvalidArgumentException( + $value . ' is not a valid CRON expression' + ); + } + + foreach ($this->cronParts as $position => $part) { + $this->setPart($position, $part); + } + + return $this; + } + + /** + * Set part of the CRON expression + * + * @param int $position The position of the CRON expression to set + * @param string $value The value to set + * + * @return CronExpression + * @throws InvalidArgumentException if the value is not valid for the part + */ + public function setPart($position, $value) + { + if (!$this->fieldFactory->getField($position)->validate($value)) { + throw new InvalidArgumentException( + 'Invalid CRON field value ' . $value . ' as position ' . $position + ); + } + + $this->cronParts[$position] = $value; + + return $this; + } + + /** + * Get a next run date relative to the current date or a specific date + * + * @param string|DateTime $currentTime (optional) Relative calculation date + * @param int $nth (optional) Number of matches to skip before returning a + * matching next run date. 0, the default, will return the current + * date and time if the next run date falls on the current date and + * time. Setting this value to 1 will skip the first match and go to + * the second match. Setting this value to 2 will skip the first 2 + * matches and so on. + * @param bool $allowCurrentDate (optional) Set to TRUE to return the + * current date if it matches the cron expression + * + * @return DateTime + * @throws RuntimeException on too many iterations + */ + public function getNextRunDate($currentTime = 'now', $nth = 0, $allowCurrentDate = false) + { + return $this->getRunDate($currentTime, $nth, false, $allowCurrentDate); + } + + /** + * Get a previous run date relative to the current date or a specific date + * + * @param string|DateTime $currentTime (optional) Relative calculation date + * @param int $nth (optional) Number of matches to skip before returning + * @param bool $allowCurrentDate (optional) Set to TRUE to return the + * current date if it matches the cron expression + * + * @return DateTime + * @throws RuntimeException on too many iterations + * @see CronExpression::getNextRunDate + */ + public function getPreviousRunDate($currentTime = 'now', $nth = 0, $allowCurrentDate = false) + { + return $this->getRunDate($currentTime, $nth, true, $allowCurrentDate); + } + + /** + * Get multiple run dates starting at the current date or a specific date + * + * @param int $total Set the total number of dates to calculate + * @param string|DateTime $currentTime (optional) Relative calculation date + * @param bool $invert (optional) Set to TRUE to retrieve previous dates + * @param bool $allowCurrentDate (optional) Set to TRUE to return the + * current date if it matches the cron expression + * + * @return array Returns an array of run dates + */ + public function getMultipleRunDates($total, $currentTime = 'now', $invert = false, $allowCurrentDate = false) + { + $matches = array(); + for ($i = 0; $i < max(0, $total); $i++) { + $matches[] = $this->getRunDate($currentTime, $i, $invert, $allowCurrentDate); + } + + return $matches; + } + + /** + * Get all or part of the CRON expression + * + * @param string $part (optional) Specify the part to retrieve or NULL to + * get the full cron schedule string. + * + * @return string|null Returns the CRON expression, a part of the + * CRON expression, or NULL if the part was specified but not found + */ + public function getExpression($part = null) + { + if (null === $part) { + return implode(' ', $this->cronParts); + } elseif (array_key_exists($part, $this->cronParts)) { + return $this->cronParts[$part]; + } + + return null; + } + + /** + * Helper method to output the full expression. + * + * @return string Full CRON expression + */ + public function __toString() + { + return $this->getExpression(); + } + + /** + * Determine if the cron is due to run based on the current date or a + * specific date. This method assumes that the current number of + * seconds are irrelevant, and should be called once per minute. + * + * @param string|DateTime $currentTime (optional) Relative calculation date + * + * @return bool Returns TRUE if the cron is due to run or FALSE if not + */ + public function isDue($currentTime = 'now') + { + if ('now' === $currentTime) { + $currentDate = date('Y-m-d H:i'); + $currentTime = strtotime($currentDate); + } elseif ($currentTime instanceof DateTime) { + $currentDate = $currentTime->format('Y-m-d H:i'); + $currentTime = strtotime($currentDate); + } else { + $currentTime = new DateTime($currentTime); + $currentTime->setTime($currentTime->format('H'), $currentTime->format('i'), 0); + $currentDate = $currentTime->format('Y-m-d H:i'); + $currentTime = (int)($currentTime->getTimestamp()); + } + + return $this->getNextRunDate($currentDate, 0, true)->getTimestamp() == $currentTime; + } + + /** + * Get the next or previous run date of the expression relative to a date + * + * @param string|DateTime $currentTime (optional) Relative calculation date + * @param int $nth (optional) Number of matches to skip before returning + * @param bool $invert (optional) Set to TRUE to go backwards in time + * @param bool $allowCurrentDate (optional) Set to TRUE to return the + * current date if it matches the cron expression + * + * @return DateTime + * @throws RuntimeException on too many iterations + */ + protected function getRunDate($currentTime = null, $nth = 0, $invert = false, $allowCurrentDate = false) + { + if ($currentTime instanceof DateTime) { + $currentDate = $currentTime; + } else { + $currentDate = new DateTime($currentTime ? $currentTime : 'now'); + $currentDate->setTimezone(new DateTimeZone(date_default_timezone_get())); + } + + $currentDate->setTime($currentDate->format('H'), $currentDate->format('i'), 0); + $nextRun = clone $currentDate; + $nth = (int) $nth; + + // Set a hard limit to bail on an impossible date + for ($i = 0; $i < 1000; $i++) { + + foreach (self::$order as $position) { + $part = $this->getExpression($position); + if (null === $part) { + continue; + } + + $satisfied = false; + // Get the field object used to validate this part + $field = $this->fieldFactory->getField($position); + // Check if this is singular or a list + if (strpos($part, ',') === false) { + $satisfied = $field->isSatisfiedBy($nextRun, $part); + } else { + foreach (array_map('trim', explode(',', $part)) as $listPart) { + if ($field->isSatisfiedBy($nextRun, $listPart)) { + $satisfied = true; + break; + } + } + } + + // If the field is not satisfied, then start over + if (!$satisfied) { + $field->increment($nextRun, $invert); + continue 2; + } + } + + // Skip this match if needed + if ((!$allowCurrentDate && $nextRun == $currentDate) || --$nth > -1) { + $this->fieldFactory->getField(0)->increment($nextRun, $invert); + continue; + } + + return $nextRun; + } + + // @codeCoverageIgnoreStart + throw new RuntimeException('Impossible CRON expression'); + // @codeCoverageIgnoreEnd + } +} diff --git a/lib/cron-expression/CronExpression_AbstractField.php b/lib/cron-expression/CronExpression_AbstractField.php new file mode 100755 index 00000000000..f8d5c00ae79 --- /dev/null +++ b/lib/cron-expression/CronExpression_AbstractField.php @@ -0,0 +1,100 @@ + + */ +abstract class CronExpression_AbstractField implements CronExpression_FieldInterface +{ + /** + * Check to see if a field is satisfied by a value + * + * @param string $dateValue Date value to check + * @param string $value Value to test + * + * @return bool + */ + public function isSatisfied($dateValue, $value) + { + if ($this->isIncrementsOfRanges($value)) { + return $this->isInIncrementsOfRanges($dateValue, $value); + } elseif ($this->isRange($value)) { + return $this->isInRange($dateValue, $value); + } + + return $value == '*' || $dateValue == $value; + } + + /** + * Check if a value is a range + * + * @param string $value Value to test + * + * @return bool + */ + public function isRange($value) + { + return strpos($value, '-') !== false; + } + + /** + * Check if a value is an increments of ranges + * + * @param string $value Value to test + * + * @return bool + */ + public function isIncrementsOfRanges($value) + { + return strpos($value, '/') !== false; + } + + /** + * Test if a value is within a range + * + * @param string $dateValue Set date value + * @param string $value Value to test + * + * @return bool + */ + public function isInRange($dateValue, $value) + { + $parts = array_map('trim', explode('-', $value, 2)); + + return $dateValue >= $parts[0] && $dateValue <= $parts[1]; + } + + /** + * Test if a value is within an increments of ranges (offset[-to]/step size) + * + * @param string $dateValue Set date value + * @param string $value Value to test + * + * @return bool + */ + public function isInIncrementsOfRanges($dateValue, $value) + { + $parts = array_map('trim', explode('/', $value, 2)); + $stepSize = isset($parts[1]) ? $parts[1] : 0; + if ($parts[0] == '*' || $parts[0] === '0') { + return (int) $dateValue % $stepSize == 0; + } + + $range = explode('-', $parts[0], 2); + $offset = $range[0]; + $to = isset($range[1]) ? $range[1] : $dateValue; + // Ensure that the date value is within the range + if ($dateValue < $offset || $dateValue > $to) { + return false; + } + + for ($i = $offset; $i <= $to; $i+= $stepSize) { + if ($i == $dateValue) { + return true; + } + } + + return false; + } +} diff --git a/lib/cron-expression/CronExpression_DayOfMonthField.php b/lib/cron-expression/CronExpression_DayOfMonthField.php new file mode 100755 index 00000000000..40c1d6c6e78 --- /dev/null +++ b/lib/cron-expression/CronExpression_DayOfMonthField.php @@ -0,0 +1,110 @@ + + */ +class CronExpression_DayOfMonthField extends CronExpression_AbstractField +{ + /** + * Get the nearest day of the week for a given day in a month + * + * @param int $currentYear Current year + * @param int $currentMonth Current month + * @param int $targetDay Target day of the month + * + * @return DateTime Returns the nearest date + */ + private static function getNearestWeekday($currentYear, $currentMonth, $targetDay) + { + $tday = str_pad($targetDay, 2, '0', STR_PAD_LEFT); + $target = new DateTime("$currentYear-$currentMonth-$tday"); + $currentWeekday = (int) $target->format('N'); + + if ($currentWeekday < 6) { + return $target; + } + + $lastDayOfMonth = $target->format('t'); + + foreach (array(-1, 1, -2, 2) as $i) { + $adjusted = $targetDay + $i; + if ($adjusted > 0 && $adjusted <= $lastDayOfMonth) { + $target->setDate($currentYear, $currentMonth, $adjusted); + if ($target->format('N') < 6 && $target->format('m') == $currentMonth) { + return $target; + } + } + } + } + + /** + * {@inheritdoc} + */ + public function isSatisfiedBy(DateTime $date, $value) + { + // ? states that the field value is to be skipped + if ($value == '?') { + return true; + } + + $fieldValue = $date->format('d'); + + // Check to see if this is the last day of the month + if ($value == 'L') { + return $fieldValue == $date->format('t'); + } + + // Check to see if this is the nearest weekday to a particular value + if (strpos($value, 'W')) { + // Parse the target day + $targetDay = substr($value, 0, strpos($value, 'W')); + // Find out if the current day is the nearest day of the week + return $date->format('j') == self::getNearestWeekday( + $date->format('Y'), + $date->format('m'), + $targetDay + )->format('j'); + } + + return $this->isSatisfied($date->format('d'), $value); + } + + /** + * {@inheritdoc} + */ + public function increment(DateTime $date, $invert = false) + { + if ($invert) { + $date->modify('previous day'); + $date->setTime(23, 59); + } else { + $date->modify('next day'); + $date->setTime(0, 0); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function validate($value) + { + return (bool) preg_match('/[\*,\/\-\?LW0-9A-Za-z]+/', $value); + } +} diff --git a/lib/cron-expression/CronExpression_DayOfWeekField.php b/lib/cron-expression/CronExpression_DayOfWeekField.php new file mode 100755 index 00000000000..e9f68a7cd6f --- /dev/null +++ b/lib/cron-expression/CronExpression_DayOfWeekField.php @@ -0,0 +1,124 @@ + + */ +class CronExpression_DayOfWeekField extends CronExpression_AbstractField +{ + /** + * {@inheritdoc} + */ + public function isSatisfiedBy(DateTime $date, $value) + { + if ($value == '?') { + return true; + } + + // Convert text day of the week values to integers + $value = str_ireplace( + array('SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT'), + range(0, 6), + $value + ); + + $currentYear = $date->format('Y'); + $currentMonth = $date->format('m'); + $lastDayOfMonth = $date->format('t'); + + // Find out if this is the last specific weekday of the month + if (strpos($value, 'L')) { + $weekday = str_replace('7', '0', substr($value, 0, strpos($value, 'L'))); + $tdate = clone $date; + $tdate->setDate($currentYear, $currentMonth, $lastDayOfMonth); + while ($tdate->format('w') != $weekday) { + $tdate->setDate($currentYear, $currentMonth, --$lastDayOfMonth); + } + + return $date->format('j') == $lastDayOfMonth; + } + + // Handle # hash tokens + if (strpos($value, '#')) { + list($weekday, $nth) = explode('#', $value); + // Validate the hash fields + if ($weekday < 1 || $weekday > 5) { + throw new InvalidArgumentException("Weekday must be a value between 1 and 5. {$weekday} given"); + } + if ($nth > 5) { + throw new InvalidArgumentException('There are never more than 5 of a given weekday in a month'); + } + // The current weekday must match the targeted weekday to proceed + if ($date->format('N') != $weekday) { + return false; + } + + $tdate = clone $date; + $tdate->setDate($currentYear, $currentMonth, 1); + $dayCount = 0; + $currentDay = 1; + while ($currentDay < $lastDayOfMonth + 1) { + if ($tdate->format('N') == $weekday) { + if (++$dayCount >= $nth) { + break; + } + } + $tdate->setDate($currentYear, $currentMonth, ++$currentDay); + } + + return $date->format('j') == $currentDay; + } + + // Handle day of the week values + if (strpos($value, '-')) { + $parts = explode('-', $value); + if ($parts[0] == '7') { + $parts[0] = '0'; + } elseif ($parts[1] == '0') { + $parts[1] = '7'; + } + $value = implode('-', $parts); + } + + // Test to see which Sunday to use -- 0 == 7 == Sunday + $format = in_array(7, str_split($value)) ? 'N' : 'w'; + $fieldValue = $date->format($format); + + return $this->isSatisfied($fieldValue, $value); + } + + /** + * {@inheritdoc} + */ + public function increment(DateTime $date, $invert = false) + { + if ($invert) { + $date->modify('-1 day'); + $date->setTime(23, 59, 0); + } else { + $date->modify('+1 day'); + $date->setTime(0, 0, 0); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function validate($value) + { + return (bool) preg_match('/[\*,\/\-0-9A-Z]+/', $value); + } +} diff --git a/lib/cron-expression/CronExpression_FieldFactory.php b/lib/cron-expression/CronExpression_FieldFactory.php new file mode 100755 index 00000000000..556ba1a3e31 --- /dev/null +++ b/lib/cron-expression/CronExpression_FieldFactory.php @@ -0,0 +1,55 @@ + + * @link http://en.wikipedia.org/wiki/Cron + */ +class CronExpression_FieldFactory +{ + /** + * @var array Cache of instantiated fields + */ + private $fields = array(); + + /** + * Get an instance of a field object for a cron expression position + * + * @param int $position CRON expression position value to retrieve + * + * @return CronExpression_FieldInterface + * @throws InvalidArgumentException if a position is not valid + */ + public function getField($position) + { + if (!isset($this->fields[$position])) { + switch ($position) { + case 0: + $this->fields[$position] = new CronExpression_MinutesField(); + break; + case 1: + $this->fields[$position] = new CronExpression_HoursField(); + break; + case 2: + $this->fields[$position] = new CronExpression_DayOfMonthField(); + break; + case 3: + $this->fields[$position] = new CronExpression_MonthField(); + break; + case 4: + $this->fields[$position] = new CronExpression_DayOfWeekField(); + break; + case 5: + $this->fields[$position] = new CronExpression_YearField(); + break; + default: + throw new InvalidArgumentException( + $position . ' is not a valid position' + ); + } + } + + return $this->fields[$position]; + } +} diff --git a/lib/cron-expression/CronExpression_FieldInterface.php b/lib/cron-expression/CronExpression_FieldInterface.php new file mode 100755 index 00000000000..5d5109b70d4 --- /dev/null +++ b/lib/cron-expression/CronExpression_FieldInterface.php @@ -0,0 +1,39 @@ + + */ +interface CronExpression_FieldInterface +{ + /** + * Check if the respective value of a DateTime field satisfies a CRON exp + * + * @param DateTime $date DateTime object to check + * @param string $value CRON expression to test against + * + * @return bool Returns TRUE if satisfied, FALSE otherwise + */ + public function isSatisfiedBy(DateTime $date, $value); + + /** + * When a CRON expression is not satisfied, this method is used to increment + * or decrement a DateTime object by the unit of the cron field + * + * @param DateTime $date DateTime object to change + * @param bool $invert (optional) Set to TRUE to decrement + * + * @return CronExpression_FieldInterface + */ + public function increment(DateTime $date, $invert = false); + + /** + * Validates a CRON expression for a given field + * + * @param string $value CRON expression value to validate + * + * @return bool Returns TRUE if valid, FALSE otherwise + */ + public function validate($value); +} diff --git a/lib/cron-expression/CronExpression_HoursField.php b/lib/cron-expression/CronExpression_HoursField.php new file mode 100755 index 00000000000..088ca73c719 --- /dev/null +++ b/lib/cron-expression/CronExpression_HoursField.php @@ -0,0 +1,47 @@ + + */ +class CronExpression_HoursField extends CronExpression_AbstractField +{ + /** + * {@inheritdoc} + */ + public function isSatisfiedBy(DateTime $date, $value) + { + return $this->isSatisfied($date->format('H'), $value); + } + + /** + * {@inheritdoc} + */ + public function increment(DateTime $date, $invert = false) + { + // Change timezone to UTC temporarily. This will + // allow us to go back or forwards and hour even + // if DST will be changed between the hours. + $timezone = $date->getTimezone(); + $date->setTimezone(new DateTimeZone('UTC')); + if ($invert) { + $date->modify('-1 hour'); + $date->setTime($date->format('H'), 59); + } else { + $date->modify('+1 hour'); + $date->setTime($date->format('H'), 0); + } + $date->setTimezone($timezone); + + return $this; + } + + /** + * {@inheritdoc} + */ + public function validate($value) + { + return (bool) preg_match('/[\*,\/\-0-9]+/', $value); + } +} diff --git a/lib/cron-expression/CronExpression_MinutesField.php b/lib/cron-expression/CronExpression_MinutesField.php new file mode 100755 index 00000000000..436acf2f560 --- /dev/null +++ b/lib/cron-expression/CronExpression_MinutesField.php @@ -0,0 +1,39 @@ + + */ +class CronExpression_MinutesField extends CronExpression_AbstractField +{ + /** + * {@inheritdoc} + */ + public function isSatisfiedBy(DateTime $date, $value) + { + return $this->isSatisfied($date->format('i'), $value); + } + + /** + * {@inheritdoc} + */ + public function increment(DateTime $date, $invert = false) + { + if ($invert) { + $date->modify('-1 minute'); + } else { + $date->modify('+1 minute'); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function validate($value) + { + return (bool) preg_match('/[\*,\/\-0-9]+/', $value); + } +} diff --git a/lib/cron-expression/CronExpression_MonthField.php b/lib/cron-expression/CronExpression_MonthField.php new file mode 100755 index 00000000000..d3deb129f46 --- /dev/null +++ b/lib/cron-expression/CronExpression_MonthField.php @@ -0,0 +1,55 @@ + + */ +class CronExpression_MonthField extends CronExpression_AbstractField +{ + /** + * {@inheritdoc} + */ + public function isSatisfiedBy(DateTime $date, $value) + { + // Convert text month values to integers + $value = str_ireplace( + array( + 'JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', + 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC' + ), + range(1, 12), + $value + ); + + return $this->isSatisfied($date->format('m'), $value); + } + + /** + * {@inheritdoc} + */ + public function increment(DateTime $date, $invert = false) + { + if ($invert) { + // $date->modify('last day of previous month'); // remove for php 5.2 compat + $date->modify('previous month'); + $date->modify($date->format('Y-m-t')); + $date->setTime(23, 59); + } else { + //$date->modify('first day of next month'); // remove for php 5.2 compat + $date->modify('next month'); + $date->modify($date->format('Y-m-01')); + $date->setTime(0, 0); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function validate($value) + { + return (bool) preg_match('/[\*,\/\-0-9A-Z]+/', $value); + } +} diff --git a/lib/cron-expression/CronExpression_YearField.php b/lib/cron-expression/CronExpression_YearField.php new file mode 100755 index 00000000000..f11562e4513 --- /dev/null +++ b/lib/cron-expression/CronExpression_YearField.php @@ -0,0 +1,43 @@ + + */ +class CronExpression_YearField extends CronExpression_AbstractField +{ + /** + * {@inheritdoc} + */ + public function isSatisfiedBy(DateTime $date, $value) + { + return $this->isSatisfied($date->format('Y'), $value); + } + + /** + * {@inheritdoc} + */ + public function increment(DateTime $date, $invert = false) + { + if ($invert) { + $date->modify('-1 year'); + $date->setDate($date->format('Y'), 12, 31); + $date->setTime(23, 59, 0); + } else { + $date->modify('+1 year'); + $date->setDate($date->format('Y'), 1, 1); + $date->setTime(0, 0, 0); + } + + return $this; + } + + /** + * {@inheritdoc} + */ + public function validate($value) + { + return (bool) preg_match('/[\*,\/\-0-9]+/', $value); + } +} diff --git a/lib/cron-expression/LICENSE b/lib/cron-expression/LICENSE new file mode 100755 index 00000000000..c6d88ac6c2f --- /dev/null +++ b/lib/cron-expression/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2011 Michael Dowling and contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/lib/cron-expression/README.md b/lib/cron-expression/README.md new file mode 100755 index 00000000000..d4d9d5add19 --- /dev/null +++ b/lib/cron-expression/README.md @@ -0,0 +1,92 @@ +PHP Cron Expression Parser +========================== + +[![Latest Stable Version](https://poser.pugx.org/mtdowling/cron-expression/v/stable.png)](https://packagist.org/packages/mtdowling/cron-expression) [![Total Downloads](https://poser.pugx.org/mtdowling/cron-expression/downloads.png)](https://packagist.org/packages/mtdowling/cron-expression) [![Build Status](https://secure.travis-ci.org/mtdowling/cron-expression.png)](http://travis-ci.org/mtdowling/cron-expression) + +The PHP cron expression parser can parse a CRON expression, determine if it is +due to run, calculate the next run date of the expression, and calculate the previous +run date of the expression. You can calculate dates far into the future or past by +skipping n number of matching dates. + +The parser can handle increments of ranges (e.g. */12, 2-59/3), intervals (e.g. 0-9), +lists (e.g. 1,2,3), W to find the nearest weekday for a given day of the month, L to +find the last day of the month, L to find the last given weekday of a month, and hash +(#) to find the nth weekday of a given month. + +Credits +========== + +Created by Micheal Dowling. Ported to PHP 5.2 by Flightless, Inc. +Based on version 1.0.3: https://github.com/mtdowling/cron-expression/tree/v1.0.3 + +Installing +========== + +Add the following to your project's composer.json: + +```javascript +{ + "require": { + "mtdowling/cron-expression": "1.0.*" + } +} +``` + +Usage +===== +```php +isDue(); +echo $cron->getNextRunDate()->format('Y-m-d H:i:s'); +echo $cron->getPreviousRunDate()->format('Y-m-d H:i:s'); + +// Works with complex expressions +$cron = Cron\CronExpression::factory('3-59/15 2,6-12 */15 1 2-5'); +echo $cron->getNextRunDate()->format('Y-m-d H:i:s'); + +// Calculate a run date two iterations into the future +$cron = Cron\CronExpression::factory('@daily'); +echo $cron->getNextRunDate(null, 2)->format('Y-m-d H:i:s'); + +// Calculate a run date relative to a specific time +$cron = Cron\CronExpression::factory('@monthly'); +echo $cron->getNextRunDate('2010-01-12 00:00:00')->format('Y-m-d H:i:s'); +``` + +CRON Expressions +================ + +A CRON expression is a string representing the schedule for a particular command to execute. The parts of a CRON schedule are as follows: + + * * * * * * + - - - - - - + | | | | | | + | | | | | + year [optional] + | | | | +----- day of week (0 - 7) (Sunday=0 or 7) + | | | +---------- month (1 - 12) + | | +--------------- day of month (1 - 31) + | +-------------------- hour (0 - 23) + +------------------------- min (0 - 59) + +Requirements +============ + +- PHP 5.3+ +- PHPUnit is required to run the unit tests +- Composer is required to run the unit tests + +CHANGELOG +========= + +1.0.3 (2013-11-23) +------------------ + +* Only set default timezone if the given $currentTime is not a DateTime instance (#34) +* Fixes issue #28 where PHP increments of ranges were failing due to PHP casting hyphens to 0 +* Now supports expressions with any number of extra spaces, tabs, or newlines +* Using static instead of self in `CronExpression::factory` diff --git a/license.txt b/license.txt new file mode 100644 index 00000000000..20d40b6bcec --- /dev/null +++ b/license.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file diff --git a/tests/ActionScheduler_UnitTestCase.php b/tests/ActionScheduler_UnitTestCase.php new file mode 100644 index 00000000000..f51e6ccdc7b --- /dev/null +++ b/tests/ActionScheduler_UnitTestCase.php @@ -0,0 +1,44 @@ +createResult(); + } + + if ( 'UTC' != ( $this->existing_timezone = date_default_timezone_get() ) ) { + date_default_timezone_set( 'UTC' ); + $result->run( $this ); + } + + date_default_timezone_set( 'Pacific/Fiji' ); // UTC+12 + $result->run( $this ); + + date_default_timezone_set( 'Pacific/Tahiti' ); // UTC-10: it's a magical place + $result->run( $this ); + + date_default_timezone_set( $this->existing_timezone ); + + return $result; + } +} diff --git a/tests/bootstrap.php b/tests/bootstrap.php new file mode 100644 index 00000000000..f7096db473c --- /dev/null +++ b/tests/bootstrap.php @@ -0,0 +1,31 @@ + + + + + + ./phpunit + + + + + ignore + + + + + .. + + . + + + + \ No newline at end of file diff --git a/tests/phpunit/deprecated/ActionScheduler_UnitTestCase.php b/tests/phpunit/deprecated/ActionScheduler_UnitTestCase.php new file mode 100644 index 00000000000..03901155715 --- /dev/null +++ b/tests/phpunit/deprecated/ActionScheduler_UnitTestCase.php @@ -0,0 +1,44 @@ +createResult(); + } + + if ( 'UTC' != ( $this->existing_timezone = date_default_timezone_get() ) ) { + date_default_timezone_set( 'UTC' ); + $result->run( $this ); + } + + date_default_timezone_set( 'Pacific/Fiji' ); // UTC+12 + $result->run( $this ); + + date_default_timezone_set( 'Pacific/Tahiti' ); // UTC-10: it's a magical place + $result->run( $this ); + + date_default_timezone_set( $this->existing_timezone ); + + return $result; + } +} diff --git a/tests/phpunit/jobs/ActionScheduler_Action_Test.php b/tests/phpunit/jobs/ActionScheduler_Action_Test.php new file mode 100644 index 00000000000..629f97f7c1d --- /dev/null +++ b/tests/phpunit/jobs/ActionScheduler_Action_Test.php @@ -0,0 +1,55 @@ +assertEquals( $schedule, $action->get_schedule() ); + } + + public function test_null_schedule() { + $action = new ActionScheduler_Action('my_hook'); + $this->assertInstanceOf( 'ActionScheduler_NullSchedule', $action->get_schedule() ); + } + + public function test_set_hook() { + $action = new ActionScheduler_Action('my_hook'); + $this->assertEquals( 'my_hook', $action->get_hook() ); + } + + public function test_args() { + $action = new ActionScheduler_Action('my_hook'); + $this->assertEmpty($action->get_args()); + + $action = new ActionScheduler_Action('my_hook', array(5,10,15)); + $this->assertEqualSets(array(5,10,15), $action->get_args()); + } + + public function test_set_group() { + $action = new ActionScheduler_Action('my_hook', array(), NULL, 'my_group'); + $this->assertEquals('my_group', $action->get_group()); + } + + public function test_execute() { + $mock = new MockAction(); + + $random = md5(rand()); + add_action( $random, array( $mock, 'action' ) ); + + $action = new ActionScheduler_Action( $random, array($random) ); + $action->execute(); + + remove_action( $random, array( $mock, 'action' ) ); + + $this->assertEquals( 1, $mock->get_call_count() ); + $events = $mock->get_events(); + $event = reset($events); + $this->assertEquals( $random, reset($event['args']) ); + } +} + \ No newline at end of file diff --git a/tests/phpunit/jobs/ActionScheduler_NullAction_Test.php b/tests/phpunit/jobs/ActionScheduler_NullAction_Test.php new file mode 100644 index 00000000000..d144e88e21c --- /dev/null +++ b/tests/phpunit/jobs/ActionScheduler_NullAction_Test.php @@ -0,0 +1,16 @@ +assertEmpty($action->get_hook()); + $this->assertEmpty($action->get_args()); + $this->assertNull($action->get_schedule()->next()); + } +} + \ No newline at end of file diff --git a/tests/phpunit/jobstore/ActionScheduler_wpPostStore_Test.php b/tests/phpunit/jobstore/ActionScheduler_wpPostStore_Test.php new file mode 100644 index 00000000000..d1fbed9294a --- /dev/null +++ b/tests/phpunit/jobstore/ActionScheduler_wpPostStore_Test.php @@ -0,0 +1,352 @@ +save_action($action); + + $this->assertNotEmpty($action_id); + } + + public function test_create_action_with_scheduled_date() { + $time = as_get_datetime_object( strtotime( '-1 week' ) ); + $action = new ActionScheduler_Action( 'my_hook', array(), new ActionScheduler_SimpleSchedule( $time ) ); + $store = new ActionScheduler_wpPostStore(); + + $action_id = $store->save_action( $action, $time ); + $action_date = $store->get_date( $action_id ); + + $this->assertEquals( $time->getTimestamp(), $action_date->getTimestamp() ); + } + + public function test_retrieve_action() { + $time = as_get_datetime_object(); + $schedule = new ActionScheduler_SimpleSchedule($time); + $action = new ActionScheduler_Action('my_hook', array(), $schedule, 'my_group'); + $store = new ActionScheduler_wpPostStore(); + $action_id = $store->save_action($action); + + $retrieved = $store->fetch_action($action_id); + $this->assertEquals($action->get_hook(), $retrieved->get_hook()); + $this->assertEqualSets($action->get_args(), $retrieved->get_args()); + $this->assertEquals($action->get_schedule()->next()->getTimestamp(), $retrieved->get_schedule()->next()->getTimestamp()); + $this->assertEquals($action->get_group(), $retrieved->get_group()); + } + + public function test_cancel_action() { + $time = as_get_datetime_object(); + $schedule = new ActionScheduler_SimpleSchedule($time); + $action = new ActionScheduler_Action('my_hook', array(), $schedule, 'my_group'); + $store = new ActionScheduler_wpPostStore(); + $action_id = $store->save_action($action); + $store->cancel_action( $action_id ); + + $fetched = $store->fetch_action( $action_id ); + $this->assertInstanceOf( 'ActionScheduler_CanceledAction', $fetched ); + } + + public function test_claim_actions() { + $created_actions = array(); + $store = new ActionScheduler_wpPostStore(); + for ( $i = 3 ; $i > -3 ; $i-- ) { + $time = as_get_datetime_object($i.' hours'); + $schedule = new ActionScheduler_SimpleSchedule($time); + $action = new ActionScheduler_Action('my_hook', array($i), $schedule, 'my_group'); + $created_actions[] = $store->save_action($action); + } + + $claim = $store->stake_claim(); + $this->assertInstanceof( 'ActionScheduler_ActionClaim', $claim ); + + $this->assertCount( 3, $claim->get_actions() ); + $this->assertEqualSets( array_slice( $created_actions, 3, 3 ), $claim->get_actions() ); + } + + public function test_claim_actions_order() { + $store = new ActionScheduler_wpPostStore(); + $schedule = new ActionScheduler_SimpleSchedule( as_get_datetime_object( '-1 hour' ) ); + $created_actions = array( + $store->save_action( new ActionScheduler_Action( 'my_hook', array( 1 ), $schedule, 'my_group' ) ), + $store->save_action( new ActionScheduler_Action( 'my_hook', array( 1 ), $schedule, 'my_group' ) ), + ); + + $claim = $store->stake_claim(); + $this->assertInstanceof( 'ActionScheduler_ActionClaim', $claim ); + + // Verify uniqueness of action IDs. + $this->assertEquals( 2, count( array_unique( $created_actions ) ) ); + + // Verify the count and order of the actions. + $claimed_actions = $claim->get_actions(); + $this->assertCount( 2, $claimed_actions ); + $this->assertEquals( $created_actions, $claimed_actions ); + + // Verify the reversed order doesn't pass. + $reversed_actions = array_reverse( $created_actions ); + $this->assertNotEquals( $reversed_actions, $claimed_actions ); + } + + public function test_duplicate_claim() { + $created_actions = array(); + $store = new ActionScheduler_wpPostStore(); + for ( $i = 0 ; $i > -3 ; $i-- ) { + $time = as_get_datetime_object($i.' hours'); + $schedule = new ActionScheduler_SimpleSchedule($time); + $action = new ActionScheduler_Action('my_hook', array($i), $schedule, 'my_group'); + $created_actions[] = $store->save_action($action); + } + + $claim1 = $store->stake_claim(); + $claim2 = $store->stake_claim(); + $this->assertCount( 3, $claim1->get_actions() ); + $this->assertCount( 0, $claim2->get_actions() ); + } + + public function test_release_claim() { + $created_actions = array(); + $store = new ActionScheduler_wpPostStore(); + for ( $i = 0 ; $i > -3 ; $i-- ) { + $time = as_get_datetime_object($i.' hours'); + $schedule = new ActionScheduler_SimpleSchedule($time); + $action = new ActionScheduler_Action('my_hook', array($i), $schedule, 'my_group'); + $created_actions[] = $store->save_action($action); + } + + $claim1 = $store->stake_claim(); + + $store->release_claim( $claim1 ); + + $claim2 = $store->stake_claim(); + $this->assertCount( 3, $claim2->get_actions() ); + } + + public function test_search() { + $created_actions = array(); + $store = new ActionScheduler_wpPostStore(); + for ( $i = -3 ; $i <= 3 ; $i++ ) { + $time = as_get_datetime_object($i.' hours'); + $schedule = new ActionScheduler_SimpleSchedule($time); + $action = new ActionScheduler_Action('my_hook', array($i), $schedule, 'my_group'); + $created_actions[] = $store->save_action($action); + } + + $next_no_args = $store->find_action( 'my_hook' ); + $this->assertEquals( $created_actions[0], $next_no_args ); + + $next_with_args = $store->find_action( 'my_hook', array( 'args' => array( 1 ) ) ); + $this->assertEquals( $created_actions[4], $next_with_args ); + + $non_existent = $store->find_action( 'my_hook', array( 'args' => array( 17 ) ) ); + $this->assertNull( $non_existent ); + } + + public function test_search_by_group() { + $store = new ActionScheduler_wpPostStore(); + $schedule = new ActionScheduler_SimpleSchedule(as_get_datetime_object('tomorrow')); + $abc = $store->save_action(new ActionScheduler_Action('my_hook', array(1), $schedule, 'abc')); + $def = $store->save_action(new ActionScheduler_Action('my_hook', array(1), $schedule, 'def')); + $ghi = $store->save_action(new ActionScheduler_Action('my_hook', array(1), $schedule, 'ghi')); + + $this->assertEquals( $abc, $store->find_action('my_hook', array('group' => 'abc'))); + $this->assertEquals( $def, $store->find_action('my_hook', array('group' => 'def'))); + $this->assertEquals( $ghi, $store->find_action('my_hook', array('group' => 'ghi'))); + } + + public function test_post_author() { + $current_user = get_current_user_id(); + + $time = as_get_datetime_object(); + $schedule = new ActionScheduler_SimpleSchedule($time); + $action = new ActionScheduler_Action('my_hook', array(), $schedule); + $store = new ActionScheduler_wpPostStore(); + $action_id = $store->save_action($action); + + $post = get_post($action_id); + $this->assertEquals(0, $post->post_author); + + $new_user = $this->factory->user->create_object(array( + 'user_login' => __FUNCTION__, + 'user_pass' => md5(rand()), + )); + wp_set_current_user( $new_user ); + + + $schedule = new ActionScheduler_SimpleSchedule($time); + $action = new ActionScheduler_Action('my_hook', array(), $schedule); + $action_id = $store->save_action($action); + $post = get_post($action_id); + $this->assertEquals(0, $post->post_author); + + wp_set_current_user($current_user); + } + + /** + * @issue 13 + */ + public function test_post_status_for_recurring_action() { + $time = as_get_datetime_object('10 minutes'); + $schedule = new ActionScheduler_IntervalSchedule($time, HOUR_IN_SECONDS); + $action = new ActionScheduler_Action('my_hook', array(), $schedule); + $store = new ActionScheduler_wpPostStore(); + $action_id = $store->save_action($action); + + $action = $store->fetch_action($action_id); + $action->execute(); + $store->mark_complete( $action_id ); + + $next = $action->get_schedule()->next( as_get_datetime_object() ); + $new_action_id = $store->save_action( $action, $next ); + + $this->assertEquals('publish', get_post_status($action_id)); + $this->assertEquals('pending', get_post_status($new_action_id)); + } + + public function test_get_run_date() { + $time = as_get_datetime_object('-10 minutes'); + $schedule = new ActionScheduler_IntervalSchedule($time, HOUR_IN_SECONDS); + $action = new ActionScheduler_Action('my_hook', array(), $schedule); + $store = new ActionScheduler_wpPostStore(); + $action_id = $store->save_action($action); + + $this->assertEquals( $store->get_date($action_id)->getTimestamp(), $time->getTimestamp() ); + + $action = $store->fetch_action($action_id); + $action->execute(); + $now = as_get_datetime_object(); + $store->mark_complete( $action_id ); + + $this->assertEquals( $store->get_date($action_id)->getTimestamp(), $now->getTimestamp() ); + + $next = $action->get_schedule()->next( $now ); + $new_action_id = $store->save_action( $action, $next ); + + $this->assertEquals( (int)($now->getTimestamp()) + HOUR_IN_SECONDS, $store->get_date($new_action_id)->getTimestamp() ); + } + + public function test_get_status() { + $time = as_get_datetime_object('-10 minutes'); + $schedule = new ActionScheduler_IntervalSchedule($time, HOUR_IN_SECONDS); + $action = new ActionScheduler_Action('my_hook', array(), $schedule); + $store = new ActionScheduler_wpPostStore(); + $action_id = $store->save_action($action); + + $this->assertEquals( ActionScheduler_Store::STATUS_PENDING, $store->get_status( $action_id ) ); + + $store->mark_complete( $action_id ); + $this->assertEquals( ActionScheduler_Store::STATUS_COMPLETE, $store->get_status( $action_id ) ); + + $store->mark_failure( $action_id ); + $this->assertEquals( ActionScheduler_Store::STATUS_FAILED, $store->get_status( $action_id ) ); + } + + public function test_claim_actions_by_hooks() { + $hook1 = __FUNCTION__ . '_hook_1'; + $hook2 = __FUNCTION__ . '_hook_2'; + $store = new ActionScheduler_wpPostStore(); + $schedule = new ActionScheduler_SimpleSchedule( as_get_datetime_object( '-1 hour' ) ); + + $action1 = $store->save_action( new ActionScheduler_Action( $hook1, array(), $schedule ) ); + $action2 = $store->save_action( new ActionScheduler_Action( $hook2, array(), $schedule ) ); + + // Claiming no hooks should include all actions. + $claim = $store->stake_claim( 10 ); + $this->assertEquals( 2, count( $claim->get_actions() ) ); + $this->assertTrue( in_array( $action1, $claim->get_actions() ) ); + $this->assertTrue( in_array( $action2, $claim->get_actions() ) ); + $store->release_claim( $claim ); + + // Claiming a hook should claim only actions with that hook + $claim = $store->stake_claim( 10, null, array( $hook1 ) ); + $this->assertEquals( 1, count( $claim->get_actions() ) ); + $this->assertTrue( in_array( $action1, $claim->get_actions() ) ); + $store->release_claim( $claim ); + + // Claiming two hooks should claim actions with either of those hooks + $claim = $store->stake_claim( 10, null, array( $hook1, $hook2 ) ); + $this->assertEquals( 2, count( $claim->get_actions() ) ); + $this->assertTrue( in_array( $action1, $claim->get_actions() ) ); + $this->assertTrue( in_array( $action2, $claim->get_actions() ) ); + $store->release_claim( $claim ); + + // Claiming two hooks should claim actions with either of those hooks + $claim = $store->stake_claim( 10, null, array( __METHOD__ . '_hook_3' ) ); + $this->assertEquals( 0, count( $claim->get_actions() ) ); + $this->assertFalse( in_array( $action1, $claim->get_actions() ) ); + $this->assertFalse( in_array( $action2, $claim->get_actions() ) ); + $store->release_claim( $claim ); + } + + /** + * @issue 121 + */ + public function test_claim_actions_by_group() { + $group1 = md5( rand() ); + $store = new ActionScheduler_wpPostStore(); + $schedule = new ActionScheduler_SimpleSchedule( as_get_datetime_object( '-1 hour' ) ); + + $action1 = $store->save_action( new ActionScheduler_Action( __METHOD__, array(), $schedule, $group1 ) ); + $action2 = $store->save_action( new ActionScheduler_Action( __METHOD__, array(), $schedule ) ); + + // Claiming no group should include all actions. + $claim = $store->stake_claim( 10 ); + $this->assertEquals( 2, count( $claim->get_actions() ) ); + $this->assertTrue( in_array( $action1, $claim->get_actions() ) ); + $this->assertTrue( in_array( $action2, $claim->get_actions() ) ); + $store->release_claim( $claim ); + + // Claiming a group should claim only actions in that group. + $claim = $store->stake_claim( 10, null, array(), $group1 ); + $this->assertEquals( 1, count( $claim->get_actions() ) ); + $this->assertTrue( in_array( $action1, $claim->get_actions() ) ); + $store->release_claim( $claim ); + } + + public function test_claim_actions_by_hook_and_group() { + $hook1 = __FUNCTION__ . '_hook_1'; + $hook2 = __FUNCTION__ . '_hook_2'; + $hook3 = __FUNCTION__ . '_hook_3'; + $group1 = 'group_' . md5( rand() ); + $group2 = 'group_' . md5( rand() ); + $store = new ActionScheduler_wpPostStore(); + $schedule = new ActionScheduler_SimpleSchedule( as_get_datetime_object( '-1 hour' ) ); + + $action1 = $store->save_action( new ActionScheduler_Action( $hook1, array(), $schedule, $group1 ) ); + $action2 = $store->save_action( new ActionScheduler_Action( $hook2, array(), $schedule ) ); + $action3 = $store->save_action( new ActionScheduler_Action( $hook3, array(), $schedule, $group2 ) ); + + // Claiming no hooks or group should include all actions. + $claim = $store->stake_claim( 10 ); + $this->assertEquals( 3, count( $claim->get_actions() ) ); + $this->assertTrue( in_array( $action1, $claim->get_actions() ) ); + $this->assertTrue( in_array( $action2, $claim->get_actions() ) ); + $store->release_claim( $claim ); + + // Claiming a group and hook should claim only actions in that group. + $claim = $store->stake_claim( 10, null, array( $hook1 ), $group1 ); + $this->assertEquals( 1, count( $claim->get_actions() ) ); + $this->assertTrue( in_array( $action1, $claim->get_actions() ) ); + $store->release_claim( $claim ); + + // Claiming a group and hook should claim only actions with that hook in that group. + $claim = $store->stake_claim( 10, null, array( $hook2 ), $group1 ); + $this->assertEquals( 0, count( $claim->get_actions() ) ); + $this->assertFalse( in_array( $action1, $claim->get_actions() ) ); + $this->assertFalse( in_array( $action2, $claim->get_actions() ) ); + $store->release_claim( $claim ); + + // Claiming a group and hook should claim only actions with that hook in that group. + $claim = $store->stake_claim( 10, null, array( $hook1, $hook2 ), $group2 ); + $this->assertEquals( 0, count( $claim->get_actions() ) ); + $this->assertFalse( in_array( $action1, $claim->get_actions() ) ); + $this->assertFalse( in_array( $action2, $claim->get_actions() ) ); + $store->release_claim( $claim ); + } +} diff --git a/tests/phpunit/logging/ActionScheduler_wpCommentLogger_Test.php b/tests/phpunit/logging/ActionScheduler_wpCommentLogger_Test.php new file mode 100644 index 00000000000..dbffb346c3b --- /dev/null +++ b/tests/phpunit/logging/ActionScheduler_wpCommentLogger_Test.php @@ -0,0 +1,166 @@ +assertInstanceOf( 'ActionScheduler_Logger', $logger ); + $this->assertInstanceOf( 'ActionScheduler_wpCommentLogger', $logger ); + } + + public function test_add_log_entry() { + $action_id = wc_schedule_single_action( time(), 'a hook' ); + $logger = ActionScheduler::logger(); + $message = 'Logging that something happened'; + $log_id = $logger->log( $action_id, $message ); + $entry = $logger->get_entry( $log_id ); + + $this->assertEquals( $action_id, $entry->get_action_id() ); + $this->assertEquals( $message, $entry->get_message() ); + } + + public function test_null_log_entry() { + $logger = ActionScheduler::logger(); + $entry = $logger->get_entry( 1 ); + $this->assertEquals( '', $entry->get_action_id() ); + $this->assertEquals( '', $entry->get_message() ); + } + + public function test_erroneous_entry_id() { + $comment = wp_insert_comment(array( + 'comment_post_ID' => 1, + 'comment_author' => 'test', + 'comment_content' => 'this is not a log entry', + )); + $logger = ActionScheduler::logger(); + $entry = $logger->get_entry( $comment ); + $this->assertEquals( '', $entry->get_action_id() ); + $this->assertEquals( '', $entry->get_message() ); + } + + public function test_storage_comments() { + $action_id = wc_schedule_single_action( time(), 'a hook' ); + $logger = ActionScheduler::logger(); + $logs = $logger->get_logs( $action_id ); + $expected = new ActionScheduler_LogEntry( $action_id, 'action created' ); + $this->assertTrue( in_array( $this->log_entry_to_array( $expected ) , $this->log_entry_to_array( $logs ) ) ); + } + + protected function log_entry_to_array( $logs ) { + if ( $logs instanceof ActionScheduler_LogEntry ) { + return array( 'action_id' => $logs->get_action_id(), 'message' => $logs->get_message() ); + } + + foreach ( $logs as $id => $log) { + $logs[ $id ] = array( 'action_id' => $log->get_action_id(), 'message' => $log->get_message() ); + } + + return $logs; + } + + public function test_execution_comments() { + $action_id = wc_schedule_single_action( time(), 'a hook' ); + $logger = ActionScheduler::logger(); + $started = new ActionScheduler_LogEntry( $action_id, 'action started' ); + $finished = new ActionScheduler_LogEntry( $action_id, 'action complete' ); + + $runner = new ActionScheduler_QueueRunner(); + $runner->run(); + + $logs = $logger->get_logs( $action_id ); + $this->assertTrue( in_array( $this->log_entry_to_array( $started ), $this->log_entry_to_array( $logs ) ) ); + $this->assertTrue( in_array( $this->log_entry_to_array( $finished ), $this->log_entry_to_array( $logs ) ) ); + } + + public function test_failed_execution_comments() { + $hook = md5(rand()); + add_action( $hook, array( $this, '_a_hook_callback_that_throws_an_exception' ) ); + $action_id = wc_schedule_single_action( time(), $hook ); + $logger = ActionScheduler::logger(); + $started = new ActionScheduler_LogEntry( $action_id, 'action started' ); + $finished = new ActionScheduler_LogEntry( $action_id, 'action complete' ); + $failed = new ActionScheduler_LogEntry( $action_id, 'action failed: Execution failed' ); + + $runner = new ActionScheduler_QueueRunner(); + $runner->run(); + + $logs = $logger->get_logs( $action_id ); + $this->assertTrue( in_array( $this->log_entry_to_array( $started ), $this->log_entry_to_array( $logs ) ) ); + $this->assertFalse( in_array( $this->log_entry_to_array( $finished ), $this->log_entry_to_array( $logs ) ) ); + $this->assertTrue( in_array( $this->log_entry_to_array( $failed ), $this->log_entry_to_array( $logs ) ) ); + } + + public function test_fatal_error_comments() { + $hook = md5(rand()); + $action_id = wc_schedule_single_action( time(), $hook ); + $logger = ActionScheduler::logger(); + do_action( 'action_scheduler_unexpected_shutdown', $action_id, array( + 'type' => E_ERROR, + 'message' => 'Test error', + 'file' => __FILE__, + 'line' => __LINE__, + )); + + $logs = $logger->get_logs( $action_id ); + $found_log = FALSE; + foreach ( $logs as $l ) { + if ( strpos( $l->get_message(), 'unexpected shutdown' ) === 0 ) { + $found_log = TRUE; + } + } + $this->assertTrue( $found_log, 'Unexpected shutdown log not found' ); + } + + public function test_canceled_action_comments() { + $action_id = wc_schedule_single_action( time(), 'a hook' ); + wc_unschedule_action( 'a hook' ); + $logger = ActionScheduler::logger(); + $logs = $logger->get_logs( $action_id ); + $expected = new ActionScheduler_LogEntry( $action_id, 'action canceled' ); + $this->assertTrue( in_array( $this->log_entry_to_array( $expected ), $this->log_entry_to_array( $logs ) ) ); + } + + public function _a_hook_callback_that_throws_an_exception() { + throw new RuntimeException('Execution failed'); + } + + public function test_filtering_of_get_comments() { + $post_id = $this->factory->post->create_object(array( + 'post_title' => __FUNCTION__, + )); + $comment_id = $this->factory->comment->create_object(array( + 'comment_post_ID' => $post_id, + 'comment_author' => __CLASS__, + 'comment_content' => __FUNCTION__, + )); + + // Verify that we're getting the expected comment before we add logging comments + $comments = get_comments(); + $this->assertCount( 1, $comments ); + $this->assertEquals( $comment_id, $comments[0]->comment_ID ); + + + $action_id = wc_schedule_single_action( time(), 'a hook' ); + $logger = ActionScheduler::logger(); + $message = 'Logging that something happened'; + $log_id = $logger->log( $action_id, $message ); + + + // Verify that logging comments are excluded from general comment queries + $comments = get_comments(); + $this->assertCount( 1, $comments ); + $this->assertEquals( $comment_id, $comments[0]->comment_ID ); + + // Verify that logging comments are returned when asking for them specifically + $comments = get_comments(array( + 'type' => ActionScheduler_wpCommentLogger::TYPE, + )); + // Expecting two: one when the action is created, another when we added our custom log + $this->assertCount( 2, $comments ); + $this->assertContains( $log_id, wp_list_pluck($comments, 'comment_ID')); + } +} + diff --git a/tests/phpunit/procedural_api/procedural_api_Test.php b/tests/phpunit/procedural_api/procedural_api_Test.php new file mode 100644 index 00000000000..1c178def444 --- /dev/null +++ b/tests/phpunit/procedural_api/procedural_api_Test.php @@ -0,0 +1,142 @@ +fetch_action($action_id); + $this->assertEquals( $time, $action->get_schedule()->next()->getTimestamp() ); + $this->assertEquals( $hook, $action->get_hook() ); + } + + public function test_recurring_action() { + $time = time(); + $hook = md5(rand()); + $action_id = wc_schedule_recurring_action( $time, HOUR_IN_SECONDS, $hook ); + + $store = ActionScheduler::store(); + $action = $store->fetch_action($action_id); + $this->assertEquals( $time, $action->get_schedule()->next()->getTimestamp() ); + $this->assertEquals( $time + HOUR_IN_SECONDS + 2, $action->get_schedule()->next(as_get_datetime_object($time + 2))->getTimestamp()); + $this->assertEquals( $hook, $action->get_hook() ); + } + + public function test_cron_schedule() { + $time = as_get_datetime_object('2014-01-01'); + $hook = md5(rand()); + $action_id = wc_schedule_cron_action( $time->getTimestamp(), '0 0 10 10 *', $hook ); + + $store = ActionScheduler::store(); + $action = $store->fetch_action($action_id); + $expected_date = as_get_datetime_object('2014-10-10'); + $this->assertEquals( $expected_date->getTimestamp(), $action->get_schedule()->next()->getTimestamp() ); + $this->assertEquals( $hook, $action->get_hook() ); + } + + public function test_get_next() { + $time = as_get_datetime_object('tomorrow'); + $hook = md5(rand()); + wc_schedule_recurring_action( $time->getTimestamp(), HOUR_IN_SECONDS, $hook ); + + $next = wc_next_scheduled_action( $hook ); + + $this->assertEquals( $time->getTimestamp(), $next ); + } + + public function test_unschedule() { + $time = time(); + $hook = md5(rand()); + $action_id = wc_schedule_single_action( $time, $hook ); + + wc_unschedule_action( $hook ); + + $next = wc_next_scheduled_action( $hook ); + $this->assertFalse($next); + + $store = ActionScheduler::store(); + $action = $store->fetch_action($action_id); + + $this->assertNull($action->get_schedule()->next()); + $this->assertEquals($hook, $action->get_hook() ); + } + + public function test_as_get_datetime_object_default() { + + $utc_now = new ActionScheduler_DateTime(null, new DateTimeZone('UTC')); + $as_now = as_get_datetime_object(); + + // Don't want to use 'U' as timestamps will always be in UTC + $this->assertEquals($utc_now->format('Y-m-d H:i:s'),$as_now->format('Y-m-d H:i:s')); + } + + public function test_as_get_datetime_object_relative() { + + $utc_tomorrow = new ActionScheduler_DateTime('tomorrow', new DateTimeZone('UTC')); + $as_tomorrow = as_get_datetime_object('tomorrow'); + + $this->assertEquals($utc_tomorrow->format('Y-m-d H:i:s'),$as_tomorrow->format('Y-m-d H:i:s')); + + $utc_tomorrow = new ActionScheduler_DateTime('yesterday', new DateTimeZone('UTC')); + $as_tomorrow = as_get_datetime_object('yesterday'); + + $this->assertEquals($utc_tomorrow->format('Y-m-d H:i:s'),$as_tomorrow->format('Y-m-d H:i:s')); + } + + public function test_as_get_datetime_object_fixed() { + + $utc_tomorrow = new ActionScheduler_DateTime('29 February 2016', new DateTimeZone('UTC')); + $as_tomorrow = as_get_datetime_object('29 February 2016'); + + $this->assertEquals($utc_tomorrow->format('Y-m-d H:i:s'),$as_tomorrow->format('Y-m-d H:i:s')); + + $utc_tomorrow = new ActionScheduler_DateTime('1st January 2024', new DateTimeZone('UTC')); + $as_tomorrow = as_get_datetime_object('1st January 2024'); + + $this->assertEquals($utc_tomorrow->format('Y-m-d H:i:s'),$as_tomorrow->format('Y-m-d H:i:s')); + } + + public function test_as_get_datetime_object_timezone() { + + $timezone_au = 'Australia/Brisbane'; + $timezone_default = date_default_timezone_get(); + + date_default_timezone_set( $timezone_au ); + + $au_now = new ActionScheduler_DateTime(null); + $as_now = as_get_datetime_object(); + + // Make sure they're for the same time + $this->assertEquals($au_now->getTimestamp(),$as_now->getTimestamp()); + + // But not in the same timezone, as $as_now should be using UTC + $this->assertNotEquals($au_now->format('Y-m-d H:i:s'),$as_now->format('Y-m-d H:i:s')); + + $au_now = new ActionScheduler_DateTime(null); + $as_au_now = as_get_datetime_object(); + + $this->assertEquals($au_now->getTimestamp(),$as_now->getTimestamp()); + + // But not in the same timezone, as $as_now should be using UTC + $this->assertNotEquals($au_now->format('Y-m-d H:i:s'),$as_now->format('Y-m-d H:i:s')); + + // Just in cases + date_default_timezone_set( $timezone_default ); + } + + public function test_as_get_datetime_object_type() { + $f = 'Y-m-d H:i:s'; + $now = as_get_datetime_object(); + $this->assertInstanceOf( 'ActionScheduler_DateTime', $now ); + + $dateTime = new DateTime( 'now', new DateTimeZone( 'UTC' ) ); + $asDateTime = as_get_datetime_object( $dateTime ); + $this->assertEquals( $dateTime->format( $f ), $asDateTime->format( $f ) ); + } +} diff --git a/tests/phpunit/procedural_api/wc_get_scheduled_actions_Test.php b/tests/phpunit/procedural_api/wc_get_scheduled_actions_Test.php new file mode 100644 index 00000000000..ee2bbfba157 --- /dev/null +++ b/tests/phpunit/procedural_api/wc_get_scheduled_actions_Test.php @@ -0,0 +1,100 @@ +hooks[$i] = md5(rand()); + $this->args[$i] = md5(rand()); + $this->groups[$i] = md5(rand()); + } + + for ( $i = 0 ; $i < 10 ; $i++ ) { + for ( $j = 0 ; $j < 10 ; $j++ ) { + $schedule = new ActionScheduler_SimpleSchedule( as_get_datetime_object( $j - 3 . 'days') ); + $group = $this->groups[ ( $i + $j ) % 10 ]; + $action = new ActionScheduler_Action( $this->hooks[$i], array($this->args[$j]), $schedule, $group ); + $store->save_action( $action ); + } + } + } + + public function test_date_queries() { + $actions = wc_get_scheduled_actions(array( + 'date' => as_get_datetime_object(gmdate('Y-m-d 00:00:00')), + 'per_page' => -1, + ), 'ids'); + $this->assertCount(30, $actions); + + $actions = wc_get_scheduled_actions(array( + 'date' => as_get_datetime_object(gmdate('Y-m-d 00:00:00')), + 'date_compare' => '>=', + 'per_page' => -1, + ), 'ids'); + $this->assertCount(70, $actions); + } + + public function test_hook_queries() { + $actions = wc_get_scheduled_actions(array( + 'hook' => $this->hooks[2], + 'per_page' => -1, + ), 'ids'); + $this->assertCount(10, $actions); + + $actions = wc_get_scheduled_actions(array( + 'hook' => $this->hooks[2], + 'date' => as_get_datetime_object(gmdate('Y-m-d 00:00:00')), + 'per_page' => -1, + ), 'ids'); + $this->assertCount(3, $actions); + } + + public function test_args_queries() { + $actions = wc_get_scheduled_actions(array( + 'args' => array($this->args[5]), + 'per_page' => -1, + ), 'ids'); + $this->assertCount(10, $actions); + + $actions = wc_get_scheduled_actions(array( + 'args' => array($this->args[5]), + 'hook' => $this->hooks[3], + 'per_page' => -1, + ), 'ids'); + $this->assertCount(1, $actions); + + $actions = wc_get_scheduled_actions(array( + 'args' => array($this->args[5]), + 'hook' => $this->hooks[3], + 'date' => as_get_datetime_object(gmdate('Y-m-d 00:00:00')), + 'per_page' => -1, + ), 'ids'); + $this->assertCount(0, $actions); + } + + public function test_group_queries() { + $actions = wc_get_scheduled_actions(array( + 'group' => $this->groups[1], + 'per_page' => -1, + ), 'ids'); + $this->assertCount(10, $actions); + + $actions = wc_get_scheduled_actions(array( + 'group' => $this->groups[1], + 'hook' => $this->hooks[9], + 'per_page' => -1, + ), 'ids'); + $this->assertCount(1, $actions); + } +} + \ No newline at end of file diff --git a/tests/phpunit/runner/ActionScheduler_QueueCleaner_Test.php b/tests/phpunit/runner/ActionScheduler_QueueCleaner_Test.php new file mode 100644 index 00000000000..401a1d676e1 --- /dev/null +++ b/tests/phpunit/runner/ActionScheduler_QueueCleaner_Test.php @@ -0,0 +1,151 @@ +save_action( $action ); + } + + $runner->run(); + + add_filter( 'action_scheduler_retention_period', '__return_zero' ); // delete any finished job + $cleaner = new ActionScheduler_QueueCleaner( $store ); + $cleaner->delete_old_actions(); + remove_filter( 'action_scheduler_retention_period', '__return_zero' ); + + foreach ( $created_actions as $action_id ) { + $action = $store->fetch_action($action_id); + $this->assertFalse($action->is_finished()); // it's a NullAction + } + } + + public function test_delete_canceled_actions() { + $store = ActionScheduler::store(); + + $random = md5(rand()); + $schedule = new ActionScheduler_SimpleSchedule(as_get_datetime_object('1 day ago')); + + $created_actions = array(); + for ( $i = 0 ; $i < 5 ; $i++ ) { + $action = new ActionScheduler_Action( $random, array($random), $schedule ); + $action_id = $store->save_action( $action ); + $store->cancel_action( $action_id ); + $created_actions[] = $action_id; + } + + // track the actions that are deleted + $mock_action = new MockAction(); + add_action( 'action_scheduler_deleted_action', array( $mock_action, 'action' ), 10, 1 ); + add_filter( 'action_scheduler_retention_period', '__return_zero' ); // delete any finished job + + $cleaner = new ActionScheduler_QueueCleaner( $store ); + $cleaner->delete_old_actions(); + + remove_filter( 'action_scheduler_retention_period', '__return_zero' ); + remove_action( 'action_scheduler_deleted_action', array( $mock_action, 'action' ), 10 ); + + $deleted_actions = array_map( 'reset', $mock_action->get_args() ); + $this->assertEqualSets( $created_actions, $deleted_actions ); + } + + public function test_do_not_delete_recent_actions() { + $store = ActionScheduler::store(); + $runner = new ActionScheduler_QueueRunner( $store ); + + $random = md5(rand()); + $schedule = new ActionScheduler_SimpleSchedule(as_get_datetime_object('1 day ago')); + + $created_actions = array(); + for ( $i = 0 ; $i < 5 ; $i++ ) { + $action = new ActionScheduler_Action( $random, array($random), $schedule ); + $created_actions[] = $store->save_action( $action ); + } + + $runner->run(); + + $cleaner = new ActionScheduler_QueueCleaner( $store ); + $cleaner->delete_old_actions(); + + foreach ( $created_actions as $action_id ) { + $action = $store->fetch_action($action_id); + $this->assertTrue($action->is_finished()); // It's a FinishedAction + } + } + + public function test_reset_unrun_actions() { + $store = ActionScheduler::store(); + + $random = md5(rand()); + $schedule = new ActionScheduler_SimpleSchedule(as_get_datetime_object('1 day ago')); + + $created_actions = array(); + for ( $i = 0 ; $i < 5 ; $i++ ) { + $action = new ActionScheduler_Action( $random, array($random), $schedule ); + $created_actions[] = $store->save_action( $action ); + } + + $store->stake_claim(10); + + // don't actually process the jobs, to simulate a request that timed out + + add_filter( 'action_scheduler_timeout_period', '__return_zero' ); // delete any finished job + $cleaner = new ActionScheduler_QueueCleaner( $store ); + $cleaner->reset_timeouts(); + + remove_filter( 'action_scheduler_timeout_period', '__return_zero' ); + + $claim = $store->stake_claim(10); + $this->assertEqualSets($created_actions, $claim->get_actions()); + } + + public function test_do_not_reset_failed_action() { + $store = ActionScheduler::store(); + + $random = md5(rand()); + $schedule = new ActionScheduler_SimpleSchedule(as_get_datetime_object('1 day ago')); + + $created_actions = array(); + for ( $i = 0 ; $i < 5 ; $i++ ) { + $action = new ActionScheduler_Action( $random, array($random), $schedule ); + $created_actions[] = $store->save_action( $action ); + } + + $claim = $store->stake_claim(10); + foreach ( $claim->get_actions() as $action_id ) { + // simulate the first action interrupted by an uncatchable fatal error + $store->log_execution( $action_id ); + break; + } + + add_filter( 'action_scheduler_timeout_period', '__return_zero' ); // delete any finished job + $cleaner = new ActionScheduler_QueueCleaner( $store ); + $cleaner->reset_timeouts(); + remove_filter( 'action_scheduler_timeout_period', '__return_zero' ); + + $new_claim = $store->stake_claim(10); + $this->assertCount( 4, $new_claim->get_actions() ); + + add_filter( 'action_scheduler_failure_period', '__return_zero' ); + $cleaner->mark_failures(); + remove_filter( 'action_scheduler_failure_period', '__return_zero' ); + + $failed = $store->query_actions(array('status' => ActionScheduler_Store::STATUS_FAILED)); + $this->assertEquals( $created_actions[0], $failed[0] ); + $this->assertCount( 1, $failed ); + + + } +} + \ No newline at end of file diff --git a/tests/phpunit/runner/ActionScheduler_QueueRunner_Test.php b/tests/phpunit/runner/ActionScheduler_QueueRunner_Test.php new file mode 100644 index 00000000000..75acf218c6b --- /dev/null +++ b/tests/phpunit/runner/ActionScheduler_QueueRunner_Test.php @@ -0,0 +1,209 @@ +run(); + + $this->assertEquals( 0, $actions_run ); + } + + public function test_run() { + $store = ActionScheduler::store(); + $runner = new ActionScheduler_QueueRunner( $store ); + + $mock = new MockAction(); + $random = md5(rand()); + add_action( $random, array( $mock, 'action' ) ); + $schedule = new ActionScheduler_SimpleSchedule(as_get_datetime_object('1 day ago')); + + for ( $i = 0 ; $i < 5 ; $i++ ) { + $action = new ActionScheduler_Action( $random, array($random), $schedule ); + $store->save_action( $action ); + } + + $actions_run = $runner->run(); + + remove_action( $random, array( $mock, 'action' ) ); + + $this->assertEquals( 5, $mock->get_call_count() ); + $this->assertEquals( 5, $actions_run ); + } + + public function test_run_with_future_actions() { + $store = ActionScheduler::store(); + $runner = new ActionScheduler_QueueRunner( $store ); + + $mock = new MockAction(); + $random = md5(rand()); + add_action( $random, array( $mock, 'action' ) ); + $schedule = new ActionScheduler_SimpleSchedule(as_get_datetime_object('1 day ago')); + + for ( $i = 0 ; $i < 3 ; $i++ ) { + $action = new ActionScheduler_Action( $random, array($random), $schedule ); + $store->save_action( $action ); + } + + $schedule = new ActionScheduler_SimpleSchedule(as_get_datetime_object('tomorrow')); + for ( $i = 0 ; $i < 3 ; $i++ ) { + $action = new ActionScheduler_Action( $random, array($random), $schedule ); + $store->save_action( $action ); + } + + $actions_run = $runner->run(); + + remove_action( $random, array( $mock, 'action' ) ); + + $this->assertEquals( 3, $mock->get_call_count() ); + $this->assertEquals( 3, $actions_run ); + } + + public function test_completed_action_status() { + $store = ActionScheduler::store(); + $runner = new ActionScheduler_QueueRunner( $store ); + + $random = md5(rand()); + $schedule = new ActionScheduler_SimpleSchedule(as_get_datetime_object('12 hours ago')); + + $action = new ActionScheduler_Action( $random, array(), $schedule ); + $action_id = $store->save_action( $action ); + + $runner->run(); + + $finished_action = $store->fetch_action( $action_id ); + + $this->assertTrue( $finished_action->is_finished() ); + } + + public function test_next_instance_of_action() { + $store = ActionScheduler::store(); + $runner = new ActionScheduler_QueueRunner( $store ); + + $random = md5(rand()); + $schedule = new ActionScheduler_IntervalSchedule(as_get_datetime_object('12 hours ago'), DAY_IN_SECONDS); + + $action = new ActionScheduler_Action( $random, array(), $schedule ); + $store->save_action( $action ); + + $runner->run(); + + $claim = $store->stake_claim(10, as_get_datetime_object((DAY_IN_SECONDS - 60).' seconds')); + $this->assertCount(0, $claim->get_actions()); + + $claim = $store->stake_claim(10, as_get_datetime_object(DAY_IN_SECONDS.' seconds')); + $actions = $claim->get_actions(); + $this->assertCount(1, $actions); + + $action_id = reset($actions); + $new_action = $store->fetch_action($action_id); + + + $this->assertEquals( $random, $new_action->get_hook() ); + $this->assertEquals( $schedule->next(as_get_datetime_object())->getTimestamp(), $new_action->get_schedule()->next(as_get_datetime_object())->getTimestamp() ); + } + + public function test_hooked_into_wp_cron() { + $next = wp_next_scheduled( ActionScheduler_QueueRunner::WP_CRON_HOOK ); + $this->assertNotEmpty($next); + } + + public function test_batch_count_limit() { + $store = ActionScheduler::store(); + $runner = new ActionScheduler_QueueRunner( $store ); + + $mock = new MockAction(); + $random = md5(rand()); + add_action( $random, array( $mock, 'action' ) ); + $schedule = new ActionScheduler_SimpleSchedule(new ActionScheduler_DateTime('1 day ago')); + + for ( $i = 0 ; $i < 30 ; $i++ ) { + $action = new ActionScheduler_Action( $random, array($random), $schedule ); + $store->save_action( $action ); + } + + $claims = array(); + + for ( $i = 0 ; $i < 5 ; $i++ ) { + $claims[] = $store->stake_claim( 5 ); + } + + $actions_run = $runner->run(); + + + $this->assertEquals( 0, $mock->get_call_count() ); + $this->assertEquals( 0, $actions_run ); + + $first = reset($claims); + $store->release_claim( $first ); + + $actions_run = $runner->run(); + $this->assertEquals( 10, $mock->get_call_count() ); + $this->assertEquals( 10, $actions_run ); + + remove_action( $random, array( $mock, 'action' ) ); + } + + public function test_changing_batch_count_limit() { + $store = ActionScheduler::store(); + $runner = new ActionScheduler_QueueRunner( $store ); + + $random = md5(rand()); + $schedule = new ActionScheduler_SimpleSchedule(new ActionScheduler_DateTime('1 day ago')); + + for ( $i = 0 ; $i < 30 ; $i++ ) { + $action = new ActionScheduler_Action( $random, array($random), $schedule ); + $store->save_action( $action ); + } + + $claims = array(); + + for ( $i = 0 ; $i < 5 ; $i++ ) { + $claims[] = $store->stake_claim( 5 ); + } + + $mock1 = new MockAction(); + add_action( $random, array( $mock1, 'action' ) ); + $actions_run = $runner->run(); + remove_action( $random, array( $mock1, 'action' ) ); + + $this->assertEquals( 0, $mock1->get_call_count() ); + $this->assertEquals( 0, $actions_run ); + + + add_filter( 'action_scheduler_queue_runner_concurrent_batches', array( $this, 'return_6' ) ); + + $mock2 = new MockAction(); + add_action( $random, array( $mock2, 'action' ) ); + $actions_run = $runner->run(); + remove_action( $random, array( $mock2, 'action' ) ); + + $this->assertEquals( 5, $mock2->get_call_count() ); + $this->assertEquals( 5, $actions_run ); + + remove_filter( 'action_scheduler_queue_runner_concurrent_batches', array( $this, 'return_6' ) ); + + for ( $i = 0 ; $i < 5 ; $i++ ) { // to make up for the actions we just processed + $action = new ActionScheduler_Action( $random, array($random), $schedule ); + $store->save_action( $action ); + } + + $mock3 = new MockAction(); + add_action( $random, array( $mock3, 'action' ) ); + $actions_run = $runner->run(); + remove_action( $random, array( $mock3, 'action' ) ); + + $this->assertEquals( 0, $mock3->get_call_count() ); + $this->assertEquals( 0, $actions_run ); + + remove_filter( 'action_scheduler_queue_runner_concurrent_batches', array( $this, 'return_6' ) ); + } + + public function return_6() { + return 6; + } +} diff --git a/tests/phpunit/schedules/ActionScheduler_CronSchedule_Test.php b/tests/phpunit/schedules/ActionScheduler_CronSchedule_Test.php new file mode 100644 index 00000000000..4d1ee9a7991 --- /dev/null +++ b/tests/phpunit/schedules/ActionScheduler_CronSchedule_Test.php @@ -0,0 +1,45 @@ +assertEquals( $time, $schedule->next() ); + } + + public function test_next() { + $time = as_get_datetime_object('2013-06-14'); + $cron = CronExpression::factory('@daily'); + $schedule = new ActionScheduler_CronSchedule($time, $cron); + $this->assertEquals( as_get_datetime_object('tomorrow'), $schedule->next( as_get_datetime_object() ) ); + } + + public function test_is_recurring() { + $schedule = new ActionScheduler_CronSchedule(as_get_datetime_object('2013-06-14'), CronExpression::factory('@daily')); + $this->assertTrue( $schedule->is_recurring() ); + } + + public function test_cron_format() { + $time = as_get_datetime_object('2014-01-01'); + $cron = CronExpression::factory('0 0 10 10 *'); + $schedule = new ActionScheduler_CronSchedule($time, $cron); + $this->assertEquals( as_get_datetime_object('2014-10-10'), $schedule->next() ); + + $cron = CronExpression::factory('0 0 L 1/2 *'); + $schedule = new ActionScheduler_CronSchedule($time, $cron); + $this->assertEquals( as_get_datetime_object('2014-01-31'), $schedule->next() ); + $this->assertEquals( as_get_datetime_object('2014-07-31'), $schedule->next( as_get_datetime_object('2014-06-01') ) ); + $this->assertEquals( as_get_datetime_object('2028-11-30'), $schedule->next( as_get_datetime_object('2028-11-01') ) ); + + $cron = CronExpression::factory('30 14 * * MON#3 *'); + $schedule = new ActionScheduler_CronSchedule($time, $cron); + $this->assertEquals( as_get_datetime_object('2014-01-20 14:30:00'), $schedule->next() ); + $this->assertEquals( as_get_datetime_object('2014-05-19 14:30:00'), $schedule->next( as_get_datetime_object('2014-05-01') ) ); + } +} + \ No newline at end of file diff --git a/tests/phpunit/schedules/ActionScheduler_IntervalSchedule_Test.php b/tests/phpunit/schedules/ActionScheduler_IntervalSchedule_Test.php new file mode 100644 index 00000000000..2f68ccb2023 --- /dev/null +++ b/tests/phpunit/schedules/ActionScheduler_IntervalSchedule_Test.php @@ -0,0 +1,28 @@ +assertEquals( $time, $schedule->next() ); + } + + public function test_next() { + $now = time(); + $start = $now - 30; + $schedule = new ActionScheduler_IntervalSchedule( as_get_datetime_object("@$start"), MINUTE_IN_SECONDS ); + $this->assertEquals( $start, $schedule->next()->getTimestamp() ); + $this->assertEquals( $now + MINUTE_IN_SECONDS, $schedule->next(as_get_datetime_object())->getTimestamp() ); + $this->assertEquals( $start, $schedule->next(as_get_datetime_object("@$start"))->getTimestamp() ); + } + + public function test_is_recurring() { + $start = time() - 30; + $schedule = new ActionScheduler_IntervalSchedule( as_get_datetime_object("@$start"), MINUTE_IN_SECONDS ); + $this->assertTrue( $schedule->is_recurring() ); + } +} diff --git a/tests/phpunit/schedules/ActionScheduler_NullSchedule_Test.php b/tests/phpunit/schedules/ActionScheduler_NullSchedule_Test.php new file mode 100644 index 00000000000..cd2c601061b --- /dev/null +++ b/tests/phpunit/schedules/ActionScheduler_NullSchedule_Test.php @@ -0,0 +1,18 @@ +assertNull( $schedule->next() ); + } + + public function test_is_recurring() { + $schedule = new ActionScheduler_NullSchedule(); + $this->assertFalse( $schedule->is_recurring() ); + } +} + \ No newline at end of file diff --git a/tests/phpunit/schedules/ActionScheduler_SimpleSchedule_Test.php b/tests/phpunit/schedules/ActionScheduler_SimpleSchedule_Test.php new file mode 100644 index 00000000000..022dd66aadc --- /dev/null +++ b/tests/phpunit/schedules/ActionScheduler_SimpleSchedule_Test.php @@ -0,0 +1,37 @@ +assertEquals( $time, $schedule->next() ); + } + + public function test_past_date() { + $time = as_get_datetime_object('-1 day'); + $schedule = new ActionScheduler_SimpleSchedule($time); + $this->assertEquals( $time, $schedule->next() ); + } + + public function test_future_date() { + $time = as_get_datetime_object('+1 day'); + $schedule = new ActionScheduler_SimpleSchedule($time); + $this->assertEquals( $time, $schedule->next() ); + } + + public function test_grace_period_for_next() { + $time = as_get_datetime_object('3 seconds ago'); + $schedule = new ActionScheduler_SimpleSchedule($time); + $this->assertEquals( $time, $schedule->next() ); + } + + public function test_is_recurring() { + $schedule = new ActionScheduler_SimpleSchedule(as_get_datetime_object('+1 day')); + $this->assertFalse( $schedule->is_recurring() ); + } +} + \ No newline at end of file diff --git a/tests/phpunit/versioning/ActionScheduler_Versions_Test.php b/tests/phpunit/versioning/ActionScheduler_Versions_Test.php new file mode 100644 index 00000000000..9e79e024595 --- /dev/null +++ b/tests/phpunit/versioning/ActionScheduler_Versions_Test.php @@ -0,0 +1,43 @@ +register('1.0-dev', 'callback_1_dot_0_dev'); + $versions->register('1.0', 'callback_1_dot_0'); + + $registered = $versions->get_versions(); + + $this->assertArrayHasKey( '1.0-dev', $registered ); + $this->assertArrayHasKey( '1.0', $registered ); + $this->assertCount( 2, $registered ); + + $this->assertEquals( 'callback_1_dot_0_dev', $registered['1.0-dev'] ); + } + + public function test_duplicate_version() { + $versions = new ActionScheduler_Versions(); + $versions->register('1.0', 'callback_1_dot_0_a'); + $versions->register('1.0', 'callback_1_dot_0_b'); + + $registered = $versions->get_versions(); + + $this->assertArrayHasKey( '1.0', $registered ); + $this->assertCount( 1, $registered ); + } + + public function test_latest_version() { + $versions = new ActionScheduler_Versions(); + $this->assertEquals('__return_null', $versions->latest_version_callback() ); + $versions->register('1.2', 'callback_1_dot_2'); + $versions->register('1.3', 'callback_1_dot_3'); + $versions->register('1.0', 'callback_1_dot_0'); + + $this->assertEquals( '1.3', $versions->latest_version() ); + $this->assertEquals( 'callback_1_dot_3', $versions->latest_version_callback() ); + } +} + \ No newline at end of file diff --git a/tests/travis/setup.sh b/tests/travis/setup.sh new file mode 100755 index 00000000000..068198af5f5 --- /dev/null +++ b/tests/travis/setup.sh @@ -0,0 +1,38 @@ +#!/bin/sh + +# WordPress test setup script for Travis CI +# +# Author: Benjamin J. Balter ( ben@balter.com | ben.balter.com ) +# License: GPL3 + +export WP_CORE_DIR=/tmp/wordpress +export WP_TESTS_DIR=/tmp/wordpress-tests/tests/phpunit + +if [[ "$1" = "5.6" || "$1" > "5.6" ]] +then + wget -c https://phar.phpunit.de/phpunit-5.7.phar + chmod +x phpunit-5.7.phar + mv phpunit-5.7.phar `which phpunit` +fi + +plugin_slug=$(basename $(pwd)) +plugin_dir=$WP_CORE_DIR/wp-content/plugins/$plugin_slug + +# Init database +mysql -e 'CREATE DATABASE wordpress_test;' -uroot + +# Grab specified version of WordPress from github +wget -nv -O /tmp/wordpress.tar.gz https://github.com/WordPress/WordPress/tarball/$WP_VERSION +mkdir -p $WP_CORE_DIR +tar --strip-components=1 -zxmf /tmp/wordpress.tar.gz -C $WP_CORE_DIR + +# Grab testing framework +svn co --quiet https://develop.svn.wordpress.org/tags/$WP_VERSION/ /tmp/wordpress-tests + +# Put various components in proper folders +cp tests/travis/wp-tests-config.php $WP_TESTS_DIR/wp-tests-config.php + +cd .. +mv $plugin_slug $plugin_dir + +cd $plugin_dir diff --git a/tests/travis/wp-tests-config.php b/tests/travis/wp-tests-config.php new file mode 100644 index 00000000000..f626da090a2 --- /dev/null +++ b/tests/travis/wp-tests-config.php @@ -0,0 +1,38 @@ + Date: Thu, 10 May 2018 11:37:15 +1000 Subject: [PATCH 071/984] Load Action Scheduler lib --- includes/class-woocommerce.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/includes/class-woocommerce.php b/includes/class-woocommerce.php index 9f7e1380f85..b704da950b5 100644 --- a/includes/class-woocommerce.php +++ b/includes/class-woocommerce.php @@ -368,6 +368,11 @@ final class WooCommerce { include_once WC_ABSPATH . 'includes/class-wc-auth.php'; include_once WC_ABSPATH . 'includes/class-wc-register-wp-admin-settings.php'; + /** + * Libraries + */ + include_once WC_ABSPATH . 'includes/libraries/action-scheduler/action-scheduler.php'; + if ( defined( 'WP_CLI' ) && WP_CLI ) { include_once WC_ABSPATH . 'includes/class-wc-cli.php'; } From f28f809edbd4c4ea1e33144acea0444bc1a74ec8 Mon Sep 17 00:00:00 2001 From: Brent Shepherd Date: Thu, 10 May 2018 11:37:23 +1000 Subject: [PATCH 072/984] Use Action Scheduler for async webhook delivery --- includes/wc-webhook-functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/wc-webhook-functions.php b/includes/wc-webhook-functions.php index 1436c711454..7f2f1d75044 100644 --- a/includes/wc-webhook-functions.php +++ b/includes/wc-webhook-functions.php @@ -21,7 +21,7 @@ function wc_webhook_process_delivery( $webhook, $arg ) { // user who triggered it. if ( apply_filters( 'woocommerce_webhook_deliver_async', true, $webhook, $arg ) ) { // Deliver in background. - wp_schedule_single_event( time(), 'woocommerce_deliver_webhook_async', array( $webhook->get_id(), $arg ) ); + wc_schedule_single_action( time(), 'woocommerce_deliver_webhook_async', array( $webhook->get_id(), $arg ) ); } else { // Deliver immediately. $webhook->deliver( $arg ); From 9aee2fa97b92d5fe9bfdffaf9afb77d5336bb2cd Mon Sep 17 00:00:00 2001 From: Brent Shepherd Date: Thu, 10 May 2018 11:39:06 +1000 Subject: [PATCH 073/984] Add webhook group for scheduled aysnc deliveries This will make it possible in future to run queues specifically for delivering webhooks, instead of deliering webhooks in the same queue as other actions, like scheduled payments, emails or other actions scheduled by other plugins. This can be used to provide better control over webhook delivery, which allows for sending webhooks more quickly than if they are only included in batches of other actions. --- includes/wc-webhook-functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/wc-webhook-functions.php b/includes/wc-webhook-functions.php index 7f2f1d75044..401a590af95 100644 --- a/includes/wc-webhook-functions.php +++ b/includes/wc-webhook-functions.php @@ -21,7 +21,7 @@ function wc_webhook_process_delivery( $webhook, $arg ) { // user who triggered it. if ( apply_filters( 'woocommerce_webhook_deliver_async', true, $webhook, $arg ) ) { // Deliver in background. - wc_schedule_single_action( time(), 'woocommerce_deliver_webhook_async', array( $webhook->get_id(), $arg ) ); + wc_schedule_single_action( time(), 'woocommerce_deliver_webhook_async', array( $webhook->get_id(), $arg ), 'woocommerce-webhooks' ); } else { // Deliver immediately. $webhook->deliver( $arg ); From 3993126f7830a0604bb9f7c86b1998a8e8af684f Mon Sep 17 00:00:00 2001 From: Brent Shepherd Date: Thu, 10 May 2018 13:59:22 +1000 Subject: [PATCH 074/984] Set array keys on scheduled webhook action To make it clearer in the database what the args refer to, e.g. instead of storing the scheduled action's args as: [1,123] This patch changes it so that the args are stored as: ["webhook_id":1,"arg":123] This has no impact on callbacks on the hooks, they are still passed the args as normal. --- includes/wc-webhook-functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/wc-webhook-functions.php b/includes/wc-webhook-functions.php index 401a590af95..f9946b9b49a 100644 --- a/includes/wc-webhook-functions.php +++ b/includes/wc-webhook-functions.php @@ -21,7 +21,7 @@ function wc_webhook_process_delivery( $webhook, $arg ) { // user who triggered it. if ( apply_filters( 'woocommerce_webhook_deliver_async', true, $webhook, $arg ) ) { // Deliver in background. - wc_schedule_single_action( time(), 'woocommerce_deliver_webhook_async', array( $webhook->get_id(), $arg ), 'woocommerce-webhooks' ); + wc_schedule_single_action( time(), 'woocommerce_deliver_webhook_async', array( 'webhook_id' => $webhook->get_id(), 'arg' => $arg ), 'woocommerce-webhooks' ); } else { // Deliver immediately. $webhook->deliver( $arg ); From 9c420125a3a3ef2eb8345c4e15fce1e77594026a Mon Sep 17 00:00:00 2001 From: Peter Fabian Date: Fri, 6 Jul 2018 12:58:57 +0200 Subject: [PATCH 075/984] Added tests for API query parameters for products endpoint. --- tests/unit-tests/api/products.php | 162 +++++++++++++++++++++++++++++- 1 file changed, 157 insertions(+), 5 deletions(-) diff --git a/tests/unit-tests/api/products.php b/tests/unit-tests/api/products.php index d3854aa2fbc..a7ff6fb4ecb 100644 --- a/tests/unit-tests/api/products.php +++ b/tests/unit-tests/api/products.php @@ -536,12 +536,12 @@ class Products_API extends WC_REST_Unit_Test_Case { $product->set_category_ids( array( $category['term_id'] ) ); $product->save(); - $args = array( - 'args' => array( - 'category' => $category['term_id'], - ), + $query_params = array( + 'category' => (string) $category['term_id'], ); - $response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v2/products', $args ) ); + $request = new WP_REST_Request( 'GET', '/wc/v2/products' ); + $request->set_query_params( $query_params ); + $response = $this->server->dispatch( $request ); $response_products = $response->get_data(); $this->assertEquals( 200, $response->get_status() ); @@ -568,4 +568,156 @@ class Products_API extends WC_REST_Unit_Test_Case { $product_2->delete( true ); } + + /** + * Test getting products by product type. + * + * @since 3.5.0 + */ + public function test_get_products_by_type() { + wp_set_current_user( $this->user ); + + $simple = WC_Helper_Product::create_simple_product(); + $external = WC_Helper_Product::create_external_product(); + $grouped = WC_Helper_Product::create_grouped_product(); + $variable = WC_Helper_Product::create_variation_product(); + + $product_ids_for_type = array( + 'simple' => array( $simple->get_id() ), + 'external' => array( $external->get_id() ), + 'grouped' => array( $grouped->get_id() ), + 'variable' => array( $variable->get_id() ), + ); + + foreach ( $grouped->get_children() as $additional_product ) { + $product_ids_for_type['simple'][] = $additional_product; + } + + foreach ( $product_ids_for_type as $product_type => $product_ids ) { + $query_params = array( + 'type' => $product_type, + ); + $request = new WP_REST_Request( 'GET', '/wc/v2/products' ); + $request->set_query_params( $query_params ); + $response = $this->server->dispatch( $request ); + $response_products = $response->get_data(); + + $this->assertEquals( 200, $response->get_status() ); + foreach ( $response_products as $response_product ) { + $this->assertContains( $response_product['id'], $product_ids_for_type[ $product_type ], 'REST API: ' . $product_type . ' not found correctly' ); + } + } + + $simple->delete( true ); + $external->delete( true ); + $variable->delete( true ); + $grouped->delete( true ); + } + + /** + * Test getting products by featured property. + * + * @since 3.5.0 + */ + public function test_get_featured_product() { + wp_set_current_user( $this->user ); + + // Create a featured product. + $feat_product = WC_Helper_Product::create_simple_product(); + $feat_product->set_featured( true ); + $feat_product->save(); + + // Create a non-featured product. + $nonfeat_product = WC_Helper_Product::create_simple_product(); + $nonfeat_product->save(); + + $query_params = array( + 'featured' => 'true', + ); + $request = new WP_REST_Request( 'GET', '/wc/v2/products' ); + $request->set_query_params( $query_params ); + $response = $this->server->dispatch( $request ); + $response_products = $response->get_data(); + + $this->assertEquals( 200, $response->get_status() ); + foreach ( $response_products as $response_product ) { + $this->assertEquals( $feat_product->get_id(), $response_product['id'], 'REST API: Featured product not found correctly' ); + } + + $query_params = array( + 'featured' => 'false', + ); + $request = new WP_REST_Request( 'GET', '/wc/v2/products' ); + $request->set_query_params( $query_params ); + $response = $this->server->dispatch( $request ); + $response_products = $response->get_data(); + + $this->assertEquals( 200, $response->get_status() ); + foreach ( $response_products as $response_product ) { + $this->assertEquals( $nonfeat_product->get_id(), $response_product['id'], 'REST API: Featured product not found correctly' ); + } + + $feat_product->delete( true ); + $nonfeat_product->delete( true ); + } + + /** + * Test getting products by shipping class property. + * + * @since 3.5.0 + */ + public function test_get_product_by_shipping_class() { + wp_set_current_user( $this->user ); + + $shipping_class_1 = wp_insert_term( 'Bulky', 'product_shipping_class' ); + + $product_1 = new WC_Product_Simple(); + $product_1->set_shipping_class_id( $shipping_class_1['term_id'] ); + $product_1->save(); + + $query_params = array( + 'shipping_class' => (string) $shipping_class_1['term_id'], + ); + $request = new WP_REST_Request( 'GET', '/wc/v2/products' ); + $request->set_query_params( $query_params ); + $response = $this->server->dispatch( $request ); + $response_products = $response->get_data(); + + $this->assertEquals( 200, $response->get_status() ); + foreach ( $response_products as $response_product ) { + $this->assertEquals( $product_1->get_id(), $response_product['id'] ); + } + + $product_1->delete( true ); + } + + /** + * Test getting products by global product attribute. + * + * @since 3.5.0 + */ + public function test_get_product_by_attribute() { + wp_set_current_user( $this->user ); + + $shipping_class_1 = wp_insert_term( 'Bulky', 'product_shipping_class' ); + + $product_1 = new WC_Product_Simple(); + $product_1->set_shipping_class_id( $shipping_class_1['term_id'] ); + $product_1->save(); + + $query_params = array( + 'shipping_class' => (string) $shipping_class_1['term_id'], + ); + $request = new WP_REST_Request( 'GET', '/wc/v2/products' ); + $request->set_query_params( $query_params ); + $response = $this->server->dispatch( $request ); + $response_products = $response->get_data(); + + $this->assertEquals( 200, $response->get_status() ); + foreach ( $response_products as $response_product ) { + $this->assertEquals( $product_1->get_id(), $response_product['id'] ); + } + + $product_1->delete( true ); + } } From fe77b9e54f8d650481a9378fbdc4e04d158a9900 Mon Sep 17 00:00:00 2001 From: Peter Fabian Date: Fri, 6 Jul 2018 16:00:59 +0200 Subject: [PATCH 076/984] Fixed the variation product helper in unit tests. Previously, the variable product had 2 variations, but one of them had a term assigned ('large') that wasn't assigned to the parent product. Normally, when variable product is created, parent has all the terms assigned to its children assigned. --- .../helpers/class-wc-helper-product.php | 71 +++++++++++-------- tests/unit-tests/api/products.php | 4 +- 2 files changed, 43 insertions(+), 32 deletions(-) diff --git a/tests/framework/helpers/class-wc-helper-product.php b/tests/framework/helpers/class-wc-helper-product.php index ec463c8ee0c..153d567f8c3 100644 --- a/tests/framework/helpers/class-wc-helper-product.php +++ b/tests/framework/helpers/class-wc-helper-product.php @@ -152,13 +152,15 @@ class WC_Helper_Product { wp_set_object_terms( $product_id, 'variable', 'product_type' ); - // Link the product to the attribute - $wpdb->insert( $wpdb->prefix . 'term_relationships', array( - 'object_id' => $product_id, - 'term_taxonomy_id' => $attribute_data['term_taxonomy_id'], - 'term_order' => 0, - ) ); - $return['term_taxonomy_id'] = $wpdb->insert_id; + // Link the product to the terms. + foreach ( $attribute_data['term_taxonomy_ids'] as $term_taxonomy_id ) { + $wpdb->insert( $wpdb->prefix . 'term_relationships', array( + 'object_id' => $product_id, + 'term_taxonomy_id' => $term_taxonomy_id, + 'term_order' => 0, + ) ); + $return['term_taxonomy_ids'][] = $wpdb->insert_id; + } // Create the variation $variation_id = wp_insert_post( array( @@ -230,6 +232,7 @@ class WC_Helper_Product { $return = array(); $attribute_name = 'size'; + $terms = array( 'small', 'large' ); // Create attribute $attribute = array( @@ -243,46 +246,50 @@ class WC_Helper_Product { $return['attribute_id'] = $wpdb->insert_id; // Register the taxonomy - $name = wc_attribute_taxonomy_name( $attribute_name ); - $label = $attribute_name; - - // Add the term - $wpdb->insert( $wpdb->prefix . 'terms', array( - 'name' => 'small', - 'slug' => 'small', - 'term_group' => 0, - ), array( + $array_format = array( '%s', '%s', '%d', - ) ); - $return['term_id'] = $wpdb->insert_id; + ); - // Add the term_taxonomy - $wpdb->insert( $wpdb->prefix . 'term_taxonomy', array( - 'term_id' => $return['term_id'], - 'taxonomy' => 'pa_size', - 'description' => '', - 'parent' => 0, - 'count' => 1, - ) ); - $return['term_taxonomy_id'] = $wpdb->insert_id; + foreach ( $terms as $term ) { + // Add the term + $wpdb->insert( $wpdb->prefix . 'terms', array( + 'name' => $term, + 'slug' => $term, + 'term_group' => 0, + ), $array_format ); + + $term_id = $wpdb->insert_id; + $return['term_ids'][] = $term_id; + + // Add the term_taxonomy + $wpdb->insert( $wpdb->prefix . 'term_taxonomy', array( + 'term_id' => $term_id, + 'taxonomy' => 'pa_' . $attribute_name, + 'description' => 'Size of the product', + 'parent' => 0, + 'count' => 1, + ) ); + $return['term_taxonomy_ids'][] = $wpdb->insert_id; + } // Delete transient delete_transient( 'wc_attribute_taxonomies' ); $taxonomy_data = array( 'labels' => array( - 'name' => 'size', + 'name' => $attribute_name, ), ); - register_taxonomy( 'pa_size', array( 'product' ), $taxonomy_data ); + register_taxonomy( 'pa_' . $attribute_name, array( 'product' ), $taxonomy_data ); // Set product attributes global. global $wc_product_attributes; $wc_product_attributes = array(); foreach ( wc_get_attribute_taxonomies() as $tax ) { - if ( $name = wc_attribute_taxonomy_name( $tax->attribute_name ) ) { + $name = wc_attribute_taxonomy_name( $tax->attribute_name ); + if ( $name ) { $wc_product_attributes[ $name ] = $tax; } } @@ -302,7 +309,9 @@ class WC_Helper_Product { $attribute_id = absint( $attribute_id ); - $wpdb->query( "DELETE FROM {$wpdb->prefix}woocommerce_attribute_taxonomies WHERE attribute_id = $attribute_id" ); + $wpdb->query( + $wpdb->prepare( "DELETE FROM {$wpdb->prefix}woocommerce_attribute_taxonomies WHERE attribute_id = %d", $attribute_id ) + ); } /** diff --git a/tests/unit-tests/api/products.php b/tests/unit-tests/api/products.php index a7ff6fb4ecb..18617a85631 100644 --- a/tests/unit-tests/api/products.php +++ b/tests/unit-tests/api/products.php @@ -198,7 +198,9 @@ class Products_API extends WC_REST_Unit_Test_Case { $response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v2/products/' . $product->get_id() ) ); $data = $response->get_data(); - $this->assertEquals( array( 'small' ), $data['attributes'][0]['options'] ); + foreach ( array( 'small', 'large' ) as $term_name ) { + $this->assertContains( $term_name, $data['attributes'][0]['options'] ); + } $request = new WP_REST_Request( 'PUT', '/wc/v2/products/' . $product->get_id() ); $request->set_body_params( From 1091eb5feb756e879027f49ec64f5869c6a7ac9a Mon Sep 17 00:00:00 2001 From: Peter Fabian Date: Fri, 6 Jul 2018 16:01:49 +0200 Subject: [PATCH 077/984] PHPCS corrections. --- tests/framework/helpers/class-wc-helper-product.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/framework/helpers/class-wc-helper-product.php b/tests/framework/helpers/class-wc-helper-product.php index 153d567f8c3..7968dfdfeac 100644 --- a/tests/framework/helpers/class-wc-helper-product.php +++ b/tests/framework/helpers/class-wc-helper-product.php @@ -234,7 +234,7 @@ class WC_Helper_Product { $attribute_name = 'size'; $terms = array( 'small', 'large' ); - // Create attribute + // Create attribute. $attribute = array( 'attribute_label' => $attribute_name, 'attribute_name' => $attribute_name, @@ -245,7 +245,7 @@ class WC_Helper_Product { $wpdb->insert( $wpdb->prefix . 'woocommerce_attribute_taxonomies', $attribute ); $return['attribute_id'] = $wpdb->insert_id; - // Register the taxonomy + // Register the taxonomy. $array_format = array( '%s', '%s', @@ -253,7 +253,7 @@ class WC_Helper_Product { ); foreach ( $terms as $term ) { - // Add the term + // Add the term. $wpdb->insert( $wpdb->prefix . 'terms', array( 'name' => $term, 'slug' => $term, @@ -263,7 +263,7 @@ class WC_Helper_Product { $term_id = $wpdb->insert_id; $return['term_ids'][] = $term_id; - // Add the term_taxonomy + // Add the term_taxonomy. $wpdb->insert( $wpdb->prefix . 'term_taxonomy', array( 'term_id' => $term_id, 'taxonomy' => 'pa_' . $attribute_name, @@ -274,7 +274,7 @@ class WC_Helper_Product { $return['term_taxonomy_ids'][] = $wpdb->insert_id; } - // Delete transient + // Delete transient. delete_transient( 'wc_attribute_taxonomies' ); $taxonomy_data = array( From e769029af61483923f0764d91cca707baf154952 Mon Sep 17 00:00:00 2001 From: Peter Fabian Date: Fri, 6 Jul 2018 16:08:32 +0200 Subject: [PATCH 078/984] Make create_attribute function for PHPUNIT more versatile by removing hardcoding. --- tests/framework/helpers/class-wc-helper-product.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/framework/helpers/class-wc-helper-product.php b/tests/framework/helpers/class-wc-helper-product.php index 7968dfdfeac..cc163bd3451 100644 --- a/tests/framework/helpers/class-wc-helper-product.php +++ b/tests/framework/helpers/class-wc-helper-product.php @@ -224,16 +224,15 @@ class WC_Helper_Product { * * @since 2.3 * + * @param string $attribute_name Name of attribute to create. + * @param array(string) $terms Terms to create for the attribute. * @return array */ - public static function create_attribute() { + public static function create_attribute( $attribute_name = 'size', $terms = array( 'small', 'large' ) ) { global $wpdb; $return = array(); - $attribute_name = 'size'; - $terms = array( 'small', 'large' ); - // Create attribute. $attribute = array( 'attribute_label' => $attribute_name, @@ -245,7 +244,6 @@ class WC_Helper_Product { $wpdb->insert( $wpdb->prefix . 'woocommerce_attribute_taxonomies', $attribute ); $return['attribute_id'] = $wpdb->insert_id; - // Register the taxonomy. $array_format = array( '%s', '%s', @@ -282,6 +280,8 @@ class WC_Helper_Product { 'name' => $attribute_name, ), ); + + // Register the taxonomy. register_taxonomy( 'pa_' . $attribute_name, array( 'product' ), $taxonomy_data ); // Set product attributes global. From 6c70064a82b506d4677ae446ee9af7b4a1f02e53 Mon Sep 17 00:00:00 2001 From: Peter Fabian Date: Fri, 6 Jul 2018 16:57:40 +0200 Subject: [PATCH 079/984] Added test products API for product tag and attributes query parameters. --- tests/unit-tests/api/products.php | 90 ++++++++++++++++++++++++++++--- 1 file changed, 82 insertions(+), 8 deletions(-) diff --git a/tests/unit-tests/api/products.php b/tests/unit-tests/api/products.php index 18617a85631..be09770c7e1 100644 --- a/tests/unit-tests/api/products.php +++ b/tests/unit-tests/api/products.php @@ -694,21 +694,22 @@ class Products_API extends WC_REST_Unit_Test_Case { } /** - * Test getting products by global product attribute. + * Test getting products by tag. * * @since 3.5.0 */ - public function test_get_product_by_attribute() { + public function test_get_product_by_tag() { wp_set_current_user( $this->user ); - $shipping_class_1 = wp_insert_term( 'Bulky', 'product_shipping_class' ); + $test_tag_1 = wp_insert_term( 'Tag 1', 'product_tag' ); + $term_tag_1 = get_term_by( 'id', $test_tag_1['term_id'], 'product_tag' ); - $product_1 = new WC_Product_Simple(); - $product_1->set_shipping_class_id( $shipping_class_1['term_id'] ); - $product_1->save(); + $product = WC_Helper_Product::create_simple_product(); + $product->set_tag_ids( array( $test_tag_1['term_id'] ) ); + $product->save(); $query_params = array( - 'shipping_class' => (string) $shipping_class_1['term_id'], + 'tag' => (string) $test_tag_1['term_id'], ); $request = new WP_REST_Request( 'GET', '/wc/v2/products' ); $request->set_query_params( $query_params ); @@ -717,9 +718,82 @@ class Products_API extends WC_REST_Unit_Test_Case { $this->assertEquals( 200, $response->get_status() ); foreach ( $response_products as $response_product ) { - $this->assertEquals( $product_1->get_id(), $response_product['id'] ); + $this->assertEquals( $product->get_id(), $response_product['id'] ); } + $product->delete( true ); + } + + /** + * Test getting products by global attribute. + * + * @since 3.5.0 + */ + public function test_get_product_by_attribute() { + global $wpdb; + wp_set_current_user( $this->user ); + + // Variable product with 2 different variations. + $variable_product = WC_Helper_Product::create_variation_product(); + + // Terms created by variable product. + $term_large = get_term_by( 'slug', 'large', 'pa_size' ); + $term_small = get_term_by( 'slug', 'small', 'pa_size' ); + + // Simple product without attribute. + $product_1 = WC_Helper_Product::create_simple_product(); + + // Simple product with attribute size = large. + $product_2 = WC_Helper_Product::create_simple_product(); + $product_2->set_attributes( array( 'pa_size' => 'large' ) ); + $product_2->save(); + + // Link the product to the term. + $wpdb->insert( $wpdb->prefix . 'term_relationships', array( + 'object_id' => $product_2->get_id(), + 'term_taxonomy_id' => $term_large->term_id, + 'term_order' => 0, + ) ); + + // Products with attribute size == large. + $expected_product_ids = array( + $variable_product->get_id(), + $product_2->get_id(), + ); + $query_params = array( + 'attribute' => 'pa_size', + 'attribute_term' => (string) $term_large->term_id, + ); + $request = new WP_REST_Request( 'GET', '/wc/v2/products' ); + $request->set_query_params( $query_params ); + $response = $this->server->dispatch( $request ); + $response_products = $response->get_data(); + + $this->assertEquals( 200, $response->get_status() ); + foreach ( $response_products as $response_product ) { + $this->assertContains( $response_product['id'], $expected_product_ids ); + } + + // Products with attribute size == small. + $expected_product_ids = array( + $variable_product->get_id(), + ); + $query_params = array( + 'attribute' => 'pa_size', + 'attribute_term' => (string) $term_small->term_id, + ); + $request = new WP_REST_Request( 'GET', '/wc/v2/products' ); + $request->set_query_params( $query_params ); + $response = $this->server->dispatch( $request ); + $response_products = $response->get_data(); + + $this->assertEquals( 200, $response->get_status() ); + foreach ( $response_products as $response_product ) { + $this->assertContains( $response_product['id'], $expected_product_ids ); + } + + $variable_product->delete( true ); $product_1->delete( true ); + $product_2->delete( true ); } } From 9970f1799a9417d843bd8d280c45bebefeaebfa6 Mon Sep 17 00:00:00 2001 From: Tiago Noronha Date: Fri, 6 Jul 2018 16:35:43 +0100 Subject: [PATCH 080/984] Add image size filters to wc_get_product_attachment_props() --- includes/wc-product-functions.php | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/includes/wc-product-functions.php b/includes/wc-product-functions.php index 851cdab5bb8..846fc530bf8 100644 --- a/includes/wc-product-functions.php +++ b/includes/wc-product-functions.php @@ -722,7 +722,8 @@ function wc_get_product_attachment_props( $attachment_id = null, $product = fals $props['alt'] = isset( $alt_text[0] ) ? $alt_text[0] : ''; // Large version. - $src = wp_get_attachment_image_src( $attachment_id, 'full' ); + $full_size = apply_filters( 'woocommerce_gallery_full_size', apply_filters( 'woocommerce_product_thumbnails_large_size', 'full' ) ); + $src = wp_get_attachment_image_src( $attachment_id, $full_size ); $props['full_src'] = $src[0]; $props['full_src_w'] = $src[1]; $props['full_src_h'] = $src[2]; @@ -736,18 +737,21 @@ function wc_get_product_attachment_props( $attachment_id = null, $product = fals $props['gallery_thumbnail_src_h'] = $src[2]; // Thumbnail version. - $src = wp_get_attachment_image_src( $attachment_id, 'woocommerce_thumbnail' ); + $thumbnail_size = apply_filters( 'woocommerce_thumbnail_size', 'woocommerce_thumbnail' ); + $src = wp_get_attachment_image_src( $attachment_id, $thumbnail_size ); $props['thumb_src'] = $src[0]; $props['thumb_src_w'] = $src[1]; $props['thumb_src_h'] = $src[2]; // Image source. - $src = wp_get_attachment_image_src( $attachment_id, 'woocommerce_single' ); + $flexslider = (bool) apply_filters( 'woocommerce_single_product_flexslider_enabled', get_theme_support( 'wc-product-gallery-slider' ) ); + $image_size = apply_filters( 'woocommerce_gallery_image_size', $flexslider ? 'woocommerce_single' : $gallery_thumbnail_size ); + $src = wp_get_attachment_image_src( $attachment_id, $image_size ); $props['src'] = $src[0]; $props['src_w'] = $src[1]; $props['src_h'] = $src[2]; - $props['srcset'] = function_exists( 'wp_get_attachment_image_srcset' ) ? wp_get_attachment_image_srcset( $attachment_id, 'woocommerce_single' ) : false; - $props['sizes'] = function_exists( 'wp_get_attachment_image_sizes' ) ? wp_get_attachment_image_sizes( $attachment_id, 'woocommerce_single' ) : false; + $props['srcset'] = function_exists( 'wp_get_attachment_image_srcset' ) ? wp_get_attachment_image_srcset( $attachment_id, $image_size ) : false; + $props['sizes'] = function_exists( 'wp_get_attachment_image_sizes' ) ? wp_get_attachment_image_sizes( $attachment_id, $image_size ) : false; } return $props; } From fda124147be67a494324907222f477c2418000c0 Mon Sep 17 00:00:00 2001 From: Tiago Noronha Date: Fri, 6 Jul 2018 16:36:19 +0100 Subject: [PATCH 081/984] phpcs --- includes/wc-product-functions.php | 100 +++++++++++++++++------------- 1 file changed, 58 insertions(+), 42 deletions(-) diff --git a/includes/wc-product-functions.php b/includes/wc-product-functions.php index 846fc530bf8..7c4ff7d4188 100644 --- a/includes/wc-product-functions.php +++ b/includes/wc-product-functions.php @@ -451,7 +451,6 @@ add_action( 'woocommerce_scheduled_sales', 'wc_scheduled_sales' ); /** * Get attachment image attributes. * - * @access public * @param array $attr Image attributes. * @return array */ @@ -467,7 +466,6 @@ add_filter( 'wp_get_attachment_image_attributes', 'wc_get_attachment_image_attri /** * Prepare attachment for JavaScript. * - * @access public * @param array $response JS version of a attachment post object. * @return array */ @@ -528,12 +526,14 @@ add_action( 'template_redirect', 'wc_track_product_view', 20 ); * @return array */ function wc_get_product_types() { - return (array) apply_filters( 'product_type_selector', array( - 'simple' => __( 'Simple product', 'woocommerce' ), - 'grouped' => __( 'Grouped product', 'woocommerce' ), - 'external' => __( 'External/Affiliate product', 'woocommerce' ), - 'variable' => __( 'Variable product', 'woocommerce' ), - ) ); + return (array) apply_filters( + 'product_type_selector', array( + 'simple' => __( 'Simple product', 'woocommerce' ), + 'grouped' => __( 'Grouped product', 'woocommerce' ), + 'external' => __( 'External/Affiliate product', 'woocommerce' ), + 'variable' => __( 'Variable product', 'woocommerce' ), + ) + ); } /** @@ -763,12 +763,14 @@ function wc_get_product_attachment_props( $attachment_id = null, $product = fals * @return array */ function wc_get_product_visibility_options() { - return apply_filters( 'woocommerce_product_visibility_options', array( - 'visible' => __( 'Shop and search results', 'woocommerce' ), - 'catalog' => __( 'Shop only', 'woocommerce' ), - 'search' => __( 'Search results only', 'woocommerce' ), - 'hidden' => __( 'Hidden', 'woocommerce' ), - ) ); + return apply_filters( + 'woocommerce_product_visibility_options', array( + 'visible' => __( 'Shop and search results', 'woocommerce' ), + 'catalog' => __( 'Shop only', 'woocommerce' ), + 'search' => __( 'Search results only', 'woocommerce' ), + 'hidden' => __( 'Hidden', 'woocommerce' ), + ) + ); } /** @@ -874,10 +876,12 @@ function wc_get_related_products( $product_id, $limit = 5, $exclude_ids = array( $limit = $limit >= -1 ? $limit : 5; $exclude_ids = array_merge( array( 0, $product_id ), $exclude_ids ); $transient_name = 'wc_related_' . $product_id; - $query_args = http_build_query( array( - 'limit' => $limit, - 'exclude_ids' => $exclude_ids, - ) ); + $query_args = http_build_query( + array( + 'limit' => $limit, + 'exclude_ids' => $exclude_ids, + ) + ); $transient = get_transient( $transient_name ); $related_posts = $transient && isset( $transient[ $query_args ] ) ? $transient[ $query_args ] : false; @@ -905,10 +909,12 @@ function wc_get_related_products( $product_id, $limit = 5, $exclude_ids = array( set_transient( $transient_name, $transient, DAY_IN_SECONDS ); } - $related_posts = apply_filters( 'woocommerce_related_products', $related_posts, $product_id, array( - 'limit' => $limit, - 'excluded_ids' => $exclude_ids, - ) ); + $related_posts = apply_filters( + 'woocommerce_related_products', $related_posts, $product_id, array( + 'limit' => $limit, + 'excluded_ids' => $exclude_ids, + ) + ); shuffle( $related_posts ); @@ -937,10 +943,12 @@ function wc_get_product_term_ids( $product_id, $taxonomy ) { * @return float */ function wc_get_price_including_tax( $product, $args = array() ) { - $args = wp_parse_args( $args, array( - 'qty' => '', - 'price' => '', - ) ); + $args = wp_parse_args( + $args, array( + 'qty' => '', + 'price' => '', + ) + ); $price = '' !== $args['price'] ? max( 0.0, (float) $args['price'] ) : $product->get_price(); $qty = '' !== $args['qty'] ? max( 0.0, (float) $args['qty'] ) : 1; @@ -997,10 +1005,12 @@ function wc_get_price_including_tax( $product, $args = array() ) { * @return float */ function wc_get_price_excluding_tax( $product, $args = array() ) { - $args = wp_parse_args( $args, array( - 'qty' => '', - 'price' => '', - ) ); + $args = wp_parse_args( + $args, array( + 'qty' => '', + 'price' => '', + ) + ); $price = '' !== $args['price'] ? max( 0.0, (float) $args['price'] ) : $product->get_price(); $qty = '' !== $args['qty'] ? max( 0.0, (float) $args['qty'] ) : 1; @@ -1034,23 +1044,29 @@ function wc_get_price_excluding_tax( $product, $args = array() ) { * @return float */ function wc_get_price_to_display( $product, $args = array() ) { - $args = wp_parse_args( $args, array( - 'qty' => 1, - 'price' => $product->get_price(), - ) ); + $args = wp_parse_args( + $args, array( + 'qty' => 1, + 'price' => $product->get_price(), + ) + ); $price = $args['price']; $qty = $args['qty']; return 'incl' === get_option( 'woocommerce_tax_display_shop' ) ? - wc_get_price_including_tax( $product, array( - 'qty' => $qty, - 'price' => $price, - ) ) : - wc_get_price_excluding_tax( $product, array( - 'qty' => $qty, - 'price' => $price, - ) ); + wc_get_price_including_tax( + $product, array( + 'qty' => $qty, + 'price' => $price, + ) + ) : + wc_get_price_excluding_tax( + $product, array( + 'qty' => $qty, + 'price' => $price, + ) + ); } /** From dc9891e1d97ec56b0cf81b756a97bbb3d0ba1a36 Mon Sep 17 00:00:00 2001 From: Claudiu Lodromanean Date: Fri, 6 Jul 2018 09:12:30 -0700 Subject: [PATCH 082/984] Update readme.txt --- readme.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/readme.txt b/readme.txt index ae1018af0f0..d339e73f73c 100644 --- a/readme.txt +++ b/readme.txt @@ -179,6 +179,7 @@ Yes you can! Join in on our [GitHub repository](https://github.com/woocommerce/w * Tweak - Hide Preview button when creating new products, as most fields aren't set up for it. #20650 * Tweak - For guests, store all address fields to the session whilst placing an order. #20665 * Tweak - Removed 'ajax_add_to_cart' class from 'Read more' button. #20690 +* Tweak - Removed unnecessary checkout form change trigger on load of the checkout page. #20655 * Performance/Tweak - Use post_author for the order customer instead of '_customer_user' meta data. #17895 * Performance - Exclude frontend include from REST API calls. #20000 * Dev - REST API - Allows oAuth1.0a authentication under SSL. From 4e6ce57b9550a3e4aefa87ddd32cce3f0b32b0fc Mon Sep 17 00:00:00 2001 From: Claudiu Lodromanean Date: Fri, 6 Jul 2018 09:38:34 -0700 Subject: [PATCH 083/984] Update readme.txt --- readme.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/readme.txt b/readme.txt index d339e73f73c..1c4092b43dc 100644 --- a/readme.txt +++ b/readme.txt @@ -180,6 +180,7 @@ Yes you can! Join in on our [GitHub repository](https://github.com/woocommerce/w * Tweak - For guests, store all address fields to the session whilst placing an order. #20665 * Tweak - Removed 'ajax_add_to_cart' class from 'Read more' button. #20690 * Tweak - Removed unnecessary checkout form change trigger on load of the checkout page. #20655 +* Tweak - Add image size filters to wc_get_product_attachment_props(). #20722 * Performance/Tweak - Use post_author for the order customer instead of '_customer_user' meta data. #17895 * Performance - Exclude frontend include from REST API calls. #20000 * Dev - REST API - Allows oAuth1.0a authentication under SSL. From d49f02a4e60f1a787e012d7d6779f358e600ba02 Mon Sep 17 00:00:00 2001 From: Andrew Lazarus Date: Fri, 6 Jul 2018 19:04:08 +0200 Subject: [PATCH 084/984] Updated prefix in filter --- includes/wc-cart-functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/wc-cart-functions.php b/includes/wc-cart-functions.php index fcdd04613a6..fb07c970c14 100644 --- a/includes/wc-cart-functions.php +++ b/includes/wc-cart-functions.php @@ -107,7 +107,7 @@ function wc_add_to_cart_message( $products, $show_qty = false, $return = false ) foreach ( $products as $product_id => $qty ) { /* translators: %s: product name */ - $titles[] = ( $qty > 1 ? absint( $qty ) . ' × ' : '' ) . apply_filters( 'wc_add_to_cart_item_name_in_quotes', sprintf( _x( '“%s”', 'Item name in quotes', 'woocommerce' ), strip_tags( get_the_title( $product_id ) ) ), $product_id ); + $titles[] = ( $qty > 1 ? absint( $qty ) . ' × ' : '' ) . apply_filters( 'woocommerce_add_to_cart_item_name_in_quotes', sprintf( _x( '“%s”', 'Item name in quotes', 'woocommerce' ), strip_tags( get_the_title( $product_id ) ) ), $product_id ); $count += $qty; } From 38324edc71ba37f7287a80b454e21eaca20093cf Mon Sep 17 00:00:00 2001 From: claudiulodro Date: Fri, 6 Jul 2018 13:29:01 -0700 Subject: [PATCH 085/984] Only wordwrap plain emails --- includes/emails/class-wc-email.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/includes/emails/class-wc-email.php b/includes/emails/class-wc-email.php index fd36a929e90..ea6588f5a56 100644 --- a/includes/emails/class-wc-email.php +++ b/includes/emails/class-wc-email.php @@ -499,12 +499,12 @@ class WC_Email extends WC_Settings_API { $this->sending = true; if ( 'plain' === $this->get_email_type() ) { - $email_content = preg_replace( $this->plain_search, $this->plain_replace, strip_tags( $this->get_content_plain() ) ); + $email_content = wordwrap( preg_replace( $this->plain_search, $this->plain_replace, strip_tags( $this->get_content_plain() ) ), 70 ); } else { $email_content = $this->get_content_html(); } - return wordwrap( $email_content, 70 ); + return $email_content; } /** From 7a957cc13066f85f20caad34e2746848ff902282 Mon Sep 17 00:00:00 2001 From: Towhidul Islam Date: Sun, 8 Jul 2018 10:35:32 +0600 Subject: [PATCH 086/984] Convert hardcoded db prefix to dynamic db prefix. Fixes #20718 --- includes/wc-update-functions.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/includes/wc-update-functions.php b/includes/wc-update-functions.php index c564831bbdf..6613d160738 100644 --- a/includes/wc-update-functions.php +++ b/includes/wc-update-functions.php @@ -1861,14 +1861,14 @@ function wc_update_350_order_customer_id( $updater = false ) { ); $wpdb->query( - "INSERT IGNORE INTO customers_map (SELECT post_id, meta_value FROM wp_postmeta WHERE meta_key = '_customer_user')" + "INSERT IGNORE INTO customers_map (SELECT post_id, meta_value FROM {$wpdb->prefix}postmeta WHERE meta_key = '_customer_user')" ); $wpdb->query( 'SET sql_safe_updates=1' ); $wpdb->query( $wpdb->prepare( - "UPDATE wp_posts JOIN customers_map ON wp_posts.ID = customers_map.post_id SET wp_posts.post_author = customers_map.customer_id WHERE post_type IN ({$post_types_placeholders})", // phpcs:ignore WordPress.WP.PreparedSQL.NotPrepared + "UPDATE {$wpdb->prefix}posts JOIN customers_map ON {$wpdb->prefix}posts.ID = customers_map.post_id SET {$wpdb->prefix}posts.post_author = customers_map.customer_id WHERE post_type IN ({$post_types_placeholders})", // phpcs:ignore WordPress.WP.PreparedSQL.NotPrepared $post_types ) ); @@ -1883,8 +1883,8 @@ function wc_update_350_order_customer_id( $updater = false ) { // Get the list of orders that we don't want to change as they belong to user ID 1. $admin_orders = $wpdb->get_col( $wpdb->prepare( - "SELECT ID FROM wp_posts p - INNER JOIN wp_postmeta pm ON p.ID = pm.post_id + "SELECT ID FROM {$wpdb->prefix}posts p + INNER JOIN {$wpdb->prefix}postmeta pm ON p.ID = pm.post_id WHERE post_type IN ({$post_types_placeholders}) AND meta_key = '_customer_user' AND meta_value = 1", // phpcs:ignore WordPress.WP.PreparedSQL.NotPrepared $post_types ) From ef2f868b899c5f0e461b2d3709641af015c0d992 Mon Sep 17 00:00:00 2001 From: Gerhard Potgieter Date: Mon, 9 Jul 2018 10:45:48 +0200 Subject: [PATCH 087/984] Add edit_theme_options capability to shop manager to allow access to customizer for changing WooCommerce settings. --- includes/class-wc-install.php | 1 + 1 file changed, 1 insertion(+) diff --git a/includes/class-wc-install.php b/includes/class-wc-install.php index f3c12cb9f41..55c919e7ed8 100644 --- a/includes/class-wc-install.php +++ b/includes/class-wc-install.php @@ -955,6 +955,7 @@ CREATE TABLE {$wpdb->prefix}woocommerce_termmeta ( 'export' => true, 'import' => true, 'list_users' => true, + 'edit_theme_options' => true, ) ); From 1fdcf2a238c5807b897e817f277146d81eb05732 Mon Sep 17 00:00:00 2001 From: Gerhard Potgieter Date: Mon, 9 Jul 2018 13:01:23 +0200 Subject: [PATCH 088/984] Fix log file deletion functionality. --- includes/admin/class-wc-admin-status.php | 2 +- includes/admin/views/html-admin-page-status-logs.php | 4 ++-- includes/log-handlers/class-wc-log-handler-file.php | 6 ++---- tests/unit-tests/log/log-handler-file.php | 2 +- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/includes/admin/class-wc-admin-status.php b/includes/admin/class-wc-admin-status.php index e5f4abfebf8..5be05ea25f9 100644 --- a/includes/admin/class-wc-admin-status.php +++ b/includes/admin/class-wc-admin-status.php @@ -162,7 +162,7 @@ class WC_Admin_Status { * @return string */ public static function get_log_file_handle( $filename ) { - return substr( $filename, 0, strlen( $filename ) > 37 ? strlen( $filename ) - 37 : strlen( $filename ) - 4 ); + return substr( $filename, 0, strlen( $filename ) > 48 ? strlen( $filename ) - 48 : strlen( $filename ) - 4 ); } /** diff --git a/includes/admin/views/html-admin-page-status-logs.php b/includes/admin/views/html-admin-page-status-logs.php index f122087346f..6f501191c00 100644 --- a/includes/admin/views/html-admin-page-status-logs.php +++ b/includes/admin/views/html-admin-page-status-logs.php @@ -15,8 +15,8 @@ if ( ! defined( 'ABSPATH' ) ) {

    - - + +

    diff --git a/includes/log-handlers/class-wc-log-handler-file.php b/includes/log-handlers/class-wc-log-handler-file.php index 04d26f6b051..0b233ef4a92 100644 --- a/includes/log-handlers/class-wc-log-handler-file.php +++ b/includes/log-handlers/class-wc-log-handler-file.php @@ -248,16 +248,14 @@ class WC_Log_Handler_File extends WC_Log_Handler { */ public function remove( $handle ) { $removed = false; - $file = self::get_log_file_path( $handle ); - + $file = trailingslashit( WC_LOG_DIR ) . $handle; if ( $file ) { if ( is_file( $file ) && is_writable( $file ) ) { // phpcs:ignore WordPress.VIP.FileSystemWritesDisallow.file_ops_is_writable - $this->close( $handle ); // Close first to be certain no processes keep it alive after it is unlinked. + $this->close( $file ); // Close first to be certain no processes keep it alive after it is unlinked. $removed = unlink( $file ); // phpcs:ignore WordPress.VIP.FileSystemWritesDisallow.file_ops_unlink } do_action( 'woocommerce_log_remove', $handle, $removed ); } - return $removed; } diff --git a/tests/unit-tests/log/log-handler-file.php b/tests/unit-tests/log/log-handler-file.php index 5e64a2aafc0..17a68b2170f 100644 --- a/tests/unit-tests/log/log-handler-file.php +++ b/tests/unit-tests/log/log-handler-file.php @@ -75,7 +75,7 @@ class WC_Tests_Log_Handler_File extends WC_Unit_Test_Case { $handler = new WC_Log_Handler_File(); $log_name = '_test_remove'; $handler->handle( time(), 'debug', 'debug', array( 'source' => $log_name ) ); - $handler->remove( $log_name ); + $handler->remove( wc_get_log_file_name( $log_name ) ); $this->assertFileNotExists( WC_Log_Handler_File::get_log_file_path( $log_name ) ); } From bc3c780b92198f87907f8edfff246395d1663609 Mon Sep 17 00:00:00 2001 From: Gerhard Potgieter Date: Mon, 9 Jul 2018 13:04:16 +0200 Subject: [PATCH 089/984] PHPCS fixes --- tests/unit-tests/log/log-handler-file.php | 37 ++++++++++++----------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/tests/unit-tests/log/log-handler-file.php b/tests/unit-tests/log/log-handler-file.php index 17a68b2170f..a6af09e52f4 100644 --- a/tests/unit-tests/log/log-handler-file.php +++ b/tests/unit-tests/log/log-handler-file.php @@ -11,25 +11,25 @@ class WC_Tests_Log_Handler_File extends WC_Unit_Test_Case { $log_files = array( 'unit-tests', 'log', - '_test_clear', - '_test_remove', - '_test_log_rotate', - '_test_log_rotate.0', - '_test_log_rotate.1', - '_test_log_rotate.2', - '_test_log_rotate.3', - '_test_log_rotate.4', - '_test_log_rotate.5', - '_test_log_rotate.6', - '_test_log_rotate.7', - '_test_log_rotate.8', - '_test_log_rotate.9', + '_test_clear', + '_test_remove', + '_test_log_rotate', + '_test_log_rotate.0', + '_test_log_rotate.1', + '_test_log_rotate.2', + '_test_log_rotate.3', + '_test_log_rotate.4', + '_test_log_rotate.5', + '_test_log_rotate.6', + '_test_log_rotate.7', + '_test_log_rotate.8', + '_test_log_rotate.9', ); foreach ( $log_files as $file ) { $file_path = WC_Log_Handler_File::get_log_file_path( $file ); - if ( file_exists( $file_path ) && is_writable( $file_path ) ) { - unlink( $file_path ); + if ( file_exists( $file_path ) && is_writable( $file_path ) ) { // phpcs:ignore WordPress.VIP.FileSystemWritesDisallow.file_ops_is_writable + unlink( $file_path ); // phpcs:ignore WordPress.VIP.FileSystemWritesDisallow.file_ops_unlink } } parent::tearDown(); @@ -47,7 +47,10 @@ class WC_Tests_Log_Handler_File extends WC_Unit_Test_Case { public function test_legacy_format() { $handler = new WC_Log_Handler_File( array( 'threshold' => 'debug' ) ); - $handler->handle( time(), 'info', 'this is a message', array( 'source' => 'unit-tests', '_legacy' => true ) ); + $handler->handle( time(), 'info', 'this is a message', array( + 'source' => 'unit-tests', + '_legacy' => true, + ) ); $this->assertStringMatchesFormat( '%d-%d-%d @ %d:%d:%d - %s', $this->read_content( 'unit-tests' ) ); $this->assertStringEndsWith( ' - this is a message' . PHP_EOL, $this->read_content( 'unit-tests' ) ); @@ -172,7 +175,7 @@ class WC_Tests_Log_Handler_File extends WC_Unit_Test_Case { // Write some files to ensure they've rotated correctly for ( $i = 0; $i < 10; $i++ ) { - file_put_contents( WC_Log_Handler_File::get_log_file_path( $log_name . ".{$i}" ), $i ); + file_put_contents( WC_Log_Handler_File::get_log_file_path( $log_name . ".{$i}" ), $i ); // phpcs:ignore WordPress.VIP.FileSystemWritesDisallow.file_ops_file_put_contents } $context_source = array( 'source' => $log_name ); From beaa610cc0e0f736b3c3bd04263311b9d099c8fe Mon Sep 17 00:00:00 2001 From: Gerhard Potgieter Date: Mon, 9 Jul 2018 13:48:05 +0200 Subject: [PATCH 090/984] Only load tables for system that is part of current multisite, this avoids displaying all tables in a MS speeding up page load, and also prevent divulding tables on other sites in the MS environment. --- includes/api/class-wc-rest-system-status-controller.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/includes/api/class-wc-rest-system-status-controller.php b/includes/api/class-wc-rest-system-status-controller.php index b8c3f1d807b..fcf79e1bcda 100644 --- a/includes/api/class-wc-rest-system-status-controller.php +++ b/includes/api/class-wc-rest-system-status-controller.php @@ -722,6 +722,12 @@ class WC_REST_System_Status_Controller extends WC_REST_Controller { ); foreach ( $database_table_sizes as $table ) { + // Only include tables matching the prefix of the current site, this is to prevent displaying all tables on a MS install not relating to the current. + if ( is_multisite() ) { + if ( 0 !== strpos( $table->name, $wpdb->prefix ) ) { + continue; + } + } $table_type = in_array( $table->name, $core_tables ) ? 'woocommerce' : 'other'; $tables[ $table_type ][ $table->name ] = array( From a4e3283b20699b3202fd795c4fb90e8b86f7a0d2 Mon Sep 17 00:00:00 2001 From: Gerhard Potgieter Date: Mon, 9 Jul 2018 15:10:49 +0200 Subject: [PATCH 091/984] Update outdated templates notice --- .../admin/views/html-notice-template-check.php | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/includes/admin/views/html-notice-template-check.php b/includes/admin/views/html-notice-template-check.php index e326a750461..64742018040 100644 --- a/includes/admin/views/html-notice-template-check.php +++ b/includes/admin/views/html-notice-template-check.php @@ -1,6 +1,8 @@
    - + -

    Your theme (%1$s) contains outdated copies of some WooCommerce template files. These files may need updating to ensure they are compatible with the current version of WooCommerce. You can see which files are affected from the system status page. If in doubt, check with the author of the theme.', 'woocommerce' ), esc_html( $theme['Name'] ), esc_url( admin_url( 'admin.php?page=wc-status' ) ) ); ?>

    -

    +

    + + Your theme (%s) contains outdated copies of some WooCommerce template files. These files may need updating to ensure they are compatible with the current version of WooCommerce. Suggestions to fix this:', 'woocommerce' ), esc_html( $theme['Name'] ) ); // phpcs:ignore WordPress.XSS.EscapeOutput.OutputNotEscaped ?> +

      +
    1. +
    2. +
    +

    +

    + + +

    From 55d7ea4ac59cf9c5396895db1bc13945bcb159b1 Mon Sep 17 00:00:00 2001 From: Peter Fabian Date: Mon, 9 Jul 2018 17:11:50 +0200 Subject: [PATCH 092/984] Improved unit tests for products REST API endpoint. --- tests/unit-tests/api/products.php | 43 +++++++++++++++++++------------ 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/tests/unit-tests/api/products.php b/tests/unit-tests/api/products.php index be09770c7e1..88b16271ff5 100644 --- a/tests/unit-tests/api/products.php +++ b/tests/unit-tests/api/products.php @@ -531,13 +531,18 @@ class Products_API extends WC_REST_Unit_Test_Case { public function test_get_products_by_category() { wp_set_current_user( $this->user ); - // Test product assigned to a single category. + // Create one product with a category. $category = wp_insert_term( 'Some Category', 'product_cat' ); $product = new WC_Product_Simple(); $product->set_category_ids( array( $category['term_id'] ) ); $product->save(); + // Create one product without category, i.e. Uncategorized. + $product_2 = new WC_Product_Simple(); + $product_2->save(); + + // Test product assigned to a single category. $query_params = array( 'category' => (string) $category['term_id'], ); @@ -552,13 +557,7 @@ class Products_API extends WC_REST_Unit_Test_Case { $this->assertEquals( $product->get_category_ids(), wp_list_pluck( $response_product['categories'], 'id' ) ); } - $product->delete( true ); - wp_delete_term( $category['term_id'], 'product_cat' ); - // Test product without categories. - $product_2 = new WC_Product_Simple(); - $product_2->save(); - $request = new WP_REST_Request( 'GET', '/wc/v2/products/' . $product_2->get_id() ); $response = $this->server->dispatch( $request ); $response_product = $response->get_data(); @@ -567,6 +566,9 @@ class Products_API extends WC_REST_Unit_Test_Case { $this->assertCount( 1, $response_product['categories'] ); $this->assertEquals( 'uncategorized', $response_product['categories'][0]['slug'] ); + // Clean up. + wp_delete_term( $category['term_id'], 'product_cat' ); + $product->delete( true ); $product_2->delete( true ); } @@ -605,6 +607,7 @@ class Products_API extends WC_REST_Unit_Test_Case { $response_products = $response->get_data(); $this->assertEquals( 200, $response->get_status() ); + $this->assertEquals( count( $product_ids ), count( $response_products ) ); foreach ( $response_products as $response_product ) { $this->assertContains( $response_product['id'], $product_ids_for_type[ $product_type ], 'REST API: ' . $product_type . ' not found correctly' ); } @@ -621,7 +624,7 @@ class Products_API extends WC_REST_Unit_Test_Case { * * @since 3.5.0 */ - public function test_get_featured_product() { + public function test_get_featured_products() { wp_set_current_user( $this->user ); // Create a featured product. @@ -664,11 +667,11 @@ class Products_API extends WC_REST_Unit_Test_Case { } /** - * Test getting products by shipping class property. - * - * @since 3.5.0 - */ - public function test_get_product_by_shipping_class() { + * Test getting products by shipping class property. + * + * @since 3.5.0 + */ + public function test_get_products_by_shipping_class() { wp_set_current_user( $this->user ); $shipping_class_1 = wp_insert_term( 'Bulky', 'product_shipping_class' ); @@ -691,6 +694,7 @@ class Products_API extends WC_REST_Unit_Test_Case { } $product_1->delete( true ); + wp_delete_term( $shipping_class_1['term_id'], 'product_shipping_class' ); } /** @@ -698,16 +702,19 @@ class Products_API extends WC_REST_Unit_Test_Case { * * @since 3.5.0 */ - public function test_get_product_by_tag() { + public function test_get_products_by_tag() { wp_set_current_user( $this->user ); $test_tag_1 = wp_insert_term( 'Tag 1', 'product_tag' ); - $term_tag_1 = get_term_by( 'id', $test_tag_1['term_id'], 'product_tag' ); + // Product with a tag. $product = WC_Helper_Product::create_simple_product(); $product->set_tag_ids( array( $test_tag_1['term_id'] ) ); $product->save(); + // Product without a tag. + $product_2 = WC_Helper_Product::create_simple_product(); + $query_params = array( 'tag' => (string) $test_tag_1['term_id'], ); @@ -722,6 +729,8 @@ class Products_API extends WC_REST_Unit_Test_Case { } $product->delete( true ); + $product_2->delete( true ); + wp_delete_term( $test_tag_1['term_id'], 'product_tag' ); } /** @@ -729,7 +738,7 @@ class Products_API extends WC_REST_Unit_Test_Case { * * @since 3.5.0 */ - public function test_get_product_by_attribute() { + public function test_get_products_by_attribute() { global $wpdb; wp_set_current_user( $this->user ); @@ -770,6 +779,7 @@ class Products_API extends WC_REST_Unit_Test_Case { $response_products = $response->get_data(); $this->assertEquals( 200, $response->get_status() ); + $this->assertEquals( count( $expected_product_ids ), count( $response_products ) ); foreach ( $response_products as $response_product ) { $this->assertContains( $response_product['id'], $expected_product_ids ); } @@ -788,6 +798,7 @@ class Products_API extends WC_REST_Unit_Test_Case { $response_products = $response->get_data(); $this->assertEquals( 200, $response->get_status() ); + $this->assertEquals( count( $expected_product_ids ), count( $response_products ) ); foreach ( $response_products as $response_product ) { $this->assertContains( $response_product['id'], $expected_product_ids ); } From 4a42e2a7fc2f05f12aa080b41afa301cece5b669 Mon Sep 17 00:00:00 2001 From: Peter Fabian Date: Mon, 9 Jul 2018 17:12:23 +0200 Subject: [PATCH 093/984] Added unit tests for query params for variations REST API endpoint. --- tests/unit-tests/api/product-variations.php | 325 ++++++++++++++++++++ 1 file changed, 325 insertions(+) diff --git a/tests/unit-tests/api/product-variations.php b/tests/unit-tests/api/product-variations.php index d6c51e1ba2e..700189fab01 100644 --- a/tests/unit-tests/api/product-variations.php +++ b/tests/unit-tests/api/product-variations.php @@ -469,4 +469,329 @@ class Product_Variations_API extends WC_REST_Unit_Test_Case { $this->assertEquals( 200, $response->get_status() ); $this->assertEquals( 'parent', $variation['manage_stock'] ); } + + /** + * Test getting product variations filtered by product category. + * + * @since 3.5.0 + */ + public function test_get_variations_by_category() { + wp_set_current_user( $this->user ); + + // Create product assigned to a single category. + $category = wp_insert_term( 'Some Category', 'product_cat' ); + $variable_product = WC_Helper_Product::create_variation_product(); + $variable_product->set_category_ids( array( $category['term_id'] ) ); + $variable_product->save(); + $variations = $variable_product->get_children(); + + $query_params = array( + 'category' => (string) $category['term_id'], + ); + $request = new WP_REST_Request( 'GET', '/wc/v2/products/' . $variable_product->get_id() . '/variations' ); + $request->set_query_params( $query_params ); + $response = $this->server->dispatch( $request ); + $response_variations = $response->get_data(); + + $this->assertEquals( 200, $response->get_status() ); + $this->assertEquals( count( $variations ), count( $response_variations ) ); + foreach ( $response_variations as $response_variation ) { + $this->assertContains( $response_variation['id'], $variations ); + } + + // Clean up. + wp_delete_term( $category['term_id'], 'product_cat' ); + $variable_product->delete( true ); + } + + /** + * Test getting variations filtered by product type. + * + * @since 3.5.0 + */ + public function test_get_variations_by_type() { + wp_set_current_user( $this->user ); + + $simple = WC_Helper_Product::create_simple_product(); + $external = WC_Helper_Product::create_external_product(); + $grouped = WC_Helper_Product::create_grouped_product(); + $variable = WC_Helper_Product::create_variation_product(); + $variations = $variable->get_children(); + + $query_params = array( + 'type' => 'variable', + ); + $request = new WP_REST_Request( 'GET', '/wc/v2/products/' . $variable->get_id() . '/variations' ); + $request->set_query_params( $query_params ); + $response = $this->server->dispatch( $request ); + $response_variations = $response->get_data(); + + $this->assertEquals( 200, $response->get_status() ); + $this->assertEquals( count( $variations ), count( $response_variations ) ); + foreach ( $response_variations as $response_variation ) { + $this->assertContains( $response_variation['id'], $variations ); + } + + $query_params = array( + 'type' => 'simple', + ); + $request = new WP_REST_Request( 'GET', '/wc/v2/products/' . $variable->get_id() . '/variations' ); + $request->set_query_params( $query_params ); + $response = $this->server->dispatch( $request ); + $response_variations = $response->get_data(); + + $this->assertEquals( 200, $response->get_status() ); + $this->assertCount( 0, $response_variations ); + + $query_params = array( + 'type' => 'external', + ); + $request = new WP_REST_Request( 'GET', '/wc/v2/products/' . $variable->get_id() . '/variations' ); + $request->set_query_params( $query_params ); + $response = $this->server->dispatch( $request ); + $response_variations = $response->get_data(); + + $this->assertEquals( 200, $response->get_status() ); + $this->assertCount( 0, $response_variations ); + + $query_params = array( + 'type' => 'grouped', + ); + $request = new WP_REST_Request( 'GET', '/wc/v2/products/' . $variable->get_id() . '/variations' ); + $request->set_query_params( $query_params ); + $response = $this->server->dispatch( $request ); + $response_variations = $response->get_data(); + + $this->assertEquals( 200, $response->get_status() ); + $this->assertCount( 0, $response_variations ); + + $simple->delete( true ); + $external->delete( true ); + $variable->delete( true ); + $grouped->delete( true ); + } + + /** + * Test getting variations by featured property. + * + * @since 3.5.0 + */ + public function test_get_featured_variations() { + wp_set_current_user( $this->user ); + + // Create a featured product. + $feat_product = WC_Helper_Product::create_variation_product(); + $feat_product->set_featured( true ); + $feat_product->save(); + $feat_variations = $feat_product->get_children(); + + // Create a non-featured product. + $nonfeat_product = WC_Helper_Product::create_variation_product(); + $nonfeat_product->save(); + $nonfeat_variations = $nonfeat_product->get_children(); + + $query_params = array( + 'featured' => 'true', + ); + $request = new WP_REST_Request( 'GET', '/wc/v2/products/' . $feat_product->get_id() . '/variations' ); + $request->set_query_params( $query_params ); + $response = $this->server->dispatch( $request ); + $response_variations = $response->get_data(); + + $this->assertEquals( 200, $response->get_status() ); + $this->assertEquals( count( $feat_variations ), count( $response_variations ) ); + foreach ( $response_variations as $response_variation ) { + $this->assertContains( $response_variation['id'], $feat_variations ); + } + + $query_params = array( + 'featured' => 'false', + ); + $request = new WP_REST_Request( 'GET', '/wc/v2/products/' . $nonfeat_product->get_id() . '/variations' ); + $request->set_query_params( $query_params ); + $response = $this->server->dispatch( $request ); + $response_variations = $response->get_data(); + + $this->assertEquals( 200, $response->get_status() ); + $this->assertEquals( count( $nonfeat_variations ), count( $response_variations ) ); + foreach ( $response_variations as $response_variation ) { + $this->assertContains( $response_variation['id'], $nonfeat_variations ); + } + + $feat_product->delete( true ); + $nonfeat_product->delete( true ); + } + + /** + * Test getting products by shipping class property. + * + * @since 3.5.0 + */ + public function test_get_variations_by_shipping_class() { + wp_set_current_user( $this->user ); + + // Shipping class can be set on product and variation level. + $shipping_class_1 = wp_insert_term( 'Bulky', 'product_shipping_class' ); + $shipping_class_2 = wp_insert_term( 'Light', 'product_shipping_class' ); + + // Default shipping class for variations is set to Light. + $variable = WC_Helper_Product::create_variation_product(); + $variable->set_shipping_class_id( $shipping_class_2['term_id'] ); + $variations = $variable->get_available_variations(); + + // Bulky shipping class for first variation. + $variation_0 = wc_get_product( $variations[0]['variation_id'] ); + $variation_0->set_shipping_class_id( $shipping_class_1['term_id'] ); + $variation_0->save(); + + $variable->save(); + + // Test Bulky shipping class. + $query_params = array( + 'shipping_class' => (string) $shipping_class_1['term_id'], + ); + $request = new WP_REST_Request( 'GET', '/wc/v2/products/' . $variable->get_id() . '/variations' ); + $request->set_query_params( $query_params ); + $response = $this->server->dispatch( $request ); + $response_variations = $response->get_data(); + + $this->assertEquals( 200, $response->get_status() ); + $this->assertEquals( 1, count( $response_variations ) ); + foreach ( $response_variations as $response_variation ) { + $this->assertEquals( $response_variation['id'], $variations[0]['variation_id'] ); + } + + // Test Light shipping class. + $query_params = array( + 'shipping_class' => (string) $shipping_class_2['term_id'], + ); + $request = new WP_REST_Request( 'GET', '/wc/v2/products/' . $variable->get_id() . '/variations' ); + $request->set_query_params( $query_params ); + $response = $this->server->dispatch( $request ); + $response_variations = $response->get_data(); + + $this->assertEquals( 200, $response->get_status() ); + $this->assertEquals( 1, count( $response_variations ) ); + foreach ( $response_variations as $response_variation ) { + $this->assertEquals( $response_variation['id'], $variations[1]['variation_id'] ); + } + + $variable->delete( true ); + wp_delete_term( $shipping_class_1['term_id'], 'product_shipping_class' ); + wp_delete_term( $shipping_class_2['term_id'], 'product_shipping_class' ); + } + + /** + * Test getting variations filtered by tag. + * + * @since 3.5.0 + */ + public function test_get_variations_by_tag() { + wp_set_current_user( $this->user ); + + $test_tag_1 = wp_insert_term( 'Tag 1', 'product_tag' ); + + // Variable product with a tag. + $variable_product = WC_Helper_Product::create_variation_product(); + $variable_product->set_tag_ids( array( $test_tag_1['term_id'] ) ); + $variable_product->save(); + $variations = $variable_product->get_children(); + + // Variable product without a tag. + $variable_product_2 = WC_Helper_Product::create_variation_product(); + + $query_params = array( + 'tag' => (string) $test_tag_1['term_id'], + ); + $request = new WP_REST_Request( 'GET', '/wc/v2/products/' . $variable_product->get_id() . '/variations' ); + $request->set_query_params( $query_params ); + $response = $this->server->dispatch( $request ); + $response_variations = $response->get_data(); + + $this->assertEquals( 200, $response->get_status() ); + $this->assertEquals( count( $variations ), count( $response_variations ) ); + foreach ( $response_variations as $response_variation ) { + $this->assertContains( $response_variation['id'], $variations ); + } + + $query_params = array( + 'tag' => (string) $test_tag_1['term_id'], + ); + $request = new WP_REST_Request( 'GET', '/wc/v2/products/' . $variable_product_2->get_id() . '/variations' ); + $request->set_query_params( $query_params ); + $response = $this->server->dispatch( $request ); + $response_variations = $response->get_data(); + + $this->assertEquals( 200, $response->get_status() ); + $this->assertEquals( 0, count( $response_variations ) ); + + $variable_product->delete( true ); + $variable_product_2->delete( true ); + wp_delete_term( $test_tag_1['term_id'], 'product_tag' ); + } + + /** + * Test getting product variations by global attribute. + * + * @since 3.5.0 + */ + public function test_get_product_by_attribute() { + global $wpdb; + wp_set_current_user( $this->user ); + + // Variable product with 2 different variations. + $variable_product = WC_Helper_Product::create_variation_product(); + + // Create one variation without value. + $variation_id = wp_insert_post( array( + 'post_title' => 'Variation #' . ( $variable_product->get_id() + 3 ) . ' of Dummy Product', + 'post_type' => 'product_variation', + 'post_parent' => $variable_product->get_id(), + 'post_status' => 'publish', + 'menu_order' => 3, + ) ); + + // Price related meta. + update_post_meta( $variation_id, '_price', '16' ); + update_post_meta( $variation_id, '_regular_price', '16' ); + + // General meta. + update_post_meta( $variation_id, '_sku', 'DUMMY SKU VARIABLE NOVALUE' ); + update_post_meta( $variation_id, '_manage_stock', 'no' ); + update_post_meta( $variation_id, '_downloadable', 'no' ); + update_post_meta( $variation_id, '_virtual', 'no' ); + update_post_meta( $variation_id, '_stock_status', 'instock' ); + + // Add the variation meta to the main product. + update_post_meta( $variable_product->get_id(), '_max_price_variation_id', $variation_id ); + + wp_set_object_terms( $variation_id, 'variation', 'product_type' ); + + $variations = $variable_product->get_available_variations(); + + foreach ( $variations as $variation ) { + $attrib_value = isset( $variation['attributes']['attribute_pa_size'] ) ? $variation['attributes']['attribute_pa_size'] : null; + // Skip testing without attribute. + if ( ! $attrib_value ) { + continue; + } + $query_params = array( + 'attribute' => 'pa_size', + 'attribute_term' => (string) get_term_by( 'slug', $attrib_value, 'pa_size' )->term_id, + ); + $expected_product_ids = array( $variation['variation_id'] ); + $request = new WP_REST_Request( 'GET', '/wc/v2/products/' . $variable_product->get_id() . '/variations' ); + $request->set_query_params( $query_params ); + $response = $this->server->dispatch( $request ); + $response_variations = $response->get_data(); + + $this->assertEquals( 200, $response->get_status() ); + $this->assertEquals( 1, count( $response_variations ) ); + foreach ( $response_variations as $response_variation ) { + $this->assertContains( $response_variation['id'], $expected_product_ids ); + } + } + + $variable_product->delete( true ); + } } From 2839dba7d2a37970b4f41be0948335156cdf5815 Mon Sep 17 00:00:00 2001 From: Peter Fabian Date: Mon, 9 Jul 2018 17:14:12 +0200 Subject: [PATCH 094/984] Switched implementation of variation query parameters in the API from SQL query adjustment to one extra parent query. --- ...-wc-rest-product-variations-controller.php | 96 ++++++++----------- 1 file changed, 39 insertions(+), 57 deletions(-) diff --git a/includes/api/class-wc-rest-product-variations-controller.php b/includes/api/class-wc-rest-product-variations-controller.php index 1ae7320e7a6..6c5d9f6f163 100644 --- a/includes/api/class-wc-rest-product-variations-controller.php +++ b/includes/api/class-wc-rest-product-variations-controller.php @@ -258,47 +258,6 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller return apply_filters( "woocommerce_rest_prepare_{$this->post_type}_object", $response, $object, $request ); } - /** - * Update JOIN part of WP_Query with parent table and taxonomies, if needed. - * - * @param string $join JOIN clause from WP_Query. - * @param WP_Query $wp_query WP_Query object. - * - * @return string - */ - public function parent_product_taxonomies_query_join( $join, $wp_query ) { - global $wpdb; - - // TODO: add some more checks here, probably only run in case one of the following filters are active: - // category, prod type, visibility, tag, shipping class, attribute; post_type == product_variation. - if ( isset( $wp_query->query_vars['post_parent'] ) && isset( $wp_query->query_vars['meta_query'] ) - && isset( $wp_query->query_vars['post_type'] ) && 'product_variation' === $wp_query->query_vars['post_type'] ) { - $join .= " LEFT JOIN {$wpdb->posts} AS {$this->parent_product_table_name} ON ({$wpdb->posts}.post_parent = {$this->parent_product_table_name}.ID) "; - $join .= $this->clauses['join']; - } - - return $join; - } - - /** - * Update WHERE part of WP_Query to match parent product with taxonomies, if needed. - * - * @param string $where WHERE clause from WP_Query. - * @param WP_Query $wp_query WP_Query object. - * - * @return string - */ - public function parent_product_taxonomies_query_where( $where, $wp_query ) { - // TODO: add some more checks here, probably only run in case one of the following filters are active: - // category, prod type, visibility, tag, shipping class, attribute; post_type == product_variation. - if ( isset( $wp_query->query_vars['post_parent'] ) - && isset( $wp_query->query_vars['post_type'] ) && 'product_variation' === $wp_query->query_vars['post_type'] ) { - $where .= $this->clauses['where']; - } - - return $where; - } - /** * Prepare objects query. * @@ -310,32 +269,55 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller $args = parent::prepare_objects_query( $request ); $args['post_parent'] = $request['product_id']; - // TODO: check if WC_Product_Data_Store_CPT::find_matching_product_variation could not be used... - // fix the filtering, otherwise taxonomy is not mapped correctly to variable product. $taxonomies = isset( $args['tax_query'] ) ? $args['tax_query'] : array(); - // maybe do this only if there are taxonomies as categories etc, not attributes and terms? - $query_for_parent = new WP_Query( $args ); - $query_for_parent->parse_tax_query( $query_for_parent->query_vars ); - $this->clauses = $query_for_parent->tax_query->get_sql( $this->parent_product_table_name, 'ID' ); + $parent_query = new WC_REST_Products_Controller(); + $parent_request = clone $request; + $parent_request['include'] = array( $request['product_id'] ); + // Shipping class can be set separately for variations and parent product. Unlike for attributes, the parent + // does not have all shipping classes of the variations assigned to it, so the parent filtering should ignore + // shipping class. + $parent_request['shipping_class'] = ''; + $query_args = $parent_query->prepare_objects_query( $parent_request ); + $query_results = $parent_query->get_objects( $query_args ); - // this does not work anyway as these are not assigned to variation. + // In case the parent does not fulfil the constraints, no variations should be returned. + if ( 0 === $query_results['total'] ) { + $args['post_parent'] = 0; + } + + // Ignore taxonomy queries, as they were already matched against parent (or will be transformed to meta query + // later on). unset( $args['tax_query'] ); - // these properties should filter parent product: - // - product_type, _visibility_, cat, tag, shipping_class - // this will run a bit later. - add_filter( 'posts_where', array( $this, 'parent_product_taxonomies_query_where' ), 10, 2 ); - add_filter( 'posts_join', array( $this, 'parent_product_taxonomies_query_join' ), 10, 2 ); - $GLOBALS['wpdb']->query( 'SET SESSION SQL_BIG_SELECTS=1' ); - // These properties needs to be transformed to meta query. + // Attributes needs to be transformed to meta query, shipping class to taxonomy. foreach ( $taxonomies as $taxonomy ) { - if ( in_array( $taxonomy['taxonomy'], array( 'product_type', 'product_visibility', 'product_cat', 'product_tag', 'product_shipping_class' ), true ) ) { + // Ignore taxonomies tied to parent product. + if ( in_array( $taxonomy['taxonomy'], array( 'product_type', 'product_visibility', 'product_cat', 'product_tag' ), true ) ) { continue; } + // Shipping class can be associated with either the parent or the individual variation. + if ( 'product_shipping_class' === $taxonomy['taxonomy'] ) { + // If requested shipping class is different from parent's shipping class, it's assigned to variation, + // so passing the taxonomy query forward to check against variations. + if ( $query_results['total'] > 0 && $taxonomy['terms'][0] !== $query_results['objects'][0]->get_shipping_class_id() ) { + $args['tax_query'][] = $taxonomy; + continue; + } else { + // In case the request should to return variations with shipping class equal to parent's shipping class, + // there are no records in taxonomy relationship table. + $args['tax_query'][] = array( + 'taxonomy' => 'product_shipping_class', + 'operator' => 'NOT EXISTS', + ); + continue; + } + } + + // Attributes switched to meta query. if ( 'term_id' === $taxonomy['field'] ) { - $terms = wc_get_product_terms( 10, $taxonomy['taxonomy'], array( 'fields' => 'slugs' ) ); + $terms = wc_get_product_terms( $request['product_id'], $taxonomy['taxonomy'], array( 'fields' => 'slugs' ) ); $value = isset( $terms[ $taxonomy['terms'][0] ] ) ? $terms[ $taxonomy['terms'][0] ] : null; } else { $value = $taxonomy['terms'][0]; From 7443a2f906173523cbea31b2f64c1178f8be5506 Mon Sep 17 00:00:00 2001 From: Peter Fabian Date: Mon, 9 Jul 2018 18:27:56 +0200 Subject: [PATCH 095/984] Switched variation creation to CRUD methods for unit test. --- tests/unit-tests/api/product-variations.php | 30 +++++---------------- 1 file changed, 7 insertions(+), 23 deletions(-) diff --git a/tests/unit-tests/api/product-variations.php b/tests/unit-tests/api/product-variations.php index e8e4fd2cc25..f47348faba6 100644 --- a/tests/unit-tests/api/product-variations.php +++ b/tests/unit-tests/api/product-variations.php @@ -743,30 +743,14 @@ class Product_Variations_API extends WC_REST_Unit_Test_Case { // Variable product with 2 different variations. $variable_product = WC_Helper_Product::create_variation_product(); - // Create one variation without value. - $variation_id = wp_insert_post( array( - 'post_title' => 'Variation #' . ( $variable_product->get_id() + 3 ) . ' of Dummy Product', - 'post_type' => 'product_variation', - 'post_parent' => $variable_product->get_id(), - 'post_status' => 'publish', - 'menu_order' => 3, + // Create one variation without attribute value. + $variation_3 = new WC_Product_Variation(); + $variation_3->set_props( array( + 'parent_id' => $variable_product->get_id(), + 'sku' => 'DUMMY SKU VARIABLE NOSIZE', + 'regular_price' => 16, ) ); - - // Price related meta. - update_post_meta( $variation_id, '_price', '16' ); - update_post_meta( $variation_id, '_regular_price', '16' ); - - // General meta. - update_post_meta( $variation_id, '_sku', 'DUMMY SKU VARIABLE NOVALUE' ); - update_post_meta( $variation_id, '_manage_stock', 'no' ); - update_post_meta( $variation_id, '_downloadable', 'no' ); - update_post_meta( $variation_id, '_virtual', 'no' ); - update_post_meta( $variation_id, '_stock_status', 'instock' ); - - // Add the variation meta to the main product. - update_post_meta( $variable_product->get_id(), '_max_price_variation_id', $variation_id ); - - wp_set_object_terms( $variation_id, 'variation', 'product_type' ); + $variation_3->save(); $variations = $variable_product->get_available_variations(); From 28cb32e54bea0b9334443f5b7e335070b280ae07 Mon Sep 17 00:00:00 2001 From: Peter Fabian Date: Mon, 9 Jul 2018 18:30:10 +0200 Subject: [PATCH 096/984] PHPCS fixes. --- tests/framework/helpers/class-wc-helper-product.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/framework/helpers/class-wc-helper-product.php b/tests/framework/helpers/class-wc-helper-product.php index 8f62d7aa274..acea76c592e 100644 --- a/tests/framework/helpers/class-wc-helper-product.php +++ b/tests/framework/helpers/class-wc-helper-product.php @@ -176,7 +176,8 @@ class WC_Helper_Product { global $wc_product_attributes; $wc_product_attributes = array(); foreach ( wc_get_attribute_taxonomies() as $tax ) { - if ( $name = wc_attribute_taxonomy_name( $tax->attribute_name ) ) { + $name = wc_attribute_taxonomy_name( $tax->attribute_name ); + if ( $name ) { $wc_product_attributes[ $name ] = $tax; } } @@ -207,7 +208,9 @@ class WC_Helper_Product { $attribute_id = absint( $attribute_id ); - $wpdb->query( "DELETE FROM {$wpdb->prefix}woocommerce_attribute_taxonomies WHERE attribute_id = $attribute_id" ); + $wpdb->query( + $wpdb->prepare( "DELETE FROM {$wpdb->prefix}woocommerce_attribute_taxonomies WHERE attribute_id = %d", $attribute_id ) + ); } /** From 44b7257c0c68c7a0acb4406a49ac8a97e297e7a0 Mon Sep 17 00:00:00 2001 From: Claudiu Lodromanean Date: Mon, 9 Jul 2018 11:06:35 -0700 Subject: [PATCH 097/984] Update readme.txt --- readme.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/readme.txt b/readme.txt index 1c4092b43dc..a8af94e1288 100644 --- a/readme.txt +++ b/readme.txt @@ -198,6 +198,7 @@ Yes you can! Join in on our [GitHub repository](https://github.com/woocommerce/w * Dev - Added `woocommerce_shipping_method_add_rate_args` and `woocommerce_shipping_method_add_rate` filters. #20633 * Dev - Added `woocommerce_coupon_validate_user_usage_limit` filter. #20630 * Dev - Add hooks needed for product custom tables feature plugin. #20520 +* Dev - Added new filter to 'Item in quotes' translation for messages. ##20714 * Localization - Updated IT provinces. #20286 * Localization - Eircode validation. #20330 From 67160f5e923f05e332f9d0f5d10a8b67fa475cea Mon Sep 17 00:00:00 2001 From: Claudiu Lodromanean Date: Mon, 9 Jul 2018 11:27:35 -0700 Subject: [PATCH 098/984] Update readme.txt --- readme.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/readme.txt b/readme.txt index a8af94e1288..e823096f088 100644 --- a/readme.txt +++ b/readme.txt @@ -167,6 +167,7 @@ Yes you can! Join in on our [GitHub repository](https://github.com/woocommerce/w * Enhancement - Improved shipping calculator experience. Shows destination country and added context to calculate shipping link. #20345 * Enhancement - On the fly image generation for frontend, if image sizes are missing. #20011 * Enhancement - SelectWoo enabled product categories dropdown widget. #20617 +* Enhancement - Make it easier to read and act upon the outdated template notice. #20732 * Fix - Check billing email is posted before using in WC_Cart::check_customer_coupons. #20180 * Fix - Shipping postcode formatting when only posting a billing address. #20330 * Fix - Correctly show/hide save card checkbox on tokenization form. #20506 From 36b6bd79c0d61035e979b017a23b6c0c79accaba Mon Sep 17 00:00:00 2001 From: Gerhard Potgieter Date: Tue, 10 Jul 2018 10:30:11 +0200 Subject: [PATCH 099/984] Add update routines to recreate user roles --- includes/class-wc-install.php | 4 ++++ includes/wc-update-functions.php | 19 +++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/includes/class-wc-install.php b/includes/class-wc-install.php index 55c919e7ed8..32f61af40f2 100644 --- a/includes/class-wc-install.php +++ b/includes/class-wc-install.php @@ -109,6 +109,10 @@ class WC_Install { 'wc_update_343_cleanup_foreign_keys', 'wc_update_343_db_version', ), + '3.4.4' => array( + 'wc_update_344_recreate_roles', + 'wc_update_344_db_version', + ), '3.5.0' => array( 'wc_update_350_order_customer_id', 'wc_update_350_db_version', diff --git a/includes/wc-update-functions.php b/includes/wc-update-functions.php index c564831bbdf..8a7da4ededa 100644 --- a/includes/wc-update-functions.php +++ b/includes/wc-update-functions.php @@ -1836,6 +1836,25 @@ function wc_update_343_db_version() { WC_Install::update_db_version( '3.4.3' ); } +/** + * Recreate user roles so existing users will get the new capabilities. + * + * @return void + */ +function wc_update_344_recreate_roles() { + WC_Install::remove_roles(); + WC_Install::create_roles(); +} + +/** + * Update DB version. + * + * @return void + */ +function wc_update_344_db_version() { + WC_Install::update_db_version( '3.4.4' ); +} + /** * Copy order customer_id from post meta to post_author and set post_author to 0 for refunds. * From ac094738539d12849ec3e815e7e24b58272dbc9d Mon Sep 17 00:00:00 2001 From: Gerhard Potgieter Date: Tue, 10 Jul 2018 10:56:49 +0200 Subject: [PATCH 100/984] Escape sku input properly for quickedit --- includes/admin/class-wc-admin-post-types.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/admin/class-wc-admin-post-types.php b/includes/admin/class-wc-admin-post-types.php index f287deb1095..52f842cf96d 100644 --- a/includes/admin/class-wc-admin-post-types.php +++ b/includes/admin/class-wc-admin-post-types.php @@ -352,7 +352,7 @@ class WC_Admin_Post_Types { if ( ! empty( $new_sku ) ) { $unique_sku = wc_product_has_unique_sku( $post_id, $new_sku ); if ( $unique_sku ) { - $product->set_sku( $new_sku ); + $product->set_sku( wc_clean( wp_unslash( $new_sku ) ) ); } } else { $product->set_sku( '' ); From f135882bdaf11e8bffe69e7fae73a6c570d55273 Mon Sep 17 00:00:00 2001 From: Claudio Sanches Date: Tue, 10 Jul 2018 15:18:38 -0300 Subject: [PATCH 101/984] Update readme.txt for #20670 --- readme.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/readme.txt b/readme.txt index e823096f088..b6d3a628294 100644 --- a/readme.txt +++ b/readme.txt @@ -186,6 +186,7 @@ Yes you can! Join in on our [GitHub repository](https://github.com/woocommerce/w * Performance - Exclude frontend include from REST API calls. #20000 * Dev - REST API - Allows oAuth1.0a authentication under SSL. * Dev - REST API - Fix position param for images. #20497 +* Dev - REST API - Handle children products deletion regardless of type. #20670 * Dev - Added woocommerce_increase_coupon_usage_count and woocommerce_decrease_coupon_usage_count action hooks to increase extensibility of Coupons. #19981 * Dev - Add endpoints to account menu items filter. #19980 * Dev - Added qty param to `wc_add_to_cart_message` filter. #19817 From 3cda8c439ce8dc7a1a9b6b0115ddc21623fff07e Mon Sep 17 00:00:00 2001 From: Gerhard Potgieter Date: Wed, 11 Jul 2018 11:19:10 +0200 Subject: [PATCH 102/984] Better table matching on multisite, hat tip to @claudiulodro for pointing me in the right direction. --- includes/api/class-wc-rest-system-status-controller.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/includes/api/class-wc-rest-system-status-controller.php b/includes/api/class-wc-rest-system-status-controller.php index fcf79e1bcda..7ab23db7ae9 100644 --- a/includes/api/class-wc-rest-system-status-controller.php +++ b/includes/api/class-wc-rest-system-status-controller.php @@ -721,12 +721,11 @@ class WC_REST_System_Status_Controller extends WC_REST_Controller { 'index' => 0, ); + $site_tables = $wpdb->tables( 'all', true ); foreach ( $database_table_sizes as $table ) { // Only include tables matching the prefix of the current site, this is to prevent displaying all tables on a MS install not relating to the current. - if ( is_multisite() ) { - if ( 0 !== strpos( $table->name, $wpdb->prefix ) ) { - continue; - } + if ( is_multisite() && ! in_array( $table->name, $site_tables, true ) ) { + continue; } $table_type = in_array( $table->name, $core_tables ) ? 'woocommerce' : 'other'; From 327fd26c704eaf8b0b00a0246f957684b39d8769 Mon Sep 17 00:00:00 2001 From: ldybecklee Date: Wed, 11 Jul 2018 17:28:50 +0800 Subject: [PATCH 103/984] Fix product csv exporter get stock value seems the original get stock value is wrong, but I'm not sure if my change is correct... what i'm considering is this line: if ( $product->is_type( 'variation' && 'parent' === $manage_stock ) ) { --- includes/export/class-wc-product-csv-exporter.php | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/includes/export/class-wc-product-csv-exporter.php b/includes/export/class-wc-product-csv-exporter.php index c9f3f0ed25d..ce0eb8e4e2c 100644 --- a/includes/export/class-wc-product-csv-exporter.php +++ b/includes/export/class-wc-product-csv-exporter.php @@ -399,13 +399,17 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter { $manage_stock = $product->get_manage_stock( 'edit' ); $stock_quantity = $product->get_stock_quantity( 'edit' ); - if ( $product->is_type( 'variation' && 'parent' === $manage_stock ) ) { - return 'parent'; - } elseif ( $manage_stock ) { + if ( $manage_stock ) { return $stock_quantity; - } else { - return ''; + } else if ( $product->is_type( 'variation' ) ) { + if ( $product->get_parent_id( 'edit' ) ) { + $parent = wc_get_product( $product->get_parent_id( 'edit' ) ); + if( $parent->get_manage_stock( 'edit' ) ) { + return 'parent'; + } + } } + return ''; } /** From 47d0bb7b6a7a021890b1b288fb86e4e70373a3b1 Mon Sep 17 00:00:00 2001 From: Peter Fabian Date: Wed, 11 Jul 2018 13:44:43 +0200 Subject: [PATCH 104/984] Removed variables that are not needed. --- ...class-wc-rest-product-variations-controller.php | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/includes/api/class-wc-rest-product-variations-controller.php b/includes/api/class-wc-rest-product-variations-controller.php index 51c3ec02f6a..f196b0e9497 100644 --- a/includes/api/class-wc-rest-product-variations-controller.php +++ b/includes/api/class-wc-rest-product-variations-controller.php @@ -39,20 +39,6 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Products_Controller */ protected $post_type = 'product_variation'; - /** - * Name of parent product table in SQL query. - * - * @var string - */ - protected $parent_product_table_name = 'p_wc_variation_parent'; - - /** - * Extra clauses to add to WP_Query. - * - * @var array - */ - protected $clauses = array(); - /** * Initialize product actions (parent). */ From f0bd83050249f3fe3dbc473b82c5d25eb193d86f Mon Sep 17 00:00:00 2001 From: Gerhard Potgieter Date: Wed, 11 Jul 2018 13:54:14 +0200 Subject: [PATCH 105/984] Do not return or store user agent in lower case as HTTP header fields values are case sensitive as per rfc2616 --- includes/class-wc-frontend-scripts.php | 2 +- includes/wc-core-functions.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/includes/class-wc-frontend-scripts.php b/includes/class-wc-frontend-scripts.php index 6257d61940d..bce20487632 100644 --- a/includes/class-wc-frontend-scripts.php +++ b/includes/class-wc-frontend-scripts.php @@ -390,7 +390,7 @@ class WC_Frontend_Scripts { } if ( 'geolocation_ajax' === get_option( 'woocommerce_default_customer_address' ) ) { - $ua = wc_get_user_agent(); // Exclude common bots from geolocation by user agent. + $ua = strtolower( wc_get_user_agent() ); // Exclude common bots from geolocation by user agent. if ( ! strstr( $ua, 'bot' ) && ! strstr( $ua, 'spider' ) && ! strstr( $ua, 'crawl' ) ) { self::enqueue_script( 'wc-geolocation' ); diff --git a/includes/wc-core-functions.php b/includes/wc-core-functions.php index 562d41ed85c..6631d4339c4 100644 --- a/includes/wc-core-functions.php +++ b/includes/wc-core-functions.php @@ -1064,7 +1064,7 @@ function wc_get_customer_default_location() { case 'geolocation_ajax': case 'geolocation': // Exclude common bots from geolocation by user agent. - $ua = wc_get_user_agent(); + $ua = strtolower( wc_get_user_agent() ); if ( ! strstr( $ua, 'bot' ) && ! strstr( $ua, 'spider' ) && ! strstr( $ua, 'crawl' ) ) { $location = WC_Geolocation::geolocate_ip( '', true, false ); @@ -1093,7 +1093,7 @@ function wc_get_customer_default_location() { * @return string */ function wc_get_user_agent() { - return isset( $_SERVER['HTTP_USER_AGENT'] ) ? strtolower( wc_clean( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) ) ) : ''; // @codingStandardsIgnoreLine + return isset( $_SERVER['HTTP_USER_AGENT'] ) ? wc_clean( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) ) : ''; // @codingStandardsIgnoreLine } // This function can be removed when WP 3.9.2 or greater is required. From a6e7ae15f94290019fc5d549029d45d0298a1565 Mon Sep 17 00:00:00 2001 From: Gerhard Potgieter Date: Wed, 11 Jul 2018 14:11:31 +0200 Subject: [PATCH 106/984] Add unit test for testing wc_get_user_agent --- .../unit-tests/util/class-wc-tests-core-functions.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/unit-tests/util/class-wc-tests-core-functions.php b/tests/unit-tests/util/class-wc-tests-core-functions.php index 5c7a9602cf9..baaf7439ea2 100644 --- a/tests/unit-tests/util/class-wc-tests-core-functions.php +++ b/tests/unit-tests/util/class-wc-tests-core-functions.php @@ -694,4 +694,15 @@ class WC_Tests_Core_Functions extends WC_Unit_Test_Case { $this->assertEquals( wc_selected( $value, $options ), $actual_result ); } } + + /** + * Test wc_get_user_agent function. + * + * @return void + */ + public function test_wc_get_user_agent() { + $example_user_agent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'; + $_SERVER['HTTP_USER_AGENT'] = $example_user_agent; + $this->assertEquals( $example_user_agent, wc_get_user_agent() ); + } } From eb533d0263b7beef395cf04bb42f3afc336d87a7 Mon Sep 17 00:00:00 2001 From: Gerhard Potgieter Date: Wed, 11 Jul 2018 14:25:42 +0200 Subject: [PATCH 107/984] Update test_get_woocommerce_currencies to test for both cached and uncached currencies, gives us more code coverage --- tests/unit-tests/util/class-wc-tests-core-functions.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tests/unit-tests/util/class-wc-tests-core-functions.php b/tests/unit-tests/util/class-wc-tests-core-functions.php index 5c7a9602cf9..3b516c319af 100644 --- a/tests/unit-tests/util/class-wc-tests-core-functions.php +++ b/tests/unit-tests/util/class-wc-tests-core-functions.php @@ -27,6 +27,7 @@ class WC_Tests_Core_Functions extends WC_Unit_Test_Case { * @since 2.2 */ public function test_get_woocommerce_currencies() { + static $currencies; $expected_currencies = array( 'AED' => 'United Arab Emirates dirham', @@ -194,6 +195,10 @@ class WC_Tests_Core_Functions extends WC_Unit_Test_Case { ); $this->assertEquals( $expected_currencies, get_woocommerce_currencies() ); + + // Unset cached currencies and test again. + unset( $currencies ); + $this->assertEquals( $expected_currencies, get_woocommerce_currencies() ); } /** From 2f7e42bb2f0bab68267e923d2ab41923a407e696 Mon Sep 17 00:00:00 2001 From: Gerhard Potgieter Date: Wed, 11 Jul 2018 14:38:33 +0200 Subject: [PATCH 108/984] Add wc_get_theme_support unit test --- .../util/class-wc-tests-core-functions.php | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/tests/unit-tests/util/class-wc-tests-core-functions.php b/tests/unit-tests/util/class-wc-tests-core-functions.php index 3b516c319af..de4c5ee3649 100644 --- a/tests/unit-tests/util/class-wc-tests-core-functions.php +++ b/tests/unit-tests/util/class-wc-tests-core-functions.php @@ -220,6 +220,32 @@ class WC_Tests_Core_Functions extends WC_Unit_Test_Case { } } + /** + * Test wc_get_theme_support() + * + * @return void + */ + public function test_wc_get_theme_support() { + $this->assertEquals( 'default', wc_get_theme_support( '', 'default' ) ); + + $theme_support_options = array( + 'thumbnail_image_width' => 150, + 'single_image_width' => 300, + 'product_grid' => array( + 'default_rows' => 3, + 'min_rows' => 2, + 'max_rows' => 8, + 'default_columns' => 4, + 'min_columns' => 2, + 'max_columns' => 5, + ), + ); + add_theme_support( 'woocommerce', $theme_support_options ); + + $this->assertEquals( $theme_support_options, wc_get_theme_support() ); + $this->assertEquals( $theme_support_options['product_grid'], wc_get_theme_support( 'product_grid' ) ); + } + /** * Test get_woocommerce_api_url(). * From 1d5605c9dc2df483b220db94db32aa501022f25b Mon Sep 17 00:00:00 2001 From: Gerhard Potgieter Date: Wed, 11 Jul 2018 14:59:05 +0200 Subject: [PATCH 109/984] Add wc_array_cartesian unit test --- .../util/class-wc-tests-core-functions.php | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/tests/unit-tests/util/class-wc-tests-core-functions.php b/tests/unit-tests/util/class-wc-tests-core-functions.php index de4c5ee3649..1b3f5b1839a 100644 --- a/tests/unit-tests/util/class-wc-tests-core-functions.php +++ b/tests/unit-tests/util/class-wc-tests-core-functions.php @@ -725,4 +725,59 @@ class WC_Tests_Core_Functions extends WC_Unit_Test_Case { $this->assertEquals( wc_selected( $value, $options ), $actual_result ); } } + + /** + * Test wc_array_cartesian. + * + * @return void + */ + public function test_wc_array_cartesian() { + $product = new WC_Product_Variable(); + $attributes = array(); + + $attribute = new \WC_Product_Attribute(); + $attribute->set_id( 0 ); + $attribute->set_name( 'Attr1' ); + $attribute->set_options( array( 'Attr1 Value 1', 'Attr1 Value 2' ) ); + $attribute->set_position( 0 ); + $attribute->set_visible( true ); + $attribute->set_variation( true ); + $attributes[] = $attribute; + + $attribute = new \WC_Product_Attribute(); + $attribute->set_id( 0 ); + $attribute->set_name( 'Attr2' ); + $attribute->set_options( array( 'Attr2 Value 1', 'Attr2 Value 2' ) ); + $attribute->set_position( 0 ); + $attribute->set_visible( true ); + $attribute->set_variation( true ); + $attributes[] = $attribute; + + $product->set_props( array( + 'attributes' => $attributes, + ) ); + $product->save(); + + $variation_attributes = wc_list_pluck( array_filter( $product->get_attributes(), 'wc_attributes_array_filter_variation' ), 'get_slugs' ); + $expected_combinations = array( + array( + 'attr2' => 'Attr2 Value 1', + 'attr1' => 'Attr1 Value 1', + ), + array( + 'attr2' => 'Attr2 Value 2', + 'attr1' => 'Attr1 Value 1', + ), + array( + 'attr2' => 'Attr2 Value 1', + 'attr1' => 'Attr1 Value 2', + ), + array( + 'attr2' => 'Attr2 Value 2', + 'attr1' => 'Attr1 Value 2', + ), + ); + + $this->assertEquals( $expected_combinations, array_reverse( wc_array_cartesian( $variation_attributes ) ) ); + } } From 0c01b6c3bbbe04e3b33110127d92bee0b5c26e58 Mon Sep 17 00:00:00 2001 From: Gerhard Potgieter Date: Wed, 11 Jul 2018 15:05:18 +0200 Subject: [PATCH 110/984] Add wc_get_credit_card_type_label unit test --- .../util/class-wc-tests-core-functions.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/tests/unit-tests/util/class-wc-tests-core-functions.php b/tests/unit-tests/util/class-wc-tests-core-functions.php index 1b3f5b1839a..7ec7ef0f109 100644 --- a/tests/unit-tests/util/class-wc-tests-core-functions.php +++ b/tests/unit-tests/util/class-wc-tests-core-functions.php @@ -780,4 +780,17 @@ class WC_Tests_Core_Functions extends WC_Unit_Test_Case { $this->assertEquals( $expected_combinations, array_reverse( wc_array_cartesian( $variation_attributes ) ) ); } + + /** + * Test wc_get_credit_card_type_label. + * + * @return void + */ + public function test_wc_get_credit_card_type_label() { + $this->assertEquals( 'Visa', wc_get_credit_card_type_label( 'visa' ) ); + $this->assertEquals( 'JCB', wc_get_credit_card_type_label( 'jCb' ) ); + $this->assertEquals( 'MasterCard', wc_get_credit_card_type_label( 'Mastercard' ) ); + $this->assertEquals( 'American Express', wc_get_credit_card_type_label( 'american_express' ) ); + $this->assertEquals( 'American Express', wc_get_credit_card_type_label( 'american-express' ) ); + } } From a28253739f9634a36244399647590dfdbd75aea0 Mon Sep 17 00:00:00 2001 From: Gerhard Potgieter Date: Wed, 11 Jul 2018 15:10:55 +0200 Subject: [PATCH 111/984] Add wc_get_permalink_structure unit test --- .../util/class-wc-tests-core-functions.php | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/unit-tests/util/class-wc-tests-core-functions.php b/tests/unit-tests/util/class-wc-tests-core-functions.php index 7ec7ef0f109..f80e15ff911 100644 --- a/tests/unit-tests/util/class-wc-tests-core-functions.php +++ b/tests/unit-tests/util/class-wc-tests-core-functions.php @@ -793,4 +793,24 @@ class WC_Tests_Core_Functions extends WC_Unit_Test_Case { $this->assertEquals( 'American Express', wc_get_credit_card_type_label( 'american_express' ) ); $this->assertEquals( 'American Express', wc_get_credit_card_type_label( 'american-express' ) ); } + + /** + * Test wc_get_permalink_structure. + * + * @return void + */ + public function test_wc_get_permalink_structure() { + $expected_structure = array( + 'product_base' => 'product', + 'category_base' => 'product-category', + 'tag_base' => 'product-tag', + 'attribute_base' => '', + 'use_verbose_page_rules' => '', + 'product_rewrite_slug' => 'product', + 'category_rewrite_slug' => 'product-category', + 'tag_rewrite_slug' => 'product-tag', + 'attribute_rewrite_slug' => '', + ); + $this->assertEquals( $expected_structure, wc_get_permalink_structure() ); + } } From 9e495478f47dfbccf61e237bad508a17403aed8c Mon Sep 17 00:00:00 2001 From: Gerhard Potgieter Date: Wed, 11 Jul 2018 15:17:00 +0200 Subject: [PATCH 112/984] Add unit test for wc_decimal_to_fraction --- tests/unit-tests/util/class-wc-tests-core-functions.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tests/unit-tests/util/class-wc-tests-core-functions.php b/tests/unit-tests/util/class-wc-tests-core-functions.php index f80e15ff911..bc86a2f7f55 100644 --- a/tests/unit-tests/util/class-wc-tests-core-functions.php +++ b/tests/unit-tests/util/class-wc-tests-core-functions.php @@ -813,4 +813,13 @@ class WC_Tests_Core_Functions extends WC_Unit_Test_Case { ); $this->assertEquals( $expected_structure, wc_get_permalink_structure() ); } + + /** + * Test wc_decimal_to_fraction. + * + * @return void + */ + public function test_wc_decimal_to_fraction() { + $this->assertEquals( array( 7, 2 ), wc_decimal_to_fraction( '3.5' ) ); + } } From 0dd61dd2f6e702f8c5bf44c0a5bbab6509e547d7 Mon Sep 17 00:00:00 2001 From: Claudiu Lodromanean Date: Wed, 11 Jul 2018 13:43:34 -0700 Subject: [PATCH 113/984] Update readme.txt --- readme.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/readme.txt b/readme.txt index b6d3a628294..2746e722c78 100644 --- a/readme.txt +++ b/readme.txt @@ -182,6 +182,7 @@ Yes you can! Join in on our [GitHub repository](https://github.com/woocommerce/w * Tweak - Removed 'ajax_add_to_cart' class from 'Read more' button. #20690 * Tweak - Removed unnecessary checkout form change trigger on load of the checkout page. #20655 * Tweak - Add image size filters to wc_get_product_attachment_props(). #20722 +* Tweak - Only display the current site's tables for a multisite install when viewing the system status. #20731 * Performance/Tweak - Use post_author for the order customer instead of '_customer_user' meta data. #17895 * Performance - Exclude frontend include from REST API calls. #20000 * Dev - REST API - Allows oAuth1.0a authentication under SSL. From 2a1940aebaeba64035e2bff34ed452b5c7af8fda Mon Sep 17 00:00:00 2001 From: Claudio Sanches Date: Wed, 11 Jul 2018 22:02:56 -0300 Subject: [PATCH 114/984] Fixed notice when variation does not exists on frontend Closes #20752 --- assets/js/frontend/add-to-cart-variation.js | 60 ++++++++++--------- .../js/frontend/add-to-cart-variation.min.js | 2 +- 2 files changed, 32 insertions(+), 30 deletions(-) diff --git a/assets/js/frontend/add-to-cart-variation.js b/assets/js/frontend/add-to-cart-variation.js index 18ba462b820..cea16e22b67 100644 --- a/assets/js/frontend/add-to-cart-variation.js +++ b/assets/js/frontend/add-to-cart-variation.js @@ -4,45 +4,47 @@ * VariationForm class which handles variation forms and attributes. */ var VariationForm = function( $form ) { - this.$form = $form; - this.$attributeFields = $form.find( '.variations select' ); - this.$singleVariation = $form.find( '.single_variation' ); - this.$singleVariationWrap = $form.find( '.single_variation_wrap' ); - this.$resetVariations = $form.find( '.reset_variations' ); - this.$product = $form.closest( '.product' ); - this.variationData = $form.data( 'product_variations' ); - this.useAjax = false === this.variationData; - this.xhr = false; - this.loading = true; + var self = this; + + self.$form = $form; + self.$attributeFields = $form.find( '.variations select' ); + self.$singleVariation = $form.find( '.single_variation' ); + self.$singleVariationWrap = $form.find( '.single_variation_wrap' ); + self.$resetVariations = $form.find( '.reset_variations' ); + self.$product = $form.closest( '.product' ); + self.variationData = $form.data( 'product_variations' ); + self.useAjax = false === self.variationData; + self.xhr = false; + self.loading = true; // Initial state. - this.$singleVariationWrap.show(); - this.$form.off( '.wc-variation-form' ); + self.$singleVariationWrap.show(); + self.$form.off( '.wc-variation-form' ); // Methods. - this.getChosenAttributes = this.getChosenAttributes.bind( this ); - this.findMatchingVariations = this.findMatchingVariations.bind( this ); - this.isMatch = this.isMatch.bind( this ); - this.toggleResetLink = this.toggleResetLink.bind( this ); + self.getChosenAttributes = self.getChosenAttributes.bind( self ); + self.findMatchingVariations = self.findMatchingVariations.bind( self ); + self.isMatch = self.isMatch.bind( self ); + self.toggleResetLink = self.toggleResetLink.bind( self ); // Events. - $form.on( 'click.wc-variation-form', '.reset_variations', { variationForm: this }, this.onReset ); - $form.on( 'reload_product_variations', { variationForm: this }, this.onReload ); - $form.on( 'hide_variation', { variationForm: this }, this.onHide ); - $form.on( 'show_variation', { variationForm: this }, this.onShow ); - $form.on( 'click', '.single_add_to_cart_button', { variationForm: this }, this.onAddToCart ); - $form.on( 'reset_data', { variationForm: this }, this.onResetDisplayedVariation ); - $form.on( 'reset_image', { variationForm: this }, this.onResetImage ); - $form.on( 'change.wc-variation-form', '.variations select', { variationForm: this }, this.onChange ); - $form.on( 'found_variation.wc-variation-form', { variationForm: this }, this.onFoundVariation ); - $form.on( 'check_variations.wc-variation-form', { variationForm: this }, this.onFindVariation ); - $form.on( 'update_variation_values.wc-variation-form', { variationForm: this }, this.onUpdateAttributes ); + $form.on( 'click.wc-variation-form', '.reset_variations', { variationForm: self }, self.onReset ); + $form.on( 'reload_product_variations', { variationForm: self }, self.onReload ); + $form.on( 'hide_variation', { variationForm: self }, self.onHide ); + $form.on( 'show_variation', { variationForm: self }, self.onShow ); + $form.on( 'click', '.single_add_to_cart_button', { variationForm: self }, self.onAddToCart ); + $form.on( 'reset_data', { variationForm: self }, self.onResetDisplayedVariation ); + $form.on( 'reset_image', { variationForm: self }, self.onResetImage ); + $form.on( 'change.wc-variation-form', '.variations select', { variationForm: self }, self.onChange ); + $form.on( 'found_variation.wc-variation-form', { variationForm: self }, self.onFoundVariation ); + $form.on( 'check_variations.wc-variation-form', { variationForm: self }, self.onFindVariation ); + $form.on( 'update_variation_values.wc-variation-form', { variationForm: self }, self.onUpdateAttributes ); // Init after gallery. setTimeout( function() { $form.trigger( 'check_variations' ); $form.trigger( 'wc_variation_form' ); - $form.loading = false; + self.loading = false; }, 100 ); }; @@ -219,7 +221,7 @@ } form.$form.wc_variations_image_update( variation ); - + if ( ! variation.variation_is_visible ) { template = wp_template( 'unavailable-variation-template' ); } else { diff --git a/assets/js/frontend/add-to-cart-variation.min.js b/assets/js/frontend/add-to-cart-variation.min.js index da1824215b4..3a7cc92dfe1 100644 --- a/assets/js/frontend/add-to-cart-variation.min.js +++ b/assets/js/frontend/add-to-cart-variation.min.js @@ -1 +1 @@ -!function(b,d,e,n){var t=function(t){this.$form=t,this.$attributeFields=t.find(".variations select"),this.$singleVariation=t.find(".single_variation"),this.$singleVariationWrap=t.find(".single_variation_wrap"),this.$resetVariations=t.find(".reset_variations"),this.$product=t.closest(".product"),this.variationData=t.data("product_variations"),this.useAjax=!1===this.variationData,this.xhr=!1,this.loading=!0,this.$singleVariationWrap.show(),this.$form.off(".wc-variation-form"),this.getChosenAttributes=this.getChosenAttributes.bind(this),this.findMatchingVariations=this.findMatchingVariations.bind(this),this.isMatch=this.isMatch.bind(this),this.toggleResetLink=this.toggleResetLink.bind(this),t.on("click.wc-variation-form",".reset_variations",{variationForm:this},this.onReset),t.on("reload_product_variations",{variationForm:this},this.onReload),t.on("hide_variation",{variationForm:this},this.onHide),t.on("show_variation",{variationForm:this},this.onShow),t.on("click",".single_add_to_cart_button",{variationForm:this},this.onAddToCart),t.on("reset_data",{variationForm:this},this.onResetDisplayedVariation),t.on("reset_image",{variationForm:this},this.onResetImage),t.on("change.wc-variation-form",".variations select",{variationForm:this},this.onChange),t.on("found_variation.wc-variation-form",{variationForm:this},this.onFoundVariation),t.on("check_variations.wc-variation-form",{variationForm:this},this.onFindVariation),t.on("update_variation_values.wc-variation-form",{variationForm:this},this.onUpdateAttributes),setTimeout(function(){t.trigger("check_variations"),t.trigger("wc_variation_form"),t.loading=!1},100)};t.prototype.onReset=function(t){t.preventDefault(),t.data.variationForm.$attributeFields.val("").change(),t.data.variationForm.$form.trigger("reset_data")},t.prototype.onReload=function(t){var a=t.data.variationForm;a.variationData=a.$form.data("product_variations"),a.useAjax=!1===a.variationData,a.$form.trigger("check_variations")},t.prototype.onHide=function(t){t.preventDefault(),t.data.variationForm.$form.find(".single_add_to_cart_button").removeClass("wc-variation-is-unavailable").addClass("disabled wc-variation-selection-needed"),t.data.variationForm.$form.find(".woocommerce-variation-add-to-cart").removeClass("woocommerce-variation-add-to-cart-enabled").addClass("woocommerce-variation-add-to-cart-disabled")},t.prototype.onShow=function(t,a,i){t.preventDefault(),i?(t.data.variationForm.$form.find(".single_add_to_cart_button").removeClass("disabled wc-variation-selection-needed wc-variation-is-unavailable"),t.data.variationForm.$form.find(".woocommerce-variation-add-to-cart").removeClass("woocommerce-variation-add-to-cart-disabled").addClass("woocommerce-variation-add-to-cart-enabled")):(t.data.variationForm.$form.find(".single_add_to_cart_button").removeClass("wc-variation-selection-needed").addClass("disabled wc-variation-is-unavailable"),t.data.variationForm.$form.find(".woocommerce-variation-add-to-cart").removeClass("woocommerce-variation-add-to-cart-enabled").addClass("woocommerce-variation-add-to-cart-disabled"))},t.prototype.onAddToCart=function(t){b(this).is(".disabled")&&(t.preventDefault(),b(this).is(".wc-variation-is-unavailable")?d.alert(wc_add_to_cart_variation_params.i18n_unavailable_text):b(this).is(".wc-variation-selection-needed")&&d.alert(wc_add_to_cart_variation_params.i18n_make_a_selection_text))},t.prototype.onResetDisplayedVariation=function(t){var a=t.data.variationForm;a.$product.find(".product_meta").find(".sku").wc_reset_content(),a.$product.find(".product_weight").wc_reset_content(),a.$product.find(".product_dimensions").wc_reset_content(),a.$form.trigger("reset_image"),a.$singleVariation.slideUp(200).trigger("hide_variation")},t.prototype.onResetImage=function(t){t.data.variationForm.$form.wc_variations_image_update(!1)},t.prototype.onFindVariation=function(t){var a=t.data.variationForm,i=a.getChosenAttributes(),e=i.data;if(i.count===i.chosenCount)if(a.useAjax)a.xhr&&a.xhr.abort(),a.$form.block({message:null,overlayCSS:{background:"#fff",opacity:.6}}),e.product_id=parseInt(a.$form.data("product_id"),10),e.custom_data=a.$form.data("custom_data"),a.xhr=b.ajax({url:wc_add_to_cart_variation_params.wc_ajax_url.toString().replace("%%endpoint%%","get_variation"),type:"POST",data:e,success:function(t){t?a.$form.trigger("found_variation",[t]):(a.$form.trigger("reset_data"),i.chosenCount=0,a.loading||(a.$form.find(".single_variation").after('

    '+wc_add_to_cart_variation_params.i18n_no_matching_variations_text+"

    "),a.$form.find(".wc-no-matching-variations").slideDown(200)))},complete:function(){a.$form.unblock()}});else{a.$form.trigger("update_variation_values");var r=a.findMatchingVariations(a.variationData,e).shift();r?a.$form.trigger("found_variation",[r]):(a.$form.trigger("reset_data"),i.chosenCount=0,a.loading||(a.$form.find(".single_variation").after('

    '+wc_add_to_cart_variation_params.i18n_no_matching_variations_text+"

    "),a.$form.find(".wc-no-matching-variations").slideDown(200)))}else a.$form.trigger("update_variation_values"),a.$form.trigger("reset_data");a.toggleResetLink(0*/",""),i.$singleVariation.html(c),i.$form.find('input[name="variation_id"], input.variation_id').val(a.variation_id).change(),"yes"===a.is_sold_individually?(n.find("input.qty").val("1").attr("min","1").attr("max",""),n.hide()):(n.find("input.qty").attr("min",a.min_qty).attr("max",a.max_qty),n.show()),a.is_purchasable&&a.is_in_stock&&a.variation_is_visible||(s=!1),b.trim(i.$singleVariation.text())?i.$singleVariation.slideDown(200).trigger("show_variation",[a,s]):i.$singleVariation.show().trigger("show_variation",[a,s])},t.prototype.onChange=function(t){var a=t.data.variationForm;a.$form.find('input[name="variation_id"], input.variation_id').val("").change(),a.$form.find(".wc-no-matching-variations").remove(),a.useAjax?a.$form.trigger("check_variations"):(a.$form.trigger("woocommerce_variation_select_change"),a.$form.trigger("check_variations"),b(this).blur()),a.$form.trigger("woocommerce_variation_has_changed")},t.prototype.addSlashes=function(t){return t=(t=t.replace(/'/g,"\\'")).replace(/"/g,'\\"')},t.prototype.onUpdateAttributes=function(t){var p=t.data.variationForm,w=p.getChosenAttributes().data;p.useAjax||(p.$attributeFields.each(function(t,a){var i,e=b(a),r=e.data("attribute_name")||e.attr("name"),o=b(a).data("show_option_none"),n=":gt(0)",s=b(""),m=o.val()||"",v=!0;if(!o.data("attribute_html")){var l=o.clone();l.find("option").removeAttr("disabled attached").removeAttr("selected"),o.data("attribute_options",l.find("option"+_).get()),o.data("attribute_html",l.html())}d.html(o.data("attribute_html"));var g=t.extend(!0,{},r);g[n]="";var f=i.findMatchingVariations(i.variationData,g);for(var u in f)if("undefined"!=typeof f[u]){var h=f[u].attributes;for(var p in h)if(h.hasOwnProperty(p)){var w=h[p],b="";p===n&&(f[u].variation_is_active&&(b="enabled"),w?(w=t("
    ").html(w).text(),d.find('option[value="'+i.addSlashes(w)+'"]').addClass("attached "+b)):d.find("option:gt(0)").addClass("attached "+b))}}c=d.find("option.attached").length,!m||0!==c&&0!==d.find('option.attached.enabled[value="'+i.addSlashes(m)+'"]').length||(v=!1),c>0&&m&&v&&"no"===s&&(d.find("option:first").remove(),_=""),d.find("option"+_+":not(.attached)").remove(),o.html(d.html()),o.find("option"+_+":not(.enabled)").prop("disabled",!0),m?v?o.val(m):o.val("").change():o.val("")}),i.$form.trigger("woocommerce_update_variation_values"))},e.prototype.getChosenAttributes=function(){var a={},i=0,r=0;return this.$attributeFields.each(function(){var e=t(this).data("attribute_name")||t(this).attr("name"),o=t(this).val()||"";o.length>0&&r++,i++,a[e]=o}),{count:i,chosenCount:r,data:a}},e.prototype.findMatchingVariations=function(t,a){for(var i=[],r=0;r1){n.find('li img[data-o_src="'+i.image.gallery_thumbnail_src+'"]').length>0&&r.wc_variations_image_reset();var m=n.find('li img[src="'+i.image.gallery_thumbnail_src+'"]');if(m.length>0)return m.trigger("click"),r.attr("current-image",i.image_id),void a.setTimeout(function(){t(a).trigger("resize"),o.trigger("woocommerce_gallery_init_zoom")},20);c.wc_set_variation_attr("src",i.image.src),c.wc_set_variation_attr("height",i.image.src_h),c.wc_set_variation_attr("width",i.image.src_w),c.wc_set_variation_attr("srcset",i.image.srcset),c.wc_set_variation_attr("sizes",i.image.sizes),c.wc_set_variation_attr("title",i.image.title),c.wc_set_variation_attr("alt",i.image.alt),c.wc_set_variation_attr("data-src",i.image.full_src),c.wc_set_variation_attr("data-large_image",i.image.full_src),c.wc_set_variation_attr("data-large_image_width",i.image.full_src_w),c.wc_set_variation_attr("data-large_image_height",i.image.full_src_h),_.wc_set_variation_attr("data-thumb",i.image.src),s.wc_set_variation_attr("src",i.image.gallery_thumbnail_src),d.wc_set_variation_attr("href",i.image.full_src)}else r.wc_variations_image_reset();a.setTimeout(function(){t(a).trigger("resize"),r.wc_maybe_trigger_slide_position_reset(i),o.trigger("woocommerce_gallery_init_zoom")},20)},t.fn.wc_variations_image_reset=function(){var t=this.closest(".product"),a=t.find(".images"),i=t.find(".flex-control-nav").find("li:eq(0) img"),r=a.find(".woocommerce-product-gallery__image, .woocommerce-product-gallery__image--placeholder").eq(0),e=r.find(".wp-post-image"),o=r.find("a").eq(0);e.wc_reset_variation_attr("src"),e.wc_reset_variation_attr("width"),e.wc_reset_variation_attr("height"),e.wc_reset_variation_attr("srcset"),e.wc_reset_variation_attr("sizes"),e.wc_reset_variation_attr("title"),e.wc_reset_variation_attr("alt"),e.wc_reset_variation_attr("data-src"),e.wc_reset_variation_attr("data-large_image"),e.wc_reset_variation_attr("data-large_image_width"),e.wc_reset_variation_attr("data-large_image_height"),r.wc_reset_variation_attr("data-thumb"),i.wc_reset_variation_attr("src"),o.wc_reset_variation_attr("href")},t(function(){"undefined"!=typeof wc_add_to_cart_variation_params&&t(".variations_form").each(function(){t(this).wc_variation_form()})});var o=function(t){var r=i.getElementById("tmpl-"+t).textContent,e=!1;return e=e||/<#\s?data\./.test(r),e=e||/{{{?\s?data\.(?!variation\.).+}}}?/.test(r),(e=e||/{{{?\s?data\.variation\.[\w-]*[^\s}]/.test(r))?wp.template(t):function(t){var i=t.variation||{};return r.replace(/({{{?)\s?data\.variation\.([\w-]*)\s?(}}}?)/g,function(t,r,e,o){if(r.length!==o.length)return"";var n=i[e]||"";return 2===r.length?a.escape(n):n})}}}(jQuery,window,document); \ No newline at end of file From 6820de4f2fb85808bc0f6d74b07382e5a724fb9e Mon Sep 17 00:00:00 2001 From: Joey Date: Thu, 12 Jul 2018 11:55:16 +0100 Subject: [PATCH 115/984] removed all low_stock additions to api files --- includes/api/class-wc-rest-products-controller.php | 14 -------------- .../api/v1/class-wc-rest-products-controller.php | 14 -------------- 2 files changed, 28 deletions(-) diff --git a/includes/api/class-wc-rest-products-controller.php b/includes/api/class-wc-rest-products-controller.php index bc588d9961a..05b9c11ea5b 100644 --- a/includes/api/class-wc-rest-products-controller.php +++ b/includes/api/class-wc-rest-products-controller.php @@ -608,7 +608,6 @@ class WC_REST_Products_Controller extends WC_REST_Legacy_Products_Controller { 'manage_stock' => $product->managing_stock(), 'stock_quantity' => $product->get_stock_quantity( $context ), 'in_stock' => $product->is_in_stock(), - 'low_stock_amount' => $product->get_low_stock_amount( $context ), 'backorders' => $product->get_backorders( $context ), 'backorders_allowed' => $product->backorders_allowed(), 'backordered' => $product->is_on_backorder(), @@ -902,11 +901,6 @@ class WC_REST_Products_Controller extends WC_REST_Legacy_Products_Controller { $product->set_manage_stock( $request['manage_stock'] ); } - // Low stock amount. - if ( isset( $request['low_stock_amount'] ) ) { - $product->set_low_stock_amount( $request['low_stock_amount'] ); - } - // Backorders. if ( isset( $request['backorders'] ) ) { $product->set_backorders( $request['backorders'] ); @@ -917,13 +911,11 @@ class WC_REST_Products_Controller extends WC_REST_Legacy_Products_Controller { $product->set_backorders( 'no' ); $product->set_stock_quantity( '' ); $product->set_stock_status( $stock_status ); - $product->set_low_stock_amount( '' ); } elseif ( $product->is_type( 'external' ) ) { $product->set_manage_stock( 'no' ); $product->set_backorders( 'no' ); $product->set_stock_quantity( '' ); $product->set_stock_status( 'instock' ); - $product->set_low_stock_amount( '' ); } elseif ( $product->get_manage_stock() ) { // Stock status is always determined by children so sync later. if ( ! $product->is_type( 'variable' ) ) { @@ -1679,12 +1671,6 @@ class WC_REST_Products_Controller extends WC_REST_Legacy_Products_Controller { 'default' => true, 'context' => array( 'view', 'edit' ), ), - 'low_stock_amount' => array( - 'description' => __( 'If managing stock, this controls when low stock notifications are sent.', 'woocommerce' ), - 'type' => 'integer', - 'default' => '', - 'context' => array( 'view', 'edit' ), - ), 'backorders' => array( 'description' => __( 'If managing stock, this controls if backorders are allowed.', 'woocommerce' ), 'type' => 'string', diff --git a/includes/api/v1/class-wc-rest-products-controller.php b/includes/api/v1/class-wc-rest-products-controller.php index cf87ec9b420..137ebca40d9 100644 --- a/includes/api/v1/class-wc-rest-products-controller.php +++ b/includes/api/v1/class-wc-rest-products-controller.php @@ -494,7 +494,6 @@ class WC_REST_Products_V1_Controller extends WC_REST_Posts_Controller { 'manage_stock' => $product->managing_stock(), 'stock_quantity' => $product->get_stock_quantity(), 'in_stock' => $product->is_in_stock(), - 'low_stock_amount' => $product->get_low_stock_amount(), 'backorders' => $product->get_backorders(), 'backorders_allowed' => $product->backorders_allowed(), 'backordered' => $product->is_on_backorder(), @@ -1231,11 +1230,6 @@ class WC_REST_Products_V1_Controller extends WC_REST_Posts_Controller { $product->set_manage_stock( $request['manage_stock'] ); } - // Low stock amount. - if ( isset( $request['low_stock_amount'] ) ) { - $product->set_low_stock_amount( $request['low_stock_amount'] ); - } - // Backorders. if ( isset( $request['backorders'] ) ) { $product->set_backorders( $request['backorders'] ); @@ -1246,13 +1240,11 @@ class WC_REST_Products_V1_Controller extends WC_REST_Posts_Controller { $product->set_backorders( 'no' ); $product->set_stock_quantity( '' ); $product->set_stock_status( $stock_status ); - $product->set_low_stock_amount( '' ); } elseif ( $product->is_type( 'external' ) ) { $product->set_manage_stock( 'no' ); $product->set_backorders( 'no' ); $product->set_stock_quantity( '' ); $product->set_stock_status( 'instock' ); - $product->set_low_stock_amount( '' ); } elseif ( $product->get_manage_stock() ) { // Stock status is always determined by children so sync later. if ( ! $product->is_type( 'variable' ) ) { @@ -1962,12 +1954,6 @@ class WC_REST_Products_V1_Controller extends WC_REST_Posts_Controller { 'default' => true, 'context' => array( 'view', 'edit' ), ), - 'low_stock_amount' => array( - 'description' => __( 'If managing stock, this controls when low stock notifications are sent.', 'woocommerce' ), - 'type' => 'integer', - 'default' => '', - 'context' => array( 'view', 'edit' ), - ), 'backorders' => array( 'description' => __( 'If managing stock, this controls if backorders are allowed.', 'woocommerce' ), 'type' => 'string', From 463447e9d9fd42d4c54bcf041a98499e1451e431 Mon Sep 17 00:00:00 2001 From: Claudio Sanches Date: Thu, 12 Jul 2018 15:48:11 -0300 Subject: [PATCH 116/984] Fixed path for data endpoints --- includes/class-wc-api.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/includes/class-wc-api.php b/includes/class-wc-api.php index 98cfef48fd0..c7d4d29e25a 100644 --- a/includes/class-wc-api.php +++ b/includes/class-wc-api.php @@ -228,10 +228,10 @@ class WC_API extends WC_Legacy_API { include_once dirname( __FILE__ ) . '/api/class-wc-rest-system-status-tools-controller.php'; include_once dirname( __FILE__ ) . '/api/class-wc-rest-shipping-methods-controller.php'; include_once dirname( __FILE__ ) . '/api/class-wc-rest-payment-gateways-controller.php'; - include_once dirname( __FILE__ ) . '/api/includes/api/class-wc-rest-data-continents-controller.php'; - include_once dirname( __FILE__ ) . '/api/includes/api/class-wc-rest-data-controller.php'; - include_once dirname( __FILE__ ) . '/api/includes/api/class-wc-rest-data-countries-controller.php'; - include_once dirname( __FILE__ ) . '/api/includes/api/class-wc-rest-data-currencies-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-data-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-data-continents-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-data-countries-controller.php'; + include_once dirname( __FILE__ ) . '/api/class-wc-rest-data-currencies-controller.php'; } /** From 0c17fd49e4c57443f9d07f9a2c94ca573178c687 Mon Sep 17 00:00:00 2001 From: Brent Shepherd Date: Fri, 13 Jul 2018 14:21:03 +1000 Subject: [PATCH 117/984] Expand error logging to E_ERROR like errors Including those triggered by code via trigger_error() and compile-time parse errors (including those generated by Zend Scripting Engine). --- includes/class-woocommerce.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/class-woocommerce.php b/includes/class-woocommerce.php index 9f7e1380f85..5435c785399 100644 --- a/includes/class-woocommerce.php +++ b/includes/class-woocommerce.php @@ -183,7 +183,7 @@ final class WooCommerce { */ public function log_errors() { $error = error_get_last(); - if ( E_ERROR === $error['type'] ) { + if ( in_array( $error['type'], array( E_ERROR, E_PARSE, E_COMPILE_ERROR, E_USER_ERROR, E_RECOVERABLE_ERROR ) ) ) { $logger = wc_get_logger(); $logger->critical( $error['message'] . PHP_EOL, From febea645f97d63c659c3fdc42fdcf1b94f87ecd6 Mon Sep 17 00:00:00 2001 From: Brent Shepherd Date: Fri, 13 Jul 2018 14:23:17 +1000 Subject: [PATCH 118/984] Log error's file and line number To help with debugging. --- includes/class-woocommerce.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/includes/class-woocommerce.php b/includes/class-woocommerce.php index 5435c785399..c97a495bbb8 100644 --- a/includes/class-woocommerce.php +++ b/includes/class-woocommerce.php @@ -186,7 +186,8 @@ final class WooCommerce { if ( in_array( $error['type'], array( E_ERROR, E_PARSE, E_COMPILE_ERROR, E_USER_ERROR, E_RECOVERABLE_ERROR ) ) ) { $logger = wc_get_logger(); $logger->critical( - $error['message'] . PHP_EOL, + /* translators: 1: error message 2: file name and path 3: line number */ + sprintf( __( '%1$s in %2$s on line %3$s', 'woocommerce' ), $error['message'], $error['file'], $error['line'] ) . PHP_EOL, array( 'source' => 'fatal-errors', ) From 67744b7768ff5f309d75bf31e6b32d2fd9f557b5 Mon Sep 17 00:00:00 2001 From: Brent Shepherd Date: Fri, 13 Jul 2018 15:04:19 +1000 Subject: [PATCH 119/984] Add 'woocommerce_shutdown_error' action --- includes/class-woocommerce.php | 1 + 1 file changed, 1 insertion(+) diff --git a/includes/class-woocommerce.php b/includes/class-woocommerce.php index c97a495bbb8..d37ef903268 100644 --- a/includes/class-woocommerce.php +++ b/includes/class-woocommerce.php @@ -192,6 +192,7 @@ final class WooCommerce { 'source' => 'fatal-errors', ) ); + do_action( 'woocommerce_shutdown_error', $error ); } } From bca7bfe29c10f914e8a701d48f596ab5a773ea9e Mon Sep 17 00:00:00 2001 From: LuigiPulcini Date: Sat, 14 Jul 2018 16:11:16 +0200 Subject: [PATCH 120/984] Adding product data to `removed_from_cart` event Adding `$thisbutton.data()` to the arguments sent by the `removed_from_cart` event. This would help developers easily detect which product has just been removed and alter their theme/plugin accordingly. --- assets/js/frontend/add-to-cart.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assets/js/frontend/add-to-cart.js b/assets/js/frontend/add-to-cart.js index 4270137de3c..1a82eb4bb37 100644 --- a/assets/js/frontend/add-to-cart.js +++ b/assets/js/frontend/add-to-cart.js @@ -86,7 +86,7 @@ jQuery( function( $ ) { window.location = $thisbutton.attr( 'href' ); return; } - $( document.body ).trigger( 'removed_from_cart', [ response.fragments, response.cart_hash ] ); + $( document.body ).trigger( 'removed_from_cart', [ response.fragments, response.cart_hash, $thisbutton.data() ] ); }).fail( function() { window.location = $thisbutton.attr( 'href' ); return; From c7884003dc09d167fd93f1b52bbb7e0a5e1081ca Mon Sep 17 00:00:00 2001 From: Gerhard Potgieter Date: Mon, 16 Jul 2018 11:44:58 +0200 Subject: [PATCH 121/984] Do not build paypal pay link when no base country is set. --- includes/gateways/paypal/class-wc-gateway-paypal.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/includes/gateways/paypal/class-wc-gateway-paypal.php b/includes/gateways/paypal/class-wc-gateway-paypal.php index 9118f7c8c9f..a44c0c9e1be 100644 --- a/includes/gateways/paypal/class-wc-gateway-paypal.php +++ b/includes/gateways/paypal/class-wc-gateway-paypal.php @@ -141,14 +141,19 @@ class WC_Gateway_Paypal extends WC_Payment_Gateway { * @return string */ public function get_icon() { + // We need a base country for the link to work, bail if in the unlikely event no country is set. + $base_country = WC()->countries->get_base_country(); + if ( empty( $base_country ) ) { + return ''; + } $icon_html = ''; - $icon = (array) $this->get_icon_image( WC()->countries->get_base_country() ); + $icon = (array) $this->get_icon_image( $base_country ); foreach ( $icon as $i ) { $icon_html .= '' . esc_attr__( 'PayPal acceptance mark', 'woocommerce' ) . ''; } - $icon_html .= sprintf( '' . esc_attr__( 'What is PayPal?', 'woocommerce' ) . '', esc_url( $this->get_icon_url( WC()->countries->get_base_country() ) ) ); + $icon_html .= sprintf( '' . esc_attr__( 'What is PayPal?', 'woocommerce' ) . '', esc_url( $this->get_icon_url( $base_country ) ) ); return apply_filters( 'woocommerce_gateway_icon', $icon_html, $this->id ); } From 370c20007681076e2da42b3b319665f1e3139b38 Mon Sep 17 00:00:00 2001 From: Gerhard Potgieter Date: Mon, 16 Jul 2018 12:59:01 +0200 Subject: [PATCH 122/984] Make wc_array_cartesian test use predefined array for testing against instead of relying on product attributes. --- .../util/class-wc-tests-core-functions.php | 38 ++++++------------- 1 file changed, 11 insertions(+), 27 deletions(-) diff --git a/tests/unit-tests/util/class-wc-tests-core-functions.php b/tests/unit-tests/util/class-wc-tests-core-functions.php index bc86a2f7f55..20c1c7185b5 100644 --- a/tests/unit-tests/util/class-wc-tests-core-functions.php +++ b/tests/unit-tests/util/class-wc-tests-core-functions.php @@ -732,33 +732,17 @@ class WC_Tests_Core_Functions extends WC_Unit_Test_Case { * @return void */ public function test_wc_array_cartesian() { - $product = new WC_Product_Variable(); - $attributes = array(); + $array = array( + 'attr1' => array( + 'Attr1 Value 1', + 'Attr1 Value 2', + ), + 'attr2' => array( + 'Attr2 Value 1', + 'Attr2 Value 2', + ), + ); - $attribute = new \WC_Product_Attribute(); - $attribute->set_id( 0 ); - $attribute->set_name( 'Attr1' ); - $attribute->set_options( array( 'Attr1 Value 1', 'Attr1 Value 2' ) ); - $attribute->set_position( 0 ); - $attribute->set_visible( true ); - $attribute->set_variation( true ); - $attributes[] = $attribute; - - $attribute = new \WC_Product_Attribute(); - $attribute->set_id( 0 ); - $attribute->set_name( 'Attr2' ); - $attribute->set_options( array( 'Attr2 Value 1', 'Attr2 Value 2' ) ); - $attribute->set_position( 0 ); - $attribute->set_visible( true ); - $attribute->set_variation( true ); - $attributes[] = $attribute; - - $product->set_props( array( - 'attributes' => $attributes, - ) ); - $product->save(); - - $variation_attributes = wc_list_pluck( array_filter( $product->get_attributes(), 'wc_attributes_array_filter_variation' ), 'get_slugs' ); $expected_combinations = array( array( 'attr2' => 'Attr2 Value 1', @@ -778,7 +762,7 @@ class WC_Tests_Core_Functions extends WC_Unit_Test_Case { ), ); - $this->assertEquals( $expected_combinations, array_reverse( wc_array_cartesian( $variation_attributes ) ) ); + $this->assertEquals( $expected_combinations, array_reverse( wc_array_cartesian( $array ) ) ); } /** From 1f46caaa4ca7433ce7cf291350cdca81b2dd86a3 Mon Sep 17 00:00:00 2001 From: Gerhard Potgieter Date: Mon, 16 Jul 2018 13:02:24 +0200 Subject: [PATCH 123/984] Test some edge cases where CC name could be empty or contain a non standard value. --- tests/unit-tests/util/class-wc-tests-core-functions.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/unit-tests/util/class-wc-tests-core-functions.php b/tests/unit-tests/util/class-wc-tests-core-functions.php index 20c1c7185b5..500f4d38c10 100644 --- a/tests/unit-tests/util/class-wc-tests-core-functions.php +++ b/tests/unit-tests/util/class-wc-tests-core-functions.php @@ -776,6 +776,8 @@ class WC_Tests_Core_Functions extends WC_Unit_Test_Case { $this->assertEquals( 'MasterCard', wc_get_credit_card_type_label( 'Mastercard' ) ); $this->assertEquals( 'American Express', wc_get_credit_card_type_label( 'american_express' ) ); $this->assertEquals( 'American Express', wc_get_credit_card_type_label( 'american-express' ) ); + $this->assertEquals( '', wc_get_credit_card_type_label( '' ) ); + $this->assertEquals( 'Random name', wc_get_credit_card_type_label( 'random-name' ) ); } /** From 4144211754a7a08ea61c8a9d75f2ab3d2e1a11ac Mon Sep 17 00:00:00 2001 From: Keith Light Date: Mon, 16 Jul 2018 15:04:36 +0100 Subject: [PATCH 124/984] Add class names to `edit_category_fields()` to be inline with other fields Class names are added in `add_category_fields()` but not `edit_category_fields()` --- includes/admin/class-wc-admin-taxonomies.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/includes/admin/class-wc-admin-taxonomies.php b/includes/admin/class-wc-admin-taxonomies.php index 694f572d4e4..d8ee5a209eb 100644 --- a/includes/admin/class-wc-admin-taxonomies.php +++ b/includes/admin/class-wc-admin-taxonomies.php @@ -200,7 +200,7 @@ class WC_Admin_Taxonomies { $image = wc_placeholder_img_src(); } ?> - + - +
    From a5e4dc9dccba701c455ae94921ccb750f8e3ae95 Mon Sep 17 00:00:00 2001 From: Peter Fabian Date: Mon, 16 Jul 2018 17:16:54 +0200 Subject: [PATCH 125/984] Removed 100% width on images on single product page for 2017 theme --- assets/css/twenty-seventeen-rtl.css | 2 +- assets/css/twenty-seventeen.css | 2 +- assets/css/twenty-seventeen.scss | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/assets/css/twenty-seventeen-rtl.css b/assets/css/twenty-seventeen-rtl.css index d1c7b3b2d85..411668652e9 100644 --- a/assets/css/twenty-seventeen-rtl.css +++ b/assets/css/twenty-seventeen-rtl.css @@ -1 +1 @@ -@charset "UTF-8";@-webkit-keyframes spin{100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}@keyframes spin{100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}.woocommerce .blockUI.blockOverlay{position:relative}.woocommerce .blockUI.blockOverlay::before{height:1em;width:1em;display:block;position:absolute;top:50%;right:50%;margin-right:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.woocommerce .loader::before{height:1em;width:1em;display:block;position:absolute;top:50%;right:50%;margin-right:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.woocommerce form .form-row .required{color:#b22222;text-decoration:none;visibility:hidden}.woocommerce form .form-row .required[title]{border:0!important}.woocommerce form .form-row .optional{visibility:visible}.woocommerce-breadcrumb{padding-bottom:2em;margin-bottom:4em;border-bottom:1px solid #eee;font-size:13px;font-size:.8125rem}.woocommerce-breadcrumb a{-webkit-box-shadow:0 1px 0 #0f0f0f;box-shadow:0 1px 0 #0f0f0f;-webkit-transition:-webkit-box-shadow ease-in-out 130ms;transition:-webkit-box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms,-webkit-box-shadow ease-in-out 130ms}.woocommerce-breadcrumb a:hover{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.woocommerce-pagination{padding-top:2em;margin-top:4em;border-top:1px solid #eee;font-size:13px;font-size:.8125rem}.woocommerce-pagination ul.page-numbers{padding:0;display:block}.woocommerce-pagination .next.page-numbers,.woocommerce-pagination .prev.page-numbers,.woocommerce-pagination a.page-numbers,.woocommerce-pagination span.page-numbers{padding:.5em 1em;background:#ddd;display:inline-block;font-size:1em;float:none;line-height:1.5;border-radius:2px;-webkit-transition:background-color ease-in-out .3s;transition:background-color ease-in-out .3s}.woocommerce-pagination span.page-numbers{background-color:#fff}.woocommerce-pagination a.page-numbers:hover{background-color:#767676;color:#fff}.onsale{background-color:#fff;position:absolute;top:0;right:0;display:inline-block;padding:.5em 1em;font-size:13px;font-size:.8125rem;text-transform:uppercase;font-weight:800}.price del{opacity:.5;display:inline-block}.price ins{display:inline-block}.woocommerce-error,.woocommerce-info,.woocommerce-message{margin-bottom:1.5em;padding:2em;background:#eee}.woocommerce-message{background:teal;color:#fff}.woocommerce-error{background:#b22222;color:#fff}.woocommerce-info{background:#4169e1;color:#fff}.woocommerce-error a,.woocommerce-info a,.woocommerce-message a{color:#fff;-webkit-box-shadow:0 1px 0 #fff!important;box-shadow:0 1px 0 #fff!important;-webkit-transition:-webkit-box-shadow ease-in-out 130ms;transition:-webkit-box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms,-webkit-box-shadow ease-in-out 130ms}.woocommerce-error a:hover,.woocommerce-info a:hover,.woocommerce-message a:hover{color:#fff!important;-webkit-box-shadow:0 3px 0 #fff!important;box-shadow:0 3px 0 #fff!important}.woocommerce-store-notice{background:#4169e1;color:#fff;padding:1em;position:absolute;top:0;right:0;width:100%;z-index:999}.admin-bar .woocommerce-store-notice{top:32px}.woocommerce-store-notice__dismiss-link{float:left;color:#fff}.woocommerce-store-notice__dismiss-link:hover{text-decoration:underline;color:#fff}.woocommerce-result-count{padding:.75em 0}ul.products li.product{list-style:none}ul.products li.product .price,ul.products li.product .star-rating{display:block;margin-bottom:.75em}ul.products li.product .woocommerce-placeholder{border:1px solid #f2f2f2}ul.products li.product .button{-webkit-box-shadow:0 1px 0 #0f0f0f;box-shadow:0 1px 0 #0f0f0f;-webkit-transition:-webkit-box-shadow ease-in-out 130ms;transition:-webkit-box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms,-webkit-box-shadow ease-in-out 130ms}ul.products li.product .button:hover{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}ul.products li.product .button.loading{opacity:.5}ul.products li.product .added_to_cart{-webkit-box-shadow:0 1px 0 #0f0f0f;box-shadow:0 1px 0 #0f0f0f;-webkit-transition:-webkit-box-shadow ease-in-out 130ms;transition:-webkit-box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms,-webkit-box-shadow ease-in-out 130ms;margin-right:.5em}ul.products li.product .added_to_cart:hover{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.star-rating{overflow:hidden;position:relative;height:1em;line-height:1;font-size:1em;width:5.4em;font-family:star}.star-rating::before{content:'\73\73\73\73\73';float:right;top:0;right:0;position:absolute}.star-rating span{overflow:hidden;float:right;top:0;right:0;position:absolute;padding-top:1.5em}.star-rating span::before{content:'\53\53\53\53\53';top:0;position:absolute;right:0}.woocommerce-loop-product__title{font-size:13px;font-size:.8125rem;text-transform:uppercase;font-weight:800;letter-spacing:.15em}a.remove{display:inline-block;width:16px;height:16px;line-height:16px;font-size:16px;text-align:center;border-radius:100%;-webkit-box-shadow:none!important;box-shadow:none!important;border:1px solid #000}a.remove:hover{background:#000;color:#fff!important}.wc-item-meta,dl.variation{list-style:none outside}.wc-item-meta .wc-item-meta-label,.wc-item-meta dt,dl.variation .wc-item-meta-label,dl.variation dt{float:right;clear:both;margin-left:.25em;display:inline-block;list-style:none outside}.wc-item-meta dd,dl.variation dd{margin:0}.wc-item-meta p,.wc-item-meta:last-child,dl.variation p,dl.variation:last-child{margin-bottom:0}.single-product div.product{position:relative}.single-product .single-featured-image-header{display:none}.single-product .summary{margin-bottom:3em}.single-product .summary p.price{margin-bottom:2em}.single-product .woocommerce-product-rating{margin-bottom:2em;line-height:1}.single-product .woocommerce-product-rating .star-rating{float:right;margin-left:.25em}.single-product form.cart .quantity{float:right;margin-left:.5em}.single-product form.cart input{width:5em}.single-product .woocommerce-variation-add-to-cart .button{padding-top:.72em;padding-bottom:.72em}.single-product .woocommerce-variation-add-to-cart .button.disabled{opacity:.2}table.variations label{margin:0}table.variations select{margin-left:.5em}.woocommerce-product-gallery{position:relative;margin-bottom:3em}.woocommerce-product-gallery figure{margin:0;padding:0}.woocommerce-product-gallery .woocommerce-product-gallery__wrapper{margin:0;padding:0}.woocommerce-product-gallery .zoomImg{background-color:#fff;opacity:0}.woocommerce-product-gallery .woocommerce-product-gallery__image--placeholder{border:1px solid #f2f2f2}.woocommerce-product-gallery .woocommerce-product-gallery__image:nth-child(n+2){width:25%;display:inline-block}.woocommerce-product-gallery .flex-control-thumbs li{list-style:none;cursor:pointer;float:right}.woocommerce-product-gallery .flex-control-thumbs img{opacity:.5}.woocommerce-product-gallery .flex-control-thumbs img.flex-active,.woocommerce-product-gallery .flex-control-thumbs img:hover{opacity:1}.woocommerce-product-gallery img{display:block;width:100%;height:auto}.woocommerce-product-gallery--columns-3 .flex-control-thumbs li{width:33.3333%}.woocommerce-product-gallery--columns-3 .flex-control-thumbs li:nth-child(3n+1){clear:right}.woocommerce-product-gallery--columns-4 .flex-control-thumbs li{width:25%}.woocommerce-product-gallery--columns-4 .flex-control-thumbs li:nth-child(4n+1){clear:right}.woocommerce-product-gallery--columns-5 .flex-control-thumbs li{width:20%}.woocommerce-product-gallery--columns-5 .flex-control-thumbs li:nth-child(5n+1){clear:right}.woocommerce-product-gallery__trigger{position:absolute;top:1em;left:1em;z-index:99}.woocommerce-tabs{margin-bottom:2em}.woocommerce-tabs li{margin-left:1em}.woocommerce-tabs li.active a{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.woocommerce-tabs a{-webkit-box-shadow:0 1px 0 #0f0f0f;box-shadow:0 1px 0 #0f0f0f;-webkit-transition:-webkit-box-shadow ease-in-out 130ms;transition:-webkit-box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms,-webkit-box-shadow ease-in-out 130ms}.woocommerce-tabs a:hover{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.woocommerce-tabs #comments{padding-top:0}.woocommerce-tabs .comment-reply-title{font-size:22px;font-size:1.375rem;font-weight:300;line-height:1.4;margin:0 0 .75em;display:block}.woocommerce-tabs #reviews li.comment,.woocommerce-tabs #reviews li.review{list-style:none;margin-left:0;margin-bottom:2.5em}.woocommerce-tabs #reviews li.comment .avatar,.woocommerce-tabs #reviews li.review .avatar{max-height:36px;width:auto;float:left}.woocommerce-tabs #reviews li.comment p.meta,.woocommerce-tabs #reviews li.review p.meta{margin-bottom:.5em}.woocommerce-tabs #reviews p.stars a{position:relative;height:1em;width:1em;text-indent:-999em;display:inline-block;text-decoration:none;-webkit-box-shadow:none;box-shadow:none}.woocommerce-tabs #reviews p.stars a::before{display:block;position:absolute;top:0;right:0;width:1em;height:1em;line-height:1;font-family:WooCommerce;content:'\e021';text-indent:0}.woocommerce-tabs #reviews p.stars a:hover~a::before{content:'\e021'}.woocommerce-tabs #reviews p.stars:hover a::before{content:'\e020'}.woocommerce-tabs #reviews p.stars.selected a.active::before{content:'\e020'}.woocommerce-tabs #reviews p.stars.selected a.active~a::before{content:'\e021'}.woocommerce-tabs #reviews p.stars.selected a:not(.active)::before{content:'\e020'}.site-footer .widget .product_list_widget,.widget .product_list_widget{margin-bottom:1.5em}.site-footer .widget .product_list_widget a,.widget .product_list_widget a{display:block;-webkit-box-shadow:none;box-shadow:none}.site-footer .widget .product_list_widget a:hover,.widget .product_list_widget a:hover{-webkit-box-shadow:none;box-shadow:none}.site-footer .widget .product_list_widget li,.widget .product_list_widget li{padding:1.5em 0}.site-footer .widget .product_list_widget li a.remove,.widget .product_list_widget li a.remove{float:left;margin-top:2px}.site-footer .widget .product_list_widget img,.widget .product_list_widget img{display:none}.widget_shopping_cart .buttons a{display:inline-block;margin:0 0 0 .5em}.widget_layered_nav .chosen:before{content:"×";display:inline-block;width:16px;height:16px;line-height:16px;font-size:16px;text-align:center;border-radius:100%;border:1px solid #000;margin-left:.25em}.widget_price_filter .price_slider{margin-bottom:1em}.widget_price_filter .price_slider_amount{text-align:left;line-height:2.4;font-size:.8751em}.widget_price_filter .price_slider_amount .button{float:right;padding:.4em 1em}.widget_price_filter .ui-slider{position:relative;text-align:right;margin-right:.5em;margin-left:.5em}.widget_price_filter .ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1em;height:1em;background-color:#000;border-radius:1em;cursor:ew-resize;outline:0;top:-.3em;margin-right:-.5em}.widget_price_filter .ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;border-radius:1em;background-color:#000}.widget_price_filter .price_slider_wrapper .ui-widget-content{border-radius:1em;background-color:#666;border:0}.widget_price_filter .ui-slider-horizontal{height:.5em}.widget_price_filter .ui-slider-horizontal .ui-slider-range{top:0;height:100%}.widget_price_filter .ui-slider-horizontal .ui-slider-range-min{right:-1px}.widget_price_filter .ui-slider-horizontal .ui-slider-range-max{left:-1px}.widget_rating_filter li{text-align:left}.widget_rating_filter li .star-rating{float:right;margin-top:.3em}.widget_product_search form{position:relative}.widget_product_search .search-field{padding-left:100px}.widget_product_search input[type=submit]{position:absolute;top:.5em;left:.5em;padding-right:1em;padding-left:1em}.woocommerce-account .woocommerce-MyAccount-navigation{float:left;width:25%;border-top:1px solid #ddd}.woocommerce-account .woocommerce-MyAccount-navigation li{list-style:none;padding:.5em 0;border-bottom:1px solid #ddd}.woocommerce-account .woocommerce-MyAccount-navigation li a{-webkit-box-shadow:none;box-shadow:none}.woocommerce-account .woocommerce-MyAccount-navigation li a:hover{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.woocommerce-account .woocommerce-MyAccount-navigation li:before{content:"→";display:inline-block;margin-left:.25em;color:#ddd}.woocommerce-account .woocommerce-MyAccount-navigation li.is-active a{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.woocommerce-account .woocommerce-MyAccount-content{float:right}.woocommerce-cart-form td{padding:1em .5em}.woocommerce-cart-form img{max-width:42px;height:auto;display:block}.woocommerce-cart-form dl.variation{margin-top:0}.woocommerce-cart-form dl.variation p,.woocommerce-cart-form dl.variation:last-child{margin-bottom:0}.woocommerce-cart-form .button{padding:1.2em 2em}.woocommerce-cart-form .actions .input-text{width:130px!important;float:right;margin-left:.25em}.woocommerce-cart-form .quantity input{width:4em}.cart_totals td,.cart_totals th{vertical-align:top;padding:1em 0;line-height:1.5em}.cart_totals th{padding-left:1em}.cart_totals .woocommerce-shipping-destination{margin-bottom:0}.shipping-calculator-button{margin-top:.5em;display:inline-block}.shipping-calculator-form{margin:1em 0 0 0}#shipping_method{list-style:none;margin:0}#shipping_method li{margin-bottom:.5em}#shipping_method li input{float:right;margin-top:.17em}#shipping_method li label{line-height:1.5em}.checkout-button{display:block;padding:1em 2em;border:2px solid #000;text-align:center;font-weight:800;-webkit-box-shadow:none!important;box-shadow:none!important}.checkout-button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;border-color:#999}.checkout-button:after{content:"→"}#ship-to-different-address label{font-weight:300;cursor:pointer}#ship-to-different-address label span{position:relative;display:block}#ship-to-different-address label span:before{content:"";display:block;height:16px;width:30px;border:2px solid #bbb;background:#bbb;border-radius:13em;-webkit-box-sizing:content-box;box-sizing:content-box;-webkit-transition:all ease-in-out .3s;transition:all ease-in-out .3s;position:absolute;top:4px;left:0}#ship-to-different-address label span:after{content:"";display:block;width:14px;height:14px;background:#fff;position:absolute;top:7px;left:17px;border-radius:13em;-webkit-transition:all ease-in-out .3s;transition:all ease-in-out .3s}#ship-to-different-address label input[type=checkbox]{display:none}#ship-to-different-address label input[type=checkbox]:checked+span:after{left:3px}#ship-to-different-address label input[type=checkbox]:checked+span:before{border-color:#000;background:#000}.woocommerce-no-js form.woocommerce-form-coupon,.woocommerce-no-js form.woocommerce-form-login{display:block!important}.woocommerce-no-js .showcoupon,.woocommerce-no-js .woocommerce-form-coupon-toggle,.woocommerce-no-js .woocommerce-form-login-toggle{display:none!important}.woocommerce-terms-and-conditions{border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background:rgba(0,0,0,.05)}.woocommerce-terms-and-conditions-link{display:inline-block}.woocommerce-terms-and-conditions-link:after{content:"";display:inline-block;border-style:solid;margin-bottom:2px;margin-right:.25em;border-width:6px 6px 0 6px;border-color:#111 transparent transparent transparent}.woocommerce-terms-and-conditions-link.woocommerce-terms-and-conditions-link--open:after{border-width:0 6px 6px 6px;border-color:transparent transparent #111 transparent}.woocommerce-checkout .woocommerce-input-wrapper .description{background:#4169e1;color:#fff;border-radius:3px;padding:1em;margin:.5em 0 0;clear:both;display:none;position:relative}.woocommerce-checkout .woocommerce-input-wrapper .description a{color:#fff;text-decoration:underline;border:0;-webkit-box-shadow:none;box-shadow:none}.woocommerce-checkout .woocommerce-input-wrapper .description:before{right:50%;top:0;margin-top:-4px;-webkit-transform:translatex(50%) rotate(-180deg);-ms-transform:translatex(50%) rotate(-180deg);transform:translatex(50%) rotate(-180deg);content:"";position:absolute;border-width:4px 6px 0 6px;border-style:solid;border-color:#4169e1 transparent transparent transparent;z-index:100;display:block}.woocommerce-checkout .select2-choice,.woocommerce-checkout .select2-choice:hover{-webkit-box-shadow:none!important;box-shadow:none!important}.woocommerce-checkout .select2-choice{padding:.7em .7em .7em 0}.woocommerce-checkout .select2-container .select2-selection--single{height:48px}.woocommerce-checkout .select2-container .select2-selection--single .select2-selection__rendered{line-height:48px}.woocommerce-checkout .select2-container--default .select2-selection--single .select2-selection__arrow{height:46px}.woocommerce-checkout .select2-container--focus .select2-selection{border-color:#000}.woocommerce-checkout-review-order-table td{padding:1em .5em}.woocommerce-checkout-review-order-table dl.variation{margin:0}.woocommerce-checkout-review-order-table dl.variation p{margin:0}.wc_payment_method{list-style:none;border-bottom:1px solid #ddd}.wc_payment_method .payment_box{padding:2em;background:#eee}.wc_payment_method .payment_box ol:last-of-type,.wc_payment_method .payment_box ul:last-of-type{margin-bottom:0}.wc_payment_method .payment_box fieldset{padding:1.5em;padding-bottom:0;border:0;background:#f6f6f6}.wc_payment_method .payment_box li{list-style:none}.wc_payment_method .payment_box p:last-child{margin-bottom:0}.wc_payment_method>label:first-of-type{margin:1em 0}.wc_payment_method>label:first-of-type img{max-height:24px;max-width:200px;float:left}.wc_payment_method label{cursor:pointer}.wc_payment_method input.input-radio[name=payment_method]{display:none}.wc_payment_method input.input-radio[name=payment_method]+label:before{content:"";display:inline-block;width:16px;height:16px;border:2px solid #fff;-webkit-box-shadow:0 0 0 2px #000;box-shadow:0 0 0 2px #000;background:#fff;margin-right:4px;margin-left:.5em;border-radius:100%;-webkit-transform:translateY(2px);-ms-transform:translateY(2px);transform:translateY(2px)}.wc_payment_method input.input-radio[name=payment_method]:checked+label:before{background:#000}.colors-dark .page-numbers{color:#444}.colors-dark .page-numbers.next,.colors-dark .page-numbers.prev{color:#ddd}.colors-dark .checkout-button{border:2px solid #555}.colors-dark .checkout-button:hover{border-color:#fff}.colors-dark .wc_payment_method .payment_box{background:#333}.colors-dark .select2-container--default .select2-results .select2-results__options{background:#333}.colors-dark .select2-container--default .select2-results .select2-results__option[data-selected=true]{color:#333}.colors-dark .select2-container--default .select2-selection--single{background-color:#333;border:1px solid #555}.colors-dark .select2-container--default .select2-selection--single .select2-selection__rendered{color:#ccc}.colors-dark .select2-container--focus .select2-selection{border-color:#fff}@media screen and (min-width:48em){.has-sidebar.woocommerce-page:not(.error404) #primary{width:74%}.has-sidebar.woocommerce-page:not(.error404) #secondary{width:20%}body.page-two-column.woocommerce-account:not(.archive) #primary .entry-header,body.page-two-column.woocommerce-cart:not(.archive) #primary .entry-header,body.page-two-column.woocommerce-checkout:not(.archive) #primary .entry-header{width:16%}body.page-two-column.woocommerce-account:not(.archive) #primary .entry-content,body.page-two-column.woocommerce-cart:not(.archive) #primary .entry-content,body.page-two-column.woocommerce-checkout:not(.archive) #primary .entry-content{width:78%}} \ No newline at end of file +@charset "UTF-8";@-webkit-keyframes spin{100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}@keyframes spin{100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}.woocommerce .blockUI.blockOverlay{position:relative}.woocommerce .blockUI.blockOverlay::before{height:1em;width:1em;display:block;position:absolute;top:50%;right:50%;margin-right:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.woocommerce .loader::before{height:1em;width:1em;display:block;position:absolute;top:50%;right:50%;margin-right:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.woocommerce form .form-row .required{color:#b22222;text-decoration:none;visibility:hidden}.woocommerce form .form-row .required[title]{border:0!important}.woocommerce form .form-row .optional{visibility:visible}.woocommerce-breadcrumb{padding-bottom:2em;margin-bottom:4em;border-bottom:1px solid #eee;font-size:13px;font-size:.8125rem}.woocommerce-breadcrumb a{-webkit-box-shadow:0 1px 0 #0f0f0f;box-shadow:0 1px 0 #0f0f0f;-webkit-transition:-webkit-box-shadow ease-in-out 130ms;transition:-webkit-box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms,-webkit-box-shadow ease-in-out 130ms}.woocommerce-breadcrumb a:hover{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.woocommerce-pagination{padding-top:2em;margin-top:4em;border-top:1px solid #eee;font-size:13px;font-size:.8125rem}.woocommerce-pagination ul.page-numbers{padding:0;display:block}.woocommerce-pagination .next.page-numbers,.woocommerce-pagination .prev.page-numbers,.woocommerce-pagination a.page-numbers,.woocommerce-pagination span.page-numbers{padding:.5em 1em;background:#ddd;display:inline-block;font-size:1em;float:none;line-height:1.5;border-radius:2px;-webkit-transition:background-color ease-in-out .3s;transition:background-color ease-in-out .3s}.woocommerce-pagination span.page-numbers{background-color:#fff}.woocommerce-pagination a.page-numbers:hover{background-color:#767676;color:#fff}.onsale{background-color:#fff;position:absolute;top:0;right:0;display:inline-block;padding:.5em 1em;font-size:13px;font-size:.8125rem;text-transform:uppercase;font-weight:800}.price del{opacity:.5;display:inline-block}.price ins{display:inline-block}.woocommerce-error,.woocommerce-info,.woocommerce-message{margin-bottom:1.5em;padding:2em;background:#eee}.woocommerce-message{background:teal;color:#fff}.woocommerce-error{background:#b22222;color:#fff}.woocommerce-info{background:#4169e1;color:#fff}.woocommerce-error a,.woocommerce-info a,.woocommerce-message a{color:#fff;-webkit-box-shadow:0 1px 0 #fff!important;box-shadow:0 1px 0 #fff!important;-webkit-transition:-webkit-box-shadow ease-in-out 130ms;transition:-webkit-box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms,-webkit-box-shadow ease-in-out 130ms}.woocommerce-error a:hover,.woocommerce-info a:hover,.woocommerce-message a:hover{color:#fff!important;-webkit-box-shadow:0 3px 0 #fff!important;box-shadow:0 3px 0 #fff!important}.woocommerce-store-notice{background:#4169e1;color:#fff;padding:1em;position:absolute;top:0;right:0;width:100%;z-index:999}.admin-bar .woocommerce-store-notice{top:32px}.woocommerce-store-notice__dismiss-link{float:left;color:#fff}.woocommerce-store-notice__dismiss-link:hover{text-decoration:underline;color:#fff}.woocommerce-result-count{padding:.75em 0}ul.products li.product{list-style:none}ul.products li.product .price,ul.products li.product .star-rating{display:block;margin-bottom:.75em}ul.products li.product .woocommerce-placeholder{border:1px solid #f2f2f2}ul.products li.product .button{-webkit-box-shadow:0 1px 0 #0f0f0f;box-shadow:0 1px 0 #0f0f0f;-webkit-transition:-webkit-box-shadow ease-in-out 130ms;transition:-webkit-box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms,-webkit-box-shadow ease-in-out 130ms}ul.products li.product .button:hover{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}ul.products li.product .button.loading{opacity:.5}ul.products li.product .added_to_cart{-webkit-box-shadow:0 1px 0 #0f0f0f;box-shadow:0 1px 0 #0f0f0f;-webkit-transition:-webkit-box-shadow ease-in-out 130ms;transition:-webkit-box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms,-webkit-box-shadow ease-in-out 130ms;margin-right:.5em}ul.products li.product .added_to_cart:hover{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.star-rating{overflow:hidden;position:relative;height:1em;line-height:1;font-size:1em;width:5.4em;font-family:star}.star-rating::before{content:'\73\73\73\73\73';float:right;top:0;right:0;position:absolute}.star-rating span{overflow:hidden;float:right;top:0;right:0;position:absolute;padding-top:1.5em}.star-rating span::before{content:'\53\53\53\53\53';top:0;position:absolute;right:0}.woocommerce-loop-product__title{font-size:13px;font-size:.8125rem;text-transform:uppercase;font-weight:800;letter-spacing:.15em}a.remove{display:inline-block;width:16px;height:16px;line-height:16px;font-size:16px;text-align:center;border-radius:100%;-webkit-box-shadow:none!important;box-shadow:none!important;border:1px solid #000}a.remove:hover{background:#000;color:#fff!important}.wc-item-meta,dl.variation{list-style:none outside}.wc-item-meta .wc-item-meta-label,.wc-item-meta dt,dl.variation .wc-item-meta-label,dl.variation dt{float:right;clear:both;margin-left:.25em;display:inline-block;list-style:none outside}.wc-item-meta dd,dl.variation dd{margin:0}.wc-item-meta p,.wc-item-meta:last-child,dl.variation p,dl.variation:last-child{margin-bottom:0}.single-product div.product{position:relative}.single-product .single-featured-image-header{display:none}.single-product .summary{margin-bottom:3em}.single-product .summary p.price{margin-bottom:2em}.single-product .woocommerce-product-rating{margin-bottom:2em;line-height:1}.single-product .woocommerce-product-rating .star-rating{float:right;margin-left:.25em}.single-product form.cart .quantity{float:right;margin-left:.5em}.single-product form.cart input{width:5em}.single-product .woocommerce-variation-add-to-cart .button{padding-top:.72em;padding-bottom:.72em}.single-product .woocommerce-variation-add-to-cart .button.disabled{opacity:.2}table.variations label{margin:0}table.variations select{margin-left:.5em}.woocommerce-product-gallery{position:relative;margin-bottom:3em}.woocommerce-product-gallery figure{margin:0;padding:0}.woocommerce-product-gallery .woocommerce-product-gallery__wrapper{margin:0;padding:0}.woocommerce-product-gallery .zoomImg{background-color:#fff;opacity:0}.woocommerce-product-gallery .woocommerce-product-gallery__image--placeholder{border:1px solid #f2f2f2}.woocommerce-product-gallery .woocommerce-product-gallery__image:nth-child(n+2){width:25%;display:inline-block}.woocommerce-product-gallery .flex-control-thumbs li{list-style:none;cursor:pointer;float:right}.woocommerce-product-gallery .flex-control-thumbs img{opacity:.5}.woocommerce-product-gallery .flex-control-thumbs img.flex-active,.woocommerce-product-gallery .flex-control-thumbs img:hover{opacity:1}.woocommerce-product-gallery img{display:block;height:auto}.woocommerce-product-gallery--columns-3 .flex-control-thumbs li{width:33.3333%}.woocommerce-product-gallery--columns-3 .flex-control-thumbs li:nth-child(3n+1){clear:right}.woocommerce-product-gallery--columns-4 .flex-control-thumbs li{width:25%}.woocommerce-product-gallery--columns-4 .flex-control-thumbs li:nth-child(4n+1){clear:right}.woocommerce-product-gallery--columns-5 .flex-control-thumbs li{width:20%}.woocommerce-product-gallery--columns-5 .flex-control-thumbs li:nth-child(5n+1){clear:right}.woocommerce-product-gallery__trigger{position:absolute;top:1em;left:1em;z-index:99}.woocommerce-tabs{margin-bottom:2em}.woocommerce-tabs li{margin-left:1em}.woocommerce-tabs li.active a{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.woocommerce-tabs a{-webkit-box-shadow:0 1px 0 #0f0f0f;box-shadow:0 1px 0 #0f0f0f;-webkit-transition:-webkit-box-shadow ease-in-out 130ms;transition:-webkit-box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms,-webkit-box-shadow ease-in-out 130ms}.woocommerce-tabs a:hover{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.woocommerce-tabs #comments{padding-top:0}.woocommerce-tabs .comment-reply-title{font-size:22px;font-size:1.375rem;font-weight:300;line-height:1.4;margin:0 0 .75em;display:block}.woocommerce-tabs #reviews li.comment,.woocommerce-tabs #reviews li.review{list-style:none;margin-left:0;margin-bottom:2.5em}.woocommerce-tabs #reviews li.comment .avatar,.woocommerce-tabs #reviews li.review .avatar{max-height:36px;width:auto;float:left}.woocommerce-tabs #reviews li.comment p.meta,.woocommerce-tabs #reviews li.review p.meta{margin-bottom:.5em}.woocommerce-tabs #reviews p.stars a{position:relative;height:1em;width:1em;text-indent:-999em;display:inline-block;text-decoration:none;-webkit-box-shadow:none;box-shadow:none}.woocommerce-tabs #reviews p.stars a::before{display:block;position:absolute;top:0;right:0;width:1em;height:1em;line-height:1;font-family:WooCommerce;content:'\e021';text-indent:0}.woocommerce-tabs #reviews p.stars a:hover~a::before{content:'\e021'}.woocommerce-tabs #reviews p.stars:hover a::before{content:'\e020'}.woocommerce-tabs #reviews p.stars.selected a.active::before{content:'\e020'}.woocommerce-tabs #reviews p.stars.selected a.active~a::before{content:'\e021'}.woocommerce-tabs #reviews p.stars.selected a:not(.active)::before{content:'\e020'}.site-footer .widget .product_list_widget,.widget .product_list_widget{margin-bottom:1.5em}.site-footer .widget .product_list_widget a,.widget .product_list_widget a{display:block;-webkit-box-shadow:none;box-shadow:none}.site-footer .widget .product_list_widget a:hover,.widget .product_list_widget a:hover{-webkit-box-shadow:none;box-shadow:none}.site-footer .widget .product_list_widget li,.widget .product_list_widget li{padding:1.5em 0}.site-footer .widget .product_list_widget li a.remove,.widget .product_list_widget li a.remove{float:left;margin-top:2px}.site-footer .widget .product_list_widget img,.widget .product_list_widget img{display:none}.widget_shopping_cart .buttons a{display:inline-block;margin:0 0 0 .5em}.widget_layered_nav .chosen:before{content:"×";display:inline-block;width:16px;height:16px;line-height:16px;font-size:16px;text-align:center;border-radius:100%;border:1px solid #000;margin-left:.25em}.widget_price_filter .price_slider{margin-bottom:1em}.widget_price_filter .price_slider_amount{text-align:left;line-height:2.4;font-size:.8751em}.widget_price_filter .price_slider_amount .button{float:right;padding:.4em 1em}.widget_price_filter .ui-slider{position:relative;text-align:right;margin-right:.5em;margin-left:.5em}.widget_price_filter .ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1em;height:1em;background-color:#000;border-radius:1em;cursor:ew-resize;outline:0;top:-.3em;margin-right:-.5em}.widget_price_filter .ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;border-radius:1em;background-color:#000}.widget_price_filter .price_slider_wrapper .ui-widget-content{border-radius:1em;background-color:#666;border:0}.widget_price_filter .ui-slider-horizontal{height:.5em}.widget_price_filter .ui-slider-horizontal .ui-slider-range{top:0;height:100%}.widget_price_filter .ui-slider-horizontal .ui-slider-range-min{right:-1px}.widget_price_filter .ui-slider-horizontal .ui-slider-range-max{left:-1px}.widget_rating_filter li{text-align:left}.widget_rating_filter li .star-rating{float:right;margin-top:.3em}.widget_product_search form{position:relative}.widget_product_search .search-field{padding-left:100px}.widget_product_search input[type=submit]{position:absolute;top:.5em;left:.5em;padding-right:1em;padding-left:1em}.woocommerce-account .woocommerce-MyAccount-navigation{float:left;width:25%;border-top:1px solid #ddd}.woocommerce-account .woocommerce-MyAccount-navigation li{list-style:none;padding:.5em 0;border-bottom:1px solid #ddd}.woocommerce-account .woocommerce-MyAccount-navigation li a{-webkit-box-shadow:none;box-shadow:none}.woocommerce-account .woocommerce-MyAccount-navigation li a:hover{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.woocommerce-account .woocommerce-MyAccount-navigation li:before{content:"→";display:inline-block;margin-left:.25em;color:#ddd}.woocommerce-account .woocommerce-MyAccount-navigation li.is-active a{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.woocommerce-account .woocommerce-MyAccount-content{float:right}.woocommerce-cart-form td{padding:1em .5em}.woocommerce-cart-form img{max-width:42px;height:auto;display:block}.woocommerce-cart-form dl.variation{margin-top:0}.woocommerce-cart-form dl.variation p,.woocommerce-cart-form dl.variation:last-child{margin-bottom:0}.woocommerce-cart-form .button{padding:1.2em 2em}.woocommerce-cart-form .actions .input-text{width:130px!important;float:right;margin-left:.25em}.woocommerce-cart-form .quantity input{width:4em}.cart_totals td,.cart_totals th{vertical-align:top;padding:1em 0;line-height:1.5em}.cart_totals th{padding-left:1em}.cart_totals .woocommerce-shipping-destination{margin-bottom:0}.shipping-calculator-button{margin-top:.5em;display:inline-block}.shipping-calculator-form{margin:1em 0 0 0}#shipping_method{list-style:none;margin:0}#shipping_method li{margin-bottom:.5em}#shipping_method li input{float:right;margin-top:.17em}#shipping_method li label{line-height:1.5em}.checkout-button{display:block;padding:1em 2em;border:2px solid #000;text-align:center;font-weight:800;-webkit-box-shadow:none!important;box-shadow:none!important}.checkout-button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;border-color:#999}.checkout-button:after{content:"→"}#ship-to-different-address label{font-weight:300;cursor:pointer}#ship-to-different-address label span{position:relative;display:block}#ship-to-different-address label span:before{content:"";display:block;height:16px;width:30px;border:2px solid #bbb;background:#bbb;border-radius:13em;-webkit-box-sizing:content-box;box-sizing:content-box;-webkit-transition:all ease-in-out .3s;transition:all ease-in-out .3s;position:absolute;top:4px;left:0}#ship-to-different-address label span:after{content:"";display:block;width:14px;height:14px;background:#fff;position:absolute;top:7px;left:17px;border-radius:13em;-webkit-transition:all ease-in-out .3s;transition:all ease-in-out .3s}#ship-to-different-address label input[type=checkbox]{display:none}#ship-to-different-address label input[type=checkbox]:checked+span:after{left:3px}#ship-to-different-address label input[type=checkbox]:checked+span:before{border-color:#000;background:#000}.woocommerce-no-js form.woocommerce-form-coupon,.woocommerce-no-js form.woocommerce-form-login{display:block!important}.woocommerce-no-js .showcoupon,.woocommerce-no-js .woocommerce-form-coupon-toggle,.woocommerce-no-js .woocommerce-form-login-toggle{display:none!important}.woocommerce-terms-and-conditions{border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background:rgba(0,0,0,.05)}.woocommerce-terms-and-conditions-link{display:inline-block}.woocommerce-terms-and-conditions-link:after{content:"";display:inline-block;border-style:solid;margin-bottom:2px;margin-right:.25em;border-width:6px 6px 0 6px;border-color:#111 transparent transparent transparent}.woocommerce-terms-and-conditions-link.woocommerce-terms-and-conditions-link--open:after{border-width:0 6px 6px 6px;border-color:transparent transparent #111 transparent}.woocommerce-checkout .woocommerce-input-wrapper .description{background:#4169e1;color:#fff;border-radius:3px;padding:1em;margin:.5em 0 0;clear:both;display:none;position:relative}.woocommerce-checkout .woocommerce-input-wrapper .description a{color:#fff;text-decoration:underline;border:0;-webkit-box-shadow:none;box-shadow:none}.woocommerce-checkout .woocommerce-input-wrapper .description:before{right:50%;top:0;margin-top:-4px;-webkit-transform:translatex(50%) rotate(-180deg);-ms-transform:translatex(50%) rotate(-180deg);transform:translatex(50%) rotate(-180deg);content:"";position:absolute;border-width:4px 6px 0 6px;border-style:solid;border-color:#4169e1 transparent transparent transparent;z-index:100;display:block}.woocommerce-checkout .select2-choice,.woocommerce-checkout .select2-choice:hover{-webkit-box-shadow:none!important;box-shadow:none!important}.woocommerce-checkout .select2-choice{padding:.7em .7em .7em 0}.woocommerce-checkout .select2-container .select2-selection--single{height:48px}.woocommerce-checkout .select2-container .select2-selection--single .select2-selection__rendered{line-height:48px}.woocommerce-checkout .select2-container--default .select2-selection--single .select2-selection__arrow{height:46px}.woocommerce-checkout .select2-container--focus .select2-selection{border-color:#000}.woocommerce-checkout-review-order-table td{padding:1em .5em}.woocommerce-checkout-review-order-table dl.variation{margin:0}.woocommerce-checkout-review-order-table dl.variation p{margin:0}.wc_payment_method{list-style:none;border-bottom:1px solid #ddd}.wc_payment_method .payment_box{padding:2em;background:#eee}.wc_payment_method .payment_box ol:last-of-type,.wc_payment_method .payment_box ul:last-of-type{margin-bottom:0}.wc_payment_method .payment_box fieldset{padding:1.5em;padding-bottom:0;border:0;background:#f6f6f6}.wc_payment_method .payment_box li{list-style:none}.wc_payment_method .payment_box p:last-child{margin-bottom:0}.wc_payment_method>label:first-of-type{margin:1em 0}.wc_payment_method>label:first-of-type img{max-height:24px;max-width:200px;float:left}.wc_payment_method label{cursor:pointer}.wc_payment_method input.input-radio[name=payment_method]{display:none}.wc_payment_method input.input-radio[name=payment_method]+label:before{content:"";display:inline-block;width:16px;height:16px;border:2px solid #fff;-webkit-box-shadow:0 0 0 2px #000;box-shadow:0 0 0 2px #000;background:#fff;margin-right:4px;margin-left:.5em;border-radius:100%;-webkit-transform:translateY(2px);-ms-transform:translateY(2px);transform:translateY(2px)}.wc_payment_method input.input-radio[name=payment_method]:checked+label:before{background:#000}.colors-dark .page-numbers{color:#444}.colors-dark .page-numbers.next,.colors-dark .page-numbers.prev{color:#ddd}.colors-dark .checkout-button{border:2px solid #555}.colors-dark .checkout-button:hover{border-color:#fff}.colors-dark .wc_payment_method .payment_box{background:#333}.colors-dark .select2-container--default .select2-results .select2-results__options{background:#333}.colors-dark .select2-container--default .select2-results .select2-results__option[data-selected=true]{color:#333}.colors-dark .select2-container--default .select2-selection--single{background-color:#333;border:1px solid #555}.colors-dark .select2-container--default .select2-selection--single .select2-selection__rendered{color:#ccc}.colors-dark .select2-container--focus .select2-selection{border-color:#fff}@media screen and (min-width:48em){.has-sidebar.woocommerce-page:not(.error404) #primary{width:74%}.has-sidebar.woocommerce-page:not(.error404) #secondary{width:20%}body.page-two-column.woocommerce-account:not(.archive) #primary .entry-header,body.page-two-column.woocommerce-cart:not(.archive) #primary .entry-header,body.page-two-column.woocommerce-checkout:not(.archive) #primary .entry-header{width:16%}body.page-two-column.woocommerce-account:not(.archive) #primary .entry-content,body.page-two-column.woocommerce-cart:not(.archive) #primary .entry-content,body.page-two-column.woocommerce-checkout:not(.archive) #primary .entry-content{width:78%}} diff --git a/assets/css/twenty-seventeen.css b/assets/css/twenty-seventeen.css index 3ccd859fe61..60bda9264cf 100644 --- a/assets/css/twenty-seventeen.css +++ b/assets/css/twenty-seventeen.css @@ -1 +1 @@ -@charset "UTF-8";@-webkit-keyframes spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}.woocommerce .blockUI.blockOverlay{position:relative}.woocommerce .blockUI.blockOverlay::before{height:1em;width:1em;display:block;position:absolute;top:50%;left:50%;margin-left:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.woocommerce .loader::before{height:1em;width:1em;display:block;position:absolute;top:50%;left:50%;margin-left:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.woocommerce form .form-row .required{color:#b22222;text-decoration:none;visibility:hidden}.woocommerce form .form-row .required[title]{border:0!important}.woocommerce form .form-row .optional{visibility:visible}.woocommerce-breadcrumb{padding-bottom:2em;margin-bottom:4em;border-bottom:1px solid #eee;font-size:13px;font-size:.8125rem}.woocommerce-breadcrumb a{-webkit-box-shadow:0 1px 0 #0f0f0f;box-shadow:0 1px 0 #0f0f0f;-webkit-transition:-webkit-box-shadow ease-in-out 130ms;transition:-webkit-box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms,-webkit-box-shadow ease-in-out 130ms}.woocommerce-breadcrumb a:hover{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.woocommerce-pagination{padding-top:2em;margin-top:4em;border-top:1px solid #eee;font-size:13px;font-size:.8125rem}.woocommerce-pagination ul.page-numbers{padding:0;display:block}.woocommerce-pagination .next.page-numbers,.woocommerce-pagination .prev.page-numbers,.woocommerce-pagination a.page-numbers,.woocommerce-pagination span.page-numbers{padding:.5em 1em;background:#ddd;display:inline-block;font-size:1em;float:none;line-height:1.5;border-radius:2px;-webkit-transition:background-color ease-in-out .3s;transition:background-color ease-in-out .3s}.woocommerce-pagination span.page-numbers{background-color:#fff}.woocommerce-pagination a.page-numbers:hover{background-color:#767676;color:#fff}.onsale{background-color:#fff;position:absolute;top:0;left:0;display:inline-block;padding:.5em 1em;font-size:13px;font-size:.8125rem;text-transform:uppercase;font-weight:800}.price del{opacity:.5;display:inline-block}.price ins{display:inline-block}.woocommerce-error,.woocommerce-info,.woocommerce-message{margin-bottom:1.5em;padding:2em;background:#eee}.woocommerce-message{background:teal;color:#fff}.woocommerce-error{background:#b22222;color:#fff}.woocommerce-info{background:#4169e1;color:#fff}.woocommerce-error a,.woocommerce-info a,.woocommerce-message a{color:#fff;-webkit-box-shadow:0 1px 0 #fff!important;box-shadow:0 1px 0 #fff!important;-webkit-transition:-webkit-box-shadow ease-in-out 130ms;transition:-webkit-box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms,-webkit-box-shadow ease-in-out 130ms}.woocommerce-error a:hover,.woocommerce-info a:hover,.woocommerce-message a:hover{color:#fff!important;-webkit-box-shadow:0 3px 0 #fff!important;box-shadow:0 3px 0 #fff!important}.woocommerce-store-notice{background:#4169e1;color:#fff;padding:1em;position:absolute;top:0;left:0;width:100%;z-index:999}.admin-bar .woocommerce-store-notice{top:32px}.woocommerce-store-notice__dismiss-link{float:right;color:#fff}.woocommerce-store-notice__dismiss-link:hover{text-decoration:underline;color:#fff}.woocommerce-result-count{padding:.75em 0}ul.products li.product{list-style:none}ul.products li.product .price,ul.products li.product .star-rating{display:block;margin-bottom:.75em}ul.products li.product .woocommerce-placeholder{border:1px solid #f2f2f2}ul.products li.product .button{-webkit-box-shadow:0 1px 0 #0f0f0f;box-shadow:0 1px 0 #0f0f0f;-webkit-transition:-webkit-box-shadow ease-in-out 130ms;transition:-webkit-box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms,-webkit-box-shadow ease-in-out 130ms}ul.products li.product .button:hover{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}ul.products li.product .button.loading{opacity:.5}ul.products li.product .added_to_cart{-webkit-box-shadow:0 1px 0 #0f0f0f;box-shadow:0 1px 0 #0f0f0f;-webkit-transition:-webkit-box-shadow ease-in-out 130ms;transition:-webkit-box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms,-webkit-box-shadow ease-in-out 130ms;margin-left:.5em}ul.products li.product .added_to_cart:hover{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.star-rating{overflow:hidden;position:relative;height:1em;line-height:1;font-size:1em;width:5.4em;font-family:star}.star-rating::before{content:'\73\73\73\73\73';float:left;top:0;left:0;position:absolute}.star-rating span{overflow:hidden;float:left;top:0;left:0;position:absolute;padding-top:1.5em}.star-rating span::before{content:'\53\53\53\53\53';top:0;position:absolute;left:0}.woocommerce-loop-product__title{font-size:13px;font-size:.8125rem;text-transform:uppercase;font-weight:800;letter-spacing:.15em}a.remove{display:inline-block;width:16px;height:16px;line-height:16px;font-size:16px;text-align:center;border-radius:100%;-webkit-box-shadow:none!important;box-shadow:none!important;border:1px solid #000}a.remove:hover{background:#000;color:#fff!important}.wc-item-meta,dl.variation{list-style:none outside}.wc-item-meta .wc-item-meta-label,.wc-item-meta dt,dl.variation .wc-item-meta-label,dl.variation dt{float:left;clear:both;margin-right:.25em;display:inline-block;list-style:none outside}.wc-item-meta dd,dl.variation dd{margin:0}.wc-item-meta p,.wc-item-meta:last-child,dl.variation p,dl.variation:last-child{margin-bottom:0}.single-product div.product{position:relative}.single-product .single-featured-image-header{display:none}.single-product .summary{margin-bottom:3em}.single-product .summary p.price{margin-bottom:2em}.single-product .woocommerce-product-rating{margin-bottom:2em;line-height:1}.single-product .woocommerce-product-rating .star-rating{float:left;margin-right:.25em}.single-product form.cart .quantity{float:left;margin-right:.5em}.single-product form.cart input{width:5em}.single-product .woocommerce-variation-add-to-cart .button{padding-top:.72em;padding-bottom:.72em}.single-product .woocommerce-variation-add-to-cart .button.disabled{opacity:.2}table.variations label{margin:0}table.variations select{margin-right:.5em}.woocommerce-product-gallery{position:relative;margin-bottom:3em}.woocommerce-product-gallery figure{margin:0;padding:0}.woocommerce-product-gallery .woocommerce-product-gallery__wrapper{margin:0;padding:0}.woocommerce-product-gallery .zoomImg{background-color:#fff;opacity:0}.woocommerce-product-gallery .woocommerce-product-gallery__image--placeholder{border:1px solid #f2f2f2}.woocommerce-product-gallery .woocommerce-product-gallery__image:nth-child(n+2){width:25%;display:inline-block}.woocommerce-product-gallery .flex-control-thumbs li{list-style:none;cursor:pointer;float:left}.woocommerce-product-gallery .flex-control-thumbs img{opacity:.5}.woocommerce-product-gallery .flex-control-thumbs img.flex-active,.woocommerce-product-gallery .flex-control-thumbs img:hover{opacity:1}.woocommerce-product-gallery img{display:block;width:100%;height:auto}.woocommerce-product-gallery--columns-3 .flex-control-thumbs li{width:33.3333%}.woocommerce-product-gallery--columns-3 .flex-control-thumbs li:nth-child(3n+1){clear:left}.woocommerce-product-gallery--columns-4 .flex-control-thumbs li{width:25%}.woocommerce-product-gallery--columns-4 .flex-control-thumbs li:nth-child(4n+1){clear:left}.woocommerce-product-gallery--columns-5 .flex-control-thumbs li{width:20%}.woocommerce-product-gallery--columns-5 .flex-control-thumbs li:nth-child(5n+1){clear:left}.woocommerce-product-gallery__trigger{position:absolute;top:1em;right:1em;z-index:99}.woocommerce-tabs{margin-bottom:2em}.woocommerce-tabs li{margin-right:1em}.woocommerce-tabs li.active a{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.woocommerce-tabs a{-webkit-box-shadow:0 1px 0 #0f0f0f;box-shadow:0 1px 0 #0f0f0f;-webkit-transition:-webkit-box-shadow ease-in-out 130ms;transition:-webkit-box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms,-webkit-box-shadow ease-in-out 130ms}.woocommerce-tabs a:hover{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.woocommerce-tabs #comments{padding-top:0}.woocommerce-tabs .comment-reply-title{font-size:22px;font-size:1.375rem;font-weight:300;line-height:1.4;margin:0 0 .75em;display:block}.woocommerce-tabs #reviews li.comment,.woocommerce-tabs #reviews li.review{list-style:none;margin-right:0;margin-bottom:2.5em}.woocommerce-tabs #reviews li.comment .avatar,.woocommerce-tabs #reviews li.review .avatar{max-height:36px;width:auto;float:right}.woocommerce-tabs #reviews li.comment p.meta,.woocommerce-tabs #reviews li.review p.meta{margin-bottom:.5em}.woocommerce-tabs #reviews p.stars a{position:relative;height:1em;width:1em;text-indent:-999em;display:inline-block;text-decoration:none;-webkit-box-shadow:none;box-shadow:none}.woocommerce-tabs #reviews p.stars a::before{display:block;position:absolute;top:0;left:0;width:1em;height:1em;line-height:1;font-family:WooCommerce;content:'\e021';text-indent:0}.woocommerce-tabs #reviews p.stars a:hover~a::before{content:'\e021'}.woocommerce-tabs #reviews p.stars:hover a::before{content:'\e020'}.woocommerce-tabs #reviews p.stars.selected a.active::before{content:'\e020'}.woocommerce-tabs #reviews p.stars.selected a.active~a::before{content:'\e021'}.woocommerce-tabs #reviews p.stars.selected a:not(.active)::before{content:'\e020'}.site-footer .widget .product_list_widget,.widget .product_list_widget{margin-bottom:1.5em}.site-footer .widget .product_list_widget a,.widget .product_list_widget a{display:block;-webkit-box-shadow:none;box-shadow:none}.site-footer .widget .product_list_widget a:hover,.widget .product_list_widget a:hover{-webkit-box-shadow:none;box-shadow:none}.site-footer .widget .product_list_widget li,.widget .product_list_widget li{padding:1.5em 0}.site-footer .widget .product_list_widget li a.remove,.widget .product_list_widget li a.remove{float:right;margin-top:2px}.site-footer .widget .product_list_widget img,.widget .product_list_widget img{display:none}.widget_shopping_cart .buttons a{display:inline-block;margin:0 .5em 0 0}.widget_layered_nav .chosen:before{content:"×";display:inline-block;width:16px;height:16px;line-height:16px;font-size:16px;text-align:center;border-radius:100%;border:1px solid #000;margin-right:.25em}.widget_price_filter .price_slider{margin-bottom:1em}.widget_price_filter .price_slider_amount{text-align:right;line-height:2.4;font-size:.8751em}.widget_price_filter .price_slider_amount .button{float:left;padding:.4em 1em}.widget_price_filter .ui-slider{position:relative;text-align:left;margin-left:.5em;margin-right:.5em}.widget_price_filter .ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1em;height:1em;background-color:#000;border-radius:1em;cursor:ew-resize;outline:0;top:-.3em;margin-left:-.5em}.widget_price_filter .ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;border-radius:1em;background-color:#000}.widget_price_filter .price_slider_wrapper .ui-widget-content{border-radius:1em;background-color:#666;border:0}.widget_price_filter .ui-slider-horizontal{height:.5em}.widget_price_filter .ui-slider-horizontal .ui-slider-range{top:0;height:100%}.widget_price_filter .ui-slider-horizontal .ui-slider-range-min{left:-1px}.widget_price_filter .ui-slider-horizontal .ui-slider-range-max{right:-1px}.widget_rating_filter li{text-align:right}.widget_rating_filter li .star-rating{float:left;margin-top:.3em}.widget_product_search form{position:relative}.widget_product_search .search-field{padding-right:100px}.widget_product_search input[type=submit]{position:absolute;top:.5em;right:.5em;padding-left:1em;padding-right:1em}.woocommerce-account .woocommerce-MyAccount-navigation{float:right;width:25%;border-top:1px solid #ddd}.woocommerce-account .woocommerce-MyAccount-navigation li{list-style:none;padding:.5em 0;border-bottom:1px solid #ddd}.woocommerce-account .woocommerce-MyAccount-navigation li a{-webkit-box-shadow:none;box-shadow:none}.woocommerce-account .woocommerce-MyAccount-navigation li a:hover{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.woocommerce-account .woocommerce-MyAccount-navigation li:before{content:"→";display:inline-block;margin-right:.25em;color:#ddd}.woocommerce-account .woocommerce-MyAccount-navigation li.is-active a{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.woocommerce-account .woocommerce-MyAccount-content{float:left}.woocommerce-cart-form td{padding:1em .5em}.woocommerce-cart-form img{max-width:42px;height:auto;display:block}.woocommerce-cart-form dl.variation{margin-top:0}.woocommerce-cart-form dl.variation p,.woocommerce-cart-form dl.variation:last-child{margin-bottom:0}.woocommerce-cart-form .button{padding:1.2em 2em}.woocommerce-cart-form .actions .input-text{width:130px!important;float:left;margin-right:.25em}.woocommerce-cart-form .quantity input{width:4em}.cart_totals td,.cart_totals th{vertical-align:top;padding:1em 0;line-height:1.5em}.cart_totals th{padding-right:1em}.cart_totals .woocommerce-shipping-destination{margin-bottom:0}.shipping-calculator-button{margin-top:.5em;display:inline-block}.shipping-calculator-form{margin:1em 0 0 0}#shipping_method{list-style:none;margin:0}#shipping_method li{margin-bottom:.5em}#shipping_method li input{float:left;margin-top:.17em}#shipping_method li label{line-height:1.5em}.checkout-button{display:block;padding:1em 2em;border:2px solid #000;text-align:center;font-weight:800;-webkit-box-shadow:none!important;box-shadow:none!important}.checkout-button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;border-color:#999}.checkout-button:after{content:"→"}#ship-to-different-address label{font-weight:300;cursor:pointer}#ship-to-different-address label span{position:relative;display:block}#ship-to-different-address label span:before{content:"";display:block;height:16px;width:30px;border:2px solid #bbb;background:#bbb;border-radius:13em;-webkit-box-sizing:content-box;box-sizing:content-box;-webkit-transition:all ease-in-out .3s;transition:all ease-in-out .3s;position:absolute;top:4px;right:0}#ship-to-different-address label span:after{content:"";display:block;width:14px;height:14px;background:#fff;position:absolute;top:7px;right:17px;border-radius:13em;-webkit-transition:all ease-in-out .3s;transition:all ease-in-out .3s}#ship-to-different-address label input[type=checkbox]{display:none}#ship-to-different-address label input[type=checkbox]:checked+span:after{right:3px}#ship-to-different-address label input[type=checkbox]:checked+span:before{border-color:#000;background:#000}.woocommerce-no-js form.woocommerce-form-coupon,.woocommerce-no-js form.woocommerce-form-login{display:block!important}.woocommerce-no-js .showcoupon,.woocommerce-no-js .woocommerce-form-coupon-toggle,.woocommerce-no-js .woocommerce-form-login-toggle{display:none!important}.woocommerce-terms-and-conditions{border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background:rgba(0,0,0,.05)}.woocommerce-terms-and-conditions-link{display:inline-block}.woocommerce-terms-and-conditions-link:after{content:"";display:inline-block;border-style:solid;margin-bottom:2px;margin-left:.25em;border-width:6px 6px 0 6px;border-color:#111 transparent transparent transparent}.woocommerce-terms-and-conditions-link.woocommerce-terms-and-conditions-link--open:after{border-width:0 6px 6px 6px;border-color:transparent transparent #111 transparent}.woocommerce-checkout .woocommerce-input-wrapper .description{background:#4169e1;color:#fff;border-radius:3px;padding:1em;margin:.5em 0 0;clear:both;display:none;position:relative}.woocommerce-checkout .woocommerce-input-wrapper .description a{color:#fff;text-decoration:underline;border:0;-webkit-box-shadow:none;box-shadow:none}.woocommerce-checkout .woocommerce-input-wrapper .description:before{left:50%;top:0;margin-top:-4px;-webkit-transform:translatex(-50%) rotate(180deg);-ms-transform:translatex(-50%) rotate(180deg);transform:translatex(-50%) rotate(180deg);content:"";position:absolute;border-width:4px 6px 0 6px;border-style:solid;border-color:#4169e1 transparent transparent transparent;z-index:100;display:block}.woocommerce-checkout .select2-choice,.woocommerce-checkout .select2-choice:hover{-webkit-box-shadow:none!important;box-shadow:none!important}.woocommerce-checkout .select2-choice{padding:.7em 0 .7em .7em}.woocommerce-checkout .select2-container .select2-selection--single{height:48px}.woocommerce-checkout .select2-container .select2-selection--single .select2-selection__rendered{line-height:48px}.woocommerce-checkout .select2-container--default .select2-selection--single .select2-selection__arrow{height:46px}.woocommerce-checkout .select2-container--focus .select2-selection{border-color:#000}.woocommerce-checkout-review-order-table td{padding:1em .5em}.woocommerce-checkout-review-order-table dl.variation{margin:0}.woocommerce-checkout-review-order-table dl.variation p{margin:0}.wc_payment_method{list-style:none;border-bottom:1px solid #ddd}.wc_payment_method .payment_box{padding:2em;background:#eee}.wc_payment_method .payment_box ol:last-of-type,.wc_payment_method .payment_box ul:last-of-type{margin-bottom:0}.wc_payment_method .payment_box fieldset{padding:1.5em;padding-bottom:0;border:0;background:#f6f6f6}.wc_payment_method .payment_box li{list-style:none}.wc_payment_method .payment_box p:last-child{margin-bottom:0}.wc_payment_method>label:first-of-type{margin:1em 0}.wc_payment_method>label:first-of-type img{max-height:24px;max-width:200px;float:right}.wc_payment_method label{cursor:pointer}.wc_payment_method input.input-radio[name=payment_method]{display:none}.wc_payment_method input.input-radio[name=payment_method]+label:before{content:"";display:inline-block;width:16px;height:16px;border:2px solid #fff;-webkit-box-shadow:0 0 0 2px #000;box-shadow:0 0 0 2px #000;background:#fff;margin-left:4px;margin-right:.5em;border-radius:100%;-webkit-transform:translateY(2px);-ms-transform:translateY(2px);transform:translateY(2px)}.wc_payment_method input.input-radio[name=payment_method]:checked+label:before{background:#000}.colors-dark .page-numbers{color:#444}.colors-dark .page-numbers.next,.colors-dark .page-numbers.prev{color:#ddd}.colors-dark .checkout-button{border:2px solid #555}.colors-dark .checkout-button:hover{border-color:#fff}.colors-dark .wc_payment_method .payment_box{background:#333}.colors-dark .select2-container--default .select2-results .select2-results__options{background:#333}.colors-dark .select2-container--default .select2-results .select2-results__option[data-selected=true]{color:#333}.colors-dark .select2-container--default .select2-selection--single{background-color:#333;border:1px solid #555}.colors-dark .select2-container--default .select2-selection--single .select2-selection__rendered{color:#ccc}.colors-dark .select2-container--focus .select2-selection{border-color:#fff}@media screen and (min-width:48em){.has-sidebar.woocommerce-page:not(.error404) #primary{width:74%}.has-sidebar.woocommerce-page:not(.error404) #secondary{width:20%}body.page-two-column.woocommerce-account:not(.archive) #primary .entry-header,body.page-two-column.woocommerce-cart:not(.archive) #primary .entry-header,body.page-two-column.woocommerce-checkout:not(.archive) #primary .entry-header{width:16%}body.page-two-column.woocommerce-account:not(.archive) #primary .entry-content,body.page-two-column.woocommerce-cart:not(.archive) #primary .entry-content,body.page-two-column.woocommerce-checkout:not(.archive) #primary .entry-content{width:78%}} \ No newline at end of file +@charset "UTF-8";@-webkit-keyframes spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}.woocommerce .blockUI.blockOverlay{position:relative}.woocommerce .blockUI.blockOverlay::before{height:1em;width:1em;display:block;position:absolute;top:50%;left:50%;margin-left:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.woocommerce .loader::before{height:1em;width:1em;display:block;position:absolute;top:50%;left:50%;margin-left:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.woocommerce form .form-row .required{color:#b22222;text-decoration:none;visibility:hidden}.woocommerce form .form-row .required[title]{border:0!important}.woocommerce form .form-row .optional{visibility:visible}.woocommerce-breadcrumb{padding-bottom:2em;margin-bottom:4em;border-bottom:1px solid #eee;font-size:13px;font-size:.8125rem}.woocommerce-breadcrumb a{-webkit-box-shadow:0 1px 0 #0f0f0f;box-shadow:0 1px 0 #0f0f0f;-webkit-transition:-webkit-box-shadow ease-in-out 130ms;transition:-webkit-box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms,-webkit-box-shadow ease-in-out 130ms}.woocommerce-breadcrumb a:hover{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.woocommerce-pagination{padding-top:2em;margin-top:4em;border-top:1px solid #eee;font-size:13px;font-size:.8125rem}.woocommerce-pagination ul.page-numbers{padding:0;display:block}.woocommerce-pagination .next.page-numbers,.woocommerce-pagination .prev.page-numbers,.woocommerce-pagination a.page-numbers,.woocommerce-pagination span.page-numbers{padding:.5em 1em;background:#ddd;display:inline-block;font-size:1em;float:none;line-height:1.5;border-radius:2px;-webkit-transition:background-color ease-in-out .3s;transition:background-color ease-in-out .3s}.woocommerce-pagination span.page-numbers{background-color:#fff}.woocommerce-pagination a.page-numbers:hover{background-color:#767676;color:#fff}.onsale{background-color:#fff;position:absolute;top:0;left:0;display:inline-block;padding:.5em 1em;font-size:13px;font-size:.8125rem;text-transform:uppercase;font-weight:800}.price del{opacity:.5;display:inline-block}.price ins{display:inline-block}.woocommerce-error,.woocommerce-info,.woocommerce-message{margin-bottom:1.5em;padding:2em;background:#eee}.woocommerce-message{background:teal;color:#fff}.woocommerce-error{background:#b22222;color:#fff}.woocommerce-info{background:#4169e1;color:#fff}.woocommerce-error a,.woocommerce-info a,.woocommerce-message a{color:#fff;-webkit-box-shadow:0 1px 0 #fff!important;box-shadow:0 1px 0 #fff!important;-webkit-transition:-webkit-box-shadow ease-in-out 130ms;transition:-webkit-box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms,-webkit-box-shadow ease-in-out 130ms}.woocommerce-error a:hover,.woocommerce-info a:hover,.woocommerce-message a:hover{color:#fff!important;-webkit-box-shadow:0 3px 0 #fff!important;box-shadow:0 3px 0 #fff!important}.woocommerce-store-notice{background:#4169e1;color:#fff;padding:1em;position:absolute;top:0;left:0;width:100%;z-index:999}.admin-bar .woocommerce-store-notice{top:32px}.woocommerce-store-notice__dismiss-link{float:right;color:#fff}.woocommerce-store-notice__dismiss-link:hover{text-decoration:underline;color:#fff}.woocommerce-result-count{padding:.75em 0}ul.products li.product{list-style:none}ul.products li.product .price,ul.products li.product .star-rating{display:block;margin-bottom:.75em}ul.products li.product .woocommerce-placeholder{border:1px solid #f2f2f2}ul.products li.product .button{-webkit-box-shadow:0 1px 0 #0f0f0f;box-shadow:0 1px 0 #0f0f0f;-webkit-transition:-webkit-box-shadow ease-in-out 130ms;transition:-webkit-box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms,-webkit-box-shadow ease-in-out 130ms}ul.products li.product .button:hover{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}ul.products li.product .button.loading{opacity:.5}ul.products li.product .added_to_cart{-webkit-box-shadow:0 1px 0 #0f0f0f;box-shadow:0 1px 0 #0f0f0f;-webkit-transition:-webkit-box-shadow ease-in-out 130ms;transition:-webkit-box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms,-webkit-box-shadow ease-in-out 130ms;margin-left:.5em}ul.products li.product .added_to_cart:hover{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.star-rating{overflow:hidden;position:relative;height:1em;line-height:1;font-size:1em;width:5.4em;font-family:star}.star-rating::before{content:'\73\73\73\73\73';float:left;top:0;left:0;position:absolute}.star-rating span{overflow:hidden;float:left;top:0;left:0;position:absolute;padding-top:1.5em}.star-rating span::before{content:'\53\53\53\53\53';top:0;position:absolute;left:0}.woocommerce-loop-product__title{font-size:13px;font-size:.8125rem;text-transform:uppercase;font-weight:800;letter-spacing:.15em}a.remove{display:inline-block;width:16px;height:16px;line-height:16px;font-size:16px;text-align:center;border-radius:100%;-webkit-box-shadow:none!important;box-shadow:none!important;border:1px solid #000}a.remove:hover{background:#000;color:#fff!important}.wc-item-meta,dl.variation{list-style:none outside}.wc-item-meta .wc-item-meta-label,.wc-item-meta dt,dl.variation .wc-item-meta-label,dl.variation dt{float:left;clear:both;margin-right:.25em;display:inline-block;list-style:none outside}.wc-item-meta dd,dl.variation dd{margin:0}.wc-item-meta p,.wc-item-meta:last-child,dl.variation p,dl.variation:last-child{margin-bottom:0}.single-product div.product{position:relative}.single-product .single-featured-image-header{display:none}.single-product .summary{margin-bottom:3em}.single-product .summary p.price{margin-bottom:2em}.single-product .woocommerce-product-rating{margin-bottom:2em;line-height:1}.single-product .woocommerce-product-rating .star-rating{float:left;margin-right:.25em}.single-product form.cart .quantity{float:left;margin-right:.5em}.single-product form.cart input{width:5em}.single-product .woocommerce-variation-add-to-cart .button{padding-top:.72em;padding-bottom:.72em}.single-product .woocommerce-variation-add-to-cart .button.disabled{opacity:.2}table.variations label{margin:0}table.variations select{margin-right:.5em}.woocommerce-product-gallery{position:relative;margin-bottom:3em}.woocommerce-product-gallery figure{margin:0;padding:0}.woocommerce-product-gallery .woocommerce-product-gallery__wrapper{margin:0;padding:0}.woocommerce-product-gallery .zoomImg{background-color:#fff;opacity:0}.woocommerce-product-gallery .woocommerce-product-gallery__image--placeholder{border:1px solid #f2f2f2}.woocommerce-product-gallery .woocommerce-product-gallery__image:nth-child(n+2){width:25%;display:inline-block}.woocommerce-product-gallery .flex-control-thumbs li{list-style:none;cursor:pointer;float:left}.woocommerce-product-gallery .flex-control-thumbs img{opacity:.5}.woocommerce-product-gallery .flex-control-thumbs img.flex-active,.woocommerce-product-gallery .flex-control-thumbs img:hover{opacity:1}.woocommerce-product-gallery img{display:block;height:auto}.woocommerce-product-gallery--columns-3 .flex-control-thumbs li{width:33.3333%}.woocommerce-product-gallery--columns-3 .flex-control-thumbs li:nth-child(3n+1){clear:left}.woocommerce-product-gallery--columns-4 .flex-control-thumbs li{width:25%}.woocommerce-product-gallery--columns-4 .flex-control-thumbs li:nth-child(4n+1){clear:left}.woocommerce-product-gallery--columns-5 .flex-control-thumbs li{width:20%}.woocommerce-product-gallery--columns-5 .flex-control-thumbs li:nth-child(5n+1){clear:left}.woocommerce-product-gallery__trigger{position:absolute;top:1em;right:1em;z-index:99}.woocommerce-tabs{margin-bottom:2em}.woocommerce-tabs li{margin-right:1em}.woocommerce-tabs li.active a{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.woocommerce-tabs a{-webkit-box-shadow:0 1px 0 #0f0f0f;box-shadow:0 1px 0 #0f0f0f;-webkit-transition:-webkit-box-shadow ease-in-out 130ms;transition:-webkit-box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms,-webkit-box-shadow ease-in-out 130ms}.woocommerce-tabs a:hover{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.woocommerce-tabs #comments{padding-top:0}.woocommerce-tabs .comment-reply-title{font-size:22px;font-size:1.375rem;font-weight:300;line-height:1.4;margin:0 0 .75em;display:block}.woocommerce-tabs #reviews li.comment,.woocommerce-tabs #reviews li.review{list-style:none;margin-right:0;margin-bottom:2.5em}.woocommerce-tabs #reviews li.comment .avatar,.woocommerce-tabs #reviews li.review .avatar{max-height:36px;width:auto;float:right}.woocommerce-tabs #reviews li.comment p.meta,.woocommerce-tabs #reviews li.review p.meta{margin-bottom:.5em}.woocommerce-tabs #reviews p.stars a{position:relative;height:1em;width:1em;text-indent:-999em;display:inline-block;text-decoration:none;-webkit-box-shadow:none;box-shadow:none}.woocommerce-tabs #reviews p.stars a::before{display:block;position:absolute;top:0;left:0;width:1em;height:1em;line-height:1;font-family:WooCommerce;content:'\e021';text-indent:0}.woocommerce-tabs #reviews p.stars a:hover~a::before{content:'\e021'}.woocommerce-tabs #reviews p.stars:hover a::before{content:'\e020'}.woocommerce-tabs #reviews p.stars.selected a.active::before{content:'\e020'}.woocommerce-tabs #reviews p.stars.selected a.active~a::before{content:'\e021'}.woocommerce-tabs #reviews p.stars.selected a:not(.active)::before{content:'\e020'}.site-footer .widget .product_list_widget,.widget .product_list_widget{margin-bottom:1.5em}.site-footer .widget .product_list_widget a,.widget .product_list_widget a{display:block;-webkit-box-shadow:none;box-shadow:none}.site-footer .widget .product_list_widget a:hover,.widget .product_list_widget a:hover{-webkit-box-shadow:none;box-shadow:none}.site-footer .widget .product_list_widget li,.widget .product_list_widget li{padding:1.5em 0}.site-footer .widget .product_list_widget li a.remove,.widget .product_list_widget li a.remove{float:right;margin-top:2px}.site-footer .widget .product_list_widget img,.widget .product_list_widget img{display:none}.widget_shopping_cart .buttons a{display:inline-block;margin:0 .5em 0 0}.widget_layered_nav .chosen:before{content:"×";display:inline-block;width:16px;height:16px;line-height:16px;font-size:16px;text-align:center;border-radius:100%;border:1px solid #000;margin-right:.25em}.widget_price_filter .price_slider{margin-bottom:1em}.widget_price_filter .price_slider_amount{text-align:right;line-height:2.4;font-size:.8751em}.widget_price_filter .price_slider_amount .button{float:left;padding:.4em 1em}.widget_price_filter .ui-slider{position:relative;text-align:left;margin-left:.5em;margin-right:.5em}.widget_price_filter .ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1em;height:1em;background-color:#000;border-radius:1em;cursor:ew-resize;outline:0;top:-.3em;margin-left:-.5em}.widget_price_filter .ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;border-radius:1em;background-color:#000}.widget_price_filter .price_slider_wrapper .ui-widget-content{border-radius:1em;background-color:#666;border:0}.widget_price_filter .ui-slider-horizontal{height:.5em}.widget_price_filter .ui-slider-horizontal .ui-slider-range{top:0;height:100%}.widget_price_filter .ui-slider-horizontal .ui-slider-range-min{left:-1px}.widget_price_filter .ui-slider-horizontal .ui-slider-range-max{right:-1px}.widget_rating_filter li{text-align:right}.widget_rating_filter li .star-rating{float:left;margin-top:.3em}.widget_product_search form{position:relative}.widget_product_search .search-field{padding-right:100px}.widget_product_search input[type=submit]{position:absolute;top:.5em;right:.5em;padding-left:1em;padding-right:1em}.woocommerce-account .woocommerce-MyAccount-navigation{float:right;width:25%;border-top:1px solid #ddd}.woocommerce-account .woocommerce-MyAccount-navigation li{list-style:none;padding:.5em 0;border-bottom:1px solid #ddd}.woocommerce-account .woocommerce-MyAccount-navigation li a{-webkit-box-shadow:none;box-shadow:none}.woocommerce-account .woocommerce-MyAccount-navigation li a:hover{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.woocommerce-account .woocommerce-MyAccount-navigation li:before{content:"→";display:inline-block;margin-right:.25em;color:#ddd}.woocommerce-account .woocommerce-MyAccount-navigation li.is-active a{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.woocommerce-account .woocommerce-MyAccount-content{float:left}.woocommerce-cart-form td{padding:1em .5em}.woocommerce-cart-form img{max-width:42px;height:auto;display:block}.woocommerce-cart-form dl.variation{margin-top:0}.woocommerce-cart-form dl.variation p,.woocommerce-cart-form dl.variation:last-child{margin-bottom:0}.woocommerce-cart-form .button{padding:1.2em 2em}.woocommerce-cart-form .actions .input-text{width:130px!important;float:left;margin-right:.25em}.woocommerce-cart-form .quantity input{width:4em}.cart_totals td,.cart_totals th{vertical-align:top;padding:1em 0;line-height:1.5em}.cart_totals th{padding-right:1em}.cart_totals .woocommerce-shipping-destination{margin-bottom:0}.shipping-calculator-button{margin-top:.5em;display:inline-block}.shipping-calculator-form{margin:1em 0 0 0}#shipping_method{list-style:none;margin:0}#shipping_method li{margin-bottom:.5em}#shipping_method li input{float:left;margin-top:.17em}#shipping_method li label{line-height:1.5em}.checkout-button{display:block;padding:1em 2em;border:2px solid #000;text-align:center;font-weight:800;-webkit-box-shadow:none!important;box-shadow:none!important}.checkout-button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;border-color:#999}.checkout-button:after{content:"→"}#ship-to-different-address label{font-weight:300;cursor:pointer}#ship-to-different-address label span{position:relative;display:block}#ship-to-different-address label span:before{content:"";display:block;height:16px;width:30px;border:2px solid #bbb;background:#bbb;border-radius:13em;-webkit-box-sizing:content-box;box-sizing:content-box;-webkit-transition:all ease-in-out .3s;transition:all ease-in-out .3s;position:absolute;top:4px;right:0}#ship-to-different-address label span:after{content:"";display:block;width:14px;height:14px;background:#fff;position:absolute;top:7px;right:17px;border-radius:13em;-webkit-transition:all ease-in-out .3s;transition:all ease-in-out .3s}#ship-to-different-address label input[type=checkbox]{display:none}#ship-to-different-address label input[type=checkbox]:checked+span:after{right:3px}#ship-to-different-address label input[type=checkbox]:checked+span:before{border-color:#000;background:#000}.woocommerce-no-js form.woocommerce-form-coupon,.woocommerce-no-js form.woocommerce-form-login{display:block!important}.woocommerce-no-js .showcoupon,.woocommerce-no-js .woocommerce-form-coupon-toggle,.woocommerce-no-js .woocommerce-form-login-toggle{display:none!important}.woocommerce-terms-and-conditions{border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background:rgba(0,0,0,.05)}.woocommerce-terms-and-conditions-link{display:inline-block}.woocommerce-terms-and-conditions-link:after{content:"";display:inline-block;border-style:solid;margin-bottom:2px;margin-left:.25em;border-width:6px 6px 0 6px;border-color:#111 transparent transparent transparent}.woocommerce-terms-and-conditions-link.woocommerce-terms-and-conditions-link--open:after{border-width:0 6px 6px 6px;border-color:transparent transparent #111 transparent}.woocommerce-checkout .woocommerce-input-wrapper .description{background:#4169e1;color:#fff;border-radius:3px;padding:1em;margin:.5em 0 0;clear:both;display:none;position:relative}.woocommerce-checkout .woocommerce-input-wrapper .description a{color:#fff;text-decoration:underline;border:0;-webkit-box-shadow:none;box-shadow:none}.woocommerce-checkout .woocommerce-input-wrapper .description:before{left:50%;top:0;margin-top:-4px;-webkit-transform:translatex(-50%) rotate(180deg);-ms-transform:translatex(-50%) rotate(180deg);transform:translatex(-50%) rotate(180deg);content:"";position:absolute;border-width:4px 6px 0 6px;border-style:solid;border-color:#4169e1 transparent transparent transparent;z-index:100;display:block}.woocommerce-checkout .select2-choice,.woocommerce-checkout .select2-choice:hover{-webkit-box-shadow:none!important;box-shadow:none!important}.woocommerce-checkout .select2-choice{padding:.7em 0 .7em .7em}.woocommerce-checkout .select2-container .select2-selection--single{height:48px}.woocommerce-checkout .select2-container .select2-selection--single .select2-selection__rendered{line-height:48px}.woocommerce-checkout .select2-container--default .select2-selection--single .select2-selection__arrow{height:46px}.woocommerce-checkout .select2-container--focus .select2-selection{border-color:#000}.woocommerce-checkout-review-order-table td{padding:1em .5em}.woocommerce-checkout-review-order-table dl.variation{margin:0}.woocommerce-checkout-review-order-table dl.variation p{margin:0}.wc_payment_method{list-style:none;border-bottom:1px solid #ddd}.wc_payment_method .payment_box{padding:2em;background:#eee}.wc_payment_method .payment_box ol:last-of-type,.wc_payment_method .payment_box ul:last-of-type{margin-bottom:0}.wc_payment_method .payment_box fieldset{padding:1.5em;padding-bottom:0;border:0;background:#f6f6f6}.wc_payment_method .payment_box li{list-style:none}.wc_payment_method .payment_box p:last-child{margin-bottom:0}.wc_payment_method>label:first-of-type{margin:1em 0}.wc_payment_method>label:first-of-type img{max-height:24px;max-width:200px;float:right}.wc_payment_method label{cursor:pointer}.wc_payment_method input.input-radio[name=payment_method]{display:none}.wc_payment_method input.input-radio[name=payment_method]+label:before{content:"";display:inline-block;width:16px;height:16px;border:2px solid #fff;-webkit-box-shadow:0 0 0 2px #000;box-shadow:0 0 0 2px #000;background:#fff;margin-left:4px;margin-right:.5em;border-radius:100%;-webkit-transform:translateY(2px);-ms-transform:translateY(2px);transform:translateY(2px)}.wc_payment_method input.input-radio[name=payment_method]:checked+label:before{background:#000}.colors-dark .page-numbers{color:#444}.colors-dark .page-numbers.next,.colors-dark .page-numbers.prev{color:#ddd}.colors-dark .checkout-button{border:2px solid #555}.colors-dark .checkout-button:hover{border-color:#fff}.colors-dark .wc_payment_method .payment_box{background:#333}.colors-dark .select2-container--default .select2-results .select2-results__options{background:#333}.colors-dark .select2-container--default .select2-results .select2-results__option[data-selected=true]{color:#333}.colors-dark .select2-container--default .select2-selection--single{background-color:#333;border:1px solid #555}.colors-dark .select2-container--default .select2-selection--single .select2-selection__rendered{color:#ccc}.colors-dark .select2-container--focus .select2-selection{border-color:#fff}@media screen and (min-width:48em){.has-sidebar.woocommerce-page:not(.error404) #primary{width:74%}.has-sidebar.woocommerce-page:not(.error404) #secondary{width:20%}body.page-two-column.woocommerce-account:not(.archive) #primary .entry-header,body.page-two-column.woocommerce-cart:not(.archive) #primary .entry-header,body.page-two-column.woocommerce-checkout:not(.archive) #primary .entry-header{width:16%}body.page-two-column.woocommerce-account:not(.archive) #primary .entry-content,body.page-two-column.woocommerce-cart:not(.archive) #primary .entry-content,body.page-two-column.woocommerce-checkout:not(.archive) #primary .entry-content{width:78%}} diff --git a/assets/css/twenty-seventeen.scss b/assets/css/twenty-seventeen.scss index f0d4c60807c..776db2d71cf 100644 --- a/assets/css/twenty-seventeen.scss +++ b/assets/css/twenty-seventeen.scss @@ -437,7 +437,6 @@ table.variations { img { display: block; - width: 100%; height: auto; } } From b39b419e5bb1c547f6f44bb343a0c9b59e010eb5 Mon Sep 17 00:00:00 2001 From: Rodrigo Primo Date: Mon, 16 Jul 2018 14:24:42 -0300 Subject: [PATCH 126/984] Pass an instance of the background updater to the db update callbacks This commit changes the way that WC_Background_Updater::task() calls the database update callbacks and adds the WC_Background_Updater instance as the first parameter to the callbacks. This is used in wc_update_350_order_customer_id() (https://github.com/woocommerce/woocommerce/blob/36b6bd79c0d61035e979b017a23b6c0c79accaba/includes/wc-update-functions.php#L1870) to monitor memory usage while the function is running. This change was intended to ship with PR #17895 (see commit https://github.com/woocommerce/woocommerce/pull/17895/commits/c77b2f20f443647fd09c0de9705d2dbc214548c3) but was accidentaly removed when merging commit 083c9947328df00c0af65cfdf300e31ea74aa337 from another PR. Fixes #20718 --- includes/class-wc-background-updater.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/class-wc-background-updater.php b/includes/class-wc-background-updater.php index 1c28f7f26da..86047094805 100644 --- a/includes/class-wc-background-updater.php +++ b/includes/class-wc-background-updater.php @@ -106,7 +106,7 @@ class WC_Background_Updater extends WC_Background_Process { if ( is_callable( $callback ) ) { $logger->info( sprintf( 'Running %s callback', $callback ), array( 'source' => 'wc_db_updates' ) ); - $result = (bool) call_user_func( $callback ); + $result = (bool) call_user_func( $callback, $this ); if ( $result ) { $logger->info( sprintf( '%s callback needs to run again', $callback ), array( 'source' => 'wc_db_updates' ) ); From 0cf070ed5ec9a76c3ac64f3ced668cfe141bc428 Mon Sep 17 00:00:00 2001 From: ldybecklee Date: Tue, 17 Jul 2018 12:09:34 +0800 Subject: [PATCH 127/984] fix method 'get_column_value_stock' --- includes/export/class-wc-product-csv-exporter.php | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/includes/export/class-wc-product-csv-exporter.php b/includes/export/class-wc-product-csv-exporter.php index ce0eb8e4e2c..b773268dd6f 100644 --- a/includes/export/class-wc-product-csv-exporter.php +++ b/includes/export/class-wc-product-csv-exporter.php @@ -399,17 +399,13 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter { $manage_stock = $product->get_manage_stock( 'edit' ); $stock_quantity = $product->get_stock_quantity( 'edit' ); - if ( $manage_stock ) { + if ( $product->is_type( 'variation') && 'parent' === $manage_stock ) { + return 'parent'; + } elseif ( $manage_stock ) { return $stock_quantity; - } else if ( $product->is_type( 'variation' ) ) { - if ( $product->get_parent_id( 'edit' ) ) { - $parent = wc_get_product( $product->get_parent_id( 'edit' ) ); - if( $parent->get_manage_stock( 'edit' ) ) { - return 'parent'; - } - } + } else { + return ''; } - return ''; } /** From a7de4672dcedebfad3cc69fb61f53a2f1be4c9a7 Mon Sep 17 00:00:00 2001 From: ldybecklee Date: Tue, 17 Jul 2018 12:10:55 +0800 Subject: [PATCH 128/984] Update class-wc-product-csv-exporter.php --- includes/export/class-wc-product-csv-exporter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/export/class-wc-product-csv-exporter.php b/includes/export/class-wc-product-csv-exporter.php index b773268dd6f..46cd14616f5 100644 --- a/includes/export/class-wc-product-csv-exporter.php +++ b/includes/export/class-wc-product-csv-exporter.php @@ -399,7 +399,7 @@ class WC_Product_CSV_Exporter extends WC_CSV_Batch_Exporter { $manage_stock = $product->get_manage_stock( 'edit' ); $stock_quantity = $product->get_stock_quantity( 'edit' ); - if ( $product->is_type( 'variation') && 'parent' === $manage_stock ) { + if ( $product->is_type( 'variation' ) && 'parent' === $manage_stock ) { return 'parent'; } elseif ( $manage_stock ) { return $stock_quantity; From 416f4b64ee7e8227ff23c396c97b8395a8e8734e Mon Sep 17 00:00:00 2001 From: Khan M Rashedun-Naby Date: Wed, 18 Jul 2018 01:37:08 +0600 Subject: [PATCH 129/984] HashTable Implemented --- includes/class-wc-checkout.php | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/includes/class-wc-checkout.php b/includes/class-wc-checkout.php index 64236abd826..a7f3049eed3 100644 --- a/includes/class-wc-checkout.php +++ b/includes/class-wc-checkout.php @@ -309,15 +309,23 @@ class WC_Checkout { $order = new WC_Order(); } + $fields_prefix = array( + 'shipping' => true, + 'billing' => true, + ); + $shipping_fields = array( + 'shipping_method' => true, + 'shipping_total' => true, + 'shipping_tax' => true, + ); foreach ( $data as $key => $value ) { if ( is_callable( array( $order, "set_{$key}" ) ) ) { $order->{"set_{$key}"}( $value ); - // Store custom fields prefixed with wither shipping_ or billing_. This is for backwards compatibility with 2.6.x. - // TODO: Fix conditional to only include shipping/billing address fields in a smarter way without str(i)pos. - } elseif ( ( 0 === stripos( $key, 'billing_' ) || 0 === stripos( $key, 'shipping_' ) ) - && ! in_array( $key, array( 'shipping_method', 'shipping_total', 'shipping_tax' ), true ) ) { - $order->update_meta_data( '_' . $key, $value ); + } elseif ( isset( $fields_prefix[ current( explode( '_', $key ) ) ] ) ) { + if ( ! isset( $shipping_fields[ $key ] ) ) { + $order->update_meta_data( '_' . $key, $value ); + } } } From 5c04cca91c746b9575383109278d7192c071379c Mon Sep 17 00:00:00 2001 From: Rodrigo Primo Date: Wed, 18 Jul 2018 17:10:29 -0300 Subject: [PATCH 130/984] Add jdgrimes/wp-http-testcase composer package This commit adds jdgrimes/wp-http-testcase (https://github.com/JDGrimes/wp-http-testcase) composer package as a dev requirement. This package provides a PHPUnit testcase for testing code that uses the WP_Http class. Using it it is possible to create artificial HTTP responses skipping the request to external servers and making the tests faster. --- composer.json | 3 ++- composer.lock | 43 +++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 23e5159c991..d1b83c04b62 100644 --- a/composer.json +++ b/composer.json @@ -18,7 +18,8 @@ "wimg/php-compatibility": "^8.0", "dealerdirect/phpcodesniffer-composer-installer": "^0.4.3", "apigen/apigen": "^4", - "nette/utils": "~2.3.0" + "nette/utils": "~2.3.0", + "jdgrimes/wp-http-testcase": "^1.3" }, "scripts": { "pre-update-cmd": [ diff --git a/composer.lock b/composer.lock index 2d64b50fd37..46961b99efc 100644 --- a/composer.lock +++ b/composer.lock @@ -1,10 +1,10 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "bc2c57d2be29888a0e4c3a09ec26cbe3", + "content-hash": "66fee52eadec5af9fd87cafffa7360ea", "packages": [ { "name": "composer/installers", @@ -644,6 +644,45 @@ "abandoned": true, "time": "2014-05-27T05:29:25+00:00" }, + { + "name": "jdgrimes/wp-http-testcase", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/JDGrimes/wp-http-testcase.git", + "reference": "cbbea5fc813a146ad8fdf19ea564a597e5d0f8bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/JDGrimes/wp-http-testcase/zipball/cbbea5fc813a146ad8fdf19ea564a597e5d0f8bb", + "reference": "cbbea5fc813a146ad8fdf19ea564a597e5d0f8bb", + "shasum": "" + }, + "require": { + "php": ">=5.2.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "wp-http-testcase.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "J.D. Grimes", + "email": "jdg@codesymphony.co", + "homepage": "http://codesymphony.co", + "role": "Developer" + } + ], + "description": "PHPUnit testcase for WordPress code involving HTTP requests", + "homepage": "https://github.com/JDGrimes/wp-http-testcase", + "time": "2017-06-03T14:09:57+00:00" + }, { "name": "justinrainbow/json-schema", "version": "1.6.1", From 0e785d46146c04f05d4ed5bc06e9ea2d575553b0 Mon Sep 17 00:00:00 2001 From: Rodrigo Primo Date: Wed, 18 Jul 2018 17:13:08 -0300 Subject: [PATCH 131/984] Make WC_Tests_Product_CSV_Importer::test_import() faster This commit changes the WC_Tests_Product_CSV_Importer class to use artificial HTTP responses instead of performing real HTTP requests to a external server to get the images of the imported products. On my local machine, this change reduced the test execution time from 3257ms to 831ms. As a consequence of this change, this commit also fixes WC_Tests_Product_CSV_Importer::test_import() in all Travis builds. This test has been failing for a few weeks on Travis but not on our local environments. After some debugging, I found out that the test was failing on Travis because of the following error when `wp_safe_remote_get()` was called to get images for the imported products: ``` Error getting remote image http://demo.woothemes.com/woocommerce/wp-content/uploads/sites/56/2013/06/T_1_front.jpg. Error: cURL error 35: gnutls_handshake() failed: Handshake failed. ``` Apparently, the PHP binary that is used by Travis is unable to handle the TLS handshake (see https://github.com/travis-ci/travis-ci/issues/6339) and the test probably started failing when demo.woothemes.com (which is used to download the images for the imported products) switched from HTTP to HTTPS. --- tests/unit-tests/importer/product.php | 30 ++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/tests/unit-tests/importer/product.php b/tests/unit-tests/importer/product.php index 7f58757564f..0dec3beb69b 100644 --- a/tests/unit-tests/importer/product.php +++ b/tests/unit-tests/importer/product.php @@ -4,7 +4,7 @@ * Meta * @package WooCommerce\Tests\Importer */ -class WC_Tests_Product_CSV_Importer extends WC_Unit_Test_Case { +class WC_Tests_Product_CSV_Importer extends WP_HTTP_TestCase { /** * Test CSV file path. @@ -19,6 +19,9 @@ class WC_Tests_Product_CSV_Importer extends WC_Unit_Test_Case { public function setUp() { parent::setUp(); + // Callback used by WP_HTTP_TestCase to decide whether to perform HTTP requests or to provide a mocked response. + $this->http_responder = array( $this, 'mock_http_responses' ); + $this->csv_file = dirname( __FILE__ ) . '/sample.csv'; $bootstrap = WC_Unit_Tests_Bootstrap::instance(); @@ -586,4 +589,29 @@ class WC_Tests_Product_CSV_Importer extends WC_Unit_Test_Case { $this->assertEquals( $items, $parsed_data ); } + + /** + * Provides a mocked response for all images that are imported together with the products. + * This way it is not necessary to perform a regular request to an external server which would + * significantly slow down the tests. + * + * This function is called by WP_HTTP_TestCase::http_request_listner(). + * + * @param array $request Request arguments. + * @param string $url URL of the request. + * + * @return array|false mocked response or false to let WP perform a regular request. + */ + protected function mock_http_responses( $request, $url ) { + $mocked_response = false; + + if ( false !== strpos( $url, 'http://demo.woothemes.com' ) ) { + $mocked_response = array( + 'body' => 'Mocked response', + 'response' => array( 'code' => 200 ), + ); + } + + return $mocked_response; + } } From 34ec2e87c07c8655a544f6157f95a05f9b37319f Mon Sep 17 00:00:00 2001 From: Rodrigo Primo Date: Wed, 18 Jul 2018 18:06:25 -0300 Subject: [PATCH 132/984] Add wp-http-testcase directly to the repository This commit adds the composer package jdgrimes/wp-http-testcase directly to this repository instead of via composer. Doing this because I couldn't find a way to make this package work on Travis build jobs running older versions of PHP and I don't think it is worth investing much time on it. --- composer.json | 3 +- composer.lock | 43 +-- tests/bootstrap.php | 1 + tests/includes/wp-http-testcase.php | 440 ++++++++++++++++++++++++++++ 4 files changed, 444 insertions(+), 43 deletions(-) create mode 100644 tests/includes/wp-http-testcase.php diff --git a/composer.json b/composer.json index d1b83c04b62..23e5159c991 100644 --- a/composer.json +++ b/composer.json @@ -18,8 +18,7 @@ "wimg/php-compatibility": "^8.0", "dealerdirect/phpcodesniffer-composer-installer": "^0.4.3", "apigen/apigen": "^4", - "nette/utils": "~2.3.0", - "jdgrimes/wp-http-testcase": "^1.3" + "nette/utils": "~2.3.0" }, "scripts": { "pre-update-cmd": [ diff --git a/composer.lock b/composer.lock index 46961b99efc..2d64b50fd37 100644 --- a/composer.lock +++ b/composer.lock @@ -1,10 +1,10 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "66fee52eadec5af9fd87cafffa7360ea", + "content-hash": "bc2c57d2be29888a0e4c3a09ec26cbe3", "packages": [ { "name": "composer/installers", @@ -644,45 +644,6 @@ "abandoned": true, "time": "2014-05-27T05:29:25+00:00" }, - { - "name": "jdgrimes/wp-http-testcase", - "version": "1.3.1", - "source": { - "type": "git", - "url": "https://github.com/JDGrimes/wp-http-testcase.git", - "reference": "cbbea5fc813a146ad8fdf19ea564a597e5d0f8bb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/JDGrimes/wp-http-testcase/zipball/cbbea5fc813a146ad8fdf19ea564a597e5d0f8bb", - "reference": "cbbea5fc813a146ad8fdf19ea564a597e5d0f8bb", - "shasum": "" - }, - "require": { - "php": ">=5.2.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "wp-http-testcase.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "J.D. Grimes", - "email": "jdg@codesymphony.co", - "homepage": "http://codesymphony.co", - "role": "Developer" - } - ], - "description": "PHPUnit testcase for WordPress code involving HTTP requests", - "homepage": "https://github.com/JDGrimes/wp-http-testcase", - "time": "2017-06-03T14:09:57+00:00" - }, { "name": "justinrainbow/json-schema", "version": "1.6.1", diff --git a/tests/bootstrap.php b/tests/bootstrap.php index 44c40ef539b..b1d5cb8791c 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -113,6 +113,7 @@ class WC_Unit_Tests_Bootstrap { require_once $this->tests_dir . '/framework/class-wc-unit-test-case.php'; require_once $this->tests_dir . '/framework/class-wc-api-unit-test-case.php'; require_once $this->tests_dir . '/framework/class-wc-rest-unit-test-case.php'; + require_once $this->tests_dir . '/includes/wp-http-testcase.php'; // Helpers require_once $this->tests_dir . '/framework/helpers/class-wc-helper-product.php'; diff --git a/tests/includes/wp-http-testcase.php b/tests/includes/wp-http-testcase.php new file mode 100644 index 00000000000..b1d8a4d7c8d --- /dev/null +++ b/tests/includes/wp-http-testcase.php @@ -0,0 +1,440 @@ + 1, + 'headers' => 1, + 'cookies' => 1, + 'body' => 1, + ); + + /** + * The directory the cache files are in. + * + * @since 1.1.0 + * + * @var string + */ + protected static $cache_dir; + + /** + * The cache group to use. + * + * @since 1.1.0 + * + * @var string + */ + protected static $cache_group = 'default'; + + /** + * The currently loaded cache. + * + * @since 1.1.0 + * + * @var array + */ + protected static $cache; + + /** + * Whether the cache has changed. + * + * @since 1.1.0 + * + * @var bool + */ + protected static $cache_changed; + + /** + * Whether to skip just the next cache hit and put the request through. + * + * When true, the cache won't be checked for the next request, but the response + * will still overwrite the existing cache. + * + * @since 1.2.0 + * + * @var bool + */ + protected $skip_cache_next = false; + + /** + * @since 1.3.0 + */ + public static function setUpBeforeClass() { + + if ( ! self::$did_init ) { + self::init(); + } + + parent::setUpBeforeClass(); + } + + /** + * @since 1.3.1 + */ + public static function tearDownAfterClass() { + + self::save_cache(); + + parent::tearDownAfterClass(); + } + + /** + * Set up for each test. + * + * @since 1.0.0 + */ + public function setUp() { + + parent::setUp(); + + $this->http_requests = array(); + + if ( ! empty( self::$host ) ) { + $this->http_responder = array( $this, 'route_request' ); + } + + add_filter( 'pre_http_request', array( $this, 'http_request_listner' ), 10, 3 ); + } + + /** + * Clean up the filters after each test. + * + * @since 1.0.0 + */ + public function tearDown() { + + parent::tearDown(); + + remove_filter( 'pre_http_request', array( $this, 'http_request_listner' ) ); + + $this->skip_cache_next = false; + } + + // + // Helpers. + // + + /** + * Mock responses to HTTP requests coming from WordPress. + * + * @since 1.0.0 + * + * @WordPress\filter pre_http_request Added by self::setUp(). + * + * @param mixed $preempt Response to the request, or false to not preempt it. + * @param array $request The request arguments. + * @param string $url The URL the request is being made to. + * + * @return mixed A response, or false. + */ + public function http_request_listner( $preempt, $request, $url ) { + + $this->http_requests[] = array( + 'url' => $url, + 'request' => $request, + ); + + if ( $this->http_responder ) { + $preempt = call_user_func( $this->http_responder, $request, $url ); + } + + return $preempt; + } + + /** + * Route a request through to a predefined host, with optional caching. + * + * @since 1.1.0 + * + * @param array $request The request to route. + * @param string $url The URL the request is for. + * + * @return array|bool|false|WP_Error The response. + */ + protected function route_request( $request, $url ) { + + // Check the cache. + $cache_key = $this->get_cache_key( $request, $url ); + $cached = $this->get_cached_response( $cache_key ); + + if ( $cached ) { + return $cached; + } + + // Get the URL host. + $host = parse_url( $url, PHP_URL_HOST ); + + // If the host is already correct, return false so the request continues. + if ( $host === self::$host ) { + return false; + } + + $url = str_replace( $host, self::$host, $url ); + + $response = wp_remote_request( $url, $request ); + + $this->cache_response( $cache_key, $response ); + + return $response; + } + + /** + * Get the cache key for a request. + * + * @since 1.1.0 + * + * @param array $request The request. + * @param string $url The URL the request is for. + * + * @return string|false The cache key for the request. False if not caching. + */ + protected function get_cache_key( $request, $url ) { + + if ( ! self::$use_caching ) { + return false; + } + + $request = array_intersect_key( $request, self::$cache_request_fields ); + + return md5( serialize( $request ) . $url ); + } + + /** + * Get the cached response to a request. + * + * @since 1.1.0 + * + * @param string $cache_key The cache key for the request. + * + * @return array|false The cached response, or false if none. + */ + protected function get_cached_response( $cache_key ) { + + if ( ! self::$use_caching ) { + return false; + } + + // If we're to skip the cache this time, return false. + if ( $this->skip_cache_next ) { + $this->skip_cache_next = false; + return false; + } + + if ( ! isset( self::$cache[ $cache_key ] ) ) { + return false; + } + + return self::$cache[ $cache_key ]; + } + + /** + * Save a response to the cache. + * + * @since 1.1.0 + * + * @param string $cache_key The cache key for the request. + * @param array $response The response. + */ + protected function cache_response( $cache_key, $response ) { + + if ( ! self::$use_caching ) { + return; + } + + self::$cache[ $cache_key ] = $response; + self::$cache_changed = true; + } + + // + // Static Functions. + // + + /** + * Initialize the class. + * + * @since 1.1.0 + */ + public static function init() { + + self::load_env( 'HOST' ); + self::load_env( 'USE_CACHING', true ); + + self::load_cache(); + + self::$did_init = true; + } + + /** + * Get an environment setting. + * + * @since 1.1.0 + * + * @param string $var The name of the setting to get. + * @param mixed $default The default value for this setting. + * + * @return mixed|null|string + */ + protected static function get_env( $var, $default = null ) { + + $value = getenv( 'WP_HTTP_TC_' . $var ); + + if ( false !== $value ) { + return $value; + } + + if ( ! defined( 'WP_HTTP_TC_' . $var ) ) { + return $default; + } + + return constant( 'WP_HTTP_TC_' . $var ); + } + + /** + * Get an environment setting and assign it to the corresponding property. + * + * @since 1.2.0 + * + * @param string $var The var name. + * @param bool $is_bool Whether this is a boolean property. + */ + protected static function load_env( $var, $is_bool = false ) { + + $property = strtolower( $var ); + + self::$$property = self::get_env( $var, self::$$property ); + + if ( $is_bool ) { + self::$$property = (bool) self::$$property; + } + } + + /** + * Load the cache if caching is in use. + * + * @since 1.1.0 + */ + protected static function load_cache() { + + if ( ! self::$use_caching ) { + return; + } + + $request_fields = self::get_env( 'CACHE_REQUEST_FIELDS' ); + + if ( null !== $request_fields ) { + self::$cache_request_fields = array_flip( + array_map( 'trim', explode( ',', $request_fields ) ) + ); + } + + self::load_env( 'CACHE_GROUP' ); + + self::$cache_dir = self::get_env( 'CACHE_DIR', dirname( __FILE__ ) ); + + $cache_file = self::$cache_dir . '/' . self::$cache_group; + + if ( ! file_exists( $cache_file ) ) { + return; + } + + $cache = file_get_contents( $cache_file ); + + self::$cache = unserialize( $cache ); + } + + /** + * Save the cache. + * + * @since 1.1.0 + */ + public static function save_cache() { + + if ( ! self::$cache_changed ) { + return; + } + + // phpcs:ignore WordPress.VIP.FileSystemWritesDisallow.file_ops_file_put_contents + file_put_contents( + self::$cache_dir . '/' . self::$cache_group, serialize( self::$cache ) + ); + } +} + +if ( ! defined( 'WP_HTTP_TC_NO_BACKPAT' ) ) { + abstract class WP_HTTP_UnitTestCase extends WP_HTTP_TestCase {} +} + +// EOF From 25ab294d40d7e37dbca5504363f9fc194127f804 Mon Sep 17 00:00:00 2001 From: Khan M Rashedun-Naby Date: Thu, 19 Jul 2018 10:33:22 +0600 Subject: [PATCH 133/984] Unnecessay Spaces Removed --- includes/abstracts/abstract-wc-data.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/includes/abstracts/abstract-wc-data.php b/includes/abstracts/abstract-wc-data.php index 032b6ed9cdb..15911176f80 100644 --- a/includes/abstracts/abstract-wc-data.php +++ b/includes/abstracts/abstract-wc-data.php @@ -429,9 +429,7 @@ abstract class WC_Data { $array_key = $array_keys ? current( $array_keys ) : false; } else { // Find matches by key. - $matches = array(); - $ids_to_keys = wp_list_pluck( $this->meta_data, 'key', 'id' ); - + $matches = array(); foreach ( $this->meta_data as $meta_data_array_key => $meta ) { if ( $meta->key === $key ) { $matches[] = $meta_data_array_key; From c3993accd4287703c527107ee35ffb43b4a121e1 Mon Sep 17 00:00:00 2001 From: Gerhard Potgieter Date: Thu, 19 Jul 2018 09:06:11 +0200 Subject: [PATCH 134/984] Set SCRIPT_DEBUG to true for e2e tests since we never commit minified js during dev, only once we do a release do we minify scripts. --- tests/bin/install.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/bin/install.sh b/tests/bin/install.sh index e75436ef986..0dc2cff9d2b 100755 --- a/tests/bin/install.sh +++ b/tests/bin/install.sh @@ -175,6 +175,7 @@ install_e2e_site() { php wp-cli.phar core config --dbname=$DB_NAME --dbuser=$DB_USER --dbpass=$DB_PASS --dbhost=$DB_HOST --dbprefix=wp_ --extra-php < Date: Thu, 19 Jul 2018 11:36:44 +0200 Subject: [PATCH 135/984] Make sure $attr[0] is set before referencing it. --- includes/wc-product-functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/wc-product-functions.php b/includes/wc-product-functions.php index 7c4ff7d4188..8c7943617f3 100644 --- a/includes/wc-product-functions.php +++ b/includes/wc-product-functions.php @@ -455,7 +455,7 @@ add_action( 'woocommerce_scheduled_sales', 'wc_scheduled_sales' ); * @return array */ function wc_get_attachment_image_attributes( $attr ) { - if ( strstr( $attr['src'][0], 'woocommerce_uploads/' ) ) { + if ( isset( $attr[0] ) && strstr( $attr['src'][0], 'woocommerce_uploads/' ) ) { $attr['src'][0] = wc_placeholder_img_src(); } return $attr; From 24112140915ee8765babdb3b25aec4ea464ca57e Mon Sep 17 00:00:00 2001 From: Gerhard Potgieter Date: Thu, 19 Jul 2018 11:38:37 +0200 Subject: [PATCH 136/984] Forgot src --- includes/wc-product-functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/wc-product-functions.php b/includes/wc-product-functions.php index 8c7943617f3..6ee5695f72f 100644 --- a/includes/wc-product-functions.php +++ b/includes/wc-product-functions.php @@ -455,7 +455,7 @@ add_action( 'woocommerce_scheduled_sales', 'wc_scheduled_sales' ); * @return array */ function wc_get_attachment_image_attributes( $attr ) { - if ( isset( $attr[0] ) && strstr( $attr['src'][0], 'woocommerce_uploads/' ) ) { + if ( isset( $attr['src'][0] ) && strstr( $attr['src'][0], 'woocommerce_uploads/' ) ) { $attr['src'][0] = wc_placeholder_img_src(); } return $attr; From 95a99a93b7cde06dca12f5c228912b5c5bc30726 Mon Sep 17 00:00:00 2001 From: Gerhard Potgieter Date: Thu, 19 Jul 2018 11:53:28 +0200 Subject: [PATCH 137/984] Just use src as there is no first index on src, it just returns the first char of the string which defeats the purpose of the check. --- includes/wc-product-functions.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/includes/wc-product-functions.php b/includes/wc-product-functions.php index 6ee5695f72f..ed69066bbf7 100644 --- a/includes/wc-product-functions.php +++ b/includes/wc-product-functions.php @@ -455,8 +455,8 @@ add_action( 'woocommerce_scheduled_sales', 'wc_scheduled_sales' ); * @return array */ function wc_get_attachment_image_attributes( $attr ) { - if ( isset( $attr['src'][0] ) && strstr( $attr['src'][0], 'woocommerce_uploads/' ) ) { - $attr['src'][0] = wc_placeholder_img_src(); + if ( isset( $attr['src'] ) && strstr( $attr['src'], 'woocommerce_uploads/' ) ) { + $attr['src'] = wc_placeholder_img_src(); } return $attr; } From 847d5b680d6907a9c6fe830f7cbf21c4614e3a98 Mon Sep 17 00:00:00 2001 From: Gerhard Potgieter Date: Thu, 19 Jul 2018 12:04:36 +0200 Subject: [PATCH 138/984] Add unit test for test_wc_get_attachment_image_attributes --- tests/unit-tests/product/functions.php | 45 ++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) diff --git a/tests/unit-tests/product/functions.php b/tests/unit-tests/product/functions.php index f7a8331f3aa..7e20800c117 100644 --- a/tests/unit-tests/product/functions.php +++ b/tests/unit-tests/product/functions.php @@ -897,8 +897,8 @@ class WC_Tests_Product_Functions extends WC_Unit_Test_Case { } /** - * @expectedException WC_Data_Exception - */ + * @expectedException WC_Data_Exception + */ public function test_wc_product_has_unique_sku() { $product_1 = WC_Helper_Product::create_simple_product(); @@ -987,4 +987,45 @@ class WC_Tests_Product_Functions extends WC_Unit_Test_Case { $this->assertFalse( wc_is_attribute_in_product_name( 'L', 'Product L Thing' ) ); $this->assertFalse( wc_is_attribute_in_product_name( 'Blue', 'Product – Large, Blueish' ) ); } + + public function test_wc_get_attachment_image_attributes() { + $image_attr = array( + 'src' => 'https://wc.local/wp-content/uploads/2018/02/single-1-250x250.jpg', + 'class' => 'attachment-woocommerce_thumbnail size-woocommerce_thumbnail', + 'alt' => '', + 'srcset' => 'https://wc.local/wp-content/uploads/2018/02/single-1-250x250.jpg 250w, https://wc.local/wp-content/uploads/2018/02/single-1-350x350.jpg 350w, https://wc.local/wp-content/uploads/2018/02/single-1-150x150.jpg 150w, https://wc.local/wp-content/uploads/2018/02/single-1-300x300.jpg 300w, https://wc.local/wp-content/uploads/2018/02/single-1-768x768.jpg 768w, https://wc.local/wp-content/uploads/2018/02/single-1-100x100.jpg 100w, https://wc.local/wp-content/uploads/2018/02/single-1.jpg 800w', + 'sizes' => '(max-width: 250px) 100vw, 250px', + ); + // Test regular image attr + $this->assertEquals( $image_attr, wc_get_attachment_image_attributes( $image_attr ) ); + + $image_attr = array( + 'src' => '', + 'class' => 'attachment-woocommerce_thumbnail size-woocommerce_thumbnail', + 'alt' => '', + 'srcset' => '', + 'sizes' => '(max-width: 250px) 100vw, 250px', + ); + // Test blank src image attr, this is used in lazy loading. + $this->assertEquals( $image_attr, wc_get_attachment_image_attributes( $image_attr ) ); + + $image_attr = array( + 'src' => 'https://wc.local/wp-content/woocommerce_uploads/my-image.jpg', + 'class' => 'attachment-woocommerce_thumbnail size-woocommerce_thumbnail', + 'alt' => '', + 'srcset' => '', + 'sizes' => '(max-width: 250px) 100vw, 250px', + ); + $expected_attr = array( + 'src' => WC()->plugin_url() . '/assets/images/placeholder.png', + 'class' => 'attachment-woocommerce_thumbnail size-woocommerce_thumbnail', + 'alt' => '', + 'srcset' => '', + 'sizes' => '(max-width: 250px) 100vw, 250px', + ); + // Test image hosted in woocommerce_uploads which is not allowed, think shops selling photos. + $this->assertEquals( $expected_attr, wc_get_attachment_image_attributes( $image_attr ) ); + + unset( $image_attr, $expected_attr ); + } } From 3065eec51553d4582da54a66080f7eb157603779 Mon Sep 17 00:00:00 2001 From: Gerhard Potgieter Date: Thu, 19 Jul 2018 12:26:45 +0200 Subject: [PATCH 139/984] Add a margin to the bestseller widget product title to avoid it overlapping the sparkline when the title is long. --- assets/css/activation-rtl.css | 2 +- assets/css/activation.css | 2 +- assets/css/admin-rtl.css | 4 ++-- assets/css/admin.css | 4 ++-- assets/css/auth-rtl.css | 2 +- assets/css/auth.css | 2 +- assets/css/dashboard-rtl.css | 2 +- assets/css/dashboard.css | 2 +- assets/css/dashboard.scss | 8 ++++++++ assets/css/helper-rtl.css | 2 +- assets/css/helper.css | 2 +- assets/css/menu-rtl.css | 2 +- assets/css/menu.css | 2 +- assets/css/network-order-widget-rtl.css | 2 +- assets/css/network-order-widget.css | 2 +- assets/css/prettyPhoto-rtl.css | 2 +- assets/css/prettyPhoto.css | 2 +- assets/css/reports-print-rtl.css | 2 +- assets/css/reports-print.css | 2 +- assets/css/select2.css | 2 +- assets/css/twenty-seventeen-rtl.css | 2 +- assets/css/twenty-seventeen.css | 2 +- assets/css/wc-setup-rtl.css | 2 +- assets/css/wc-setup.css | 2 +- assets/css/woocommerce-layout-rtl.css | 2 +- assets/css/woocommerce-layout.css | 2 +- assets/css/woocommerce-rtl.css | 2 +- assets/css/woocommerce-smallscreen-rtl.css | 2 +- assets/css/woocommerce-smallscreen.css | 2 +- assets/css/woocommerce.css | 2 +- 30 files changed, 39 insertions(+), 31 deletions(-) diff --git a/assets/css/activation-rtl.css b/assets/css/activation-rtl.css index 38e8e12040c..2c7ce47ebf5 100644 --- a/assets/css/activation-rtl.css +++ b/assets/css/activation-rtl.css @@ -1 +1 @@ -div.woocommerce-message{overflow:hidden;position:relative;border-right-color:#cc99c2!important}div.woocommerce-message p{max-width:700px}div.woocommerce-message p:last-child{max-width:inherit}.woocommerce-message .button-primary,p.woocommerce-actions .button-primary{background:#bb77ae;border-color:#a36597;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;color:#fff;text-shadow:0 -1px 1px #a36597,-1px 0 1px #a36597,0 1px 1px #a36597,1px 0 1px #a36597}.woocommerce-message .button-primary:active,.woocommerce-message .button-primary:focus,.woocommerce-message .button-primary:hover,p.woocommerce-actions .button-primary:active,p.woocommerce-actions .button-primary:focus,p.woocommerce-actions .button-primary:hover{background:#a36597;border-color:#a36597;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.woocommerce-message a.woocommerce-message-close,p.woocommerce-actions a.woocommerce-message-close{position:static;float:left;top:0;left:0;padding:0 28px 10px 15px;margin-top:-10px;font-size:13px;line-height:1.23076923;text-decoration:none}.woocommerce-message a.woocommerce-message-close::before,p.woocommerce-actions a.woocommerce-message-close::before{position:relative;top:18px;right:-20px;-webkit-transition:all .1s ease-in-out;transition:all .1s ease-in-out}.woocommerce-message .button-primary,.woocommerce-message .button-secondary,p.woocommerce-actions .button-primary,p.woocommerce-actions .button-secondary{text-decoration:none!important}.woocommerce-message .twitter-share-button,p.woocommerce-actions .twitter-share-button{margin-top:-3px;margin-right:3px;vertical-align:middle}.woocommerce-about-text,p.woocommerce-actions{margin-bottom:1em!important}div.woocommerce-legacy-shipping-notice,div.woocommerce-no-shipping-methods-notice{overflow:hidden;padding:1px 12px}div.woocommerce-legacy-shipping-notice p,div.woocommerce-no-shipping-methods-notice p{position:relative;z-index:1;max-width:700px;line-height:1.5em;margin:12px 0}div.woocommerce-legacy-shipping-notice p.main,div.woocommerce-no-shipping-methods-notice p.main{font-size:1.1em}div.woocommerce-legacy-shipping-notice::before,div.woocommerce-no-shipping-methods-notice::before{content:'\e01b';font-family:WooCommerce;text-align:center;line-height:1;color:#f7f1f6;display:block;width:1em;font-size:20em;top:36px;left:12px;position:absolute} \ No newline at end of file +div.woocommerce-message{overflow:hidden;position:relative;border-right-color:#cc99c2!important}div.woocommerce-message p{max-width:700px}div.woocommerce-message p:last-child{max-width:inherit}.woocommerce-message .button-primary,p.woocommerce-actions .button-primary{background:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;color:#fff;text-shadow:0 -1px 1px #a36597,-1px 0 1px #a36597,0 1px 1px #a36597,1px 0 1px #a36597}.woocommerce-message .button-primary:active,.woocommerce-message .button-primary:focus,.woocommerce-message .button-primary:hover,p.woocommerce-actions .button-primary:active,p.woocommerce-actions .button-primary:focus,p.woocommerce-actions .button-primary:hover{background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.woocommerce-message a.woocommerce-message-close,p.woocommerce-actions a.woocommerce-message-close{position:static;float:left;top:0;left:0;padding:0 28px 10px 15px;margin-top:-10px;font-size:13px;line-height:1.23076923;text-decoration:none}.woocommerce-message a.woocommerce-message-close::before,p.woocommerce-actions a.woocommerce-message-close::before{position:relative;top:18px;right:-20px;-webkit-transition:all .1s ease-in-out;transition:all .1s ease-in-out}.woocommerce-message .button-primary,.woocommerce-message .button-secondary,p.woocommerce-actions .button-primary,p.woocommerce-actions .button-secondary{text-decoration:none!important}.woocommerce-message .twitter-share-button,p.woocommerce-actions .twitter-share-button{margin-top:-3px;margin-right:3px;vertical-align:middle}.woocommerce-about-text,p.woocommerce-actions{margin-bottom:1em!important}div.woocommerce-legacy-shipping-notice,div.woocommerce-no-shipping-methods-notice{overflow:hidden;padding:1px 12px}div.woocommerce-legacy-shipping-notice p,div.woocommerce-no-shipping-methods-notice p{position:relative;z-index:1;max-width:700px;line-height:1.5em;margin:12px 0}div.woocommerce-legacy-shipping-notice p.main,div.woocommerce-no-shipping-methods-notice p.main{font-size:1.1em}div.woocommerce-legacy-shipping-notice::before,div.woocommerce-no-shipping-methods-notice::before{content:'\e01b';font-family:WooCommerce;text-align:center;line-height:1;color:#f7f1f6;display:block;width:1em;font-size:20em;top:36px;left:12px;position:absolute} \ No newline at end of file diff --git a/assets/css/activation.css b/assets/css/activation.css index de0d9870ab2..3efe75e5c6f 100644 --- a/assets/css/activation.css +++ b/assets/css/activation.css @@ -1 +1 @@ -div.woocommerce-message{overflow:hidden;position:relative;border-left-color:#cc99c2!important}div.woocommerce-message p{max-width:700px}div.woocommerce-message p:last-child{max-width:inherit}.woocommerce-message .button-primary,p.woocommerce-actions .button-primary{background:#bb77ae;border-color:#a36597;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;color:#fff;text-shadow:0 -1px 1px #a36597,1px 0 1px #a36597,0 1px 1px #a36597,-1px 0 1px #a36597}.woocommerce-message .button-primary:active,.woocommerce-message .button-primary:focus,.woocommerce-message .button-primary:hover,p.woocommerce-actions .button-primary:active,p.woocommerce-actions .button-primary:focus,p.woocommerce-actions .button-primary:hover{background:#a36597;border-color:#a36597;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.woocommerce-message a.woocommerce-message-close,p.woocommerce-actions a.woocommerce-message-close{position:static;float:right;top:0;right:0;padding:0 15px 10px 28px;margin-top:-10px;font-size:13px;line-height:1.23076923;text-decoration:none}.woocommerce-message a.woocommerce-message-close::before,p.woocommerce-actions a.woocommerce-message-close::before{position:relative;top:18px;left:-20px;-webkit-transition:all .1s ease-in-out;transition:all .1s ease-in-out}.woocommerce-message .button-primary,.woocommerce-message .button-secondary,p.woocommerce-actions .button-primary,p.woocommerce-actions .button-secondary{text-decoration:none!important}.woocommerce-message .twitter-share-button,p.woocommerce-actions .twitter-share-button{margin-top:-3px;margin-left:3px;vertical-align:middle}.woocommerce-about-text,p.woocommerce-actions{margin-bottom:1em!important}div.woocommerce-legacy-shipping-notice,div.woocommerce-no-shipping-methods-notice{overflow:hidden;padding:1px 12px}div.woocommerce-legacy-shipping-notice p,div.woocommerce-no-shipping-methods-notice p{position:relative;z-index:1;max-width:700px;line-height:1.5em;margin:12px 0}div.woocommerce-legacy-shipping-notice p.main,div.woocommerce-no-shipping-methods-notice p.main{font-size:1.1em}div.woocommerce-legacy-shipping-notice::before,div.woocommerce-no-shipping-methods-notice::before{content:'\e01b';font-family:WooCommerce;text-align:center;line-height:1;color:#f7f1f6;display:block;width:1em;font-size:20em;top:36px;right:12px;position:absolute} \ No newline at end of file +div.woocommerce-message{overflow:hidden;position:relative;border-left-color:#cc99c2!important}div.woocommerce-message p{max-width:700px}div.woocommerce-message p:last-child{max-width:inherit}.woocommerce-message .button-primary,p.woocommerce-actions .button-primary{background:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;color:#fff;text-shadow:0 -1px 1px #a36597,1px 0 1px #a36597,0 1px 1px #a36597,-1px 0 1px #a36597}.woocommerce-message .button-primary:active,.woocommerce-message .button-primary:focus,.woocommerce-message .button-primary:hover,p.woocommerce-actions .button-primary:active,p.woocommerce-actions .button-primary:focus,p.woocommerce-actions .button-primary:hover{background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.woocommerce-message a.woocommerce-message-close,p.woocommerce-actions a.woocommerce-message-close{position:static;float:right;top:0;right:0;padding:0 15px 10px 28px;margin-top:-10px;font-size:13px;line-height:1.23076923;text-decoration:none}.woocommerce-message a.woocommerce-message-close::before,p.woocommerce-actions a.woocommerce-message-close::before{position:relative;top:18px;left:-20px;-webkit-transition:all .1s ease-in-out;transition:all .1s ease-in-out}.woocommerce-message .button-primary,.woocommerce-message .button-secondary,p.woocommerce-actions .button-primary,p.woocommerce-actions .button-secondary{text-decoration:none!important}.woocommerce-message .twitter-share-button,p.woocommerce-actions .twitter-share-button{margin-top:-3px;margin-left:3px;vertical-align:middle}.woocommerce-about-text,p.woocommerce-actions{margin-bottom:1em!important}div.woocommerce-legacy-shipping-notice,div.woocommerce-no-shipping-methods-notice{overflow:hidden;padding:1px 12px}div.woocommerce-legacy-shipping-notice p,div.woocommerce-no-shipping-methods-notice p{position:relative;z-index:1;max-width:700px;line-height:1.5em;margin:12px 0}div.woocommerce-legacy-shipping-notice p.main,div.woocommerce-no-shipping-methods-notice p.main{font-size:1.1em}div.woocommerce-legacy-shipping-notice::before,div.woocommerce-no-shipping-methods-notice::before{content:'\e01b';font-family:WooCommerce;text-align:center;line-height:1;color:#f7f1f6;display:block;width:1em;font-size:20em;top:36px;right:12px;position:absolute} \ No newline at end of file diff --git a/assets/css/admin-rtl.css b/assets/css/admin-rtl.css index 6616e5ddb5d..b5236e3e635 100644 --- a/assets/css/admin-rtl.css +++ b/assets/css/admin-rtl.css @@ -1,2 +1,2 @@ -.select2-container{-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer;display:block;height:28px;margin:0 0 -4px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer;display:block;min-height:32px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left;padding:0}.select2-container .select2-search--inline .select2-search__field{-webkit-box-sizing:border-box;box-sizing:border-box;border:none;font-size:100%;margin:0;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border:1px solid #aaa;border-radius:4px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected],.select2-results__option[data-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{-webkit-box-sizing:border-box;box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none;margin:5px 5px 0 0}.select2-container--default .select2-selection--multiple .select2-selection__rendered li:before{content:'';display:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid #000 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:0 0;border:none;outline:0;-webkit-box-shadow:none;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true],.select2-container--default .select2-results__option[data-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected],.select2-container--default .select2-results__option--highlighted[data-selected]{background-color:#0073aa;color:#fff}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(50%,#fff),to(#eee));background-image:-webkit-linear-gradient(top,#fff 50%,#eee 100%);background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single:focus{border:1px solid #0073aa}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(50%,#eee),to(#ccc));background-image:-webkit-linear-gradient(top,#eee 50%,#ccc 100%);background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #0073aa}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:0 0;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-gradient(linear,left top,left bottom,from(white),color-stop(50%,#eee));background-image:-webkit-linear-gradient(top,#fff 0,#eee 50%);background-image:linear-gradient(to bottom,#fff 0,#eee 50%);background-repeat:repeat-x}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(50%,#eee),to(white));background-image:-webkit-linear-gradient(top,#eee 50%,#fff 100%);background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #0073aa}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #0073aa}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;-webkit-box-shadow:none;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected],.select2-container--classic .select2-results__option--highlighted[data-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#0073aa} -@charset "UTF-8";@-webkit-keyframes spin{100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}@keyframes spin{100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}.blockUI.blockOverlay::before{height:1em;width:1em;display:block;position:absolute;top:50%;right:50%;margin-right:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.wc_addons_wrap{max-width:1200px}.wc_addons_wrap h1.search-form-title{clear:right;padding:0}.wc_addons_wrap form.search-form{clear:both;display:block;position:relative;margin-top:1em;margin-bottom:1em}.wc_addons_wrap form.search-form input{border:1px solid #ddd;-webkit-box-shadow:none;box-shadow:none;height:53px;padding-right:50px;width:100%;margin:0}.wc_addons_wrap form.search-form button{background:0 0;border:none;cursor:pointer;height:53px;position:absolute;width:53px}.wc_addons_wrap .update-plugins .update-count{background-color:#d54e21;border-radius:10px;color:#fff;display:inline-block;font-size:9px;font-weight:600;line-height:17px;margin:1px 2px 0 0;padding:0 6px;vertical-align:text-top}.wc_addons_wrap .addons-featured{margin:0}.wc_addons_wrap ul.subsubsub.subsubsub{margin:-2px 0 12px}.wc_addons_wrap .subsubsub li::after{content:'|'}.wc_addons_wrap .subsubsub li:last-child::after{content:''}.wc_addons_wrap .addons-banner-block-item-icon,.wc_addons_wrap .addons-column-block-item-icon{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.wc_addons_wrap .addons-banner-block,.wc_addons_wrap .addons-wcs-banner-block{background:#fff;border:1px solid #ddd;margin:0 0 1em 0;padding:2em 2em 1em}.wc_addons_wrap .addons-banner-block img{height:62px}.wc_addons_wrap .addons-banner-block p{margin:0 0 20px}.wc_addons_wrap .addons-banner-block-items{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around;margin:0 -10px 0 -10px}.wc_addons_wrap .addons-banner-block-item{border:1px solid #e6e6e6;border-radius:3px;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin:1em;min-width:200px;width:30%}.wc_addons_wrap .addons-banner-block-item-icon{background:#f7f7f7;height:143px}.wc_addons_wrap .addons-banner-block-item-content{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:184px;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:24px}.wc_addons_wrap .addons-banner-block-item-content h3{margin-top:0}.wc_addons_wrap .addons-banner-block-item-content p{margin:0 0 auto}.wc_addons_wrap .addons-wcs-banner-block{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.wc_addons_wrap .addons-wcs-banner-block-image{background:#f7f7f7;border:1px solid #e6e6e6;margin-left:2em;padding:4em}.wc_addons_wrap .addons-wcs-banner-block-image .addons-img{max-height:86px;max-width:97px}.wc_addons_wrap .addons-shipping-methods .addons-wcs-banner-block{margin-right:0;margin-left:0;margin-top:1em}.wc_addons_wrap .addons-wcs-banner-block-content{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding:1em 0}.wc_addons_wrap .addons-wcs-banner-block-content h1{padding-bottom:0}.wc_addons_wrap .addons-wcs-banner-block-content p{margin-bottom:0}.wc_addons_wrap .addons-wcs-banner-block-content .wcs-service-logo{max-width:40px}.wc_addons_wrap .addons-column-section{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}.wc_addons_wrap .addons-column{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:50%;padding:0 .5em}.wc_addons_wrap .addons-column:nth-child(2){margin-left:0}.wc_addons_wrap .addons-column-block,.wc_addons_wrap .addons-small-dark-block,.wc_addons_wrap .addons-small-light-block{-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #ddd;margin:0 0 1em;padding:20px}.wc_addons_wrap .addons-column-block img{max-height:50px;max-width:50px}.wc_addons_wrap .addons-column-block,.wc_addons_wrap .addons-small-light-block{background:#fff}.wc_addons_wrap .addons-column-block-left{float:right}.wc_addons_wrap .addons-column-block-right{float:left}.wc_addons_wrap .addons-column-block-item{border-top:2px solid #f9f9f9;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:0 -20px;padding:20px}.wc_addons_wrap .addons-column-block-item-icon{background:#f7f7f7;border:1px solid #e6e6e6;height:100px;margin:0 0 10px 10px;width:100px}.wc_addons_wrap .addons-column-block-item-content{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;height:20%;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-width:200px}.wc_addons_wrap .addons-column-block-item-content h2{float:right;margin-top:8px}.wc_addons_wrap .addons-column-block-item-content a{float:left}.wc_addons_wrap .addons-column-block-item-content p{float:right}.wc_addons_wrap .addons-banner-block-item,.wc_addons_wrap .addons-column-block-item{display:none}.wc_addons_wrap .addons-banner-block-item:nth-child(-n+3){display:block}.wc_addons_wrap .addons-column-block-item:nth-of-type(-n+3){display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wc_addons_wrap .addons-small-dark-block{background-color:#54687d;text-align:center}.wc_addons_wrap .addons-small-dark-items{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}.wc_addons_wrap .addons-small-dark-item{margin:0 0 20px}.wc_addons_wrap .addons-small-dark-block h1{color:#fff}.wc_addons_wrap .addons-small-dark-block p{color:#fafafa}.wc_addons_wrap .addons-small-dark-item-icon img{height:30px}.wc_addons_wrap .addons-small-dark-item a{margin:28px auto 0}.wc_addons_wrap .addons-small-light-block{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.wc_addons_wrap .addons-small-light-block h1{margin-top:-12px}.wc_addons_wrap .addons-small-light-block p{margin-top:0}.wc_addons_wrap .addons-small-light-block img{height:225px;margin:0 -20px 0 0}.wc_addons_wrap .addons-small-light-block-content{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1 1 100px;-ms-flex:1 1 100px;flex:1 1 100px;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}.wc_addons_wrap .addons-small-light-block-buttons{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.wc_addons_wrap .addons-small-light-block-content a{width:48%}.wc_addons_wrap .addons-button{border-radius:3px;cursor:pointer;display:block;height:37px;line-height:37px;text-align:center;text-decoration:none;width:124px}.wc_addons_wrap .addons-button-solid{background-color:#955a89;color:#fff}.wc_addons_wrap .addons-button-solid:hover{color:#fff;opacity:.8}.wc_addons_wrap .addons-button-outline-green{border:1px solid #73ae39;color:#73ae39}.wc_addons_wrap .addons-button-outline-green:hover{color:#73ae39;opacity:.8}.wc_addons_wrap .addons-button-outline-white{border:1px solid #fff;color:#fff}.wc_addons_wrap .addons-button-outline-white:hover{color:#fff;opacity:.8}.wc_addons_wrap .addons-button-installed{background:#e6e6e6;color:#3c3c3c}.wc_addons_wrap .addons-button-installed:hover{color:#3c3c3c;opacity:.8}@media only screen and (max-width:400px){.wc_addons_wrap .addons-featured{margin:-1% -5%}.wc_addons_wrap .addons-button{width:100%}.wc_addons_wrap .addons-small-dark-item{width:100%}.wc_addons_wrap .addons-column-block-item-icon{background:0 0;border:none;height:75px;margin:0 0 10px 10px;width:75px}}.wc_addons_wrap .products{overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row;-ms-flex-flow:row;flex-flow:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0 -.5em}.wc_addons_wrap .products li{float:right;border:1px solid #ddd;margin:0 .5em 1em!important;padding:0;vertical-align:top;width:25%;min-width:280px;min-height:220px;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;overflow:hidden;background:#f5f5f5;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),inset 0 -1px 0 rgba(0,0,0,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),inset 0 -1px 0 rgba(0,0,0,.1)}.wc_addons_wrap .products li a{text-decoration:none;color:inherit;display:block;height:100%}.wc_addons_wrap .products li a .product-img-wrap{background:#fff;display:block}.wc_addons_wrap .products li a img{max-width:258px;max-height:24px;padding:17px 20px;display:block;margin:0;background:#fff;border-left:260px solid #fff}.wc_addons_wrap .products li a img.extension-thumb+h3{display:none}.wc_addons_wrap .products li a .price{display:none}.wc_addons_wrap .products li a h2,.wc_addons_wrap .products li a h3{margin:0!important;padding:20px!important;background:#fff}.wc_addons_wrap .products li a p{padding:20px!important;margin:0!important;border-top:1px solid #f1f1f1}.wc_addons_wrap .products li a:focus,.wc_addons_wrap .products li a:hover{background-color:#fff}.wc_addons_wrap .storefront{background:url(../images/storefront-bg.jpg) bottom right #f6f6f6;border:1px solid #ddd;margin-top:1em;padding:20px;overflow:hidden;zoom:1}.wc_addons_wrap .storefront img{width:278px;height:auto;float:right;margin:0 0 0 20px;-webkit-box-shadow:0 1px 6px rgba(0,0,0,.1);box-shadow:0 1px 6px rgba(0,0,0,.1)}.wc_addons_wrap .storefront p{max-width:750px}.woocommerce-BlankState a.button-primary,.woocommerce-BlankState button.button-primary,.woocommerce-message a.button-primary,.woocommerce-message button.button-primary{background:#bb77ae;border-color:#a36597;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;color:#fff;text-shadow:0 -1px 1px #a36597,-1px 0 1px #a36597,0 1px 1px #a36597,1px 0 1px #a36597;display:inline-block}.woocommerce-BlankState a.button-primary:active,.woocommerce-BlankState a.button-primary:focus,.woocommerce-BlankState a.button-primary:hover,.woocommerce-BlankState button.button-primary:active,.woocommerce-BlankState button.button-primary:focus,.woocommerce-BlankState button.button-primary:hover,.woocommerce-message a.button-primary:active,.woocommerce-message a.button-primary:focus,.woocommerce-message a.button-primary:hover,.woocommerce-message button.button-primary:active,.woocommerce-message button.button-primary:focus,.woocommerce-message button.button-primary:hover{background:#a36597;border-color:#a36597;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.woocommerce-message{position:relative;border-right-color:#cc99c2!important;overflow:hidden}.woocommerce-message a.docs,.woocommerce-message a.skip{text-decoration:none!important}.woocommerce-message a.woocommerce-message-close{position:static;float:left;padding:0 28px 10px 15px;margin-top:-10px;font-size:13px;line-height:1.23076923;text-decoration:none}.woocommerce-message a.woocommerce-message-close::before{position:relative;top:18px;right:-20px;-webkit-transition:all .1s ease-in-out;transition:all .1s ease-in-out}.woocommerce-message .twitter-share-button{margin-top:-3px;margin-right:3px;vertical-align:middle}#variable_product_options #message,#variable_product_options .notice{margin:10px}.clear{clear:both}.wrap.woocommerce div.error,.wrap.woocommerce div.updated{margin-top:10px}mark.amount{background:transparent none;color:inherit}.simplify-commerce-banner{overflow:hidden}.simplify-commerce-banner img{float:left;padding:15px 0;margin-right:1em;width:200px}.woocommerce-help-tip{color:#666;display:inline-block;font-size:1.1em;font-style:normal;height:16px;line-height:16px;position:relative;vertical-align:middle;width:16px}.woocommerce-help-tip::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";cursor:help}h2 .woocommerce-help-tip{margin-top:-5px;margin-right:.25em}table.wc_status_table{margin-bottom:1em}table.wc_status_table h2{font-size:14px;margin:0}table.wc_status_table tr:nth-child(2n) td,table.wc_status_table tr:nth-child(2n) th{background:#fcfcfc}table.wc_status_table th{font-weight:700;padding:9px}table.wc_status_table td:first-child{width:33%}table.wc_status_table td.help{width:1em}table.wc_status_table td,table.wc_status_table th{font-size:1.1em;font-weight:400}table.wc_status_table td.run-tool,table.wc_status_table th.run-tool{text-align:left}table.wc_status_table td strong.name,table.wc_status_table th strong.name{display:block;margin-bottom:.5em}table.wc_status_table td mark,table.wc_status_table th mark{background:transparent none}table.wc_status_table td mark.yes,table.wc_status_table th mark.yes{color:#7ad03a}table.wc_status_table td mark.no,table.wc_status_table th mark.no{color:#999}table.wc_status_table td .red,table.wc_status_table td mark.error,table.wc_status_table th .red,table.wc_status_table th mark.error{color:#a00}table.wc_status_table td ul,table.wc_status_table th ul{margin:0}table.wc_status_table .help_tip{cursor:help}table.wc_status_table--tools td,table.wc_status_table--tools th{padding:2em}.taxonomy-product_cat .column-thumb .woocommerce-help-tip{font-size:1.5em;margin:0 -34px 0 0;padding:0 2px 5px;display:block;position:absolute}#debug-report{display:none;margin:10px 0;padding:0;position:relative}#debug-report textarea{font-family:monospace;width:100%;margin:0;height:300px;padding:20px;border-radius:0;resize:none;font-size:12px;line-height:20px;outline:0}.wp-list-table.logs .log-level{display:inline;padding:.2em .6em .3em;font-size:80%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.2em}.wp-list-table.logs .log-level:empty{display:none}.wp-list-table.logs .log-level--alert,.wp-list-table.logs .log-level--emergency{background-color:#ff4136}.wp-list-table.logs .log-level--critical,.wp-list-table.logs .log-level--error{background-color:#ff851b}.wp-list-table.logs .log-level--notice,.wp-list-table.logs .log-level--warning{color:#222;background-color:#ffdc00}.wp-list-table.logs .log-level--info{background-color:#0074d9}.wp-list-table.logs .log-level--debug{background-color:#3d9970}@media screen and (min-width:783px){.wp-list-table.logs .column-timestamp{width:18%}.wp-list-table.logs .column-level{width:14%}.wp-list-table.logs .column-source{width:15%}}#log-viewer-select{padding:10px 0 8px;line-height:28px}#log-viewer-select h2 a{vertical-align:middle}#log-viewer{background:#fff;border:1px solid #e5e5e5;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.04);box-shadow:0 1px 1px rgba(0,0,0,.04);padding:5px 20px}#log-viewer pre{font-family:monospace;white-space:pre-wrap;word-wrap:break-word}.inline-edit-product.quick-edit-row .inline-edit-col-center,.inline-edit-product.quick-edit-row .inline-edit-col-right{float:left!important}#woocommerce-fields.inline-edit-col{clear:right}#woocommerce-fields.inline-edit-col label.featured,#woocommerce-fields.inline-edit-col label.manage_stock{margin-right:10px}#woocommerce-fields.inline-edit-col label.stock_status_field{clear:both;float:right}#woocommerce-fields.inline-edit-col .dimensions div{display:block;margin:.2em 0}#woocommerce-fields.inline-edit-col .dimensions div span.title{display:block;float:right;width:5em}#woocommerce-fields.inline-edit-col .dimensions div span.input-text-wrap{display:block;margin-right:5em}#woocommerce-fields.inline-edit-col .text{-webkit-box-sizing:border-box;box-sizing:border-box;width:99%;float:right;margin:1px 1px 1px 1%}#woocommerce-fields.inline-edit-col .height,#woocommerce-fields.inline-edit-col .length,#woocommerce-fields.inline-edit-col .width{width:32.33%}#woocommerce-fields.inline-edit-col .height{margin-left:0}#woocommerce-fields-bulk.inline-edit-col label{clear:right}#woocommerce-fields-bulk.inline-edit-col .inline-edit-group label{clear:none;width:49%;margin:.2em 0}#woocommerce-fields-bulk.inline-edit-col .inline-edit-group.dimensions label{width:75%;max-width:75%}#woocommerce-fields-bulk.inline-edit-col .length,#woocommerce-fields-bulk.inline-edit-col .regular_price,#woocommerce-fields-bulk.inline-edit-col .sale_price,#woocommerce-fields-bulk.inline-edit-col .stock,#woocommerce-fields-bulk.inline-edit-col .weight{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;margin-right:4.4em}#woocommerce-fields-bulk.inline-edit-col .height,#woocommerce-fields-bulk.inline-edit-col .length,#woocommerce-fields-bulk.inline-edit-col .width{-webkit-box-sizing:border-box;box-sizing:border-box;width:25%}.column-coupon_code{line-height:2.25em}.column-coupon_code,ul.wc_coupon_list{margin:0;overflow:hidden;zoom:1;clear:both}ul.wc_coupon_list{padding-bottom:5px}ul.wc_coupon_list li{margin:0}ul.wc_coupon_list li.code{display:inline-block;position:relative;padding:0 .5em;background-color:#fff;border:1px solid #aaa;-webkit-box-shadow:0 1px 0 #dfdfdf;box-shadow:0 1px 0 #dfdfdf;border-radius:4px;margin-left:5px;margin-top:5px}ul.wc_coupon_list li.code.editable{padding-left:2em}ul.wc_coupon_list li.code .tips{cursor:pointer}ul.wc_coupon_list li.code .tips span{color:#888}ul.wc_coupon_list li.code .tips span:hover{color:#000}ul.wc_coupon_list li.code .remove-coupon{text-decoration:none;color:#888;position:absolute;top:7px;left:20px;left:7px}ul.wc_coupon_list li.code .remove-coupon::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}ul.wc_coupon_list li.code .remove-coupon:hover::before{color:#a00}ul.wc_coupon_list_block{margin:0;padding-bottom:2px}ul.wc_coupon_list_block li{border-top:1px solid #fff;border-bottom:1px solid #ccc;line-height:2.5em;margin:0;padding:.5em 0}ul.wc_coupon_list_block li:first-child{border-top:0;padding-top:0}ul.wc_coupon_list_block li:last-child{border-bottom:0;padding-bottom:0}.button.wc-reload{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;padding:0;height:28px;width:28px!important;display:inline-block}.button.wc-reload::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";line-height:28px}#woocommerce-order-data .handlediv,#woocommerce-order-data .hndle{display:none}#woocommerce-order-data .inside{display:block!important}#order_data{padding:23px 24px 12px}#order_data h2{margin:0;font-family:HelveticaNeue-Light,'Helvetica Neue Light','Helvetica Neue',sans-serif;font-size:21px;font-weight:400;line-height:1.2;text-shadow:-1px 1px 1px #fff;padding:0}#order_data h3{font-size:14px}#order_data h3,#order_data h4{color:#333;margin:1.33em 0 0}#order_data p{color:#777}#order_data p.order_number{margin:0;font-family:HelveticaNeue-Light,'Helvetica Neue Light','Helvetica Neue',sans-serif;font-weight:400;line-height:1.6em;font-size:16px}#order_data .order_data_column_container{clear:both}#order_data .order_data_column{width:32%;padding:0 0 0 2%;float:right}#order_data .order_data_column>h3 span{display:block}#order_data .order_data_column:last-child{padding-left:0}#order_data .order_data_column p{padding:0!important}#order_data .order_data_column .address strong{display:block}#order_data .order_data_column .form-field{float:right;clear:right;width:48%;padding:0;margin:9px 0 0}#order_data .order_data_column .form-field label{display:block;padding:0 0 3px}#order_data .order_data_column .form-field input,#order_data .order_data_column .form-field textarea{width:100%}#order_data .order_data_column .form-field select{width:100%}#order_data .order_data_column .form-field .select2-container{width:100%!important}#order_data .order_data_column .form-field .date-picker{width:50%}#order_data .order_data_column .form-field .hour,#order_data .order_data_column .form-field .minute{width:3.5em}#order_data .order_data_column .form-field small{display:block;margin:5px 0 0;color:#999}#order_data .order_data_column ._billing_address_2_field,#order_data .order_data_column ._billing_last_name_field,#order_data .order_data_column ._billing_phone_field,#order_data .order_data_column ._billing_postcode_field,#order_data .order_data_column ._billing_state_field,#order_data .order_data_column ._shipping_address_2_field,#order_data .order_data_column ._shipping_last_name_field,#order_data .order_data_column ._shipping_postcode_field,#order_data .order_data_column ._shipping_state_field,#order_data .order_data_column .form-field.last{float:left;clear:left}#order_data .order_data_column ._billing_company_field,#order_data .order_data_column ._shipping_company_field,#order_data .order_data_column ._transaction_id_field,#order_data .order_data_column .form-field-wide{width:100%;clear:both}#order_data .order_data_column ._billing_company_field .wc-category-search,#order_data .order_data_column ._billing_company_field .wc-customer-search,#order_data .order_data_column ._billing_company_field .wc-enhanced-select,#order_data .order_data_column ._billing_company_field input,#order_data .order_data_column ._billing_company_field select,#order_data .order_data_column ._billing_company_field textarea,#order_data .order_data_column ._shipping_company_field .wc-category-search,#order_data .order_data_column ._shipping_company_field .wc-customer-search,#order_data .order_data_column ._shipping_company_field .wc-enhanced-select,#order_data .order_data_column ._shipping_company_field input,#order_data .order_data_column ._shipping_company_field select,#order_data .order_data_column ._shipping_company_field textarea,#order_data .order_data_column ._transaction_id_field .wc-category-search,#order_data .order_data_column ._transaction_id_field .wc-customer-search,#order_data .order_data_column ._transaction_id_field .wc-enhanced-select,#order_data .order_data_column ._transaction_id_field input,#order_data .order_data_column ._transaction_id_field select,#order_data .order_data_column ._transaction_id_field textarea,#order_data .order_data_column .form-field-wide .wc-category-search,#order_data .order_data_column .form-field-wide .wc-customer-search,#order_data .order_data_column .form-field-wide .wc-enhanced-select,#order_data .order_data_column .form-field-wide input,#order_data .order_data_column .form-field-wide select,#order_data .order_data_column .form-field-wide textarea{width:100%}#order_data .order_data_column p.none_set{color:#999}#order_data .order_data_column div.edit_address{display:none;zoom:1;padding-left:1px}#order_data .order_data_column .wc-customer-user label a,#order_data .order_data_column .wc-order-status label a{float:left;margin-right:8px}#order_data .order_data_column a.edit_address{width:14px;height:0;padding:14px 0 0;margin:0 6px 0 0;overflow:hidden;position:relative;color:#999;border:0;float:left}#order_data .order_data_column a.edit_address:focus,#order_data .order_data_column a.edit_address:hover{color:#000}#order_data .order_data_column a.edit_address::after{font-family:WooCommerce;position:absolute;top:0;right:0;text-align:center;vertical-align:top;line-height:14px;font-size:14px;font-weight:400}#order_data .order_data_column a.edit_address::after{font-family:Dashicons;content:'\f464'}#order_data .order_data_column .billing-same-as-shipping,#order_data .order_data_column .load_customer_billing,#order_data .order_data_column .load_customer_shipping{font-size:13px;display:inline-block;font-weight:400}#order_data .order_data_column .load_customer_shipping{margin-left:.3em}.order_actions{margin:0;overflow:hidden;zoom:1}.order_actions li{border-top:1px solid #fff;border-bottom:1px solid #ddd;padding:6px 0;margin:0;line-height:1.6em;float:right;width:50%;text-align:center}.order_actions li a{float:none;text-align:center;text-decoration:underline}.order_actions li.wide{width:auto;float:none;clear:both;padding:6px;text-align:right;overflow:hidden}.order_actions li #delete-action{line-height:25px;vertical-align:middle;text-align:right;float:right}.order_actions li .save_order{float:left}.order_actions li#actions{overflow:hidden}.order_actions li#actions .button{width:24px;-webkit-box-sizing:border-box;box-sizing:border-box;float:left}.order_actions li#actions select{width:225px;-webkit-box-sizing:border-box;box-sizing:border-box;float:right}#woocommerce-order-items .inside{margin:0;padding:0;background:#fefefe}#woocommerce-order-items .wc-order-data-row{border-bottom:1px solid #dfdfdf;padding:1.5em 2em;background:#f8f8f8;line-height:2em;text-align:left}#woocommerce-order-items .wc-order-data-row::after,#woocommerce-order-items .wc-order-data-row::before{content:' ';display:table}#woocommerce-order-items .wc-order-data-row::after{clear:both}#woocommerce-order-items .wc-order-data-row p{margin:0;line-height:2em}#woocommerce-order-items .wc-order-data-row .wc-used-coupons{text-align:right}#woocommerce-order-items .wc-order-data-row .wc-used-coupons .tips{display:inline-block}#woocommerce-order-items .wc-used-coupons{float:right;width:50%}#woocommerce-order-items .wc-order-totals{float:left;width:50%;margin:0;padding:0;text-align:left}#woocommerce-order-items .wc-order-totals .amount{font-weight:700}#woocommerce-order-items .wc-order-totals .label{vertical-align:top}#woocommerce-order-items .wc-order-totals .total{font-size:1em!important;width:10em;margin:0 .5em 0 0;-webkit-box-sizing:border-box;box-sizing:border-box}#woocommerce-order-items .wc-order-totals .total input[type=text]{width:96%;float:left}#woocommerce-order-items .wc-order-totals .refunded-total{color:#a00}#woocommerce-order-items .refund-actions{margin-top:5px;padding-top:12px;border-top:1px solid #dfdfdf}#woocommerce-order-items .refund-actions .button{float:left;margin-right:4px}#woocommerce-order-items .refund-actions .cancel-action{float:right;margin-right:0}#woocommerce-order-items .add_meta{margin-right:0!important}#woocommerce-order-items h3 small{color:#999}#woocommerce-order-items .amount{white-space:nowrap}#woocommerce-order-items .add-items .description{margin-left:10px}#woocommerce-order-items .add-items .button{float:right;margin-left:.25em}#woocommerce-order-items .add-items .button-primary{float:none;margin-left:0}#woocommerce-order-items .inside{display:block!important}#woocommerce-order-items .handlediv,#woocommerce-order-items .hndle{display:none}#woocommerce-order-items .woocommerce_order_items_wrapper{margin:0;overflow-x:auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items{width:100%;background:#fff}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th{text-align:right;padding:1em;font-weight:400;color:#999;background:#f8f8f8;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th.sortable{cursor:pointer}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th:last-child{padding-left:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th:first-child{padding-right:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th .wc-arrow{float:left;position:relative;margin-left:-1em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td{padding:1.5em 1em 1em;text-align:right;line-height:1.5em;vertical-align:top;border-bottom:1px solid #f8f8f8}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td textarea{width:100%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td select{width:50%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td textarea{font-size:14px;padding:4px;color:#555}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th:last-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td:last-child{padding-left:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td:first-child{padding-right:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody tr:last-child td{border-bottom:1px solid #dfdfdf}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody tr:first-child td{border-top:8px solid #f8f8f8}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody#order_line_items tr:first-child td{border-top:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb{text-align:right;width:38px;padding-bottom:1.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb .wc-order-item-thumbnail{width:38px;height:38px;border:2px solid #e8e8e8;background:#f8f8f8;color:#ccc;position:relative;font-size:21px;display:block;text-align:center}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb .wc-order-item-thumbnail::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";width:38px;line-height:38px;display:block}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb .wc-order-item-thumbnail img{width:100%;height:100%;margin:0;padding:0;position:relative}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.name .wc-order-item-sku,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.name .wc-order-item-variation{display:block;margin-top:.5em;font-size:.92em!important;color:#888}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item{min-width:200px}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .center,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .variation-id{text-align:center}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class{text-align:left}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class label{white-space:nowrap;color:#999;font-size:.833em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class label input{display:inline}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class input{width:70px;vertical-align:middle;text-align:left}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class select{width:85px;height:26px;vertical-align:middle;font-size:1em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input{display:inline-block;background:#fff;border:1px solid #ddd;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.07);box-shadow:inset 0 1px 2px rgba(0,0,0,.07);margin:1px 0;min-width:80px;overflow:hidden;line-height:1em;text-align:left}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input{width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input label{font-size:.75em;padding:4px 6px 0;color:#555;display:block}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input input{width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;border:0;-webkit-box-shadow:none;box-shadow:none;margin:0;padding:0 6px 4px;color:#555;background:0 0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input input::-webkit-input-placeholder{color:#ddd}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input:first-child{border-bottom:1px dashed #ddd;background:#fff}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input:first-child label{color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input:first-child input{color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .view{white-space:nowrap}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .edit{text-align:right}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class small.times{font-size:.92em!important;color:#888}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-taxes{margin:0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-taxes label{display:block}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-discount{display:block;margin-top:.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class small.times{margin-left:.25em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity{text-align:center}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity input{text-align:center;width:50px}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items span.subtotal{opacity:.5}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.tax_class,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.tax_class{text-align:right}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .calculated{border-color:#ae8ca2;border-style:dotted}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta{width:100%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta{margin:.5em 0 0;font-size:.92em!important;color:#888}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr th,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr th{border:0;padding:0 0 .5em 4px;line-height:1.5em;width:20%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td{padding:0 0 .5em 4px;border:0;line-height:1.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td input{width:100%;margin:0;position:relative;border-bottom:0;-webkit-box-shadow:none;box-shadow:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td textarea{width:100%;height:4em;margin:0;-webkit-box-shadow:none;box-shadow:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td input:focus+textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td input:focus+textarea{border-top-color:#999}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td p,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td p{margin:0 0 .5em;line-height:1.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td p:last-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td p:last-child{margin:0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .refund_by{border-bottom:1px dotted #999}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.fee .thumb div{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.5em;line-height:1em;vertical-align:middle;margin:0 auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.fee .thumb div::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.refund .thumb div{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.5em;line-height:1em;vertical-align:middle;margin:0 auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.refund .thumb div::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .thumb div{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.5em;line-height:1em;vertical-align:middle;margin:0 auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .thumb div::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .shipping_method,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .shipping_method_name{width:100%;margin:0 0 .5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax{white-space:nowrap}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax .delete-order-tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax .delete-order-tax{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;float:left;font-size:14px;visibility:hidden;margin:3px 0 0 -18px}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax .delete-order-tax::before,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax .delete-order-tax::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#999}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax .delete-order-tax:hover::before,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax .delete-order-tax:hover::before{color:#a00}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax:hover .delete-order-tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax:hover .delete-order-tax{visibility:visible}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items small.refunded{display:block;color:#a00;white-space:nowrap;margin-top:.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items small.refunded::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";position:relative;top:auto;right:auto;margin:-1px 0 0 4px;vertical-align:middle;line-height:1em}#woocommerce-order-items .wc-order-edit-line-item{padding-right:0}#woocommerce-order-items .wc-order-edit-line-item-actions{width:44px;text-align:left;padding-right:0;vertical-align:middle}#woocommerce-order-items .wc-order-edit-line-item-actions a{color:#ccc;display:inline-block;cursor:pointer;padding:0 0 .5em;margin:0 12px 0 0;vertical-align:middle;text-decoration:none;line-height:16px;width:16px;overflow:hidden}#woocommerce-order-items .wc-order-edit-line-item-actions a::before{margin:0;padding:0;font-size:16px;width:16px;height:16px}#woocommerce-order-items .wc-order-edit-line-item-actions a:hover::before{color:#999}#woocommerce-order-items .wc-order-edit-line-item-actions a:first-child{margin-right:0}#woocommerce-order-items .wc-order-edit-line-item-actions .edit-order-item::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";position:relative}#woocommerce-order-items .wc-order-edit-line-item-actions .delete-order-item::before,#woocommerce-order-items .wc-order-edit-line-item-actions .delete_refund::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";position:relative}#woocommerce-order-items .wc-order-edit-line-item-actions .delete-order-item:hover::before,#woocommerce-order-items .wc-order-edit-line-item-actions .delete_refund:hover::before{color:#a00}#woocommerce-order-items tbody tr .wc-order-edit-line-item-actions{visibility:hidden}#woocommerce-order-items tbody tr:hover .wc-order-edit-line-item-actions{visibility:visible}#woocommerce-order-items .wc-order-totals .wc-order-edit-line-item-actions{width:1.5em;visibility:visible!important}#woocommerce-order-items .wc-order-totals .wc-order-edit-line-item-actions a{padding:0}#woocommerce-order-downloads .buttons{float:right;padding:0;margin:0;vertical-align:top}#woocommerce-order-downloads .buttons .add_item_id,#woocommerce-order-downloads .buttons .select2-container{width:400px!important;margin-left:9px;vertical-align:top;float:right}#woocommerce-order-downloads .buttons button{margin:2px 0 0}#woocommerce-order-downloads h3 small{color:#999}#poststuff #woocommerce-order-actions .inside{margin:0;padding:0}#poststuff #woocommerce-order-actions .inside ul.order_actions li{padding:6px 10px;-webkit-box-sizing:border-box;box-sizing:border-box}#poststuff #woocommerce-order-actions .inside ul.order_actions li:last-child{border-bottom:0}#poststuff #woocommerce-order-notes .inside{margin:0;padding:0}#poststuff #woocommerce-order-notes .inside ul.order_notes li{padding:0 10px}#woocommerce_customers p.search-box{margin:6px 0 4px;float:right}#woocommerce_customers .tablenav{float:left;clear:none}.widefat.customers td{vertical-align:middle;padding:4px 7px}.widefat .column-order_title{width:15%}.widefat .column-order_title time{display:block;color:#999;margin:3px 0}.widefat .column-orders,.widefat .column-paying,.widefat .column-spent{text-align:center;width:8%}.widefat .column-last_order{width:11%}.widefat .column-wc_actions{width:110px}.widefat .column-wc_actions a.button{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;display:inline-block;margin:2px 0 2px 4px;padding:0!important;height:2em!important;width:2em;overflow:hidden}.widefat .column-wc_actions a.button::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;line-height:1.85}.widefat .column-wc_actions a.button img{display:block;width:12px;height:auto}.widefat .column-wc_actions a.edit::after{content:'\f464'}.widefat .column-wc_actions a.link::after{font-family:WooCommerce;content:'\e00d'}.widefat .column-wc_actions a.view::after{content:'\f177'}.widefat .column-wc_actions a.refresh::after{font-family:WooCommerce;content:'\e031'}.widefat .column-wc_actions a.processing::after{font-family:WooCommerce;content:'\e00f'}.widefat .column-wc_actions a.complete::after{content:'\f147'}.widefat small.meta{display:block;color:#999;font-size:inherit;margin:3px 0}.post-type-shop_order .tablenav .one-page .displaying-num{display:none}.post-type-shop_order .wp-list-table{margin-top:1em}.post-type-shop_order .wp-list-table tfoot th,.post-type-shop_order .wp-list-table thead th{padding:.75em 1em}.post-type-shop_order .wp-list-table tfoot th.sortable a,.post-type-shop_order .wp-list-table tfoot th.sorted a,.post-type-shop_order .wp-list-table thead th.sortable a,.post-type-shop_order .wp-list-table thead th.sorted a{padding:0}.post-type-shop_order .wp-list-table tfoot th:first-child,.post-type-shop_order .wp-list-table thead th:first-child{padding-right:2em}.post-type-shop_order .wp-list-table tfoot th:last-child,.post-type-shop_order .wp-list-table thead th:last-child{padding-left:2em}.post-type-shop_order .wp-list-table tbody td,.post-type-shop_order .wp-list-table tbody th{padding:1em;line-height:26px}.post-type-shop_order .wp-list-table tbody td:first-child{padding-right:2em}.post-type-shop_order .wp-list-table tbody td:last-child{padding-left:2em}.post-type-shop_order .wp-list-table tbody tr{border-top:1px solid #f5f5f5}.post-type-shop_order .wp-list-table tbody tr:hover:not(.status-trash):not(.no-link) td{cursor:pointer}.post-type-shop_order .wp-list-table .no-link{cursor:default!important}.post-type-shop_order .wp-list-table td,.post-type-shop_order .wp-list-table th{width:12ch;vertical-align:middle}.post-type-shop_order .wp-list-table td p,.post-type-shop_order .wp-list-table th p{margin:0}.post-type-shop_order .wp-list-table .check-column{width:1px;white-space:nowrap;padding:1em 1em 1em 1em!important;vertical-align:middle}.post-type-shop_order .wp-list-table .check-column input{vertical-align:text-top;margin:1px 0}.post-type-shop_order .wp-list-table .column-order_number{width:20ch}.post-type-shop_order .wp-list-table .column-order_total{width:8ch;text-align:left}.post-type-shop_order .wp-list-table .column-order_total a span{float:left}.post-type-shop_order .wp-list-table .column-order_date,.post-type-shop_order .wp-list-table .column-order_status{width:10ch}.post-type-shop_order .wp-list-table .column-order_status{width:14ch}.post-type-shop_order .wp-list-table .column-billing_address,.post-type-shop_order .wp-list-table .column-shipping_address{width:20ch;line-height:1.5em}.post-type-shop_order .wp-list-table .column-billing_address .description,.post-type-shop_order .wp-list-table .column-shipping_address .description{display:block;color:#999}.post-type-shop_order .wp-list-table .column-wc_actions{text-align:left}.post-type-shop_order .wp-list-table .column-wc_actions a.button{text-indent:9999px;margin:2px 4px 2px 0}.post-type-shop_order .wp-list-table .order-preview{float:left;width:16px;padding:20px 4px 4px 4px;height:0;overflow:hidden;position:relative;border:2px solid transparent;border-radius:4px}.post-type-shop_order .wp-list-table .order-preview::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";line-height:16px;font-size:14px;vertical-align:middle;top:4px}.post-type-shop_order .wp-list-table .order-preview:hover{border:2px solid #00a0d2}.post-type-shop_order .wp-list-table .order-preview.disabled::before{content:'';background:url(../images/wpspin.gif) no-repeat center top}.order-status{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;line-height:2.5em;color:#777;background:#e5e5e5;border-radius:4px;border-bottom:1px solid rgba(0,0,0,.05);margin:-.25em 0;cursor:inherit!important;white-space:nowrap;max-width:100%}.order-status.status-completed{background:#c8d7e1;color:#2e4453}.order-status.status-on-hold{background:#f8dda7;color:#94660c}.order-status.status-failed{background:#eba3a3;color:#761919}.order-status.status-processing{background:#c6e1c6;color:#5b841b}.order-status.status-trash{background:#eba3a3;color:#761919}.order-status>span{margin:0 1em;overflow:hidden;text-overflow:ellipsis}.wc-order-preview .order-status{float:left;margin-left:54px}.wc-order-preview article{padding:0!important}.wc-order-preview .modal-close{border-radius:0}.wc-order-preview .wc-order-preview-table{width:100%;margin:0}.wc-order-preview .wc-order-preview-table td,.wc-order-preview .wc-order-preview-table th{padding:1em 1.5em;text-align:right;border:0;border-bottom:1px solid #eee;margin:0;background:0 0;-webkit-box-shadow:none;box-shadow:none;text-align:left;vertical-align:top}.wc-order-preview .wc-order-preview-table td:first-child,.wc-order-preview .wc-order-preview-table th:first-child{text-align:right}.wc-order-preview .wc-order-preview-table th{border-color:#ccc}.wc-order-preview .wc-order-preview-table tr:last-child td{border:0}.wc-order-preview .wc-order-preview-table .wc-order-item-sku{margin-top:.5em}.wc-order-preview .wc-order-preview-table .wc-order-item-meta{margin-top:.5em}.wc-order-preview .wc-order-preview-table .wc-order-item-meta td,.wc-order-preview .wc-order-preview-table .wc-order-item-meta th{padding:0;border:0;text-align:right;vertical-align:top}.wc-order-preview .wc-order-preview-table .wc-order-item-meta td:last-child{padding-right:.5em}.wc-order-preview .wc-order-preview-addresses{overflow:hidden;padding-bottom:1.5em}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note{width:50%;float:right;padding:1.5em 1.5em 0;-webkit-box-sizing:border-box;box-sizing:border-box;word-wrap:break-word}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address h2,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note h2{margin-top:0}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address strong,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note strong{display:block;margin-top:1.5em}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address strong:first-child,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note strong:first-child{margin-top:0}.wc-order-preview footer .wc-action-button-group{display:inline-block;float:right}.wc-order-preview footer .button.button-large{margin-right:10px;padding:0 10px!important;line-height:28px;height:auto;display:inline-block}.wc-order-preview .wc-action-button-group label{display:none}.wc-action-button-group{vertical-align:middle;line-height:26px;text-align:right}.wc-action-button-group label{margin-left:6px;cursor:default;font-weight:700;line-height:28px}.wc-action-button-group .wc-action-button-group__items{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-align-content:flex-start;-ms-flex-line-pack:start;align-content:flex-start;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.wc-action-button-group .wc-action-button{margin:0 -1px 0 0!important;border:1px solid #ccc;padding:0 10px!important;border-radius:0!important;float:none;line-height:28px;height:auto;z-index:1;position:relative;overflow:hidden;text-overflow:ellipsis;-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;white-space:nowrap}.wc-action-button-group .wc-action-button:focus,.wc-action-button-group .wc-action-button:hover{border:1px solid #999;z-index:2}.wc-action-button-group .wc-action-button:first-child{margin-right:0!important;border-top-right-radius:3px!important;border-bottom-right-radius:3px!important}.wc-action-button-group .wc-action-button:last-child{border-top-left-radius:3px!important;border-bottom-left-radius:3px!important}@media screen and (max-width:782px){.wc-order-preview footer .wc-action-button-group .wc-action-button-group__items{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wc-order-preview footer .wc-action-button-group{float:none;display:block;margin-bottom:4px}.wc-order-preview footer .button.button-large{width:100%;float:none;text-align:center;margin:0;display:block}.post-type-shop_order .wp-list-table td.check-column{width:1em}.post-type-shop_order .wp-list-table td.column-order_number{padding-right:0;padding-bottom:.5em}.post-type-shop_order .wp-list-table td.column-order_date,.post-type-shop_order .wp-list-table td.column-order_status{display:inline-block!important;padding:0 1em 1em 1em!important}.post-type-shop_order .wp-list-table td.column-order_date:before,.post-type-shop_order .wp-list-table td.column-order_status:before{display:none!important}.post-type-shop_order .wp-list-table td.column-order_date{padding-right:0!important}.post-type-shop_order .wp-list-table td.column-order_status{float:left}}.column-customer_message .note-on{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto;color:#999}.column-customer_message .note-on::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";line-height:16px}.column-order_notes .note-on{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto;color:#999}.column-order_notes .note-on::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";line-height:16px}.attributes-table td,.attributes-table th{width:15%;vertical-align:top}.attributes-table .attribute-terms{width:32%}.attributes-table .attribute-actions{width:2em}.attributes-table .attribute-actions .configure-terms{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;padding:0!important;height:2em!important;width:2em}.attributes-table .attribute-actions .configure-terms::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";font-family:Dashicons;line-height:1.85}ul.order_notes{padding:2px 0 0}ul.order_notes li .note_content{padding:10px;background:#efefef;position:relative}ul.order_notes li .note_content p{margin:0;padding:0;word-wrap:break-word}ul.order_notes li p.meta{padding:10px;color:#999;margin:0;font-size:11px}ul.order_notes li p.meta .exact-date{border-bottom:1px dotted #999}ul.order_notes li a.delete_note{color:#a00}ul.order_notes li .note_content::after{content:'';display:block;position:absolute;bottom:-10px;right:20px;width:0;height:0;border-width:10px 0 0 10px;border-style:solid;border-color:#efefef transparent}ul.order_notes li.system-note .note_content{background:#d7cad2}ul.order_notes li.system-note .note_content::after{border-color:#d7cad2 transparent}ul.order_notes li.customer-note .note_content{background:#a7cedc}ul.order_notes li.customer-note .note_content::after{border-color:#a7cedc transparent}.add_note{border-top:1px solid #ddd;padding:10px 10px 0}.add_note h4{margin-top:5px!important}.add_note #add_order_note{width:100%;height:50px}table.wp-list-table .column-thumb{width:52px;text-align:center;white-space:nowrap}table.wp-list-table .column-handle{width:17px;display:none}table.wp-list-table tbody td.column-handle{cursor:move;width:17px;text-align:center;vertical-align:text-top}table.wp-list-table tbody td.column-handle::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;height:100%;margin:4px 0 0 0}table.wp-list-table .column-name{width:22%}table.wp-list-table .column-product_cat,table.wp-list-table .column-product_tag{width:11%!important}table.wp-list-table .column-featured,table.wp-list-table .column-product_type{width:48px;text-align:right!important}table.wp-list-table .column-customer_message,table.wp-list-table .column-order_notes{width:48px;text-align:center}table.wp-list-table .column-customer_message img,table.wp-list-table .column-order_notes img{margin:0 auto;padding-top:0!important}table.wp-list-table .manage-column.column-featured img,table.wp-list-table .manage-column.column-product_type img{padding-right:2px}table.wp-list-table .column-price .woocommerce-price-suffix{display:none}table.wp-list-table img{margin:1px 2px}table.wp-list-table .row-actions{color:#999}table.wp-list-table td.column-thumb img{margin:0;width:auto;height:auto;max-width:40px;max-height:40px;vertical-align:middle}table.wp-list-table span.na{color:#999}table.wp-list-table .column-sku{width:10%}table.wp-list-table .column-price{width:10ch}table.wp-list-table .column-is_in_stock{text-align:right!important;width:12ch}table.wp-list-table span.wc-featured,table.wp-list-table span.wc-image{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto}table.wp-list-table span.wc-featured::before,table.wp-list-table span.wc-image::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}table.wp-list-table span.wc-featured::before{content:'\f155'}table.wp-list-table span.wc-featured.not-featured::before{content:'\f154'}table.wp-list-table td.column-featured span.wc-featured{font-size:1.6em;cursor:pointer}table.wp-list-table mark.instock,table.wp-list-table mark.onbackorder,table.wp-list-table mark.outofstock{font-weight:700;background:transparent none;line-height:1}table.wp-list-table mark.instock{color:#7ad03a}table.wp-list-table mark.outofstock{color:#a44}table.wp-list-table mark.onbackorder{color:#eaa600}table.wp-list-table .notes_head,table.wp-list-table .order-notes_head,table.wp-list-table .status_head{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto}table.wp-list-table .notes_head::after,table.wp-list-table .order-notes_head::after,table.wp-list-table .status_head::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}table.wp-list-table .order-notes_head::after{content:'\e028'}table.wp-list-table .notes_head::after{content:'\e026'}table.wp-list-table .status_head::after{content:'\e011'}table.wp-list-table .column-order_items{width:12%}table.wp-list-table .column-order_items table.order_items{width:100%;margin:3px 0 0;padding:0;display:none}table.wp-list-table .column-order_items table.order_items td{border:0;margin:0;padding:0 0 3px}table.wp-list-table .column-order_items table.order_items td.qty{color:#999;padding-left:6px;text-align:right}mark.notice{background:#fff;color:#a00;margin:0 10px 0 0}a.export_rates,a.import_rates{float:left;margin-right:9px;margin-top:-2px;margin-bottom:0}#rates-search{float:left}#rates-search input.wc-tax-rates-search-field{padding:4px 8px;font-size:1.2em}#rates-pagination{float:left;margin-left:.5em}#rates-pagination .tablenav{margin:0}.wc_input_table_wrapper{overflow-x:auto;display:block}table.wc_input_table,table.wc_tax_rates{width:100%}table.wc_input_table td,table.wc_input_table th,table.wc_tax_rates td,table.wc_tax_rates th{display:table-cell!important}table.wc_input_table span.tips,table.wc_tax_rates span.tips{color:#2ea2cc}table.wc_input_table th,table.wc_tax_rates th{white-space:nowrap;padding:10px}table.wc_input_table td,table.wc_tax_rates td{padding:0;border-left:1px solid #dfdfdf;border-bottom:1px solid #dfdfdf;border-top:0;background:#fff;cursor:default}table.wc_input_table td input[type=number],table.wc_input_table td input[type=text],table.wc_tax_rates td input[type=number],table.wc_tax_rates td input[type=text]{width:100%!important;min-width:100px;padding:8px 10px;margin:0;border:0;outline:0;background:transparent none}table.wc_input_table td input[type=number]:focus,table.wc_input_table td input[type=text]:focus,table.wc_tax_rates td input[type=number]:focus,table.wc_tax_rates td input[type=text]:focus{outline:0;-webkit-box-shadow:none;box-shadow:none}table.wc_input_table td.apply_to_shipping,table.wc_input_table td.compound,table.wc_tax_rates td.apply_to_shipping,table.wc_tax_rates td.compound{padding:5px 7px;vertical-align:middle}table.wc_input_table td.apply_to_shipping input,table.wc_input_table td.compound input,table.wc_tax_rates td.apply_to_shipping input,table.wc_tax_rates td.compound input{width:auto;padding:0}table.wc_input_table td:last-child,table.wc_tax_rates td:last-child{border-left:0}table.wc_input_table tr.current td,table.wc_tax_rates tr.current td{background-color:#fefbcc}table.wc_input_table .cost,table.wc_input_table .item_cost,table.wc_tax_rates .cost,table.wc_tax_rates .item_cost{text-align:left}table.wc_input_table .cost input,table.wc_input_table .item_cost input,table.wc_tax_rates .cost input,table.wc_tax_rates .item_cost input{text-align:left}table.wc_input_table th.sort,table.wc_tax_rates th.sort{width:17px;padding:0 4px}table.wc_input_table td.sort,table.wc_tax_rates td.sort{padding:0 4px}table.wc_input_table .ui-sortable:not(.ui-sortable-disabled) td.sort,table.wc_tax_rates .ui-sortable:not(.ui-sortable-disabled) td.sort{cursor:move;font-size:15px;background:#f9f9f9;text-align:center;vertical-align:middle}table.wc_input_table .ui-sortable:not(.ui-sortable-disabled) td.sort::before,table.wc_tax_rates .ui-sortable:not(.ui-sortable-disabled) td.sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:right;height:100%}table.wc_input_table .ui-sortable:not(.ui-sortable-disabled) td.sort:hover::before,table.wc_tax_rates .ui-sortable:not(.ui-sortable-disabled) td.sort:hover::before{color:#333}table.wc_input_table .button,table.wc_tax_rates .button{float:right;margin-left:5px}table.wc_input_table .export,table.wc_input_table .import,table.wc_tax_rates .export,table.wc_tax_rates .import{float:left;margin-left:0;margin-right:5px}table.wc_input_table span.tips,table.wc_tax_rates span.tips{padding:0 3px}table.wc_input_table .pagination,table.wc_tax_rates .pagination{float:left}table.wc_input_table .pagination .button,table.wc_tax_rates .pagination .button{margin-right:5px;margin-left:0}table.wc_input_table .pagination .current,table.wc_tax_rates .pagination .current{background:#bbb;text-shadow:none}table.wc_input_table tr:last-child td,table.wc_tax_rates tr:last-child td{border-bottom:0}table.wc_emails,table.wc_gateways,table.wc_shipping{position:relative}table.wc_emails td,table.wc_emails th,table.wc_gateways td,table.wc_gateways th,table.wc_shipping td,table.wc_shipping th{display:table-cell!important;padding:1em!important;vertical-align:top;line-height:1.75em}table.wc_emails.wc_emails td,table.wc_gateways.wc_emails td,table.wc_shipping.wc_emails td{vertical-align:middle}table.wc_emails tr:nth-child(odd) td,table.wc_gateways tr:nth-child(odd) td,table.wc_shipping tr:nth-child(odd) td{background:#f9f9f9}table.wc_emails td.name,table.wc_gateways td.name,table.wc_shipping td.name{font-weight:700}table.wc_emails .settings,table.wc_gateways .settings,table.wc_shipping .settings{text-align:left}table.wc_emails .default,table.wc_emails .radio,table.wc_emails .status,table.wc_gateways .default,table.wc_gateways .radio,table.wc_gateways .status,table.wc_shipping .default,table.wc_shipping .radio,table.wc_shipping .status{text-align:center}table.wc_emails .default .tips,table.wc_emails .radio .tips,table.wc_emails .status .tips,table.wc_gateways .default .tips,table.wc_gateways .radio .tips,table.wc_gateways .status .tips,table.wc_shipping .default .tips,table.wc_shipping .radio .tips,table.wc_shipping .status .tips{margin:0 auto}table.wc_emails .default input,table.wc_emails .radio input,table.wc_emails .status input,table.wc_gateways .default input,table.wc_gateways .radio input,table.wc_gateways .status input,table.wc_shipping .default input,table.wc_shipping .radio input,table.wc_shipping .status input{margin:0}table.wc_emails td.sort,table.wc_gateways td.sort,table.wc_shipping td.sort{font-size:15px;text-align:center}table.wc_emails td.sort .wc-item-reorder-nav,table.wc_gateways td.sort .wc-item-reorder-nav,table.wc_shipping td.sort .wc-item-reorder-nav{white-space:nowrap;width:72px}table.wc_emails td.sort .wc-item-reorder-nav:before,table.wc_gateways td.sort .wc-item-reorder-nav:before,table.wc_shipping td.sort .wc-item-reorder-nav:before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:24px;float:right;height:100%;line-height:24px;cursor:move}table.wc_emails td.sort .wc-item-reorder-nav button,table.wc_gateways td.sort .wc-item-reorder-nav button,table.wc_shipping td.sort .wc-item-reorder-nav button{position:relative;overflow:hidden;float:right;display:block;width:24px;height:24px;margin:0;background:0 0;border:none;-webkit-box-shadow:none;box-shadow:none;color:#82878c;text-indent:-9999px;cursor:pointer;outline:0}table.wc_emails td.sort .wc-item-reorder-nav button:before,table.wc_gateways td.sort .wc-item-reorder-nav button:before,table.wc_shipping td.sort .wc-item-reorder-nav button:before{display:inline-block;position:absolute;top:0;left:0;width:100%;height:100%;font:normal 20px/23px dashicons;text-align:center;text-indent:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}table.wc_emails td.sort .wc-item-reorder-nav button:focus,table.wc_emails td.sort .wc-item-reorder-nav button:hover,table.wc_gateways td.sort .wc-item-reorder-nav button:focus,table.wc_gateways td.sort .wc-item-reorder-nav button:hover,table.wc_shipping td.sort .wc-item-reorder-nav button:focus,table.wc_shipping td.sort .wc-item-reorder-nav button:hover{color:#191e23}table.wc_emails td.sort .wc-item-reorder-nav .wc-move-down:before,table.wc_gateways td.sort .wc-item-reorder-nav .wc-move-down:before,table.wc_shipping td.sort .wc-item-reorder-nav .wc-move-down:before{content:"\f347"}table.wc_emails td.sort .wc-item-reorder-nav .wc-move-up:before,table.wc_gateways td.sort .wc-item-reorder-nav .wc-move-up:before,table.wc_shipping td.sort .wc-item-reorder-nav .wc-move-up:before{content:"\f343"}table.wc_emails td.sort .wc-item-reorder-nav .wc-move-disabled,table.wc_gateways td.sort .wc-item-reorder-nav .wc-move-disabled,table.wc_shipping td.sort .wc-item-reorder-nav .wc-move-disabled{color:#d5d5d5!important;cursor:default;pointer-events:none}table.wc_emails .wc-payment-gateway-method-name,table.wc_gateways .wc-payment-gateway-method-name,table.wc_shipping .wc-payment-gateway-method-name{font-weight:400}table.wc_emails .wc-email-settings-table-name,table.wc_gateways .wc-email-settings-table-name,table.wc_shipping .wc-email-settings-table-name{font-weight:700}table.wc_emails .wc-email-settings-table-name span,table.wc_gateways .wc-email-settings-table-name span,table.wc_shipping .wc-email-settings-table-name span{font-weight:400;color:#999;margin:0 4px 0 0!important}table.wc_emails .wc-payment-gateway-method-toggle-disabled,table.wc_emails .wc-payment-gateway-method-toggle-enabled,table.wc_gateways .wc-payment-gateway-method-toggle-disabled,table.wc_gateways .wc-payment-gateway-method-toggle-enabled,table.wc_shipping .wc-payment-gateway-method-toggle-disabled,table.wc_shipping .wc-payment-gateway-method-toggle-enabled{padding-top:1px;display:block;outline:0;-webkit-box-shadow:none;box-shadow:none}table.wc_emails .wc-email-settings-table-status,table.wc_gateways .wc-email-settings-table-status,table.wc_shipping .wc-email-settings-table-status{text-align:center;width:1em}table.wc_emails .wc-email-settings-table-status .tips,table.wc_gateways .wc-email-settings-table-status .tips,table.wc_shipping .wc-email-settings-table-status .tips{margin:0 auto}.wc-shipping-zone-settings th{padding:24px 0 24px 24px}.wc-shipping-zone-settings td.forminp input,.wc-shipping-zone-settings td.forminp textarea{padding:8px;width:448px;max-width:100%!important}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select{width:448px;max-width:100%!important}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select .select2-choices{padding:8px 8px 4px;border-color:#ddd;min-height:0;line-height:1}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select .select2-choices input{padding:0}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select .select2-choices li{margin:0 0 4px 4px}.wc-shipping-zone-settings .wc-shipping-zone-postcodes-toggle{margin:.5em 0 0;font-size:.9em;text-decoration:underline;display:block}.wc-shipping-zone-settings .wc-shipping-zone-postcodes-toggle+.wc-shipping-zone-postcodes{display:none}.wc-shipping-zone-settings .wc-shipping-zone-postcodes textarea{margin:10px 0}.wc-shipping-zone-settings .wc-shipping-zone-postcodes .description{font-size:.9em;color:#999}.wc-shipping-zone-settings+p.submit{margin-top:0}table tr table.wc-shipping-zone-methods tr .row-actions,table tr:hover table.wc-shipping-zone-methods tr .row-actions{position:relative}table tr table.wc-shipping-zone-methods tr:hover .row-actions,table tr:hover table.wc-shipping-zone-methods tr:hover .row-actions{position:static}.wc-shipping-zones-heading .page-title-action{display:inline-block}table.wc-shipping-classes td,table.wc-shipping-classes th,table.wc-shipping-zone-methods td,table.wc-shipping-zone-methods th,table.wc-shipping-zones td,table.wc-shipping-zones th{vertical-align:top;line-height:24px;padding:1em!important;font-size:14px;background:#fff;display:table-cell!important}table.wc-shipping-classes td li,table.wc-shipping-classes th li,table.wc-shipping-zone-methods td li,table.wc-shipping-zone-methods th li,table.wc-shipping-zones td li,table.wc-shipping-zones th li{line-height:24px;font-size:14px}table.wc-shipping-classes td .woocommerce-help-tip,table.wc-shipping-classes th .woocommerce-help-tip,table.wc-shipping-zone-methods td .woocommerce-help-tip,table.wc-shipping-zone-methods th .woocommerce-help-tip,table.wc-shipping-zones td .woocommerce-help-tip,table.wc-shipping-zones th .woocommerce-help-tip{margin:0!important}table.wc-shipping-classes thead th,table.wc-shipping-zone-methods thead th,table.wc-shipping-zones thead th{vertical-align:middle}table.wc-shipping-classes thead .wc-shipping-zone-sort,table.wc-shipping-zone-methods thead .wc-shipping-zone-sort,table.wc-shipping-zones thead .wc-shipping-zone-sort{text-align:center}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state,table.wc-shipping-classes td.wc-shipping-zones-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state,table.wc-shipping-zones td.wc-shipping-zones-blank-state{background:#f7f1f6!important;overflow:hidden;position:relative;padding:7.5em 7.5%!important;border-bottom:2px solid #eee2ec}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-classes td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zones td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state{padding:2em!important}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-classes td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zones td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state p{margin-bottom:0}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state li,table.wc-shipping-classes td.wc-shipping-zone-method-blank-state p,table.wc-shipping-classes td.wc-shipping-zones-blank-state li,table.wc-shipping-classes td.wc-shipping-zones-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state p,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state p,table.wc-shipping-zones td.wc-shipping-zones-blank-state li,table.wc-shipping-zones td.wc-shipping-zones-blank-state p{color:#a46497;font-size:1.5em;line-height:1.5em;margin:0 0 1em;position:relative;z-index:1;text-shadow:-1px 1px 1px #fff}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state li.main,table.wc-shipping-classes td.wc-shipping-zone-method-blank-state p.main,table.wc-shipping-classes td.wc-shipping-zones-blank-state li.main,table.wc-shipping-classes td.wc-shipping-zones-blank-state p.main,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state li.main,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state p.main,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state li.main,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state p.main,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state li.main,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state p.main,table.wc-shipping-zones td.wc-shipping-zones-blank-state li.main,table.wc-shipping-zones td.wc-shipping-zones-blank-state p.main{font-size:2em}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state li,table.wc-shipping-classes td.wc-shipping-zones-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state li,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zones td.wc-shipping-zones-blank-state li{margin-right:1em;list-style:circle inside}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state::before,table.wc-shipping-classes td.wc-shipping-zones-blank-state::before,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state::before,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state::before,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state::before,table.wc-shipping-zones td.wc-shipping-zones-blank-state::before{content:'\e01b';font-family:WooCommerce;text-align:center;line-height:1;color:#eee2ec;display:block;width:1em;font-size:40em;top:50%;left:-3.75%;margin-top:-.1875em;position:absolute}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state .button-primary,table.wc-shipping-classes td.wc-shipping-zones-blank-state .button-primary,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state .button-primary,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state .button-primary,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state .button-primary,table.wc-shipping-zones td.wc-shipping-zones-blank-state .button-primary{background-color:#804877;border-color:#804877;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 0 rgba(0,0,0,.15);margin:0;opacity:1;text-shadow:0 -1px 1px #8a4f7f,-1px 0 1px #8a4f7f,0 1px 1px #8a4f7f,1px 0 1px #8a4f7f;font-size:1.5em;padding:.75em 1em;height:auto;position:relative;z-index:1}table.wc-shipping-classes .wc-shipping-zone-method-rows tr:nth-child(even) td,table.wc-shipping-zone-methods .wc-shipping-zone-method-rows tr:nth-child(even) td,table.wc-shipping-zones .wc-shipping-zone-method-rows tr:nth-child(even) td{background:#f9f9f9}table.wc-shipping-classes .wc-shipping-class-rows tr:nth-child(odd) td,table.wc-shipping-classes tr.odd td,table.wc-shipping-zone-methods .wc-shipping-class-rows tr:nth-child(odd) td,table.wc-shipping-zone-methods tr.odd td,table.wc-shipping-zones .wc-shipping-class-rows tr:nth-child(odd) td,table.wc-shipping-zones tr.odd td{background:#f9f9f9}table.wc-shipping-classes tbody.wc-shipping-zone-rows td,table.wc-shipping-zone-methods tbody.wc-shipping-zone-rows td,table.wc-shipping-zones tbody.wc-shipping-zone-rows td{border-top:2px solid #f9f9f9}table.wc-shipping-classes tbody.wc-shipping-zone-rows tr:first-child td,table.wc-shipping-zone-methods tbody.wc-shipping-zone-rows tr:first-child td,table.wc-shipping-zones tbody.wc-shipping-zone-rows tr:first-child td{border-top:0}table.wc-shipping-classes tr.wc-shipping-zone-worldwide td,table.wc-shipping-zone-methods tr.wc-shipping-zone-worldwide td,table.wc-shipping-zones tr.wc-shipping-zone-worldwide td{background:#f9f9f9;border-top:2px solid #e1e1e1}table.wc-shipping-classes p,table.wc-shipping-classes ul,table.wc-shipping-zone-methods p,table.wc-shipping-zone-methods ul,table.wc-shipping-zones p,table.wc-shipping-zones ul{margin:0}table.wc-shipping-classes td.wc-shipping-zone-method-sort,table.wc-shipping-classes td.wc-shipping-zone-sort,table.wc-shipping-zone-methods td.wc-shipping-zone-method-sort,table.wc-shipping-zone-methods td.wc-shipping-zone-sort,table.wc-shipping-zones td.wc-shipping-zone-method-sort,table.wc-shipping-zones td.wc-shipping-zone-sort{cursor:move;font-size:15px;text-align:center}table.wc-shipping-classes td.wc-shipping-zone-method-sort::before,table.wc-shipping-classes td.wc-shipping-zone-sort::before,table.wc-shipping-zone-methods td.wc-shipping-zone-method-sort::before,table.wc-shipping-zone-methods td.wc-shipping-zone-sort::before,table.wc-shipping-zones td.wc-shipping-zone-method-sort::before,table.wc-shipping-zones td.wc-shipping-zone-sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:right;height:100%;line-height:24px}table.wc-shipping-classes td.wc-shipping-zone-method-sort:hover::before,table.wc-shipping-classes td.wc-shipping-zone-sort:hover::before,table.wc-shipping-zone-methods td.wc-shipping-zone-method-sort:hover::before,table.wc-shipping-zone-methods td.wc-shipping-zone-sort:hover::before,table.wc-shipping-zones td.wc-shipping-zone-method-sort:hover::before,table.wc-shipping-zones td.wc-shipping-zone-sort:hover::before{color:#333}table.wc-shipping-classes td.wc-shipping-zone-worldwide,table.wc-shipping-zone-methods td.wc-shipping-zone-worldwide,table.wc-shipping-zones td.wc-shipping-zone-worldwide{text-align:center}table.wc-shipping-classes td.wc-shipping-zone-worldwide::before,table.wc-shipping-zone-methods td.wc-shipping-zone-worldwide::before,table.wc-shipping-zones td.wc-shipping-zone-worldwide::before{content:'\f319';font-family:dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:right;height:100%;line-height:24px}table.wc-shipping-classes .wc-shipping-zone-methods,table.wc-shipping-classes .wc-shipping-zone-name,table.wc-shipping-zone-methods .wc-shipping-zone-methods,table.wc-shipping-zone-methods .wc-shipping-zone-name,table.wc-shipping-zones .wc-shipping-zone-methods,table.wc-shipping-zones .wc-shipping-zone-name{width:25%}table.wc-shipping-classes .wc-shipping-class-description input,table.wc-shipping-classes .wc-shipping-class-description select,table.wc-shipping-classes .wc-shipping-class-description textarea,table.wc-shipping-classes .wc-shipping-class-name input,table.wc-shipping-classes .wc-shipping-class-name select,table.wc-shipping-classes .wc-shipping-class-name textarea,table.wc-shipping-classes .wc-shipping-class-slug input,table.wc-shipping-classes .wc-shipping-class-slug select,table.wc-shipping-classes .wc-shipping-class-slug textarea,table.wc-shipping-classes .wc-shipping-zone-name input,table.wc-shipping-classes .wc-shipping-zone-name select,table.wc-shipping-classes .wc-shipping-zone-name textarea,table.wc-shipping-classes .wc-shipping-zone-region input,table.wc-shipping-classes .wc-shipping-zone-region select,table.wc-shipping-classes .wc-shipping-zone-region textarea,table.wc-shipping-zone-methods .wc-shipping-class-description input,table.wc-shipping-zone-methods .wc-shipping-class-description select,table.wc-shipping-zone-methods .wc-shipping-class-description textarea,table.wc-shipping-zone-methods .wc-shipping-class-name input,table.wc-shipping-zone-methods .wc-shipping-class-name select,table.wc-shipping-zone-methods .wc-shipping-class-name textarea,table.wc-shipping-zone-methods .wc-shipping-class-slug input,table.wc-shipping-zone-methods .wc-shipping-class-slug select,table.wc-shipping-zone-methods .wc-shipping-class-slug textarea,table.wc-shipping-zone-methods .wc-shipping-zone-name input,table.wc-shipping-zone-methods .wc-shipping-zone-name select,table.wc-shipping-zone-methods .wc-shipping-zone-name textarea,table.wc-shipping-zone-methods .wc-shipping-zone-region input,table.wc-shipping-zone-methods .wc-shipping-zone-region select,table.wc-shipping-zone-methods .wc-shipping-zone-region textarea,table.wc-shipping-zones .wc-shipping-class-description input,table.wc-shipping-zones .wc-shipping-class-description select,table.wc-shipping-zones .wc-shipping-class-description textarea,table.wc-shipping-zones .wc-shipping-class-name input,table.wc-shipping-zones .wc-shipping-class-name select,table.wc-shipping-zones .wc-shipping-class-name textarea,table.wc-shipping-zones .wc-shipping-class-slug input,table.wc-shipping-zones .wc-shipping-class-slug select,table.wc-shipping-zones .wc-shipping-class-slug textarea,table.wc-shipping-zones .wc-shipping-zone-name input,table.wc-shipping-zones .wc-shipping-zone-name select,table.wc-shipping-zones .wc-shipping-zone-name textarea,table.wc-shipping-zones .wc-shipping-zone-region input,table.wc-shipping-zones .wc-shipping-zone-region select,table.wc-shipping-zones .wc-shipping-zone-region textarea{width:100%}table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-zone-delete{color:#a00}table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-zone-delete:hover{color:red}table.wc-shipping-classes .wc-shipping-class-count,table.wc-shipping-zone-methods .wc-shipping-class-count,table.wc-shipping-zones .wc-shipping-class-count{text-align:center}table.wc-shipping-classes td.wc-shipping-zone-methods,table.wc-shipping-zone-methods td.wc-shipping-zone-methods,table.wc-shipping-zones td.wc-shipping-zone-methods{color:#555}table.wc-shipping-classes td.wc-shipping-zone-methods .method_disabled,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .method_disabled,table.wc-shipping-zones td.wc-shipping-zone-methods .method_disabled{text-decoration:line-through}table.wc-shipping-classes td.wc-shipping-zone-methods ul,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul,table.wc-shipping-zones td.wc-shipping-zone-methods ul{position:relative;padding-left:32px}table.wc-shipping-classes td.wc-shipping-zone-methods ul li,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul li,table.wc-shipping-zones td.wc-shipping-zone-methods ul li{color:#555;display:inline;margin:0}table.wc-shipping-classes td.wc-shipping-zone-methods ul li::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul li::before,table.wc-shipping-zones td.wc-shipping-zone-methods ul li::before{content:', '}table.wc-shipping-classes td.wc-shipping-zone-methods ul li:first-child::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul li:first-child::before,table.wc-shipping-zones td.wc-shipping-zone-methods ul li:first-child::before{content:''}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method{display:block;width:24px;padding:24px 0 0;height:0;overflow:hidden;cursor:pointer}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method::before,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";font-family:Dashicons;content:'\f502';color:#999;vertical-align:middle;line-height:24px;font-size:16px;margin:0}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method.disabled,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method.disabled,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method.disabled{cursor:not-allowed}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method.disabled::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method.disabled::before,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method.disabled::before{color:#ccc}table.wc-shipping-classes .wc-shipping-zone-method-title,table.wc-shipping-zone-methods .wc-shipping-zone-method-title,table.wc-shipping-zones .wc-shipping-zone-method-title{width:25%}table.wc-shipping-classes .wc-shipping-zone-method-title .wc-shipping-zone-method-delete,table.wc-shipping-zone-methods .wc-shipping-zone-method-title .wc-shipping-zone-method-delete,table.wc-shipping-zones .wc-shipping-zone-method-title .wc-shipping-zone-method-delete{color:red}table.wc-shipping-classes .wc-shipping-zone-method-enabled,table.wc-shipping-zone-methods .wc-shipping-zone-method-enabled,table.wc-shipping-zones .wc-shipping-zone-method-enabled{text-align:center}table.wc-shipping-classes .wc-shipping-zone-method-enabled a,table.wc-shipping-zone-methods .wc-shipping-zone-method-enabled a,table.wc-shipping-zones .wc-shipping-zone-method-enabled a{display:inline-block}table.wc-shipping-classes .wc-shipping-zone-method-enabled .woocommerce-input-toggle,table.wc-shipping-zone-methods .wc-shipping-zone-method-enabled .woocommerce-input-toggle,table.wc-shipping-zones .wc-shipping-zone-method-enabled .woocommerce-input-toggle{margin-top:3px}table.wc-shipping-classes .wc-shipping-zone-method-type,table.wc-shipping-zone-methods .wc-shipping-zone-method-type,table.wc-shipping-zones .wc-shipping-zone-method-type{display:block}table.wc-shipping-classes tfoot input,table.wc-shipping-classes tfoot select,table.wc-shipping-zone-methods tfoot input,table.wc-shipping-zone-methods tfoot select,table.wc-shipping-zones tfoot input,table.wc-shipping-zones tfoot select{vertical-align:middle!important}table.wc-shipping-classes tfoot .button-secondary,table.wc-shipping-zone-methods tfoot .button-secondary,table.wc-shipping-zones tfoot .button-secondary{float:left}table.wc-shipping-classes .editing .wc-shipping-zone-edit,table.wc-shipping-classes .editing .wc-shipping-zone-view,table.wc-shipping-zone-methods .editing .wc-shipping-zone-edit,table.wc-shipping-zone-methods .editing .wc-shipping-zone-view,table.wc-shipping-zones .editing .wc-shipping-zone-edit,table.wc-shipping-zones .editing .wc-shipping-zone-view{display:none}.woocommerce-input-toggle{height:16px;width:32px;border:2px solid #935687;background-color:#935687;display:inline-block;text-indent:-9999px;border-radius:10em;position:relative;margin-top:-1px;vertical-align:text-top}.woocommerce-input-toggle:before{content:"";display:block;width:16px;height:16px;background:#fff;position:absolute;top:0;left:0;border-radius:100%}.woocommerce-input-toggle.woocommerce-input-toggle--disabled{border-color:#999;background-color:#999}.woocommerce-input-toggle.woocommerce-input-toggle--disabled:before{left:auto;right:0}.woocommerce-input-toggle.woocommerce-input-toggle--loading{opacity:.5}.wc-modal-shipping-method-settings{background:#f8f8f8;padding:1em!important}.wc-modal-shipping-method-settings form .form-table{width:100%;background:#fff;margin:0 0 1.5em}.wc-modal-shipping-method-settings form .form-table tr th{width:30%;position:relative}.wc-modal-shipping-method-settings form .form-table tr th .woocommerce-help-tip{float:left;margin:-8px 0 0 -.5em;vertical-align:middle;left:0;top:50%;position:absolute}.wc-modal-shipping-method-settings form .form-table tr td input,.wc-modal-shipping-method-settings form .form-table tr td select,.wc-modal-shipping-method-settings form .form-table tr td textarea{width:50%;min-width:250px}.wc-modal-shipping-method-settings form .form-table tr td input[type=checkbox]{width:auto;min-width:16px}.wc-modal-shipping-method-settings form .form-table tr td,.wc-modal-shipping-method-settings form .form-table tr th{vertical-align:middle;margin:0;line-height:24px;padding:1em;border-bottom:1px solid #f8f8f8}.wc-modal-shipping-method-settings form .form-table:last-of-type{margin-bottom:0}.wc-backbone-modal .wc-shipping-zone-method-selector p{margin-top:0}.wc-backbone-modal .wc-shipping-zone-method-selector .wc-shipping-zone-method-description{margin:.75em 1px 0;line-height:1.5em;color:#999;font-style:italic}.wc-backbone-modal .wc-shipping-zone-method-selector select{width:100%;cursor:pointer}img.help_tip{margin:0 9px 0 0;vertical-align:middle}.postbox img.help_tip{margin-top:0}.postbox .woocommerce-help-tip{margin:0 9px 0 0}.status-disabled,.status-enabled,.status-manual{font-size:1.4em;display:block;text-indent:-9999px;position:relative;height:1em;width:1em}.status-manual::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#999}.status-enabled::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#a46497}.status-disabled::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}.woocommerce h2.woo-nav-tab-wrapper{margin-bottom:1em}.woocommerce nav.woo-nav-tab-wrapper{margin:1.5em 0 1em}.woocommerce .subsubsub{margin:-8px 0 0}.woocommerce .wc-admin-breadcrumb{margin-right:.5em}.woocommerce .wc-admin-breadcrumb a{color:#a46497}.woocommerce #template div{margin:0}.woocommerce #template div p .button{float:left;margin-right:10px;margin-top:-4px}.woocommerce #template div .editor textarea{margin-bottom:8px}.woocommerce textarea[disabled=disabled]{background:#dfdfdf!important}.woocommerce table.form-table{margin:0;position:relative;table-layout:fixed}.woocommerce table.form-table .forminp-radio ul{margin:0}.woocommerce table.form-table .forminp-radio ul li{line-height:1.4em}.woocommerce table.form-table input[type=email],.woocommerce table.form-table input[type=number],.woocommerce table.form-table input[type=text]{height:auto}.woocommerce table.form-table textarea.input-text{height:100%;min-width:150px;display:block}.woocommerce table.form-table input.regular-input,.woocommerce table.form-table input[type=email],.woocommerce table.form-table input[type=number],.woocommerce table.form-table input[type=text],.woocommerce table.form-table textarea{width:400px;margin:0;padding:6px;-webkit-box-sizing:border-box;box-sizing:border-box;vertical-align:top}.woocommerce table.form-table select{width:400px;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box;height:32px;line-height:32px;vertical-align:top}.woocommerce table.form-table input[size]{width:auto!important}.woocommerce table.form-table table input.regular-input,.woocommerce table.form-table table input[type=email],.woocommerce table.form-table table input[type=number],.woocommerce table.form-table table input[type=text],.woocommerce table.form-table table select,.woocommerce table.form-table table textarea{width:auto}.woocommerce table.form-table textarea.wide-input{width:100%}.woocommerce table.form-table .woocommerce-help-tip,.woocommerce table.form-table img.help_tip{padding:0;margin:-4px 5px 0 0;vertical-align:middle;cursor:help;line-height:1}.woocommerce table.form-table span.help_tip{cursor:help;color:#2ea2cc}.woocommerce table.form-table th{position:relative;padding-left:24px}.woocommerce table.form-table th label{position:relative;display:block}.woocommerce table.form-table th label .woocommerce-help-tip,.woocommerce table.form-table th label img.help_tip{margin:-8px 0 0 -24px;position:absolute;left:0;top:50%}.woocommerce table.form-table th label+.woocommerce-help-tip{margin:0;position:absolute;left:0;top:20px}.woocommerce table.form-table woocommerce-help-tip .select2-container{vertical-align:top;margin-bottom:3px}.woocommerce table.form-table table.widefat th{padding-left:inherit}.woocommerce table.form-table .wp-list-table .woocommerce-help-tip{float:none}.woocommerce table.form-table fieldset{margin-top:4px}.woocommerce table.form-table fieldset .woocommerce-help-tip,.woocommerce table.form-table fieldset img.help_tip{margin:-3px 5px 0 0}.woocommerce table.form-table fieldset p.description{margin-bottom:8px}.woocommerce table.form-table fieldset:first-child{margin-top:0}.woocommerce table.form-table .iris-picker{z-index:100;display:none;position:absolute;border:1px solid #ccc;border-radius:3px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.2);box-shadow:0 1px 3px rgba(0,0,0,.2)}.woocommerce table.form-table .iris-picker .ui-slider{border:0!important;margin:0!important;width:auto!important;height:auto!important;background:none transparent!important}.woocommerce table.form-table .iris-picker .ui-slider .ui-slider-handle{margin-bottom:0!important}.woocommerce table.form-table .iris-error{background-color:#ffafaf}.woocommerce table.form-table .colorpickpreview{padding:7px 0;line-height:1em;display:inline-block;width:26px;border:1px solid #ddd;font-size:14px}.woocommerce table.form-table .image_width_settings{vertical-align:middle}.woocommerce table.form-table .image_width_settings label{margin-right:10px}.woocommerce table.form-table .image_width_settings input{width:auto}.woocommerce table.form-table .wc_emails_wrapper,.woocommerce table.form-table .wc_payment_gateways_wrapper{padding:0 0 10px 15px}.woocommerce #tabs-wrap table a.remove{margin-right:4px}.woocommerce #tabs-wrap table p{margin:0 0 4px!important;overflow:hidden;zoom:1}.woocommerce #tabs-wrap table p a.add{float:right}#wp-excerpt-editor-container{background:#fff}#product_variation-parent #parent_id{width:100%}#postimagediv img{border:1px solid #d5d5d5;max-width:100%}#woocommerce-product-images .inside{margin:0;padding:0}#woocommerce-product-images .inside .add_product_images{padding:0 12px 12px}#woocommerce-product-images .inside #product_images_container{padding:0 9px 0 0}#woocommerce-product-images .inside #product_images_container ul{margin:0;padding:0}#woocommerce-product-images .inside #product_images_container ul::after,#woocommerce-product-images .inside #product_images_container ul::before{content:' ';display:table}#woocommerce-product-images .inside #product_images_container ul::after{clear:both}#woocommerce-product-images .inside #product_images_container ul li.add,#woocommerce-product-images .inside #product_images_container ul li.image,#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder{width:80px;float:right;cursor:move;border:1px solid #d5d5d5;margin:9px 0 0 9px;background:#f7f7f7;border-radius:2px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box}#woocommerce-product-images .inside #product_images_container ul li.add img,#woocommerce-product-images .inside #product_images_container ul li.image img,#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder img{width:100%;height:auto;display:block}#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder{border:3px dashed #ddd;position:relative}#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";font-size:2.618em;line-height:72px;color:#ddd}#woocommerce-product-images .inside #product_images_container ul ul.actions{position:absolute;top:-8px;left:-8px;padding:2px;display:none}#woocommerce-product-images .inside #product_images_container ul ul.actions li{float:left;margin:0 2px 0 0}#woocommerce-product-images .inside #product_images_container ul ul.actions li a{width:1em;height:1em;margin:0;height:0;display:block;overflow:hidden}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.tips{cursor:pointer}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.delete{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.4em}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.delete::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#999;background:#fff;border-radius:50%;height:1em;width:1em;line-height:1em}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.delete:hover::before{color:#a00}#woocommerce-product-images .inside #product_images_container ul li:hover ul.actions{display:block}#woocommerce-product-data .hndle{padding:10px}#woocommerce-product-data .hndle span{display:block;vertical-align:middle;line-height:24px}#woocommerce-product-data .hndle span span{display:inline;line-height:inherit;vertical-align:baseline}#woocommerce-product-data .hndle select{margin:0}#woocommerce-product-data .hndle label{padding-left:1em;font-size:12px;vertical-align:baseline}#woocommerce-product-data .hndle label:first-child{margin-left:1em;border-left:1px solid #dfdfdf}#woocommerce-product-data .hndle input,#woocommerce-product-data .hndle select{margin-top:-3px 0 0;vertical-align:middle}#woocommerce-product-data .hndle select{margin-right:.5em}#woocommerce-product-data>.handlediv{margin-top:4px}#woocommerce-product-data .wrap{margin:0}#woocommerce-coupon-description{padding:3px 8px;font-size:1.7em;line-height:1.42em;height:auto;width:100%;outline:0;margin:10px 0;display:block}#woocommerce-coupon-description::-webkit-input-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-description::-moz-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-description:-ms-input-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-description:-moz-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-data .panel-wrap,#woocommerce-product-data .panel-wrap{background:#fff}#woocommerce-coupon-data .wc-metaboxes-wrapper,#woocommerce-coupon-data .woocommerce_options_panel,#woocommerce-product-data .wc-metaboxes-wrapper,#woocommerce-product-data .woocommerce_options_panel{float:right;width:80%}#woocommerce-coupon-data .wc-metaboxes-wrapper .wc-radios,#woocommerce-coupon-data .woocommerce_options_panel .wc-radios,#woocommerce-product-data .wc-metaboxes-wrapper .wc-radios,#woocommerce-product-data .woocommerce_options_panel .wc-radios{display:block;float:right;margin:0}#woocommerce-coupon-data .wc-metaboxes-wrapper .wc-radios li,#woocommerce-coupon-data .woocommerce_options_panel .wc-radios li,#woocommerce-product-data .wc-metaboxes-wrapper .wc-radios li,#woocommerce-product-data .woocommerce_options_panel .wc-radios li{display:block;padding:0 0 10px}#woocommerce-coupon-data .wc-metaboxes-wrapper .wc-radios li input,#woocommerce-coupon-data .woocommerce_options_panel .wc-radios li input,#woocommerce-product-data .wc-metaboxes-wrapper .wc-radios li input,#woocommerce-product-data .woocommerce_options_panel .wc-radios li input{width:auto}#woocommerce-coupon-data .panel-wrap,#woocommerce-product-data .panel-wrap,.woocommerce .panel-wrap{overflow:hidden}#woocommerce-coupon-data ul.wc-tabs,#woocommerce-product-data ul.wc-tabs,.woocommerce ul.wc-tabs{margin:0;width:20%;float:right;line-height:1em;padding:0 0 10px;position:relative;background-color:#fafafa;border-left:1px solid #eee;-webkit-box-sizing:border-box;box-sizing:border-box}#woocommerce-coupon-data ul.wc-tabs::after,#woocommerce-product-data ul.wc-tabs::after,.woocommerce ul.wc-tabs::after{content:'';display:block;width:100%;height:9999em;position:absolute;bottom:-9999em;right:0;background-color:#fafafa;border-left:1px solid #eee}#woocommerce-coupon-data ul.wc-tabs li,#woocommerce-product-data ul.wc-tabs li,.woocommerce ul.wc-tabs li{margin:0;padding:0;display:block;position:relative}#woocommerce-coupon-data ul.wc-tabs li a,#woocommerce-product-data ul.wc-tabs li a,.woocommerce ul.wc-tabs li a{margin:0;padding:10px;display:block;-webkit-box-shadow:none;box-shadow:none;text-decoration:none;line-height:20px!important;border-bottom:1px solid #eee}#woocommerce-coupon-data ul.wc-tabs li a span,#woocommerce-product-data ul.wc-tabs li a span,.woocommerce ul.wc-tabs li a span{margin-right:.618em;margin-left:.618em}#woocommerce-coupon-data ul.wc-tabs li a::before,#woocommerce-product-data ul.wc-tabs li a::before,.woocommerce ul.wc-tabs li a::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;content:"";text-decoration:none}#woocommerce-coupon-data ul.wc-tabs li.general_options a::before,#woocommerce-product-data ul.wc-tabs li.general_options a::before,.woocommerce ul.wc-tabs li.general_options a::before{content:'\f107'}#woocommerce-coupon-data ul.wc-tabs li.inventory_options a::before,#woocommerce-product-data ul.wc-tabs li.inventory_options a::before,.woocommerce ul.wc-tabs li.inventory_options a::before{content:'\f481'}#woocommerce-coupon-data ul.wc-tabs li.shipping_options a::before,#woocommerce-product-data ul.wc-tabs li.shipping_options a::before,.woocommerce ul.wc-tabs li.shipping_options a::before{font-family:WooCommerce;content:'\e01a'}#woocommerce-coupon-data ul.wc-tabs li.linked_product_options a::before,#woocommerce-product-data ul.wc-tabs li.linked_product_options a::before,.woocommerce ul.wc-tabs li.linked_product_options a::before{content:'\f103'}#woocommerce-coupon-data ul.wc-tabs li.attribute_options a::before,#woocommerce-product-data ul.wc-tabs li.attribute_options a::before,.woocommerce ul.wc-tabs li.attribute_options a::before{content:'\f175'}#woocommerce-coupon-data ul.wc-tabs li.advanced_options a::before,#woocommerce-product-data ul.wc-tabs li.advanced_options a::before,.woocommerce ul.wc-tabs li.advanced_options a::before{font-family:Dashicons;content:'\f111'}#woocommerce-coupon-data ul.wc-tabs li.variations_options a::before,#woocommerce-product-data ul.wc-tabs li.variations_options a::before,.woocommerce ul.wc-tabs li.variations_options a::before{content:'\f509'}#woocommerce-coupon-data ul.wc-tabs li.usage_restriction_options a::before,#woocommerce-product-data ul.wc-tabs li.usage_restriction_options a::before,.woocommerce ul.wc-tabs li.usage_restriction_options a::before{font-family:WooCommerce;content:'\e602'}#woocommerce-coupon-data ul.wc-tabs li.usage_limit_options a::before,#woocommerce-product-data ul.wc-tabs li.usage_limit_options a::before,.woocommerce ul.wc-tabs li.usage_limit_options a::before{font-family:WooCommerce;content:'\e601'}#woocommerce-coupon-data ul.wc-tabs li.general_coupon_data a::before,#woocommerce-product-data ul.wc-tabs li.general_coupon_data a::before,.woocommerce ul.wc-tabs li.general_coupon_data a::before{font-family:WooCommerce;content:'\e600'}#woocommerce-coupon-data ul.wc-tabs li.active a,#woocommerce-product-data ul.wc-tabs li.active a,.woocommerce ul.wc-tabs li.active a{color:#555;position:relative;background-color:#eee}.woocommerce_page_wc-settings input[type=email],.woocommerce_page_wc-settings input[type=url]{direction:rtl}.woocommerce_page_wc-settings .shippingrows th.check-column{padding-top:20px}.woocommerce_page_wc-settings .shippingrows tfoot th{padding-right:10px}.woocommerce_page_wc-settings .shippingrows .add.button::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-left:.618em;content:"";text-decoration:none}.woocommerce_page_wc-settings h3.wc-settings-sub-title{font-size:1.2em}#woocommerce-coupon-data .inside,#woocommerce-order-data .inside,#woocommerce-order-downloads .inside,#woocommerce-product-data .inside,#woocommerce-product-type-options .inside{margin:0;padding:0}.panel,.woocommerce_options_panel{padding:9px;color:#555}.panel .form-field .woocommerce-help-tip,.woocommerce_options_panel .form-field .woocommerce-help-tip{font-size:1.4em}.panel,.woocommerce_page_settings .woocommerce_options_panel{padding:0}#woocommerce-product-specs .inside,#woocommerce-product-type-options .panel{margin:0;padding:9px}#woocommerce-product-type-options .panel p,.woocommerce_options_panel fieldset.form-field,.woocommerce_options_panel p{margin:0 0 9px;font-size:12px;padding:5px 9px;line-height:24px}#woocommerce-product-type-options .panel p::after,.woocommerce_options_panel fieldset.form-field::after,.woocommerce_options_panel p::after{content:'.';display:block;height:0;clear:both;visibility:hidden}.woocommerce_options_panel .checkbox,.woocommerce_variable_attributes .checkbox{width:auto;margin:4px 0!important;vertical-align:middle;float:right}.woocommerce_options_panel .downloadable_files table,.woocommerce_variations .downloadable_files table{width:100%;padding:0!important}.woocommerce_options_panel .downloadable_files table th,.woocommerce_variations .downloadable_files table th{padding:7px 7px 7px 0!important}.woocommerce_options_panel .downloadable_files table th.sort,.woocommerce_variations .downloadable_files table th.sort{width:17px;padding:7px!important}.woocommerce_options_panel .downloadable_files table th .woocommerce-help-tip,.woocommerce_variations .downloadable_files table th .woocommerce-help-tip{font-size:1.1em;margin-right:0}.woocommerce_options_panel .downloadable_files table td,.woocommerce_variations .downloadable_files table td{vertical-align:middle!important;padding:4px 7px 4px 0!important;position:relative}.woocommerce_options_panel .downloadable_files table td:last-child,.woocommerce_variations .downloadable_files table td:last-child{padding-left:7px!important}.woocommerce_options_panel .downloadable_files table td input.input_text,.woocommerce_variations .downloadable_files table td input.input_text{width:100%;float:none;min-width:0;margin:1px 0}.woocommerce_options_panel .downloadable_files table td .upload_file_button,.woocommerce_variations .downloadable_files table td .upload_file_button{width:auto;float:left;cursor:pointer}.woocommerce_options_panel .downloadable_files table td .delete,.woocommerce_variations .downloadable_files table td .delete{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.2em}.woocommerce_options_panel .downloadable_files table td .delete::before,.woocommerce_variations .downloadable_files table td .delete::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#999}.woocommerce_options_panel .downloadable_files table td .delete:hover::before,.woocommerce_variations .downloadable_files table td .delete:hover::before{color:#a00}.woocommerce_options_panel .downloadable_files table td.sort,.woocommerce_variations .downloadable_files table td.sort{width:17px;cursor:move;font-size:15px;text-align:center;background:#f9f9f9;padding-left:7px!important}.woocommerce_options_panel .downloadable_files table td.sort::before,.woocommerce_variations .downloadable_files table td.sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:right;height:100%}.woocommerce_options_panel .downloadable_files table td.sort:hover::before,.woocommerce_variations .downloadable_files table td.sort:hover::before{color:#333}.woocommerce_variation h3 .sort{width:17px;height:26px;cursor:move;float:left;font-size:15px;font-weight:400;margin-left:.5em;visibility:hidden;text-align:center;vertical-align:middle}.woocommerce_variation h3 .sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:28px;color:#999;display:block;width:17px;float:right;height:100%}.woocommerce_variation h3 .sort:hover::before{color:#777}.woocommerce_variation h3:hover .sort,.woocommerce_variation.ui-sortable-helper .sort{visibility:visible}.woocommerce_options_panel{min-height:175px;-webkit-box-sizing:border-box;box-sizing:border-box}.woocommerce_options_panel .downloadable_files{padding:0 162px 0 9px;position:relative;margin:9px 0}.woocommerce_options_panel .downloadable_files label{position:absolute;right:0;margin:0 12px 0 0;line-height:24px}.woocommerce_options_panel p{margin:9px 0}.woocommerce_options_panel fieldset.form-field,.woocommerce_options_panel p.form-field{padding:5px 162px 5px 20px!important}.woocommerce_options_panel .sale_price_dates_fields .short:first-of-type{margin-bottom:1em}.woocommerce_options_panel .sale_price_dates_fields .short:nth-of-type(2){clear:right}.woocommerce_options_panel label,.woocommerce_options_panel legend{float:right;width:150px;padding:0;margin:0 -150px 0 0}.woocommerce_options_panel label .req,.woocommerce_options_panel legend .req{font-weight:700;font-style:normal;color:#a00}.woocommerce_options_panel .description{padding:0;margin:0 7px 0 0;clear:none;display:inline}.woocommerce_options_panel .description-block{margin-right:0;display:block}.woocommerce_options_panel input,.woocommerce_options_panel select,.woocommerce_options_panel textarea{margin:0}.woocommerce_options_panel textarea{float:right;height:3.5em;line-height:1.5em;vertical-align:top}.woocommerce_options_panel input[type=email],.woocommerce_options_panel input[type=number],.woocommerce_options_panel input[type=password],.woocommerce_options_panel input[type=text]{width:50%;float:right}.woocommerce_options_panel input.button{width:auto;margin-right:8px}.woocommerce_options_panel select{float:right}.woocommerce_options_panel .short,.woocommerce_options_panel input[type=email].short,.woocommerce_options_panel input[type=number].short,.woocommerce_options_panel input[type=password].short,.woocommerce_options_panel input[type=text].short{width:50%}.woocommerce_options_panel .sized{width:auto!important;margin-left:6px}.woocommerce_options_panel .options_group{border-top:1px solid #fff;border-bottom:1px solid #eee}.woocommerce_options_panel .options_group:first-child{border-top:0}.woocommerce_options_panel .options_group:last-child{border-bottom:0}.woocommerce_options_panel .options_group fieldset{margin:9px 0;font-size:12px;padding:5px 9px;line-height:24px}.woocommerce_options_panel .options_group fieldset label{width:auto;float:none}.woocommerce_options_panel .options_group fieldset ul{float:right;width:50%;margin:0;padding:0}.woocommerce_options_panel .options_group fieldset ul li{margin:0;width:auto}.woocommerce_options_panel .options_group fieldset ul li input{width:auto;float:none;margin-left:4px}.woocommerce_options_panel .options_group fieldset ul.wc-radios label{margin-right:0}.woocommerce_options_panel .dimensions_field .wrap{display:block;width:50%}.woocommerce_options_panel .dimensions_field .wrap input{width:30.75%;margin-left:3.8%}.woocommerce_options_panel .dimensions_field .wrap .last{margin-left:0}.woocommerce_options_panel.padded{padding:1em}.woocommerce_options_panel .select2-container{float:right}#woocommerce-product-data input.dp-applied{float:right}#grouped_product_options,#simple_product_options,#virtual_product_options{padding:12px;font-style:italic;color:#666}.wc-metaboxes-wrapper .toolbar{margin:0!important;border-top:1px solid #fff;border-bottom:1px solid #eee;padding:9px 12px!important}.wc-metaboxes-wrapper .toolbar:first-child{border-top:0}.wc-metaboxes-wrapper .toolbar:last-child{border-bottom:0}.wc-metaboxes-wrapper .toolbar .add_variation{float:left;margin-right:5px}.wc-metaboxes-wrapper .toolbar .cancel-variation-changes,.wc-metaboxes-wrapper .toolbar .save-variation-changes{float:right;margin-left:5px}.wc-metaboxes-wrapper p.toolbar{overflow:hidden;zoom:1}.wc-metaboxes-wrapper .expand-close{margin-left:2px;color:#777;font-size:12px;font-style:italic}.wc-metaboxes-wrapper .expand-close a{background:0 0;padding:0;font-size:12px;text-decoration:none}.wc-metaboxes-wrapper#product_attributes .expand-close{float:left;line-height:28px}.wc-metaboxes-wrapper .fr,.wc-metaboxes-wrapper button.add_variable_attribute{float:left;margin:0 6px 0 0}.wc-metaboxes-wrapper .wc-metaboxes{border-bottom:1px solid #eee}.wc-metaboxes-wrapper .wc-metabox-sortable-placeholder{border-color:#bbb;background-color:#f5f5f5;margin-bottom:9px;border-width:1px;border-style:dashed}.wc-metaboxes-wrapper .wc-metabox{background:#fff;border-bottom:1px solid #eee;margin:0!important}.wc-metaboxes-wrapper .wc-metabox select{font-weight:400}.wc-metaboxes-wrapper .wc-metabox:last-of-type{border-bottom:0}.wc-metaboxes-wrapper .wc-metabox .handlediv{width:27px}.wc-metaboxes-wrapper .wc-metabox .handlediv::before{content:'\f142'!important;cursor:pointer;display:inline-block;font:400 20px/1 Dashicons;line-height:.5!important;padding:8px 10px;position:relative;left:12px;top:0}.wc-metaboxes-wrapper .wc-metabox.closed{border-radius:3px}.wc-metaboxes-wrapper .wc-metabox.closed .handlediv::before{content:'\f140'!important}.wc-metaboxes-wrapper .wc-metabox.closed h3{border:0}.wc-metaboxes-wrapper .wc-metabox h3{margin:0!important;padding:.75em 1em .75em .75em!important;font-size:1em!important;overflow:hidden;zoom:1;cursor:move}.wc-metaboxes-wrapper .wc-metabox h3 a.delete,.wc-metaboxes-wrapper .wc-metabox h3 button{float:left}.wc-metaboxes-wrapper .wc-metabox h3 a.delete{color:red;font-weight:400;line-height:26px;text-decoration:none;position:relative;visibility:hidden}.wc-metaboxes-wrapper .wc-metabox h3 strong{font-weight:400;line-height:26px;font-weight:700}.wc-metaboxes-wrapper .wc-metabox h3 select{font-family:sans-serif;max-width:20%;margin:.25em 0 .25em .25em}.wc-metaboxes-wrapper .wc-metabox h3 .handlediv{background-position:6px 5px!important;visibility:hidden;height:26px}.wc-metaboxes-wrapper .wc-metabox h3.fixed{cursor:pointer!important}.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3{cursor:pointer;padding:.5em 1em .5em .75em!important}.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3 .handlediv,.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3 .sort,.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3 a.delete{margin-top:.25em}.wc-metaboxes-wrapper .wc-metabox h3:hover .handlediv,.wc-metaboxes-wrapper .wc-metabox h3:hover a.delete,.wc-metaboxes-wrapper .wc-metabox.ui-sortable-helper .handlediv,.wc-metaboxes-wrapper .wc-metabox.ui-sortable-helper a.delete{visibility:visible}.wc-metaboxes-wrapper .wc-metabox table{width:100%;position:relative;background-color:#fdfdfd;padding:1em;border-top:1px solid #eee}.wc-metaboxes-wrapper .wc-metabox table td{text-align:right;padding:0 0 1em 6px;vertical-align:top;border:0}.wc-metaboxes-wrapper .wc-metabox table td label{text-align:right;display:block;line-height:21px}.wc-metaboxes-wrapper .wc-metabox table td input{float:right;min-width:200px}.wc-metaboxes-wrapper .wc-metabox table td input,.wc-metaboxes-wrapper .wc-metabox table td textarea{width:100%;margin:0;display:block;font-size:14px;padding:4px;color:#555}.wc-metaboxes-wrapper .wc-metabox table td .select2-container,.wc-metaboxes-wrapper .wc-metabox table td select{width:100%!important}.wc-metaboxes-wrapper .wc-metabox table td input.short{width:200px}.wc-metaboxes-wrapper .wc-metabox table td input.checkbox{width:16px;min-width:inherit;vertical-align:text-bottom;display:inline-block;float:none}.wc-metaboxes-wrapper .wc-metabox table td.attribute_name{width:200px}.wc-metaboxes-wrapper .wc-metabox table .minus,.wc-metaboxes-wrapper .wc-metabox table .plus{margin-top:6px}.wc-metaboxes-wrapper .wc-metabox table .fl{float:right}.wc-metaboxes-wrapper .wc-metabox table .fr{float:left}.variations-pagenav{float:left;line-height:24px}.variations-pagenav .displaying-num{color:#777;font-size:12px;font-style:italic}.variations-pagenav a{padding:0 10px 3px;background:rgba(0,0,0,.05);font-size:16px;font-weight:400;text-decoration:none}.variations-pagenav a.disabled,.variations-pagenav a.disabled:active,.variations-pagenav a.disabled:focus,.variations-pagenav a.disabled:hover{color:#a0a5aa;background:rgba(0,0,0,.05)}.variations-defaults{float:right}.variations-defaults select{margin:.25em 0 .25em .25em}.woocommerce_variable_attributes{background-color:#fdfdfd;border-top:1px solid #eee}.woocommerce_variable_attributes .data{padding:1em 2em}.woocommerce_variable_attributes .data::after,.woocommerce_variable_attributes .data::before{content:' ';display:table}.woocommerce_variable_attributes .data::after{clear:both}.woocommerce_variable_attributes .upload_image_button{display:block;width:64px;height:64px;float:right;margin-left:20px;position:relative;cursor:pointer}.woocommerce_variable_attributes .upload_image_button img{width:100%;height:auto;display:none}.woocommerce_variable_attributes .upload_image_button::before{content:'\f128';font-family:Dashicons;position:absolute;top:0;right:0;left:0;bottom:0;text-align:center;line-height:64px;font-size:64px;font-weight:400;-webkit-font-smoothing:antialiased}.woocommerce_variable_attributes .upload_image_button.remove img{display:block}.woocommerce_variable_attributes .upload_image_button.remove::before{content:'\f335';display:none}.woocommerce_variable_attributes .upload_image_button.remove:hover::before{display:block}.woocommerce_variable_attributes .options{border:1px solid #eee;border-width:1px 0;padding:.25em 0}.woocommerce_variable_attributes .options label{display:inline-block;padding:4px 0 2px 1em}.woocommerce_variable_attributes .options input[type=checkbox]{margin:0 .5em 0 5px!important;vertical-align:middle}.form-row label{display:inline-block}.form-row .woocommerce-help-tip{float:left}.form-row input[type=number],.form-row input[type=text],.form-row select,.form-row textarea{width:100%;vertical-align:middle;margin:2px 0 0;padding:5px}.form-row select{height:30px;line-height:30px}.form-row.dimensions_field .wrap{clear:right;display:block}.form-row.dimensions_field input{width:33%;float:right;vertical-align:middle}.form-row.dimensions_field input:last-of-type{margin-left:0;width:34%}.form-row.form-row-first,.form-row.form-row-last{width:48%;float:left}.form-row.form-row-first{clear:both;float:right}.form-row.form-row-full{clear:both}.tips{cursor:help;text-decoration:none}img.tips{padding:5px 0 0}#tiptip_holder{display:none;z-index:8675309;position:absolute;top:0;left:0}#tiptip_holder.tip_top{padding-bottom:5px}#tiptip_holder.tip_top #tiptip_arrow_inner{margin-top:-7px;margin-right:-6px;border-top-color:#333}#tiptip_holder.tip_bottom{padding-top:5px}#tiptip_holder.tip_bottom #tiptip_arrow_inner{margin-top:-5px;margin-right:-6px;border-bottom-color:#333}#tiptip_holder.tip_right{padding-right:5px}#tiptip_holder.tip_right #tiptip_arrow_inner{margin-top:-6px;margin-right:-5px;border-left-color:#333}#tiptip_holder.tip_left{padding-left:5px}#tiptip_holder.tip_left #tiptip_arrow_inner{margin-top:-6px;margin-right:-7px;border-right-color:#333}#tiptip_content,.chart-tooltip,.wc_error_tip{color:#fff;font-size:.8em;max-width:150px;background:#333;text-align:center;border-radius:3px;padding:.618em 1em;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.2);box-shadow:0 1px 3px rgba(0,0,0,.2)}#tiptip_content code,.chart-tooltip code,.wc_error_tip code{padding:1px;background:#888}#tiptip_arrow,#tiptip_arrow_inner{position:absolute;border-color:transparent;border-style:solid;border-width:6px;height:0;width:0}#tiptip_arrow{right:50%;margin-right:-6px}.wc_error_tip{max-width:20em;line-height:1.8em;position:absolute;white-space:normal;background:#d82223;margin:1.5em -1em 0 1px;z-index:9999999}.wc_error_tip::after{content:'';display:block;border:8px solid #d82223;border-left-color:transparent;border-right-color:transparent;border-top-color:transparent;position:absolute;top:-3px;right:50%;margin:-1em -3px 0 0}img.ui-datepicker-trigger{vertical-align:middle;margin-top:-1px;cursor:pointer}.wc-metabox-content img.ui-datepicker-trigger,.woocommerce_options_panel img.ui-datepicker-trigger{float:right;margin-left:8px;margin-top:4px;margin-right:4px}#ui-datepicker-div{display:none}.woocommerce-reports-remove-filter{color:red;text-decoration:none}.woocommerce-reports-wide.woocommerce-reports-wrap,.woocommerce-reports-wrap.woocommerce-reports-wrap{margin-right:300px;padding-top:18px}.woocommerce-reports-wide.halved,.woocommerce-reports-wrap.halved{margin:0;overflow:hidden;zoom:1}.woocommerce-reports-wide .widefat th,.woocommerce-reports-wrap .widefat th{padding:7px}.woocommerce-reports-wide .widefat td,.woocommerce-reports-wrap .widefat td{vertical-align:top;padding:7px}.woocommerce-reports-wide .widefat td .description,.woocommerce-reports-wrap .widefat td .description{margin:4px 0 0}.woocommerce-reports-wide .postbox::after,.woocommerce-reports-wrap .postbox::after{content:'.';display:block;height:0;clear:both;visibility:hidden}.woocommerce-reports-wide .postbox h3,.woocommerce-reports-wrap .postbox h3{cursor:default!important}.woocommerce-reports-wide .postbox .inside,.woocommerce-reports-wrap .postbox .inside{padding:10px;margin:0!important}.woocommerce-reports-wide .postbox div.stats_range,.woocommerce-reports-wide .postbox h3.stats_range,.woocommerce-reports-wrap .postbox div.stats_range,.woocommerce-reports-wrap .postbox h3.stats_range{border-bottom-color:#dfdfdf;margin:0;padding:0!important}.woocommerce-reports-wide .postbox div.stats_range .export_csv,.woocommerce-reports-wide .postbox h3.stats_range .export_csv,.woocommerce-reports-wrap .postbox div.stats_range .export_csv,.woocommerce-reports-wrap .postbox h3.stats_range .export_csv{float:left;line-height:26px;border-right:1px solid #dfdfdf;padding:10px;display:block;text-decoration:none}.woocommerce-reports-wide .postbox div.stats_range .export_csv::before,.woocommerce-reports-wide .postbox h3.stats_range .export_csv::before,.woocommerce-reports-wrap .postbox div.stats_range .export_csv::before,.woocommerce-reports-wrap .postbox h3.stats_range .export_csv::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;content:"";text-decoration:none;margin-left:4px}.woocommerce-reports-wide .postbox div.stats_range ul,.woocommerce-reports-wide .postbox h3.stats_range ul,.woocommerce-reports-wrap .postbox div.stats_range ul,.woocommerce-reports-wrap .postbox h3.stats_range ul{list-style:none outside;margin:0;padding:0;zoom:1;background:#f5f5f5;border-bottom:1px solid #ccc}.woocommerce-reports-wide .postbox div.stats_range ul::after,.woocommerce-reports-wide .postbox div.stats_range ul::before,.woocommerce-reports-wide .postbox h3.stats_range ul::after,.woocommerce-reports-wide .postbox h3.stats_range ul::before,.woocommerce-reports-wrap .postbox div.stats_range ul::after,.woocommerce-reports-wrap .postbox div.stats_range ul::before,.woocommerce-reports-wrap .postbox h3.stats_range ul::after,.woocommerce-reports-wrap .postbox h3.stats_range ul::before{content:' ';display:table}.woocommerce-reports-wide .postbox div.stats_range ul::after,.woocommerce-reports-wide .postbox h3.stats_range ul::after,.woocommerce-reports-wrap .postbox div.stats_range ul::after,.woocommerce-reports-wrap .postbox h3.stats_range ul::after{clear:both}.woocommerce-reports-wide .postbox div.stats_range ul li,.woocommerce-reports-wide .postbox h3.stats_range ul li,.woocommerce-reports-wrap .postbox div.stats_range ul li,.woocommerce-reports-wrap .postbox h3.stats_range ul li{float:right;margin:0;padding:0;line-height:26px;font-weight:700;font-size:14px}.woocommerce-reports-wide .postbox div.stats_range ul li a,.woocommerce-reports-wide .postbox h3.stats_range ul li a,.woocommerce-reports-wrap .postbox div.stats_range ul li a,.woocommerce-reports-wrap .postbox h3.stats_range ul li a{border-left:1px solid #dfdfdf;padding:10px;display:block;text-decoration:none}.woocommerce-reports-wide .postbox div.stats_range ul li.active,.woocommerce-reports-wide .postbox h3.stats_range ul li.active,.woocommerce-reports-wrap .postbox div.stats_range ul li.active,.woocommerce-reports-wrap .postbox h3.stats_range ul li.active{background:#fff;-webkit-box-shadow:0 4px 0 0 #fff;box-shadow:0 4px 0 0 #fff}.woocommerce-reports-wide .postbox div.stats_range ul li.active a,.woocommerce-reports-wide .postbox h3.stats_range ul li.active a,.woocommerce-reports-wrap .postbox div.stats_range ul li.active a,.woocommerce-reports-wrap .postbox h3.stats_range ul li.active a{color:#777}.woocommerce-reports-wide .postbox div.stats_range ul li.custom,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom{padding:9px 10px;vertical-align:middle}.woocommerce-reports-wide .postbox div.stats_range ul li.custom div,.woocommerce-reports-wide .postbox div.stats_range ul li.custom form,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom div,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom form,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom div,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom form,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom div,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom form{display:inline;margin:0}.woocommerce-reports-wide .postbox div.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wide .postbox div.stats_range ul li.custom form input.range_datepicker,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom form input.range_datepicker,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom form input.range_datepicker,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom form input.range_datepicker{padding:0;margin:0 0 0 10px;background:0 0;border:0;color:#777;text-align:center;-webkit-box-shadow:none;box-shadow:none}.woocommerce-reports-wide .postbox div.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wide .postbox div.stats_range ul li.custom form input.range_datepicker.from,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom form input.range_datepicker.from,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom form input.range_datepicker.from,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom form input.range_datepicker.from{margin-left:0}.woocommerce-reports-wide .postbox .chart-with-sidebar,.woocommerce-reports-wrap .postbox .chart-with-sidebar{padding:12px 249px 12px 12px;margin:0!important}.woocommerce-reports-wide .postbox .chart-with-sidebar .chart-sidebar,.woocommerce-reports-wrap .postbox .chart-with-sidebar .chart-sidebar{width:225px;margin-right:-237px;float:right}.woocommerce-reports-wide .postbox .chart-widgets,.woocommerce-reports-wrap .postbox .chart-widgets{margin:0;padding:0}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget{margin:0 0 1em;background:#fafafa;border:1px solid #dfdfdf}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget::after,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget::after{content:'.';display:block;height:0;clear:both;visibility:hidden}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget h4,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget h4{background:#fff;border:1px solid #dfdfdf;border-right-width:0;border-left-width:0;padding:10px;margin:0;color:#2ea2cc;border-top-width:0;background-image:-webkit-gradient(linear,left bottom,left top,from(#ececec),to(#f9f9f9));background-image:-webkit-linear-gradient(bottom,#ececec,#f9f9f9);background-image:linear-gradient(to top,#ececec,#f9f9f9)}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget h4.section_title:hover,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget h4.section_title:hover{color:#a00}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title{cursor:pointer}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title span,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title span{display:block}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title span::after,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title span::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-right:.618em;content:"";text-decoration:none;float:left;font-size:.9em;line-height:1.618}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title.open,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title.open{color:#333}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title.open span::after,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title.open span::after{display:none}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section{border-bottom:1px solid #dfdfdf}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section .select2-container,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section .select2-container{width:100%!important}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section:last-of-type,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section:last-of-type{border-radius:0 0 3px 3px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table{width:100%}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td{padding:7px 10px;vertical-align:top;border-top:1px solid #e5e5e5;line-height:1.4em}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table tr:first-child td,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table tr:first-child td{border-top:0}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.count,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.count{background:#f5f5f5}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.name,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.name{max-width:175px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.name a,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.name a{word-wrap:break-word}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.sparkline,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.sparkline{vertical-align:middle}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table .wc_sparkline,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table .wc_sparkline{width:32px;height:1em;display:block;float:left}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table tr.active td,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table tr.active td{background:#f5f5f5}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget form,.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget p,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget form,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget p{margin:0;padding:10px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget form .submit,.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget p .submit,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget form .submit,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget p .submit{margin-top:10px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget #product_ids,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget #product_ids{width:100%}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .select_all,.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .select_none,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .select_all,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .select_none{float:left;color:#999;margin-right:4px;margin-top:10px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .description,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .description{margin-right:.5em;font-weight:400;opacity:.8}.woocommerce-reports-wide .postbox .chart-legend,.woocommerce-reports-wrap .postbox .chart-legend{list-style:none outside;margin:0 0 1em;padding:0;border:1px solid #dfdfdf;border-left-width:0;border-bottom-width:0;background:#fff}.woocommerce-reports-wide .postbox .chart-legend li,.woocommerce-reports-wrap .postbox .chart-legend li{border-left:5px solid #aaa;color:#aaa;padding:1em;display:block;margin:0;-webkit-transition:all ease .5s;transition:all ease .5s;-webkit-box-shadow:inset 0 -1px 0 0 #dfdfdf;box-shadow:inset 0 -1px 0 0 #dfdfdf}.woocommerce-reports-wide .postbox .chart-legend li strong,.woocommerce-reports-wrap .postbox .chart-legend li strong{font-size:1.618em;line-height:1.2em;color:#464646;font-weight:400;display:block;font-family:HelveticaNeue-Light,'Helvetica Neue Light','Helvetica Neue',sans-serif}.woocommerce-reports-wide .postbox .chart-legend li strong del,.woocommerce-reports-wrap .postbox .chart-legend li strong del{color:#e74c3c;font-weight:400}.woocommerce-reports-wide .postbox .chart-legend li:hover,.woocommerce-reports-wrap .postbox .chart-legend li:hover{-webkit-box-shadow:inset 0 -1px 0 0 #dfdfdf,inset -300px 0 0 rgba(156,93,144,.1);box-shadow:inset 0 -1px 0 0 #dfdfdf,inset -300px 0 0 rgba(156,93,144,.1);border-left:5px solid #9c5d90!important;padding-right:1.5em;color:#9c5d90}.woocommerce-reports-wide .postbox .pie-chart-legend,.woocommerce-reports-wrap .postbox .pie-chart-legend{margin:12px 0 0;overflow:hidden}.woocommerce-reports-wide .postbox .pie-chart-legend li,.woocommerce-reports-wrap .postbox .pie-chart-legend li{float:right;margin:0;padding:6px 0 0;border-top:4px solid #999;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;width:50%}.woocommerce-reports-wide .postbox .stat,.woocommerce-reports-wrap .postbox .stat{font-size:1.5em!important;font-weight:700;text-align:center}.woocommerce-reports-wide .postbox .chart-placeholder,.woocommerce-reports-wrap .postbox .chart-placeholder{width:100%;height:650px;overflow:hidden;position:relative}.woocommerce-reports-wide .postbox .chart-prompt,.woocommerce-reports-wrap .postbox .chart-prompt{line-height:650px;margin:0;color:#999;font-size:1.2em;font-style:italic;text-align:center}.woocommerce-reports-wide .postbox .chart-container,.woocommerce-reports-wrap .postbox .chart-container{background:#fff;padding:12px;position:relative;border:1px solid #dfdfdf;border-radius:3px}.woocommerce-reports-wide .postbox .main .chart-legend,.woocommerce-reports-wrap .postbox .main .chart-legend{margin-top:12px}.woocommerce-reports-wide .postbox .main .chart-legend li,.woocommerce-reports-wrap .postbox .main .chart-legend li{border-left:0;margin:0 0 0 8px;float:right;border-top:4px solid #aaa}.woocommerce-reports-wide .woocommerce-reports-main,.woocommerce-reports-wrap .woocommerce-reports-main{float:right;min-width:100%}.woocommerce-reports-wide .woocommerce-reports-main table td,.woocommerce-reports-wrap .woocommerce-reports-main table td{padding:9px}.woocommerce-reports-wide .woocommerce-reports-sidebar,.woocommerce-reports-wrap .woocommerce-reports-sidebar{display:inline;width:281px;margin-right:-300px;clear:both;float:right}.woocommerce-reports-wide .woocommerce-reports-left,.woocommerce-reports-wrap .woocommerce-reports-left{width:49.5%;float:right}.woocommerce-reports-wide .woocommerce-reports-right,.woocommerce-reports-wrap .woocommerce-reports-right{width:49.5%;float:left}.woocommerce-wide-reports-wrap{padding-bottom:11px}.woocommerce-wide-reports-wrap .widefat .export-data{float:left}.woocommerce-wide-reports-wrap .widefat td,.woocommerce-wide-reports-wrap .widefat th{vertical-align:middle;padding:7px}form.report_filters p{vertical-align:middle}form.report_filters div,form.report_filters input,form.report_filters label{vertical-align:middle}.chart-tooltip{position:absolute;display:none;line-height:1}table.bar_chart{width:100%}table.bar_chart thead th{text-align:right;color:#ccc;padding:6px 0}table.bar_chart tbody th{padding:6px 0;width:25%;text-align:right!important;font-weight:400!important;border-bottom:1px solid #fee}table.bar_chart tbody td{text-align:left;line-height:24px;padding:6px 0 6px 6px;border-bottom:1px solid #fee}table.bar_chart tbody td span{color:#8a4b75;display:block}table.bar_chart tbody td span.alt{color:#47a03e;margin-top:6px}table.bar_chart tbody td.bars{position:relative;text-align:right;padding:6px 0 6px 6px;border-bottom:1px solid #fee}table.bar_chart tbody td.bars a,table.bar_chart tbody td.bars span{text-decoration:none;clear:both;background:#8a4b75;float:right;display:block;line-height:24px;height:24px;border-radius:3px}table.bar_chart tbody td.bars span.alt{clear:both;background:#47a03e}table.bar_chart tbody td.bars span.alt span{margin:0;color:#c5dec2!important;text-shadow:0 1px 0 #47a03e;background:0 0}.post-type-shop_order .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}.post-type-shop_coupon .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}.post-type-product .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}.woocommerce-BlankState--api .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}.woocommerce-BlankState--webhooks .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}.woocommerce-BlankState{text-align:center;padding:5em 0 0}.woocommerce-BlankState .woocommerce-BlankState-message{color:#aaa;margin:0 auto 1.5em;line-height:1.5em;font-size:1.2em;max-width:500px}.woocommerce-BlankState .woocommerce-BlankState-message::before{color:#ddd;text-shadow:0 -1px 1px rgba(0,0,0,.2),0 1px 0 rgba(255,255,255,.8);font-size:8em;display:block;position:relative!important;top:auto;right:auto;line-height:1em;margin:0 0 .1875em}.woocommerce-BlankState .woocommerce-BlankState-cta{font-size:1.2em;padding:.75em 1.5em;margin:0 .25em;height:auto;display:inline-block!important}@media only screen and (max-width:1280px){#order_data .order_data_column{width:48%}#order_data .order_data_column:first-child{width:100%}.woocommerce_options_panel .description{display:block;clear:both;margin-right:0}.woocommerce_options_panel .dimensions_field .wrap,.woocommerce_options_panel .short,.woocommerce_options_panel input[type=email].short,.woocommerce_options_panel input[type=number].short,.woocommerce_options_panel input[type=password].short,.woocommerce_options_panel input[type=text].short{width:80%}.woocommerce_options_panel .downloadable_files,.woocommerce_variations .downloadable_files{padding:0;clear:both}.woocommerce_options_panel .downloadable_files label,.woocommerce_variations .downloadable_files label{position:static}.woocommerce_options_panel .downloadable_files table,.woocommerce_variations .downloadable_files table{margin:0 12px 24px;width:94%}.woocommerce_options_panel .downloadable_files table .sort,.woocommerce_variations .downloadable_files table .sort{visibility:hidden}.woocommerce_options_panel .woocommerce_variable_attributes .downloadable_files table,.woocommerce_variations .woocommerce_variable_attributes .downloadable_files table{margin:0 0 1em;width:100%}}@media only screen and (max-width:900px){#woocommerce-coupon-data ul.coupon_data_tabs,#woocommerce-product-data .wc-tabs-back,#woocommerce-product-data ul.product_data_tabs{width:10%}#woocommerce-coupon-data .wc-metaboxes-wrapper,#woocommerce-coupon-data .woocommerce_options_panel,#woocommerce-product-data .wc-metaboxes-wrapper,#woocommerce-product-data .woocommerce_options_panel{width:90%}#woocommerce-coupon-data ul.coupon_data_tabs li a,#woocommerce-product-data ul.product_data_tabs li a{position:relative;text-indent:-999px;padding:10px}#woocommerce-coupon-data ul.coupon_data_tabs li a::before,#woocommerce-product-data ul.product_data_tabs li a::before{position:absolute;top:0;left:0;bottom:0;right:0;text-indent:0;text-align:center;line-height:40px;width:100%;height:40px}}@media only screen and (max-width:782px){#wp-excerpt-media-buttons a{font-size:16px;line-height:37px;height:39px;padding:0 15px 0 20px}#wp-excerpt-editor-tools{padding-top:20px;padding-left:15px;overflow:hidden;margin-bottom:-1px}#woocommerce-product-data .checkbox{width:25px}.variations-pagenav{float:none;text-align:center;font-size:18px}.variations-pagenav .displaying-num{font-size:16px}.variations-pagenav a{padding:8px 20px 11px;font-size:18px}.variations-pagenav select{padding:0 20px}.variations-defaults{float:none;text-align:center;margin-top:10px}.post-type-product .wp-list-table .column-thumb{display:none;text-align:right;padding-bottom:0}.post-type-product .wp-list-table .column-thumb::before{display:none!important}.post-type-product .wp-list-table .column-thumb img{max-width:32px}.post-type-product .wp-list-table .is-expanded td:not(.hidden){overflow:visible}.post-type-product .wp-list-table .toggle-row{top:-28px}.post-type-shop_order .wp-list-table .column-customer_message,.post-type-shop_order .wp-list-table .column-order_notes{text-align:inherit}.post-type-shop_order .wp-list-table .column-order_notes .note-on{font-size:1.3em;margin:0}.post-type-shop_order .wp-list-table .is-expanded td:not(.hidden){overflow:visible}.post-type-shop_order .wp-list-table .toggle-row{top:-15px}}@media only screen and (max-width:500px){.woocommerce_options_panel label,.woocommerce_options_panel legend{float:none;width:auto;display:block;margin:0}.woocommerce_options_panel fieldset.form-field,.woocommerce_options_panel p.form-field{padding:5px 20px!important}.addons-wcs-banner-block{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.wc_addons_wrap .addons-wcs-banner-block{padding:40px}.wc_addons_wrap .addons-wcs-banner-block-image{padding:1em;text-align:center;width:100%;padding:2em 0;margin:0}.wc_addons_wrap .addons-wcs-banner-block-image .addons-img{margin:0}}.wc-backbone-modal *{-webkit-box-sizing:border-box;box-sizing:border-box}.wc-backbone-modal .wc-backbone-modal-content{position:fixed;background:#fff;z-index:100000;right:50%;top:50%;-webkit-transform:translate(50%,-50%);-ms-transform:translate(50%,-50%);transform:translate(50%,-50%);max-width:100%;min-width:500px}.wc-backbone-modal .wc-backbone-modal-content article{overflow:auto}.wc-backbone-modal.wc-backbone-modal-shipping-method-settings .wc-backbone-modal-content{width:75%;min-width:500px}.wc-backbone-modal .select2-container{width:100%!important}@media screen and (max-width:782px){.wc-backbone-modal .wc-backbone-modal-content{width:100%;height:100%;min-width:100%}}.wc-backbone-modal-backdrop{position:fixed;top:0;right:0;left:0;bottom:0;min-height:360px;background:#000;opacity:.7;z-index:99900}.wc-backbone-modal-main{padding-bottom:55px}.wc-backbone-modal-main article,.wc-backbone-modal-main header{display:block;position:relative}.wc-backbone-modal-main .wc-backbone-modal-header{height:auto;background:#fcfcfc;padding:1em 1.5em;border-bottom:1px solid #ddd}.wc-backbone-modal-main .wc-backbone-modal-header h1{margin:0;font-size:18px;font-weight:700;line-height:1.5em}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link{cursor:pointer;color:#777;height:54px;width:54px;padding:0;position:absolute;top:0;left:0;text-align:center;border:0;border-right:1px solid #ddd;background-color:transparent;-webkit-transition:color .1s ease-in-out,background .1s ease-in-out;transition:color .1s ease-in-out,background .1s ease-in-out}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link::before{font:normal 22px/50px dashicons!important;color:#666;display:block;content:'\f335';font-weight:300}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link:focus,.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link:hover{background:#ddd;border-color:#ccc;color:#000}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link:focus{outline:0}.wc-backbone-modal-main article{padding:1.5em}.wc-backbone-modal-main article p{margin:1.5em 0}.wc-backbone-modal-main article p:first-child{margin-top:0}.wc-backbone-modal-main article p:last-child{margin-bottom:0}.wc-backbone-modal-main article .pagination{padding:10px 0 0;text-align:center}.wc-backbone-modal-main article table.widefat{margin:0;width:100%;border:0;-webkit-box-shadow:none;box-shadow:none}.wc-backbone-modal-main article table.widefat thead th{padding:0 1em 1em 1em;text-align:right}.wc-backbone-modal-main article table.widefat thead th:first-child{padding-right:0}.wc-backbone-modal-main article table.widefat thead th:last-child{padding-left:0;text-align:left}.wc-backbone-modal-main article table.widefat tbody td,.wc-backbone-modal-main article table.widefat tbody th{padding:1em;text-align:right;vertical-align:middle}.wc-backbone-modal-main article table.widefat tbody td:first-child,.wc-backbone-modal-main article table.widefat tbody th:first-child{padding-right:0}.wc-backbone-modal-main article table.widefat tbody td:last-child,.wc-backbone-modal-main article table.widefat tbody th:last-child{padding-left:0;text-align:left}.wc-backbone-modal-main article table.widefat tbody td .select2-container,.wc-backbone-modal-main article table.widefat tbody td select,.wc-backbone-modal-main article table.widefat tbody th .select2-container,.wc-backbone-modal-main article table.widefat tbody th select{width:100%}.wc-backbone-modal-main footer{position:absolute;right:0;left:0;bottom:0;z-index:100;padding:1em 1.5em;background:#fcfcfc;border-top:1px solid #dfdfdf;-webkit-box-shadow:0 -4px 4px -4px rgba(0,0,0,.1);box-shadow:0 -4px 4px -4px rgba(0,0,0,.1)}.wc-backbone-modal-main footer .inner{text-align:left;line-height:23px}.wc-backbone-modal-main footer .inner .button{margin-bottom:0}.select2-drop,.select2-dropdown{z-index:999999!important}.select2-results{line-height:1.5em}.select2-results .select2-results__group,.select2-results .select2-results__option{margin:0;padding:8px}.select2-results .description{display:block;color:#999;padding-top:4px}.select2-dropdown{border-color:#ddd}.select2-dropdown--below{-webkit-box-shadow:0 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px rgba(0,0,0,.1)}.select2-dropdown--above{-webkit-box-shadow:0 -1px 1px rgba(0,0,0,.1);box-shadow:0 -1px 1px rgba(0,0,0,.1)}.select2-container .select2-selection__rendered.ui-sortable li{cursor:move}.select2-container .select2-selection{border-color:#ddd}.select2-container .select2-search__field{min-width:150px}.select2-container .select2-selection--single{height:32px}.select2-container .select2-selection--single .select2-selection__rendered{line-height:32px;padding-left:24px}.select2-container .select2-selection--single .select2-selection__arrow{left:3px;height:30px}.select2-container .select2-selection--multiple{min-height:28px;border-radius:0;line-height:1.5}.select2-container .select2-selection--multiple li{margin:0}.select2-container .select2-selection--multiple .select2-selection__choice{padding:2px 6px}.select2-container .select2-selection--multiple .select2-selection__choice .description{display:none}.select2-container .select2-selection__clear{color:#999;margin-top:-1px}.select2-container .select2-search--inline .select2-search__field{font-family:inherit;font-size:inherit;font-weight:inherit;padding:3px 0}.woocommerce table.form-table .select2-container{min-width:400px!important}.post-type-product .tablenav .actions,.post-type-shop_order .tablenav .actions{overflow:visible}.post-type-product .tablenav input,.post-type-product .tablenav select,.post-type-shop_order .tablenav input,.post-type-shop_order .tablenav select{line-height:1;height:32px}.post-type-product .tablenav .select2-container,.post-type-shop_order .tablenav .select2-container{float:right;width:240px!important;font-size:14px;vertical-align:middle;margin:1px 1px 4px 6px}.woocommerce-exporter-wrapper,.woocommerce-importer-wrapper,.woocommerce-progress-form-wrapper{text-align:center;max-width:700px;margin:40px auto}.woocommerce-exporter-wrapper .error,.woocommerce-importer-wrapper .error,.woocommerce-progress-form-wrapper .error{text-align:right}.woocommerce-exporter-wrapper .wc-progress-steps,.woocommerce-importer-wrapper .wc-progress-steps,.woocommerce-progress-form-wrapper .wc-progress-steps{padding:0 0 24px;margin:0;list-style:none outside;overflow:hidden;color:#ccc;width:100%;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:-webkit-inline-box;display:inline-flex}.woocommerce-exporter-wrapper .wc-progress-steps li,.woocommerce-importer-wrapper .wc-progress-steps li,.woocommerce-progress-form-wrapper .wc-progress-steps li{width:25%;float:right;padding:0 0 .8em;margin:0;text-align:center;position:relative;border-bottom:4px solid #ccc;line-height:1.4em}.woocommerce-exporter-wrapper .wc-progress-steps li::before,.woocommerce-importer-wrapper .wc-progress-steps li::before,.woocommerce-progress-form-wrapper .wc-progress-steps li::before{content:'';border:4px solid #ccc;border-radius:100%;width:4px;height:4px;position:absolute;bottom:0;right:50%;margin-right:-6px;margin-bottom:-8px;background:#fff}.woocommerce-exporter-wrapper .wc-progress-steps li.active,.woocommerce-importer-wrapper .wc-progress-steps li.active,.woocommerce-progress-form-wrapper .wc-progress-steps li.active{border-color:#a16696;color:#a16696}.woocommerce-exporter-wrapper .wc-progress-steps li.active::before,.woocommerce-importer-wrapper .wc-progress-steps li.active::before,.woocommerce-progress-form-wrapper .wc-progress-steps li.active::before{border-color:#a16696}.woocommerce-exporter-wrapper .wc-progress-steps li.done,.woocommerce-importer-wrapper .wc-progress-steps li.done,.woocommerce-progress-form-wrapper .wc-progress-steps li.done{border-color:#a16696;color:#a16696}.woocommerce-exporter-wrapper .wc-progress-steps li.done::before,.woocommerce-importer-wrapper .wc-progress-steps li.done::before,.woocommerce-progress-form-wrapper .wc-progress-steps li.done::before{border-color:#a16696;background:#a16696}.woocommerce-exporter-wrapper .button,.woocommerce-importer-wrapper .button,.woocommerce-progress-form-wrapper .button{font-size:1.25em;padding:.5em 1em!important;line-height:1.5em!important;margin-left:.5em;margin-bottom:2px;height:auto!important;border-radius:4px;background-color:#bb77ae;border-color:#a36597;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;text-shadow:0 -1px 1px #a36597,-1px 0 1px #a36597,0 1px 1px #a36597,1px 0 1px #a36597;margin:0;opacity:1}.woocommerce-exporter-wrapper .button:active,.woocommerce-exporter-wrapper .button:focus,.woocommerce-exporter-wrapper .button:hover,.woocommerce-importer-wrapper .button:active,.woocommerce-importer-wrapper .button:focus,.woocommerce-importer-wrapper .button:hover,.woocommerce-progress-form-wrapper .button:active,.woocommerce-progress-form-wrapper .button:focus,.woocommerce-progress-form-wrapper .button:hover{background:#a36597;border-color:#a36597;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.woocommerce-exporter-wrapper .error .button,.woocommerce-importer-wrapper .error .button,.woocommerce-progress-form-wrapper .error .button{font-size:1em}.woocommerce-exporter-wrapper .wc-actions,.woocommerce-importer-wrapper .wc-actions,.woocommerce-progress-form-wrapper .wc-actions{overflow:hidden;border-top:1px solid #eee;margin:0;padding:23px 24px 24px;line-height:3em}.woocommerce-exporter-wrapper .wc-actions .button,.woocommerce-importer-wrapper .wc-actions .button,.woocommerce-progress-form-wrapper .wc-actions .button{float:left}.woocommerce-exporter-wrapper .wc-actions .woocommerce-importer-toggle-advanced-options,.woocommerce-importer-wrapper .wc-actions .woocommerce-importer-toggle-advanced-options,.woocommerce-progress-form-wrapper .wc-actions .woocommerce-importer-toggle-advanced-options{color:#999}.woocommerce-exporter-wrapper .wc-progress-form-content,.woocommerce-exporter-wrapper .woocommerce-exporter,.woocommerce-exporter-wrapper .woocommerce-importer,.woocommerce-importer-wrapper .wc-progress-form-content,.woocommerce-importer-wrapper .woocommerce-exporter,.woocommerce-importer-wrapper .woocommerce-importer,.woocommerce-progress-form-wrapper .wc-progress-form-content,.woocommerce-progress-form-wrapper .woocommerce-exporter,.woocommerce-progress-form-wrapper .woocommerce-importer{background:#fff;overflow:hidden;padding:0;margin:0 0 16px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.13);box-shadow:0 1px 3px rgba(0,0,0,.13);color:#555;text-align:right}.woocommerce-exporter-wrapper .wc-progress-form-content header,.woocommerce-exporter-wrapper .woocommerce-exporter header,.woocommerce-exporter-wrapper .woocommerce-importer header,.woocommerce-importer-wrapper .wc-progress-form-content header,.woocommerce-importer-wrapper .woocommerce-exporter header,.woocommerce-importer-wrapper .woocommerce-importer header,.woocommerce-progress-form-wrapper .wc-progress-form-content header,.woocommerce-progress-form-wrapper .woocommerce-exporter header,.woocommerce-progress-form-wrapper .woocommerce-importer header{border-bottom:1px solid #eee;margin:0;padding:24px 24px 0}.woocommerce-exporter-wrapper .wc-progress-form-content section,.woocommerce-exporter-wrapper .woocommerce-exporter section,.woocommerce-exporter-wrapper .woocommerce-importer section,.woocommerce-importer-wrapper .wc-progress-form-content section,.woocommerce-importer-wrapper .woocommerce-exporter section,.woocommerce-importer-wrapper .woocommerce-importer section,.woocommerce-progress-form-wrapper .wc-progress-form-content section,.woocommerce-progress-form-wrapper .woocommerce-exporter section,.woocommerce-progress-form-wrapper .woocommerce-importer section{padding:24px 24px 0}.woocommerce-exporter-wrapper .wc-progress-form-content h2,.woocommerce-exporter-wrapper .woocommerce-exporter h2,.woocommerce-exporter-wrapper .woocommerce-importer h2,.woocommerce-importer-wrapper .wc-progress-form-content h2,.woocommerce-importer-wrapper .woocommerce-exporter h2,.woocommerce-importer-wrapper .woocommerce-importer h2,.woocommerce-progress-form-wrapper .wc-progress-form-content h2,.woocommerce-progress-form-wrapper .woocommerce-exporter h2,.woocommerce-progress-form-wrapper .woocommerce-importer h2{margin:0 0 24px;color:#555;font-size:24px;font-weight:400;line-height:1em}.woocommerce-exporter-wrapper .wc-progress-form-content p,.woocommerce-exporter-wrapper .woocommerce-exporter p,.woocommerce-exporter-wrapper .woocommerce-importer p,.woocommerce-importer-wrapper .wc-progress-form-content p,.woocommerce-importer-wrapper .woocommerce-exporter p,.woocommerce-importer-wrapper .woocommerce-importer p,.woocommerce-progress-form-wrapper .wc-progress-form-content p,.woocommerce-progress-form-wrapper .woocommerce-exporter p,.woocommerce-progress-form-wrapper .woocommerce-importer p{font-size:1em;line-height:1.75em;font-size:16px;color:#555;margin:0 0 24px}.woocommerce-exporter-wrapper .wc-progress-form-content .form-row,.woocommerce-exporter-wrapper .woocommerce-exporter .form-row,.woocommerce-exporter-wrapper .woocommerce-importer .form-row,.woocommerce-importer-wrapper .wc-progress-form-content .form-row,.woocommerce-importer-wrapper .woocommerce-exporter .form-row,.woocommerce-importer-wrapper .woocommerce-importer .form-row,.woocommerce-progress-form-wrapper .wc-progress-form-content .form-row,.woocommerce-progress-form-wrapper .woocommerce-exporter .form-row,.woocommerce-progress-form-wrapper .woocommerce-importer .form-row{margin-top:24px}.woocommerce-exporter-wrapper .wc-progress-form-content .spinner,.woocommerce-exporter-wrapper .woocommerce-exporter .spinner,.woocommerce-exporter-wrapper .woocommerce-importer .spinner,.woocommerce-importer-wrapper .wc-progress-form-content .spinner,.woocommerce-importer-wrapper .woocommerce-exporter .spinner,.woocommerce-importer-wrapper .woocommerce-importer .spinner,.woocommerce-progress-form-wrapper .wc-progress-form-content .spinner,.woocommerce-progress-form-wrapper .woocommerce-exporter .spinner,.woocommerce-progress-form-wrapper .woocommerce-importer .spinner{display:none}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th{vertical-align:top;line-height:1.75em;padding:0 0 24px 0}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td label,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th label,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td label,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th label{color:#555;font-weight:400}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=checkbox],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=checkbox],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=checkbox],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=checkbox]{margin:0 0 0 4px;padding:7px}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=text],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=text],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=text],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=text]{padding:7px;height:auto;margin:0}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper{border:1px solid #ddd;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.07);box-shadow:inset 0 1px 2px rgba(0,0,0,.07);background-color:#fff;color:#32373c;outline:0;line-height:1;display:block}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code{background:0 0;font-size:smaller;padding:0;margin:0;color:#999;padding:7px 7px 0 0;display:inline-block}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input{font-family:Consolas,Monaco,monospace;border:0;margin:0;outline:0;-webkit-box-shadow:none;box-shadow:none;display:inline-block;min-width:100%}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th{width:35%;padding-left:20px}.woocommerce-exporter-wrapper .wc-progress-form-content progress,.woocommerce-exporter-wrapper .woocommerce-exporter progress,.woocommerce-exporter-wrapper .woocommerce-importer progress,.woocommerce-importer-wrapper .wc-progress-form-content progress,.woocommerce-importer-wrapper .woocommerce-exporter progress,.woocommerce-importer-wrapper .woocommerce-importer progress,.woocommerce-progress-form-wrapper .wc-progress-form-content progress,.woocommerce-progress-form-wrapper .woocommerce-exporter progress,.woocommerce-progress-form-wrapper .woocommerce-importer progress{width:100%;height:42px;margin:0 auto 24px;display:block;-webkit-appearance:none;border:none;display:none;background:#f5f5f5;border:2px solid #eee;border-radius:4px;padding:0;-webkit-box-shadow:0 1px 0 0 rgba(255,255,255,.2);box-shadow:0 1px 0 0 rgba(255,255,255,.2)}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-webkit-progress-bar,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-webkit-progress-bar,.woocommerce-exporter-wrapper .woocommerce-importer progress::-webkit-progress-bar,.woocommerce-importer-wrapper .wc-progress-form-content progress::-webkit-progress-bar,.woocommerce-importer-wrapper .woocommerce-exporter progress::-webkit-progress-bar,.woocommerce-importer-wrapper .woocommerce-importer progress::-webkit-progress-bar,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-webkit-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-webkit-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-webkit-progress-bar{background:transparent none;border:0;border-radius:4px;padding:0;-webkit-box-shadow:none;box-shadow:none}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-webkit-progress-value,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-webkit-progress-value,.woocommerce-exporter-wrapper .woocommerce-importer progress::-webkit-progress-value,.woocommerce-importer-wrapper .wc-progress-form-content progress::-webkit-progress-value,.woocommerce-importer-wrapper .woocommerce-exporter progress::-webkit-progress-value,.woocommerce-importer-wrapper .woocommerce-importer progress::-webkit-progress-value,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-webkit-progress-value,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-webkit-progress-value,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-webkit-progress-value{border-radius:3px;-webkit-box-shadow:inset 0 1px 1px 0 rgba(255,255,255,.4);box-shadow:inset 0 1px 1px 0 rgba(255,255,255,.4);background:#a46497;background:-webkit-gradient(linear,left top,left bottom,from(#a46497),to(#66405f)),#a46497;background:-webkit-linear-gradient(top,#a46497,#66405f),#a46497;background:linear-gradient(top,#a46497,#66405f),#a46497;-webkit-transition:width 1s ease;transition:width 1s ease}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-moz-progress-bar,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-moz-progress-bar,.woocommerce-exporter-wrapper .woocommerce-importer progress::-moz-progress-bar,.woocommerce-importer-wrapper .wc-progress-form-content progress::-moz-progress-bar,.woocommerce-importer-wrapper .woocommerce-exporter progress::-moz-progress-bar,.woocommerce-importer-wrapper .woocommerce-importer progress::-moz-progress-bar,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-moz-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-moz-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-moz-progress-bar{border-radius:3px;box-shadow:inset 0 1px 1px 0 rgba(255,255,255,.4);background:#a46497;background:linear-gradient(top,#a46497,#66405f),#a46497;-webkit-transition:width 1s ease;transition:width 1s ease}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-ms-fill,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-ms-fill,.woocommerce-exporter-wrapper .woocommerce-importer progress::-ms-fill,.woocommerce-importer-wrapper .wc-progress-form-content progress::-ms-fill,.woocommerce-importer-wrapper .woocommerce-exporter progress::-ms-fill,.woocommerce-importer-wrapper .woocommerce-importer progress::-ms-fill,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-ms-fill,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-ms-fill,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-ms-fill{border-radius:3px;box-shadow:inset 0 1px 1px 0 rgba(255,255,255,.4);background:#a46497;background:linear-gradient(to bottom,#a46497,#66405f),#a46497;-webkit-transition:width 1s ease;transition:width 1s ease}.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .spinner,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing .spinner,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .spinner,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing .spinner,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting .spinner,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing .spinner,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .spinner,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing .spinner,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .spinner,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing .spinner,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting .spinner,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing .spinner,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .spinner,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing .spinner,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .spinner,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing .spinner,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting .spinner,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing .spinner{display:block}.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting progress,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing progress,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting progress,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing progress,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting progress,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing progress,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting progress,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing progress,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting progress,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing progress,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting progress,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing progress,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting progress,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing progress,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting progress,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing progress,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting progress,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing progress{display:block}.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .wc-actions,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing .wc-actions,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .wc-actions,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing .wc-actions,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting .wc-actions,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing .wc-actions,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .wc-actions,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing .wc-actions,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .wc-actions,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing .wc-actions,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting .wc-actions,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing .wc-actions,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .wc-actions,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing .wc-actions,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing .woocommerce-exporter-options{display:none}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table-wrapper{padding:0}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table{margin:0;border:0;-webkit-box-shadow:none;box-shadow:none;width:100%;table-layout:fixed}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th{border:0;padding:12px;vertical-align:middle;word-wrap:break-word}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td select,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th select,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td select,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th select{width:100%}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) th{background:#fbfbfb}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th{font-weight:700}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td:first-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th:first-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td:first-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th:first-child{padding-right:24px}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td:last-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th:last-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td:last-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th:last-child{padding-left:24px}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name{width:50%}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description{color:#999;margin-top:4px;display:block}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description code{background:0 0;padding:0;white-space:pre-line;word-wrap:break-word;word-break:break-all}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-done,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-done,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-done,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-done,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-done,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-done,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-done,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-done,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-done{text-align:center;padding:48px 24px;font-size:1.5em;line-height:1.75em}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-done::before,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-done::before,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-done::before,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-done::before,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-done::before,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-done::before,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-done::before,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-done::before,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-done::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#a16696;position:static;font-size:100px;display:block;float:none;margin:0 0 24px}.wc-pointer .wc-pointer-buttons .close{float:right;margin:6px 15px 0 0} \ No newline at end of file +.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;margin:0 0 -4px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left;padding:0}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin:0;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected],.select2-results__option[data-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none;margin:5px 5px 0 0}.select2-container--default .select2-selection--multiple .select2-selection__rendered li:before{content:'';display:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid #000 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:0 0;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true],.select2-container--default .select2-results__option[data-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected],.select2-container--default .select2-results__option--highlighted[data-selected]{background-color:#0073aa;color:#fff}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top,#fff 50%,#eee 100%);background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single:focus{border:1px solid #0073aa}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top,#eee 50%,#ccc 100%);background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #0073aa}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:0 0;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top,#fff 0,#eee 50%);background-image:linear-gradient(to bottom,#fff 0,#eee 50%);background-repeat:repeat-x}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top,#eee 50%,#fff 100%);background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #0073aa}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #0073aa}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected],.select2-container--classic .select2-results__option--highlighted[data-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#0073aa} +@charset "UTF-8";@-webkit-keyframes spin{100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}@keyframes spin{100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}.blockUI.blockOverlay::before{height:1em;width:1em;display:block;position:absolute;top:50%;right:50%;margin-right:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.wc_addons_wrap{max-width:1200px}.wc_addons_wrap h1.search-form-title{clear:right;padding:0}.wc_addons_wrap form.search-form{clear:both;display:block;position:relative;margin-top:1em;margin-bottom:1em}.wc_addons_wrap form.search-form input{border:1px solid #ddd;box-shadow:none;height:53px;padding-right:50px;width:100%;margin:0}.wc_addons_wrap form.search-form button{background:0 0;border:none;cursor:pointer;height:53px;position:absolute;width:53px}.wc_addons_wrap .update-plugins .update-count{background-color:#d54e21;border-radius:10px;color:#fff;display:inline-block;font-size:9px;font-weight:600;line-height:17px;margin:1px 2px 0 0;padding:0 6px;vertical-align:text-top}.wc_addons_wrap .addons-featured{margin:0}.wc_addons_wrap ul.subsubsub.subsubsub{margin:-2px 0 12px}.wc_addons_wrap .subsubsub li::after{content:'|'}.wc_addons_wrap .subsubsub li:last-child::after{content:''}.wc_addons_wrap .addons-banner-block-item-icon,.wc_addons_wrap .addons-column-block-item-icon{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.wc_addons_wrap .addons-banner-block,.wc_addons_wrap .addons-wcs-banner-block{background:#fff;border:1px solid #ddd;margin:0 0 1em 0;padding:2em 2em 1em}.wc_addons_wrap .addons-banner-block img{height:62px}.wc_addons_wrap .addons-banner-block p{margin:0 0 20px}.wc_addons_wrap .addons-banner-block-items{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:distribute;justify-content:space-around;margin:0 -10px 0 -10px}.wc_addons_wrap .addons-banner-block-item{border:1px solid #e6e6e6;border-radius:3px;-webkit-box-flex:1;-ms-flex:1;flex:1;margin:1em;min-width:200px;width:30%}.wc_addons_wrap .addons-banner-block-item-icon{background:#f7f7f7;height:143px}.wc_addons_wrap .addons-banner-block-item-content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:184px;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:24px}.wc_addons_wrap .addons-banner-block-item-content h3{margin-top:0}.wc_addons_wrap .addons-banner-block-item-content p{margin:0 0 auto}.wc_addons_wrap .addons-wcs-banner-block{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.wc_addons_wrap .addons-wcs-banner-block-image{background:#f7f7f7;border:1px solid #e6e6e6;margin-left:2em;padding:4em}.wc_addons_wrap .addons-wcs-banner-block-image .addons-img{max-height:86px;max-width:97px}.wc_addons_wrap .addons-shipping-methods .addons-wcs-banner-block{margin-right:0;margin-left:0;margin-top:1em}.wc_addons_wrap .addons-wcs-banner-block-content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:distribute;justify-content:space-around;-ms-flex-item-align:stretch;align-self:stretch;padding:1em 0}.wc_addons_wrap .addons-wcs-banner-block-content h1{padding-bottom:0}.wc_addons_wrap .addons-wcs-banner-block-content p{margin-bottom:0}.wc_addons_wrap .addons-wcs-banner-block-content .wcs-service-logo{max-width:40px}.wc_addons_wrap .addons-column-section{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:distribute;justify-content:space-around}.wc_addons_wrap .addons-column{-webkit-box-flex:1;-ms-flex:1;flex:1;width:50%;padding:0 .5em}.wc_addons_wrap .addons-column:nth-child(2){margin-left:0}.wc_addons_wrap .addons-column-block,.wc_addons_wrap .addons-small-dark-block,.wc_addons_wrap .addons-small-light-block{box-sizing:border-box;border:1px solid #ddd;margin:0 0 1em;padding:20px}.wc_addons_wrap .addons-column-block img{max-height:50px;max-width:50px}.wc_addons_wrap .addons-column-block,.wc_addons_wrap .addons-small-light-block{background:#fff}.wc_addons_wrap .addons-column-block-left{float:right}.wc_addons_wrap .addons-column-block-right{float:left}.wc_addons_wrap .addons-column-block-item{border-top:2px solid #f9f9f9;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin:0 -20px;padding:20px}.wc_addons_wrap .addons-column-block-item-icon{background:#f7f7f7;border:1px solid #e6e6e6;height:100px;margin:0 0 10px 10px;width:100px}.wc_addons_wrap .addons-column-block-item-content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-wrap:wrap;flex-wrap:wrap;height:20%;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;min-width:200px}.wc_addons_wrap .addons-column-block-item-content h2{float:right;margin-top:8px}.wc_addons_wrap .addons-column-block-item-content a{float:left}.wc_addons_wrap .addons-column-block-item-content p{float:right}.wc_addons_wrap .addons-banner-block-item,.wc_addons_wrap .addons-column-block-item{display:none}.wc_addons_wrap .addons-banner-block-item:nth-child(-n+3){display:block}.wc_addons_wrap .addons-column-block-item:nth-of-type(-n+3){display:-webkit-box;display:-ms-flexbox;display:flex}.wc_addons_wrap .addons-small-dark-block{background-color:#54687d;text-align:center}.wc_addons_wrap .addons-small-dark-items{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:distribute;justify-content:space-around}.wc_addons_wrap .addons-small-dark-item{margin:0 0 20px}.wc_addons_wrap .addons-small-dark-block h1{color:#fff}.wc_addons_wrap .addons-small-dark-block p{color:#fafafa}.wc_addons_wrap .addons-small-dark-item-icon img{height:30px}.wc_addons_wrap .addons-small-dark-item a{margin:28px auto 0}.wc_addons_wrap .addons-small-light-block{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.wc_addons_wrap .addons-small-light-block h1{margin-top:-12px}.wc_addons_wrap .addons-small-light-block p{margin-top:0}.wc_addons_wrap .addons-small-light-block img{height:225px;margin:0 -20px 0 0}.wc_addons_wrap .addons-small-light-block-content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 1 100px;flex:1 1 100px;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:distribute;justify-content:space-around}.wc_addons_wrap .addons-small-light-block-buttons{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.wc_addons_wrap .addons-small-light-block-content a{width:48%}.wc_addons_wrap .addons-button{border-radius:3px;cursor:pointer;display:block;height:37px;line-height:37px;text-align:center;text-decoration:none;width:124px}.wc_addons_wrap .addons-button-solid{background-color:#955a89;color:#fff}.wc_addons_wrap .addons-button-solid:hover{color:#fff;opacity:.8}.wc_addons_wrap .addons-button-outline-green{border:1px solid #73ae39;color:#73ae39}.wc_addons_wrap .addons-button-outline-green:hover{color:#73ae39;opacity:.8}.wc_addons_wrap .addons-button-outline-white{border:1px solid #fff;color:#fff}.wc_addons_wrap .addons-button-outline-white:hover{color:#fff;opacity:.8}.wc_addons_wrap .addons-button-installed{background:#e6e6e6;color:#3c3c3c}.wc_addons_wrap .addons-button-installed:hover{color:#3c3c3c;opacity:.8}@media only screen and (max-width:400px){.wc_addons_wrap .addons-featured{margin:-1% -5%}.wc_addons_wrap .addons-button{width:100%}.wc_addons_wrap .addons-small-dark-item{width:100%}.wc_addons_wrap .addons-column-block-item-icon{background:0 0;border:none;height:75px;margin:0 0 10px 10px;width:75px}}.wc_addons_wrap .products{overflow:hidden;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row;flex-flow:row;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0 -.5em}.wc_addons_wrap .products li{float:right;border:1px solid #ddd;margin:0 .5em 1em!important;padding:0;vertical-align:top;width:25%;min-width:280px;min-height:220px;-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden;background:#f5f5f5;box-shadow:inset 0 1px 0 rgba(255,255,255,.2),inset 0 -1px 0 rgba(0,0,0,.1)}.wc_addons_wrap .products li a{text-decoration:none;color:inherit;display:block;height:100%}.wc_addons_wrap .products li a .product-img-wrap{background:#fff;display:block}.wc_addons_wrap .products li a img{max-width:258px;max-height:24px;padding:17px 20px;display:block;margin:0;background:#fff;border-left:260px solid #fff}.wc_addons_wrap .products li a img.extension-thumb+h3{display:none}.wc_addons_wrap .products li a .price{display:none}.wc_addons_wrap .products li a h2,.wc_addons_wrap .products li a h3{margin:0!important;padding:20px!important;background:#fff}.wc_addons_wrap .products li a p{padding:20px!important;margin:0!important;border-top:1px solid #f1f1f1}.wc_addons_wrap .products li a:focus,.wc_addons_wrap .products li a:hover{background-color:#fff}.wc_addons_wrap .storefront{background:url(../images/storefront-bg.jpg) bottom right #f6f6f6;border:1px solid #ddd;margin-top:1em;padding:20px;overflow:hidden;zoom:1}.wc_addons_wrap .storefront img{width:278px;height:auto;float:right;margin:0 0 0 20px;box-shadow:0 1px 6px rgba(0,0,0,.1)}.wc_addons_wrap .storefront p{max-width:750px}.woocommerce-BlankState a.button-primary,.woocommerce-BlankState button.button-primary,.woocommerce-message a.button-primary,.woocommerce-message button.button-primary{background:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;color:#fff;text-shadow:0 -1px 1px #a36597,-1px 0 1px #a36597,0 1px 1px #a36597,1px 0 1px #a36597;display:inline-block}.woocommerce-BlankState a.button-primary:active,.woocommerce-BlankState a.button-primary:focus,.woocommerce-BlankState a.button-primary:hover,.woocommerce-BlankState button.button-primary:active,.woocommerce-BlankState button.button-primary:focus,.woocommerce-BlankState button.button-primary:hover,.woocommerce-message a.button-primary:active,.woocommerce-message a.button-primary:focus,.woocommerce-message a.button-primary:hover,.woocommerce-message button.button-primary:active,.woocommerce-message button.button-primary:focus,.woocommerce-message button.button-primary:hover{background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.woocommerce-message{position:relative;border-right-color:#cc99c2!important;overflow:hidden}.woocommerce-message a.docs,.woocommerce-message a.skip{text-decoration:none!important}.woocommerce-message a.woocommerce-message-close{position:static;float:left;padding:0 28px 10px 15px;margin-top:-10px;font-size:13px;line-height:1.23076923;text-decoration:none}.woocommerce-message a.woocommerce-message-close::before{position:relative;top:18px;right:-20px;-webkit-transition:all .1s ease-in-out;transition:all .1s ease-in-out}.woocommerce-message .twitter-share-button{margin-top:-3px;margin-right:3px;vertical-align:middle}#variable_product_options #message,#variable_product_options .notice{margin:10px}.clear{clear:both}.wrap.woocommerce div.error,.wrap.woocommerce div.updated{margin-top:10px}mark.amount{background:transparent none;color:inherit}.simplify-commerce-banner{overflow:hidden}.simplify-commerce-banner img{float:left;padding:15px 0;margin-right:1em;width:200px}.woocommerce-help-tip{color:#666;display:inline-block;font-size:1.1em;font-style:normal;height:16px;line-height:16px;position:relative;vertical-align:middle;width:16px}.woocommerce-help-tip::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";cursor:help}h2 .woocommerce-help-tip{margin-top:-5px;margin-right:.25em}table.wc_status_table{margin-bottom:1em}table.wc_status_table h2{font-size:14px;margin:0}table.wc_status_table tr:nth-child(2n) td,table.wc_status_table tr:nth-child(2n) th{background:#fcfcfc}table.wc_status_table th{font-weight:700;padding:9px}table.wc_status_table td:first-child{width:33%}table.wc_status_table td.help{width:1em}table.wc_status_table td,table.wc_status_table th{font-size:1.1em;font-weight:400}table.wc_status_table td.run-tool,table.wc_status_table th.run-tool{text-align:left}table.wc_status_table td strong.name,table.wc_status_table th strong.name{display:block;margin-bottom:.5em}table.wc_status_table td mark,table.wc_status_table th mark{background:transparent none}table.wc_status_table td mark.yes,table.wc_status_table th mark.yes{color:#7ad03a}table.wc_status_table td mark.no,table.wc_status_table th mark.no{color:#999}table.wc_status_table td .red,table.wc_status_table td mark.error,table.wc_status_table th .red,table.wc_status_table th mark.error{color:#a00}table.wc_status_table td ul,table.wc_status_table th ul{margin:0}table.wc_status_table .help_tip{cursor:help}table.wc_status_table--tools td,table.wc_status_table--tools th{padding:2em}.taxonomy-product_cat .column-thumb .woocommerce-help-tip{font-size:1.5em;margin:0 -34px 0 0;padding:0 2px 5px;display:block;position:absolute}#debug-report{display:none;margin:10px 0;padding:0;position:relative}#debug-report textarea{font-family:monospace;width:100%;margin:0;height:300px;padding:20px;border-radius:0;resize:none;font-size:12px;line-height:20px;outline:0}.wp-list-table.logs .log-level{display:inline;padding:.2em .6em .3em;font-size:80%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.2em}.wp-list-table.logs .log-level:empty{display:none}.wp-list-table.logs .log-level--alert,.wp-list-table.logs .log-level--emergency{background-color:#ff4136}.wp-list-table.logs .log-level--critical,.wp-list-table.logs .log-level--error{background-color:#ff851b}.wp-list-table.logs .log-level--notice,.wp-list-table.logs .log-level--warning{color:#222;background-color:#ffdc00}.wp-list-table.logs .log-level--info{background-color:#0074d9}.wp-list-table.logs .log-level--debug{background-color:#3d9970}@media screen and (min-width:783px){.wp-list-table.logs .column-timestamp{width:18%}.wp-list-table.logs .column-level{width:14%}.wp-list-table.logs .column-source{width:15%}}#log-viewer-select{padding:10px 0 8px;line-height:28px}#log-viewer-select h2 a{vertical-align:middle}#log-viewer{background:#fff;border:1px solid #e5e5e5;box-shadow:0 1px 1px rgba(0,0,0,.04);padding:5px 20px}#log-viewer pre{font-family:monospace;white-space:pre-wrap;word-wrap:break-word}.inline-edit-product.quick-edit-row .inline-edit-col-center,.inline-edit-product.quick-edit-row .inline-edit-col-right{float:left!important}#woocommerce-fields.inline-edit-col{clear:right}#woocommerce-fields.inline-edit-col label.featured,#woocommerce-fields.inline-edit-col label.manage_stock{margin-right:10px}#woocommerce-fields.inline-edit-col label.stock_status_field{clear:both;float:right}#woocommerce-fields.inline-edit-col .dimensions div{display:block;margin:.2em 0}#woocommerce-fields.inline-edit-col .dimensions div span.title{display:block;float:right;width:5em}#woocommerce-fields.inline-edit-col .dimensions div span.input-text-wrap{display:block;margin-right:5em}#woocommerce-fields.inline-edit-col .text{box-sizing:border-box;width:99%;float:right;margin:1px 1px 1px 1%}#woocommerce-fields.inline-edit-col .height,#woocommerce-fields.inline-edit-col .length,#woocommerce-fields.inline-edit-col .width{width:32.33%}#woocommerce-fields.inline-edit-col .height{margin-left:0}#woocommerce-fields-bulk.inline-edit-col label{clear:right}#woocommerce-fields-bulk.inline-edit-col .inline-edit-group label{clear:none;width:49%;margin:.2em 0}#woocommerce-fields-bulk.inline-edit-col .inline-edit-group.dimensions label{width:75%;max-width:75%}#woocommerce-fields-bulk.inline-edit-col .length,#woocommerce-fields-bulk.inline-edit-col .regular_price,#woocommerce-fields-bulk.inline-edit-col .sale_price,#woocommerce-fields-bulk.inline-edit-col .stock,#woocommerce-fields-bulk.inline-edit-col .weight{box-sizing:border-box;width:100%;margin-right:4.4em}#woocommerce-fields-bulk.inline-edit-col .height,#woocommerce-fields-bulk.inline-edit-col .length,#woocommerce-fields-bulk.inline-edit-col .width{box-sizing:border-box;width:25%}.column-coupon_code{line-height:2.25em}.column-coupon_code,ul.wc_coupon_list{margin:0;overflow:hidden;zoom:1;clear:both}ul.wc_coupon_list{padding-bottom:5px}ul.wc_coupon_list li{margin:0}ul.wc_coupon_list li.code{display:inline-block;position:relative;padding:0 .5em;background-color:#fff;border:1px solid #aaa;box-shadow:0 1px 0 #dfdfdf;border-radius:4px;margin-left:5px;margin-top:5px}ul.wc_coupon_list li.code.editable{padding-left:2em}ul.wc_coupon_list li.code .tips{cursor:pointer}ul.wc_coupon_list li.code .tips span{color:#888}ul.wc_coupon_list li.code .tips span:hover{color:#000}ul.wc_coupon_list li.code .remove-coupon{text-decoration:none;color:#888;position:absolute;top:7px;left:20px;left:7px}ul.wc_coupon_list li.code .remove-coupon::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}ul.wc_coupon_list li.code .remove-coupon:hover::before{color:#a00}ul.wc_coupon_list_block{margin:0;padding-bottom:2px}ul.wc_coupon_list_block li{border-top:1px solid #fff;border-bottom:1px solid #ccc;line-height:2.5em;margin:0;padding:.5em 0}ul.wc_coupon_list_block li:first-child{border-top:0;padding-top:0}ul.wc_coupon_list_block li:last-child{border-bottom:0;padding-bottom:0}.button.wc-reload{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;padding:0;height:28px;width:28px!important;display:inline-block}.button.wc-reload::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";line-height:28px}#woocommerce-order-data .handlediv,#woocommerce-order-data .hndle{display:none}#woocommerce-order-data .inside{display:block!important}#order_data{padding:23px 24px 12px}#order_data h2{margin:0;font-family:HelveticaNeue-Light,'Helvetica Neue Light','Helvetica Neue',sans-serif;font-size:21px;font-weight:400;line-height:1.2;text-shadow:-1px 1px 1px #fff;padding:0}#order_data h3{font-size:14px}#order_data h3,#order_data h4{color:#333;margin:1.33em 0 0}#order_data p{color:#777}#order_data p.order_number{margin:0;font-family:HelveticaNeue-Light,'Helvetica Neue Light','Helvetica Neue',sans-serif;font-weight:400;line-height:1.6em;font-size:16px}#order_data .order_data_column_container{clear:both}#order_data .order_data_column{width:32%;padding:0 0 0 2%;float:right}#order_data .order_data_column>h3 span{display:block}#order_data .order_data_column:last-child{padding-left:0}#order_data .order_data_column p{padding:0!important}#order_data .order_data_column .address strong{display:block}#order_data .order_data_column .form-field{float:right;clear:right;width:48%;padding:0;margin:9px 0 0}#order_data .order_data_column .form-field label{display:block;padding:0 0 3px}#order_data .order_data_column .form-field input,#order_data .order_data_column .form-field textarea{width:100%}#order_data .order_data_column .form-field select{width:100%}#order_data .order_data_column .form-field .select2-container{width:100%!important}#order_data .order_data_column .form-field .date-picker{width:50%}#order_data .order_data_column .form-field .hour,#order_data .order_data_column .form-field .minute{width:3.5em}#order_data .order_data_column .form-field small{display:block;margin:5px 0 0;color:#999}#order_data .order_data_column ._billing_address_2_field,#order_data .order_data_column ._billing_last_name_field,#order_data .order_data_column ._billing_phone_field,#order_data .order_data_column ._billing_postcode_field,#order_data .order_data_column ._billing_state_field,#order_data .order_data_column ._shipping_address_2_field,#order_data .order_data_column ._shipping_last_name_field,#order_data .order_data_column ._shipping_postcode_field,#order_data .order_data_column ._shipping_state_field,#order_data .order_data_column .form-field.last{float:left;clear:left}#order_data .order_data_column ._billing_company_field,#order_data .order_data_column ._shipping_company_field,#order_data .order_data_column ._transaction_id_field,#order_data .order_data_column .form-field-wide{width:100%;clear:both}#order_data .order_data_column ._billing_company_field .wc-category-search,#order_data .order_data_column ._billing_company_field .wc-customer-search,#order_data .order_data_column ._billing_company_field .wc-enhanced-select,#order_data .order_data_column ._billing_company_field input,#order_data .order_data_column ._billing_company_field select,#order_data .order_data_column ._billing_company_field textarea,#order_data .order_data_column ._shipping_company_field .wc-category-search,#order_data .order_data_column ._shipping_company_field .wc-customer-search,#order_data .order_data_column ._shipping_company_field .wc-enhanced-select,#order_data .order_data_column ._shipping_company_field input,#order_data .order_data_column ._shipping_company_field select,#order_data .order_data_column ._shipping_company_field textarea,#order_data .order_data_column ._transaction_id_field .wc-category-search,#order_data .order_data_column ._transaction_id_field .wc-customer-search,#order_data .order_data_column ._transaction_id_field .wc-enhanced-select,#order_data .order_data_column ._transaction_id_field input,#order_data .order_data_column ._transaction_id_field select,#order_data .order_data_column ._transaction_id_field textarea,#order_data .order_data_column .form-field-wide .wc-category-search,#order_data .order_data_column .form-field-wide .wc-customer-search,#order_data .order_data_column .form-field-wide .wc-enhanced-select,#order_data .order_data_column .form-field-wide input,#order_data .order_data_column .form-field-wide select,#order_data .order_data_column .form-field-wide textarea{width:100%}#order_data .order_data_column p.none_set{color:#999}#order_data .order_data_column div.edit_address{display:none;zoom:1;padding-left:1px}#order_data .order_data_column .wc-customer-user label a,#order_data .order_data_column .wc-order-status label a{float:left;margin-right:8px}#order_data .order_data_column a.edit_address{width:14px;height:0;padding:14px 0 0;margin:0 6px 0 0;overflow:hidden;position:relative;color:#999;border:0;float:left}#order_data .order_data_column a.edit_address:focus,#order_data .order_data_column a.edit_address:hover{color:#000}#order_data .order_data_column a.edit_address::after{font-family:WooCommerce;position:absolute;top:0;right:0;text-align:center;vertical-align:top;line-height:14px;font-size:14px;font-weight:400}#order_data .order_data_column a.edit_address::after{font-family:Dashicons;content:'\f464'}#order_data .order_data_column .billing-same-as-shipping,#order_data .order_data_column .load_customer_billing,#order_data .order_data_column .load_customer_shipping{font-size:13px;display:inline-block;font-weight:400}#order_data .order_data_column .load_customer_shipping{margin-left:.3em}.order_actions{margin:0;overflow:hidden;zoom:1}.order_actions li{border-top:1px solid #fff;border-bottom:1px solid #ddd;padding:6px 0;margin:0;line-height:1.6em;float:right;width:50%;text-align:center}.order_actions li a{float:none;text-align:center;text-decoration:underline}.order_actions li.wide{width:auto;float:none;clear:both;padding:6px;text-align:right;overflow:hidden}.order_actions li #delete-action{line-height:25px;vertical-align:middle;text-align:right;float:right}.order_actions li .save_order{float:left}.order_actions li#actions{overflow:hidden}.order_actions li#actions .button{width:24px;box-sizing:border-box;float:left}.order_actions li#actions select{width:225px;box-sizing:border-box;float:right}#woocommerce-order-items .inside{margin:0;padding:0;background:#fefefe}#woocommerce-order-items .wc-order-data-row{border-bottom:1px solid #dfdfdf;padding:1.5em 2em;background:#f8f8f8;line-height:2em;text-align:left}#woocommerce-order-items .wc-order-data-row::after,#woocommerce-order-items .wc-order-data-row::before{content:' ';display:table}#woocommerce-order-items .wc-order-data-row::after{clear:both}#woocommerce-order-items .wc-order-data-row p{margin:0;line-height:2em}#woocommerce-order-items .wc-order-data-row .wc-used-coupons{text-align:right}#woocommerce-order-items .wc-order-data-row .wc-used-coupons .tips{display:inline-block}#woocommerce-order-items .wc-used-coupons{float:right;width:50%}#woocommerce-order-items .wc-order-totals{float:left;width:50%;margin:0;padding:0;text-align:left}#woocommerce-order-items .wc-order-totals .amount{font-weight:700}#woocommerce-order-items .wc-order-totals .label{vertical-align:top}#woocommerce-order-items .wc-order-totals .total{font-size:1em!important;width:10em;margin:0 .5em 0 0;box-sizing:border-box}#woocommerce-order-items .wc-order-totals .total input[type=text]{width:96%;float:left}#woocommerce-order-items .wc-order-totals .refunded-total{color:#a00}#woocommerce-order-items .refund-actions{margin-top:5px;padding-top:12px;border-top:1px solid #dfdfdf}#woocommerce-order-items .refund-actions .button{float:left;margin-right:4px}#woocommerce-order-items .refund-actions .cancel-action{float:right;margin-right:0}#woocommerce-order-items .add_meta{margin-right:0!important}#woocommerce-order-items h3 small{color:#999}#woocommerce-order-items .amount{white-space:nowrap}#woocommerce-order-items .add-items .description{margin-left:10px}#woocommerce-order-items .add-items .button{float:right;margin-left:.25em}#woocommerce-order-items .add-items .button-primary{float:none;margin-left:0}#woocommerce-order-items .inside{display:block!important}#woocommerce-order-items .handlediv,#woocommerce-order-items .hndle{display:none}#woocommerce-order-items .woocommerce_order_items_wrapper{margin:0;overflow-x:auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items{width:100%;background:#fff}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th{text-align:right;padding:1em;font-weight:400;color:#999;background:#f8f8f8;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th.sortable{cursor:pointer}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th:last-child{padding-left:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th:first-child{padding-right:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th .wc-arrow{float:left;position:relative;margin-left:-1em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td{padding:1.5em 1em 1em;text-align:right;line-height:1.5em;vertical-align:top;border-bottom:1px solid #f8f8f8}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td textarea{width:100%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td select{width:50%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td textarea{font-size:14px;padding:4px;color:#555}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th:last-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td:last-child{padding-left:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td:first-child{padding-right:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody tr:last-child td{border-bottom:1px solid #dfdfdf}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody tr:first-child td{border-top:8px solid #f8f8f8}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody#order_line_items tr:first-child td{border-top:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb{text-align:right;width:38px;padding-bottom:1.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb .wc-order-item-thumbnail{width:38px;height:38px;border:2px solid #e8e8e8;background:#f8f8f8;color:#ccc;position:relative;font-size:21px;display:block;text-align:center}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb .wc-order-item-thumbnail::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";width:38px;line-height:38px;display:block}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb .wc-order-item-thumbnail img{width:100%;height:100%;margin:0;padding:0;position:relative}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.name .wc-order-item-sku,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.name .wc-order-item-variation{display:block;margin-top:.5em;font-size:.92em!important;color:#888}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item{min-width:200px}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .center,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .variation-id{text-align:center}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class{text-align:left}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class label{white-space:nowrap;color:#999;font-size:.833em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class label input{display:inline}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class input{width:70px;vertical-align:middle;text-align:left}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class select{width:85px;height:26px;vertical-align:middle;font-size:1em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input{display:inline-block;background:#fff;border:1px solid #ddd;box-shadow:inset 0 1px 2px rgba(0,0,0,.07);margin:1px 0;min-width:80px;overflow:hidden;line-height:1em;text-align:left}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input{width:100%;box-sizing:border-box}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input label{font-size:.75em;padding:4px 6px 0;color:#555;display:block}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input input{width:100%;box-sizing:border-box;border:0;box-shadow:none;margin:0;padding:0 6px 4px;color:#555;background:0 0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input input::-webkit-input-placeholder{color:#ddd}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input:first-child{border-bottom:1px dashed #ddd;background:#fff}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input:first-child label{color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input:first-child input{color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .view{white-space:nowrap}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .edit{text-align:right}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class small.times{font-size:.92em!important;color:#888}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-taxes{margin:0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-taxes label{display:block}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-discount{display:block;margin-top:.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class small.times{margin-left:.25em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity{text-align:center}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity input{text-align:center;width:50px}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items span.subtotal{opacity:.5}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.tax_class,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.tax_class{text-align:right}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .calculated{border-color:#ae8ca2;border-style:dotted}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta{width:100%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta{margin:.5em 0 0;font-size:.92em!important;color:#888}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr th,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr th{border:0;padding:0 0 .5em 4px;line-height:1.5em;width:20%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td{padding:0 0 .5em 4px;border:0;line-height:1.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td input{width:100%;margin:0;position:relative;border-bottom:0;box-shadow:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td textarea{width:100%;height:4em;margin:0;box-shadow:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td input:focus+textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td input:focus+textarea{border-top-color:#999}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td p,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td p{margin:0 0 .5em;line-height:1.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td p:last-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td p:last-child{margin:0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .refund_by{border-bottom:1px dotted #999}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.fee .thumb div{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.5em;line-height:1em;vertical-align:middle;margin:0 auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.fee .thumb div::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.refund .thumb div{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.5em;line-height:1em;vertical-align:middle;margin:0 auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.refund .thumb div::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .thumb div{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.5em;line-height:1em;vertical-align:middle;margin:0 auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .thumb div::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .shipping_method,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .shipping_method_name{width:100%;margin:0 0 .5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax{white-space:nowrap}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax .delete-order-tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax .delete-order-tax{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;float:left;font-size:14px;visibility:hidden;margin:3px 0 0 -18px}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax .delete-order-tax::before,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax .delete-order-tax::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#999}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax .delete-order-tax:hover::before,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax .delete-order-tax:hover::before{color:#a00}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax:hover .delete-order-tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax:hover .delete-order-tax{visibility:visible}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items small.refunded{display:block;color:#a00;white-space:nowrap;margin-top:.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items small.refunded::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";position:relative;top:auto;right:auto;margin:-1px 0 0 4px;vertical-align:middle;line-height:1em}#woocommerce-order-items .wc-order-edit-line-item{padding-right:0}#woocommerce-order-items .wc-order-edit-line-item-actions{width:44px;text-align:left;padding-right:0;vertical-align:middle}#woocommerce-order-items .wc-order-edit-line-item-actions a{color:#ccc;display:inline-block;cursor:pointer;padding:0 0 .5em;margin:0 12px 0 0;vertical-align:middle;text-decoration:none;line-height:16px;width:16px;overflow:hidden}#woocommerce-order-items .wc-order-edit-line-item-actions a::before{margin:0;padding:0;font-size:16px;width:16px;height:16px}#woocommerce-order-items .wc-order-edit-line-item-actions a:hover::before{color:#999}#woocommerce-order-items .wc-order-edit-line-item-actions a:first-child{margin-right:0}#woocommerce-order-items .wc-order-edit-line-item-actions .edit-order-item::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";position:relative}#woocommerce-order-items .wc-order-edit-line-item-actions .delete-order-item::before,#woocommerce-order-items .wc-order-edit-line-item-actions .delete_refund::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";position:relative}#woocommerce-order-items .wc-order-edit-line-item-actions .delete-order-item:hover::before,#woocommerce-order-items .wc-order-edit-line-item-actions .delete_refund:hover::before{color:#a00}#woocommerce-order-items tbody tr .wc-order-edit-line-item-actions{visibility:hidden}#woocommerce-order-items tbody tr:hover .wc-order-edit-line-item-actions{visibility:visible}#woocommerce-order-items .wc-order-totals .wc-order-edit-line-item-actions{width:1.5em;visibility:visible!important}#woocommerce-order-items .wc-order-totals .wc-order-edit-line-item-actions a{padding:0}#woocommerce-order-downloads .buttons{float:right;padding:0;margin:0;vertical-align:top}#woocommerce-order-downloads .buttons .add_item_id,#woocommerce-order-downloads .buttons .select2-container{width:400px!important;margin-left:9px;vertical-align:top;float:right}#woocommerce-order-downloads .buttons button{margin:2px 0 0}#woocommerce-order-downloads h3 small{color:#999}#poststuff #woocommerce-order-actions .inside{margin:0;padding:0}#poststuff #woocommerce-order-actions .inside ul.order_actions li{padding:6px 10px;box-sizing:border-box}#poststuff #woocommerce-order-actions .inside ul.order_actions li:last-child{border-bottom:0}#poststuff #woocommerce-order-notes .inside{margin:0;padding:0}#poststuff #woocommerce-order-notes .inside ul.order_notes li{padding:0 10px}#woocommerce_customers p.search-box{margin:6px 0 4px;float:right}#woocommerce_customers .tablenav{float:left;clear:none}.widefat.customers td{vertical-align:middle;padding:4px 7px}.widefat .column-order_title{width:15%}.widefat .column-order_title time{display:block;color:#999;margin:3px 0}.widefat .column-orders,.widefat .column-paying,.widefat .column-spent{text-align:center;width:8%}.widefat .column-last_order{width:11%}.widefat .column-wc_actions{width:110px}.widefat .column-wc_actions a.button{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;display:inline-block;margin:2px 0 2px 4px;padding:0!important;height:2em!important;width:2em;overflow:hidden}.widefat .column-wc_actions a.button::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;line-height:1.85}.widefat .column-wc_actions a.button img{display:block;width:12px;height:auto}.widefat .column-wc_actions a.edit::after{content:'\f464'}.widefat .column-wc_actions a.link::after{font-family:WooCommerce;content:'\e00d'}.widefat .column-wc_actions a.view::after{content:'\f177'}.widefat .column-wc_actions a.refresh::after{font-family:WooCommerce;content:'\e031'}.widefat .column-wc_actions a.processing::after{font-family:WooCommerce;content:'\e00f'}.widefat .column-wc_actions a.complete::after{content:'\f147'}.widefat small.meta{display:block;color:#999;font-size:inherit;margin:3px 0}.post-type-shop_order .tablenav .one-page .displaying-num{display:none}.post-type-shop_order .wp-list-table{margin-top:1em}.post-type-shop_order .wp-list-table tfoot th,.post-type-shop_order .wp-list-table thead th{padding:.75em 1em}.post-type-shop_order .wp-list-table tfoot th.sortable a,.post-type-shop_order .wp-list-table tfoot th.sorted a,.post-type-shop_order .wp-list-table thead th.sortable a,.post-type-shop_order .wp-list-table thead th.sorted a{padding:0}.post-type-shop_order .wp-list-table tfoot th:first-child,.post-type-shop_order .wp-list-table thead th:first-child{padding-right:2em}.post-type-shop_order .wp-list-table tfoot th:last-child,.post-type-shop_order .wp-list-table thead th:last-child{padding-left:2em}.post-type-shop_order .wp-list-table tbody td,.post-type-shop_order .wp-list-table tbody th{padding:1em;line-height:26px}.post-type-shop_order .wp-list-table tbody td:first-child{padding-right:2em}.post-type-shop_order .wp-list-table tbody td:last-child{padding-left:2em}.post-type-shop_order .wp-list-table tbody tr{border-top:1px solid #f5f5f5}.post-type-shop_order .wp-list-table tbody tr:hover:not(.status-trash):not(.no-link) td{cursor:pointer}.post-type-shop_order .wp-list-table .no-link{cursor:default!important}.post-type-shop_order .wp-list-table td,.post-type-shop_order .wp-list-table th{width:12ch;vertical-align:middle}.post-type-shop_order .wp-list-table td p,.post-type-shop_order .wp-list-table th p{margin:0}.post-type-shop_order .wp-list-table .check-column{width:1px;white-space:nowrap;padding:1em 1em 1em 1em!important;vertical-align:middle}.post-type-shop_order .wp-list-table .check-column input{vertical-align:text-top;margin:1px 0}.post-type-shop_order .wp-list-table .column-order_number{width:20ch}.post-type-shop_order .wp-list-table .column-order_total{width:8ch;text-align:left}.post-type-shop_order .wp-list-table .column-order_total a span{float:left}.post-type-shop_order .wp-list-table .column-order_date,.post-type-shop_order .wp-list-table .column-order_status{width:10ch}.post-type-shop_order .wp-list-table .column-order_status{width:14ch}.post-type-shop_order .wp-list-table .column-billing_address,.post-type-shop_order .wp-list-table .column-shipping_address{width:20ch;line-height:1.5em}.post-type-shop_order .wp-list-table .column-billing_address .description,.post-type-shop_order .wp-list-table .column-shipping_address .description{display:block;color:#999}.post-type-shop_order .wp-list-table .column-wc_actions{text-align:left}.post-type-shop_order .wp-list-table .column-wc_actions a.button{text-indent:9999px;margin:2px 4px 2px 0}.post-type-shop_order .wp-list-table .order-preview{float:left;width:16px;padding:20px 4px 4px 4px;height:0;overflow:hidden;position:relative;border:2px solid transparent;border-radius:4px}.post-type-shop_order .wp-list-table .order-preview::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";line-height:16px;font-size:14px;vertical-align:middle;top:4px}.post-type-shop_order .wp-list-table .order-preview:hover{border:2px solid #00a0d2}.post-type-shop_order .wp-list-table .order-preview.disabled::before{content:'';background:url(../images/wpspin.gif) no-repeat center top}.order-status{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;line-height:2.5em;color:#777;background:#e5e5e5;border-radius:4px;border-bottom:1px solid rgba(0,0,0,.05);margin:-.25em 0;cursor:inherit!important;white-space:nowrap;max-width:100%}.order-status.status-completed{background:#c8d7e1;color:#2e4453}.order-status.status-on-hold{background:#f8dda7;color:#94660c}.order-status.status-failed{background:#eba3a3;color:#761919}.order-status.status-processing{background:#c6e1c6;color:#5b841b}.order-status.status-trash{background:#eba3a3;color:#761919}.order-status>span{margin:0 1em;overflow:hidden;text-overflow:ellipsis}.wc-order-preview .order-status{float:left;margin-left:54px}.wc-order-preview article{padding:0!important}.wc-order-preview .modal-close{border-radius:0}.wc-order-preview .wc-order-preview-table{width:100%;margin:0}.wc-order-preview .wc-order-preview-table td,.wc-order-preview .wc-order-preview-table th{padding:1em 1.5em;text-align:right;border:0;border-bottom:1px solid #eee;margin:0;background:0 0;box-shadow:none;text-align:left;vertical-align:top}.wc-order-preview .wc-order-preview-table td:first-child,.wc-order-preview .wc-order-preview-table th:first-child{text-align:right}.wc-order-preview .wc-order-preview-table th{border-color:#ccc}.wc-order-preview .wc-order-preview-table tr:last-child td{border:0}.wc-order-preview .wc-order-preview-table .wc-order-item-sku{margin-top:.5em}.wc-order-preview .wc-order-preview-table .wc-order-item-meta{margin-top:.5em}.wc-order-preview .wc-order-preview-table .wc-order-item-meta td,.wc-order-preview .wc-order-preview-table .wc-order-item-meta th{padding:0;border:0;text-align:right;vertical-align:top}.wc-order-preview .wc-order-preview-table .wc-order-item-meta td:last-child{padding-right:.5em}.wc-order-preview .wc-order-preview-addresses{overflow:hidden;padding-bottom:1.5em}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note{width:50%;float:right;padding:1.5em 1.5em 0;box-sizing:border-box;word-wrap:break-word}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address h2,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note h2{margin-top:0}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address strong,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note strong{display:block;margin-top:1.5em}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address strong:first-child,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note strong:first-child{margin-top:0}.wc-order-preview footer .wc-action-button-group{display:inline-block;float:right}.wc-order-preview footer .button.button-large{margin-right:10px;padding:0 10px!important;line-height:28px;height:auto;display:inline-block}.wc-order-preview .wc-action-button-group label{display:none}.wc-action-button-group{vertical-align:middle;line-height:26px;text-align:right}.wc-action-button-group label{margin-left:6px;cursor:default;font-weight:700;line-height:28px}.wc-action-button-group .wc-action-button-group__items{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-line-pack:start;align-content:flex-start;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.wc-action-button-group .wc-action-button{margin:0 -1px 0 0!important;border:1px solid #ccc;padding:0 10px!important;border-radius:0!important;float:none;line-height:28px;height:auto;z-index:1;position:relative;overflow:hidden;text-overflow:ellipsis;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;box-sizing:border-box;text-align:center;white-space:nowrap}.wc-action-button-group .wc-action-button:focus,.wc-action-button-group .wc-action-button:hover{border:1px solid #999;z-index:2}.wc-action-button-group .wc-action-button:first-child{margin-right:0!important;border-top-right-radius:3px!important;border-bottom-right-radius:3px!important}.wc-action-button-group .wc-action-button:last-child{border-top-left-radius:3px!important;border-bottom-left-radius:3px!important}@media screen and (max-width:782px){.wc-order-preview footer .wc-action-button-group .wc-action-button-group__items{display:-webkit-box;display:-ms-flexbox;display:flex}.wc-order-preview footer .wc-action-button-group{float:none;display:block;margin-bottom:4px}.wc-order-preview footer .button.button-large{width:100%;float:none;text-align:center;margin:0;display:block}.post-type-shop_order .wp-list-table td.check-column{width:1em}.post-type-shop_order .wp-list-table td.column-order_number{padding-right:0;padding-bottom:.5em}.post-type-shop_order .wp-list-table td.column-order_date,.post-type-shop_order .wp-list-table td.column-order_status{display:inline-block!important;padding:0 1em 1em 1em!important}.post-type-shop_order .wp-list-table td.column-order_date:before,.post-type-shop_order .wp-list-table td.column-order_status:before{display:none!important}.post-type-shop_order .wp-list-table td.column-order_date{padding-right:0!important}.post-type-shop_order .wp-list-table td.column-order_status{float:left}}.column-customer_message .note-on{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto;color:#999}.column-customer_message .note-on::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";line-height:16px}.column-order_notes .note-on{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto;color:#999}.column-order_notes .note-on::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";line-height:16px}.attributes-table td,.attributes-table th{width:15%;vertical-align:top}.attributes-table .attribute-terms{width:32%}.attributes-table .attribute-actions{width:2em}.attributes-table .attribute-actions .configure-terms{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;padding:0!important;height:2em!important;width:2em}.attributes-table .attribute-actions .configure-terms::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";font-family:Dashicons;line-height:1.85}ul.order_notes{padding:2px 0 0}ul.order_notes li .note_content{padding:10px;background:#efefef;position:relative}ul.order_notes li .note_content p{margin:0;padding:0;word-wrap:break-word}ul.order_notes li p.meta{padding:10px;color:#999;margin:0;font-size:11px}ul.order_notes li p.meta .exact-date{border-bottom:1px dotted #999}ul.order_notes li a.delete_note{color:#a00}ul.order_notes li .note_content::after{content:'';display:block;position:absolute;bottom:-10px;right:20px;width:0;height:0;border-width:10px 0 0 10px;border-style:solid;border-color:#efefef transparent}ul.order_notes li.system-note .note_content{background:#d7cad2}ul.order_notes li.system-note .note_content::after{border-color:#d7cad2 transparent}ul.order_notes li.customer-note .note_content{background:#a7cedc}ul.order_notes li.customer-note .note_content::after{border-color:#a7cedc transparent}.add_note{border-top:1px solid #ddd;padding:10px 10px 0}.add_note h4{margin-top:5px!important}.add_note #add_order_note{width:100%;height:50px}table.wp-list-table .column-thumb{width:52px;text-align:center;white-space:nowrap}table.wp-list-table .column-handle{width:17px;display:none}table.wp-list-table tbody td.column-handle{cursor:move;width:17px;text-align:center;vertical-align:text-top}table.wp-list-table tbody td.column-handle::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;height:100%;margin:4px 0 0 0}table.wp-list-table .column-name{width:22%}table.wp-list-table .column-product_cat,table.wp-list-table .column-product_tag{width:11%!important}table.wp-list-table .column-featured,table.wp-list-table .column-product_type{width:48px;text-align:right!important}table.wp-list-table .column-customer_message,table.wp-list-table .column-order_notes{width:48px;text-align:center}table.wp-list-table .column-customer_message img,table.wp-list-table .column-order_notes img{margin:0 auto;padding-top:0!important}table.wp-list-table .manage-column.column-featured img,table.wp-list-table .manage-column.column-product_type img{padding-right:2px}table.wp-list-table .column-price .woocommerce-price-suffix{display:none}table.wp-list-table img{margin:1px 2px}table.wp-list-table .row-actions{color:#999}table.wp-list-table td.column-thumb img{margin:0;width:auto;height:auto;max-width:40px;max-height:40px;vertical-align:middle}table.wp-list-table span.na{color:#999}table.wp-list-table .column-sku{width:10%}table.wp-list-table .column-price{width:10ch}table.wp-list-table .column-is_in_stock{text-align:right!important;width:12ch}table.wp-list-table span.wc-featured,table.wp-list-table span.wc-image{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto}table.wp-list-table span.wc-featured::before,table.wp-list-table span.wc-image::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}table.wp-list-table span.wc-featured::before{content:'\f155'}table.wp-list-table span.wc-featured.not-featured::before{content:'\f154'}table.wp-list-table td.column-featured span.wc-featured{font-size:1.6em;cursor:pointer}table.wp-list-table mark.instock,table.wp-list-table mark.onbackorder,table.wp-list-table mark.outofstock{font-weight:700;background:transparent none;line-height:1}table.wp-list-table mark.instock{color:#7ad03a}table.wp-list-table mark.outofstock{color:#a44}table.wp-list-table mark.onbackorder{color:#eaa600}table.wp-list-table .notes_head,table.wp-list-table .order-notes_head,table.wp-list-table .status_head{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto}table.wp-list-table .notes_head::after,table.wp-list-table .order-notes_head::after,table.wp-list-table .status_head::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}table.wp-list-table .order-notes_head::after{content:'\e028'}table.wp-list-table .notes_head::after{content:'\e026'}table.wp-list-table .status_head::after{content:'\e011'}table.wp-list-table .column-order_items{width:12%}table.wp-list-table .column-order_items table.order_items{width:100%;margin:3px 0 0;padding:0;display:none}table.wp-list-table .column-order_items table.order_items td{border:0;margin:0;padding:0 0 3px}table.wp-list-table .column-order_items table.order_items td.qty{color:#999;padding-left:6px;text-align:right}mark.notice{background:#fff;color:#a00;margin:0 10px 0 0}a.export_rates,a.import_rates{float:left;margin-right:9px;margin-top:-2px;margin-bottom:0}#rates-search{float:left}#rates-search input.wc-tax-rates-search-field{padding:4px 8px;font-size:1.2em}#rates-pagination{float:left;margin-left:.5em}#rates-pagination .tablenav{margin:0}.wc_input_table_wrapper{overflow-x:auto;display:block}table.wc_input_table,table.wc_tax_rates{width:100%}table.wc_input_table td,table.wc_input_table th,table.wc_tax_rates td,table.wc_tax_rates th{display:table-cell!important}table.wc_input_table span.tips,table.wc_tax_rates span.tips{color:#2ea2cc}table.wc_input_table th,table.wc_tax_rates th{white-space:nowrap;padding:10px}table.wc_input_table td,table.wc_tax_rates td{padding:0;border-left:1px solid #dfdfdf;border-bottom:1px solid #dfdfdf;border-top:0;background:#fff;cursor:default}table.wc_input_table td input[type=number],table.wc_input_table td input[type=text],table.wc_tax_rates td input[type=number],table.wc_tax_rates td input[type=text]{width:100%!important;min-width:100px;padding:8px 10px;margin:0;border:0;outline:0;background:transparent none}table.wc_input_table td input[type=number]:focus,table.wc_input_table td input[type=text]:focus,table.wc_tax_rates td input[type=number]:focus,table.wc_tax_rates td input[type=text]:focus{outline:0;box-shadow:none}table.wc_input_table td.apply_to_shipping,table.wc_input_table td.compound,table.wc_tax_rates td.apply_to_shipping,table.wc_tax_rates td.compound{padding:5px 7px;vertical-align:middle}table.wc_input_table td.apply_to_shipping input,table.wc_input_table td.compound input,table.wc_tax_rates td.apply_to_shipping input,table.wc_tax_rates td.compound input{width:auto;padding:0}table.wc_input_table td:last-child,table.wc_tax_rates td:last-child{border-left:0}table.wc_input_table tr.current td,table.wc_tax_rates tr.current td{background-color:#fefbcc}table.wc_input_table .cost,table.wc_input_table .item_cost,table.wc_tax_rates .cost,table.wc_tax_rates .item_cost{text-align:left}table.wc_input_table .cost input,table.wc_input_table .item_cost input,table.wc_tax_rates .cost input,table.wc_tax_rates .item_cost input{text-align:left}table.wc_input_table th.sort,table.wc_tax_rates th.sort{width:17px;padding:0 4px}table.wc_input_table td.sort,table.wc_tax_rates td.sort{padding:0 4px}table.wc_input_table .ui-sortable:not(.ui-sortable-disabled) td.sort,table.wc_tax_rates .ui-sortable:not(.ui-sortable-disabled) td.sort{cursor:move;font-size:15px;background:#f9f9f9;text-align:center;vertical-align:middle}table.wc_input_table .ui-sortable:not(.ui-sortable-disabled) td.sort::before,table.wc_tax_rates .ui-sortable:not(.ui-sortable-disabled) td.sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:right;height:100%}table.wc_input_table .ui-sortable:not(.ui-sortable-disabled) td.sort:hover::before,table.wc_tax_rates .ui-sortable:not(.ui-sortable-disabled) td.sort:hover::before{color:#333}table.wc_input_table .button,table.wc_tax_rates .button{float:right;margin-left:5px}table.wc_input_table .export,table.wc_input_table .import,table.wc_tax_rates .export,table.wc_tax_rates .import{float:left;margin-left:0;margin-right:5px}table.wc_input_table span.tips,table.wc_tax_rates span.tips{padding:0 3px}table.wc_input_table .pagination,table.wc_tax_rates .pagination{float:left}table.wc_input_table .pagination .button,table.wc_tax_rates .pagination .button{margin-right:5px;margin-left:0}table.wc_input_table .pagination .current,table.wc_tax_rates .pagination .current{background:#bbb;text-shadow:none}table.wc_input_table tr:last-child td,table.wc_tax_rates tr:last-child td{border-bottom:0}table.wc_emails,table.wc_gateways,table.wc_shipping{position:relative}table.wc_emails td,table.wc_emails th,table.wc_gateways td,table.wc_gateways th,table.wc_shipping td,table.wc_shipping th{display:table-cell!important;padding:1em!important;vertical-align:top;line-height:1.75em}table.wc_emails.wc_emails td,table.wc_gateways.wc_emails td,table.wc_shipping.wc_emails td{vertical-align:middle}table.wc_emails tr:nth-child(odd) td,table.wc_gateways tr:nth-child(odd) td,table.wc_shipping tr:nth-child(odd) td{background:#f9f9f9}table.wc_emails td.name,table.wc_gateways td.name,table.wc_shipping td.name{font-weight:700}table.wc_emails .settings,table.wc_gateways .settings,table.wc_shipping .settings{text-align:left}table.wc_emails .default,table.wc_emails .radio,table.wc_emails .status,table.wc_gateways .default,table.wc_gateways .radio,table.wc_gateways .status,table.wc_shipping .default,table.wc_shipping .radio,table.wc_shipping .status{text-align:center}table.wc_emails .default .tips,table.wc_emails .radio .tips,table.wc_emails .status .tips,table.wc_gateways .default .tips,table.wc_gateways .radio .tips,table.wc_gateways .status .tips,table.wc_shipping .default .tips,table.wc_shipping .radio .tips,table.wc_shipping .status .tips{margin:0 auto}table.wc_emails .default input,table.wc_emails .radio input,table.wc_emails .status input,table.wc_gateways .default input,table.wc_gateways .radio input,table.wc_gateways .status input,table.wc_shipping .default input,table.wc_shipping .radio input,table.wc_shipping .status input{margin:0}table.wc_emails td.sort,table.wc_gateways td.sort,table.wc_shipping td.sort{font-size:15px;text-align:center}table.wc_emails td.sort .wc-item-reorder-nav,table.wc_gateways td.sort .wc-item-reorder-nav,table.wc_shipping td.sort .wc-item-reorder-nav{white-space:nowrap;width:72px}table.wc_emails td.sort .wc-item-reorder-nav:before,table.wc_gateways td.sort .wc-item-reorder-nav:before,table.wc_shipping td.sort .wc-item-reorder-nav:before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:24px;float:right;height:100%;line-height:24px;cursor:move}table.wc_emails td.sort .wc-item-reorder-nav button,table.wc_gateways td.sort .wc-item-reorder-nav button,table.wc_shipping td.sort .wc-item-reorder-nav button{position:relative;overflow:hidden;float:right;display:block;width:24px;height:24px;margin:0;background:0 0;border:none;box-shadow:none;color:#82878c;text-indent:-9999px;cursor:pointer;outline:0}table.wc_emails td.sort .wc-item-reorder-nav button:before,table.wc_gateways td.sort .wc-item-reorder-nav button:before,table.wc_shipping td.sort .wc-item-reorder-nav button:before{display:inline-block;position:absolute;top:0;left:0;width:100%;height:100%;font:normal 20px/23px dashicons;text-align:center;text-indent:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}table.wc_emails td.sort .wc-item-reorder-nav button:focus,table.wc_emails td.sort .wc-item-reorder-nav button:hover,table.wc_gateways td.sort .wc-item-reorder-nav button:focus,table.wc_gateways td.sort .wc-item-reorder-nav button:hover,table.wc_shipping td.sort .wc-item-reorder-nav button:focus,table.wc_shipping td.sort .wc-item-reorder-nav button:hover{color:#191e23}table.wc_emails td.sort .wc-item-reorder-nav .wc-move-down:before,table.wc_gateways td.sort .wc-item-reorder-nav .wc-move-down:before,table.wc_shipping td.sort .wc-item-reorder-nav .wc-move-down:before{content:"\f347"}table.wc_emails td.sort .wc-item-reorder-nav .wc-move-up:before,table.wc_gateways td.sort .wc-item-reorder-nav .wc-move-up:before,table.wc_shipping td.sort .wc-item-reorder-nav .wc-move-up:before{content:"\f343"}table.wc_emails td.sort .wc-item-reorder-nav .wc-move-disabled,table.wc_gateways td.sort .wc-item-reorder-nav .wc-move-disabled,table.wc_shipping td.sort .wc-item-reorder-nav .wc-move-disabled{color:#d5d5d5!important;cursor:default;pointer-events:none}table.wc_emails .wc-payment-gateway-method-name,table.wc_gateways .wc-payment-gateway-method-name,table.wc_shipping .wc-payment-gateway-method-name{font-weight:400}table.wc_emails .wc-email-settings-table-name,table.wc_gateways .wc-email-settings-table-name,table.wc_shipping .wc-email-settings-table-name{font-weight:700}table.wc_emails .wc-email-settings-table-name span,table.wc_gateways .wc-email-settings-table-name span,table.wc_shipping .wc-email-settings-table-name span{font-weight:400;color:#999;margin:0 4px 0 0!important}table.wc_emails .wc-payment-gateway-method-toggle-disabled,table.wc_emails .wc-payment-gateway-method-toggle-enabled,table.wc_gateways .wc-payment-gateway-method-toggle-disabled,table.wc_gateways .wc-payment-gateway-method-toggle-enabled,table.wc_shipping .wc-payment-gateway-method-toggle-disabled,table.wc_shipping .wc-payment-gateway-method-toggle-enabled{padding-top:1px;display:block;outline:0;box-shadow:none}table.wc_emails .wc-email-settings-table-status,table.wc_gateways .wc-email-settings-table-status,table.wc_shipping .wc-email-settings-table-status{text-align:center;width:1em}table.wc_emails .wc-email-settings-table-status .tips,table.wc_gateways .wc-email-settings-table-status .tips,table.wc_shipping .wc-email-settings-table-status .tips{margin:0 auto}.wc-shipping-zone-settings th{padding:24px 0 24px 24px}.wc-shipping-zone-settings td.forminp input,.wc-shipping-zone-settings td.forminp textarea{padding:8px;width:448px;max-width:100%!important}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select{width:448px;max-width:100%!important}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select .select2-choices{padding:8px 8px 4px;border-color:#ddd;min-height:0;line-height:1}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select .select2-choices input{padding:0}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select .select2-choices li{margin:0 0 4px 4px}.wc-shipping-zone-settings .wc-shipping-zone-postcodes-toggle{margin:.5em 0 0;font-size:.9em;text-decoration:underline;display:block}.wc-shipping-zone-settings .wc-shipping-zone-postcodes-toggle+.wc-shipping-zone-postcodes{display:none}.wc-shipping-zone-settings .wc-shipping-zone-postcodes textarea{margin:10px 0}.wc-shipping-zone-settings .wc-shipping-zone-postcodes .description{font-size:.9em;color:#999}.wc-shipping-zone-settings+p.submit{margin-top:0}table tr table.wc-shipping-zone-methods tr .row-actions,table tr:hover table.wc-shipping-zone-methods tr .row-actions{position:relative}table tr table.wc-shipping-zone-methods tr:hover .row-actions,table tr:hover table.wc-shipping-zone-methods tr:hover .row-actions{position:static}.wc-shipping-zones-heading .page-title-action{display:inline-block}table.wc-shipping-classes td,table.wc-shipping-classes th,table.wc-shipping-zone-methods td,table.wc-shipping-zone-methods th,table.wc-shipping-zones td,table.wc-shipping-zones th{vertical-align:top;line-height:24px;padding:1em!important;font-size:14px;background:#fff;display:table-cell!important}table.wc-shipping-classes td li,table.wc-shipping-classes th li,table.wc-shipping-zone-methods td li,table.wc-shipping-zone-methods th li,table.wc-shipping-zones td li,table.wc-shipping-zones th li{line-height:24px;font-size:14px}table.wc-shipping-classes td .woocommerce-help-tip,table.wc-shipping-classes th .woocommerce-help-tip,table.wc-shipping-zone-methods td .woocommerce-help-tip,table.wc-shipping-zone-methods th .woocommerce-help-tip,table.wc-shipping-zones td .woocommerce-help-tip,table.wc-shipping-zones th .woocommerce-help-tip{margin:0!important}table.wc-shipping-classes thead th,table.wc-shipping-zone-methods thead th,table.wc-shipping-zones thead th{vertical-align:middle}table.wc-shipping-classes thead .wc-shipping-zone-sort,table.wc-shipping-zone-methods thead .wc-shipping-zone-sort,table.wc-shipping-zones thead .wc-shipping-zone-sort{text-align:center}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state,table.wc-shipping-classes td.wc-shipping-zones-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state,table.wc-shipping-zones td.wc-shipping-zones-blank-state{background:#f7f1f6!important;overflow:hidden;position:relative;padding:7.5em 7.5%!important;border-bottom:2px solid #eee2ec}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-classes td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zones td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state{padding:2em!important}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-classes td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zones td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state p{margin-bottom:0}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state li,table.wc-shipping-classes td.wc-shipping-zone-method-blank-state p,table.wc-shipping-classes td.wc-shipping-zones-blank-state li,table.wc-shipping-classes td.wc-shipping-zones-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state p,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state p,table.wc-shipping-zones td.wc-shipping-zones-blank-state li,table.wc-shipping-zones td.wc-shipping-zones-blank-state p{color:#a46497;font-size:1.5em;line-height:1.5em;margin:0 0 1em;position:relative;z-index:1;text-shadow:-1px 1px 1px #fff}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state li.main,table.wc-shipping-classes td.wc-shipping-zone-method-blank-state p.main,table.wc-shipping-classes td.wc-shipping-zones-blank-state li.main,table.wc-shipping-classes td.wc-shipping-zones-blank-state p.main,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state li.main,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state p.main,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state li.main,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state p.main,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state li.main,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state p.main,table.wc-shipping-zones td.wc-shipping-zones-blank-state li.main,table.wc-shipping-zones td.wc-shipping-zones-blank-state p.main{font-size:2em}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state li,table.wc-shipping-classes td.wc-shipping-zones-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state li,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zones td.wc-shipping-zones-blank-state li{margin-right:1em;list-style:circle inside}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state::before,table.wc-shipping-classes td.wc-shipping-zones-blank-state::before,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state::before,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state::before,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state::before,table.wc-shipping-zones td.wc-shipping-zones-blank-state::before{content:'\e01b';font-family:WooCommerce;text-align:center;line-height:1;color:#eee2ec;display:block;width:1em;font-size:40em;top:50%;left:-3.75%;margin-top:-.1875em;position:absolute}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state .button-primary,table.wc-shipping-classes td.wc-shipping-zones-blank-state .button-primary,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state .button-primary,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state .button-primary,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state .button-primary,table.wc-shipping-zones td.wc-shipping-zones-blank-state .button-primary{background-color:#804877;border-color:#804877;box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 0 rgba(0,0,0,.15);margin:0;opacity:1;text-shadow:0 -1px 1px #8a4f7f,-1px 0 1px #8a4f7f,0 1px 1px #8a4f7f,1px 0 1px #8a4f7f;font-size:1.5em;padding:.75em 1em;height:auto;position:relative;z-index:1}table.wc-shipping-classes .wc-shipping-zone-method-rows tr:nth-child(even) td,table.wc-shipping-zone-methods .wc-shipping-zone-method-rows tr:nth-child(even) td,table.wc-shipping-zones .wc-shipping-zone-method-rows tr:nth-child(even) td{background:#f9f9f9}table.wc-shipping-classes .wc-shipping-class-rows tr:nth-child(odd) td,table.wc-shipping-classes tr.odd td,table.wc-shipping-zone-methods .wc-shipping-class-rows tr:nth-child(odd) td,table.wc-shipping-zone-methods tr.odd td,table.wc-shipping-zones .wc-shipping-class-rows tr:nth-child(odd) td,table.wc-shipping-zones tr.odd td{background:#f9f9f9}table.wc-shipping-classes tbody.wc-shipping-zone-rows td,table.wc-shipping-zone-methods tbody.wc-shipping-zone-rows td,table.wc-shipping-zones tbody.wc-shipping-zone-rows td{border-top:2px solid #f9f9f9}table.wc-shipping-classes tbody.wc-shipping-zone-rows tr:first-child td,table.wc-shipping-zone-methods tbody.wc-shipping-zone-rows tr:first-child td,table.wc-shipping-zones tbody.wc-shipping-zone-rows tr:first-child td{border-top:0}table.wc-shipping-classes tr.wc-shipping-zone-worldwide td,table.wc-shipping-zone-methods tr.wc-shipping-zone-worldwide td,table.wc-shipping-zones tr.wc-shipping-zone-worldwide td{background:#f9f9f9;border-top:2px solid #e1e1e1}table.wc-shipping-classes p,table.wc-shipping-classes ul,table.wc-shipping-zone-methods p,table.wc-shipping-zone-methods ul,table.wc-shipping-zones p,table.wc-shipping-zones ul{margin:0}table.wc-shipping-classes td.wc-shipping-zone-method-sort,table.wc-shipping-classes td.wc-shipping-zone-sort,table.wc-shipping-zone-methods td.wc-shipping-zone-method-sort,table.wc-shipping-zone-methods td.wc-shipping-zone-sort,table.wc-shipping-zones td.wc-shipping-zone-method-sort,table.wc-shipping-zones td.wc-shipping-zone-sort{cursor:move;font-size:15px;text-align:center}table.wc-shipping-classes td.wc-shipping-zone-method-sort::before,table.wc-shipping-classes td.wc-shipping-zone-sort::before,table.wc-shipping-zone-methods td.wc-shipping-zone-method-sort::before,table.wc-shipping-zone-methods td.wc-shipping-zone-sort::before,table.wc-shipping-zones td.wc-shipping-zone-method-sort::before,table.wc-shipping-zones td.wc-shipping-zone-sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:right;height:100%;line-height:24px}table.wc-shipping-classes td.wc-shipping-zone-method-sort:hover::before,table.wc-shipping-classes td.wc-shipping-zone-sort:hover::before,table.wc-shipping-zone-methods td.wc-shipping-zone-method-sort:hover::before,table.wc-shipping-zone-methods td.wc-shipping-zone-sort:hover::before,table.wc-shipping-zones td.wc-shipping-zone-method-sort:hover::before,table.wc-shipping-zones td.wc-shipping-zone-sort:hover::before{color:#333}table.wc-shipping-classes td.wc-shipping-zone-worldwide,table.wc-shipping-zone-methods td.wc-shipping-zone-worldwide,table.wc-shipping-zones td.wc-shipping-zone-worldwide{text-align:center}table.wc-shipping-classes td.wc-shipping-zone-worldwide::before,table.wc-shipping-zone-methods td.wc-shipping-zone-worldwide::before,table.wc-shipping-zones td.wc-shipping-zone-worldwide::before{content:'\f319';font-family:dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:right;height:100%;line-height:24px}table.wc-shipping-classes .wc-shipping-zone-methods,table.wc-shipping-classes .wc-shipping-zone-name,table.wc-shipping-zone-methods .wc-shipping-zone-methods,table.wc-shipping-zone-methods .wc-shipping-zone-name,table.wc-shipping-zones .wc-shipping-zone-methods,table.wc-shipping-zones .wc-shipping-zone-name{width:25%}table.wc-shipping-classes .wc-shipping-class-description input,table.wc-shipping-classes .wc-shipping-class-description select,table.wc-shipping-classes .wc-shipping-class-description textarea,table.wc-shipping-classes .wc-shipping-class-name input,table.wc-shipping-classes .wc-shipping-class-name select,table.wc-shipping-classes .wc-shipping-class-name textarea,table.wc-shipping-classes .wc-shipping-class-slug input,table.wc-shipping-classes .wc-shipping-class-slug select,table.wc-shipping-classes .wc-shipping-class-slug textarea,table.wc-shipping-classes .wc-shipping-zone-name input,table.wc-shipping-classes .wc-shipping-zone-name select,table.wc-shipping-classes .wc-shipping-zone-name textarea,table.wc-shipping-classes .wc-shipping-zone-region input,table.wc-shipping-classes .wc-shipping-zone-region select,table.wc-shipping-classes .wc-shipping-zone-region textarea,table.wc-shipping-zone-methods .wc-shipping-class-description input,table.wc-shipping-zone-methods .wc-shipping-class-description select,table.wc-shipping-zone-methods .wc-shipping-class-description textarea,table.wc-shipping-zone-methods .wc-shipping-class-name input,table.wc-shipping-zone-methods .wc-shipping-class-name select,table.wc-shipping-zone-methods .wc-shipping-class-name textarea,table.wc-shipping-zone-methods .wc-shipping-class-slug input,table.wc-shipping-zone-methods .wc-shipping-class-slug select,table.wc-shipping-zone-methods .wc-shipping-class-slug textarea,table.wc-shipping-zone-methods .wc-shipping-zone-name input,table.wc-shipping-zone-methods .wc-shipping-zone-name select,table.wc-shipping-zone-methods .wc-shipping-zone-name textarea,table.wc-shipping-zone-methods .wc-shipping-zone-region input,table.wc-shipping-zone-methods .wc-shipping-zone-region select,table.wc-shipping-zone-methods .wc-shipping-zone-region textarea,table.wc-shipping-zones .wc-shipping-class-description input,table.wc-shipping-zones .wc-shipping-class-description select,table.wc-shipping-zones .wc-shipping-class-description textarea,table.wc-shipping-zones .wc-shipping-class-name input,table.wc-shipping-zones .wc-shipping-class-name select,table.wc-shipping-zones .wc-shipping-class-name textarea,table.wc-shipping-zones .wc-shipping-class-slug input,table.wc-shipping-zones .wc-shipping-class-slug select,table.wc-shipping-zones .wc-shipping-class-slug textarea,table.wc-shipping-zones .wc-shipping-zone-name input,table.wc-shipping-zones .wc-shipping-zone-name select,table.wc-shipping-zones .wc-shipping-zone-name textarea,table.wc-shipping-zones .wc-shipping-zone-region input,table.wc-shipping-zones .wc-shipping-zone-region select,table.wc-shipping-zones .wc-shipping-zone-region textarea{width:100%}table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-zone-delete{color:#a00}table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-zone-delete:hover{color:red}table.wc-shipping-classes .wc-shipping-class-count,table.wc-shipping-zone-methods .wc-shipping-class-count,table.wc-shipping-zones .wc-shipping-class-count{text-align:center}table.wc-shipping-classes td.wc-shipping-zone-methods,table.wc-shipping-zone-methods td.wc-shipping-zone-methods,table.wc-shipping-zones td.wc-shipping-zone-methods{color:#555}table.wc-shipping-classes td.wc-shipping-zone-methods .method_disabled,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .method_disabled,table.wc-shipping-zones td.wc-shipping-zone-methods .method_disabled{text-decoration:line-through}table.wc-shipping-classes td.wc-shipping-zone-methods ul,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul,table.wc-shipping-zones td.wc-shipping-zone-methods ul{position:relative;padding-left:32px}table.wc-shipping-classes td.wc-shipping-zone-methods ul li,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul li,table.wc-shipping-zones td.wc-shipping-zone-methods ul li{color:#555;display:inline;margin:0}table.wc-shipping-classes td.wc-shipping-zone-methods ul li::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul li::before,table.wc-shipping-zones td.wc-shipping-zone-methods ul li::before{content:', '}table.wc-shipping-classes td.wc-shipping-zone-methods ul li:first-child::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul li:first-child::before,table.wc-shipping-zones td.wc-shipping-zone-methods ul li:first-child::before{content:''}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method{display:block;width:24px;padding:24px 0 0;height:0;overflow:hidden;cursor:pointer}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method::before,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";font-family:Dashicons;content:'\f502';color:#999;vertical-align:middle;line-height:24px;font-size:16px;margin:0}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method.disabled,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method.disabled,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method.disabled{cursor:not-allowed}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method.disabled::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method.disabled::before,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method.disabled::before{color:#ccc}table.wc-shipping-classes .wc-shipping-zone-method-title,table.wc-shipping-zone-methods .wc-shipping-zone-method-title,table.wc-shipping-zones .wc-shipping-zone-method-title{width:25%}table.wc-shipping-classes .wc-shipping-zone-method-title .wc-shipping-zone-method-delete,table.wc-shipping-zone-methods .wc-shipping-zone-method-title .wc-shipping-zone-method-delete,table.wc-shipping-zones .wc-shipping-zone-method-title .wc-shipping-zone-method-delete{color:red}table.wc-shipping-classes .wc-shipping-zone-method-enabled,table.wc-shipping-zone-methods .wc-shipping-zone-method-enabled,table.wc-shipping-zones .wc-shipping-zone-method-enabled{text-align:center}table.wc-shipping-classes .wc-shipping-zone-method-enabled a,table.wc-shipping-zone-methods .wc-shipping-zone-method-enabled a,table.wc-shipping-zones .wc-shipping-zone-method-enabled a{display:inline-block}table.wc-shipping-classes .wc-shipping-zone-method-enabled .woocommerce-input-toggle,table.wc-shipping-zone-methods .wc-shipping-zone-method-enabled .woocommerce-input-toggle,table.wc-shipping-zones .wc-shipping-zone-method-enabled .woocommerce-input-toggle{margin-top:3px}table.wc-shipping-classes .wc-shipping-zone-method-type,table.wc-shipping-zone-methods .wc-shipping-zone-method-type,table.wc-shipping-zones .wc-shipping-zone-method-type{display:block}table.wc-shipping-classes tfoot input,table.wc-shipping-classes tfoot select,table.wc-shipping-zone-methods tfoot input,table.wc-shipping-zone-methods tfoot select,table.wc-shipping-zones tfoot input,table.wc-shipping-zones tfoot select{vertical-align:middle!important}table.wc-shipping-classes tfoot .button-secondary,table.wc-shipping-zone-methods tfoot .button-secondary,table.wc-shipping-zones tfoot .button-secondary{float:left}table.wc-shipping-classes .editing .wc-shipping-zone-edit,table.wc-shipping-classes .editing .wc-shipping-zone-view,table.wc-shipping-zone-methods .editing .wc-shipping-zone-edit,table.wc-shipping-zone-methods .editing .wc-shipping-zone-view,table.wc-shipping-zones .editing .wc-shipping-zone-edit,table.wc-shipping-zones .editing .wc-shipping-zone-view{display:none}.woocommerce-input-toggle{height:16px;width:32px;border:2px solid #935687;background-color:#935687;display:inline-block;text-indent:-9999px;border-radius:10em;position:relative;margin-top:-1px;vertical-align:text-top}.woocommerce-input-toggle:before{content:"";display:block;width:16px;height:16px;background:#fff;position:absolute;top:0;left:0;border-radius:100%}.woocommerce-input-toggle.woocommerce-input-toggle--disabled{border-color:#999;background-color:#999}.woocommerce-input-toggle.woocommerce-input-toggle--disabled:before{left:auto;right:0}.woocommerce-input-toggle.woocommerce-input-toggle--loading{opacity:.5}.wc-modal-shipping-method-settings{background:#f8f8f8;padding:1em!important}.wc-modal-shipping-method-settings form .form-table{width:100%;background:#fff;margin:0 0 1.5em}.wc-modal-shipping-method-settings form .form-table tr th{width:30%;position:relative}.wc-modal-shipping-method-settings form .form-table tr th .woocommerce-help-tip{float:left;margin:-8px 0 0 -.5em;vertical-align:middle;left:0;top:50%;position:absolute}.wc-modal-shipping-method-settings form .form-table tr td input,.wc-modal-shipping-method-settings form .form-table tr td select,.wc-modal-shipping-method-settings form .form-table tr td textarea{width:50%;min-width:250px}.wc-modal-shipping-method-settings form .form-table tr td input[type=checkbox]{width:auto;min-width:16px}.wc-modal-shipping-method-settings form .form-table tr td,.wc-modal-shipping-method-settings form .form-table tr th{vertical-align:middle;margin:0;line-height:24px;padding:1em;border-bottom:1px solid #f8f8f8}.wc-modal-shipping-method-settings form .form-table:last-of-type{margin-bottom:0}.wc-backbone-modal .wc-shipping-zone-method-selector p{margin-top:0}.wc-backbone-modal .wc-shipping-zone-method-selector .wc-shipping-zone-method-description{margin:.75em 1px 0;line-height:1.5em;color:#999;font-style:italic}.wc-backbone-modal .wc-shipping-zone-method-selector select{width:100%;cursor:pointer}img.help_tip{margin:0 9px 0 0;vertical-align:middle}.postbox img.help_tip{margin-top:0}.postbox .woocommerce-help-tip{margin:0 9px 0 0}.status-disabled,.status-enabled,.status-manual{font-size:1.4em;display:block;text-indent:-9999px;position:relative;height:1em;width:1em}.status-manual::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#999}.status-enabled::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#a46497}.status-disabled::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}.woocommerce h2.woo-nav-tab-wrapper{margin-bottom:1em}.woocommerce nav.woo-nav-tab-wrapper{margin:1.5em 0 1em}.woocommerce .subsubsub{margin:-8px 0 0}.woocommerce .wc-admin-breadcrumb{margin-right:.5em}.woocommerce .wc-admin-breadcrumb a{color:#a46497}.woocommerce #template div{margin:0}.woocommerce #template div p .button{float:left;margin-right:10px;margin-top:-4px}.woocommerce #template div .editor textarea{margin-bottom:8px}.woocommerce textarea[disabled=disabled]{background:#dfdfdf!important}.woocommerce table.form-table{margin:0;position:relative;table-layout:fixed}.woocommerce table.form-table .forminp-radio ul{margin:0}.woocommerce table.form-table .forminp-radio ul li{line-height:1.4em}.woocommerce table.form-table input[type=email],.woocommerce table.form-table input[type=number],.woocommerce table.form-table input[type=text]{height:auto}.woocommerce table.form-table textarea.input-text{height:100%;min-width:150px;display:block}.woocommerce table.form-table input.regular-input,.woocommerce table.form-table input[type=email],.woocommerce table.form-table input[type=number],.woocommerce table.form-table input[type=text],.woocommerce table.form-table textarea{width:400px;margin:0;padding:6px;box-sizing:border-box;vertical-align:top}.woocommerce table.form-table select{width:400px;margin:0;box-sizing:border-box;height:32px;line-height:32px;vertical-align:top}.woocommerce table.form-table input[size]{width:auto!important}.woocommerce table.form-table table input.regular-input,.woocommerce table.form-table table input[type=email],.woocommerce table.form-table table input[type=number],.woocommerce table.form-table table input[type=text],.woocommerce table.form-table table select,.woocommerce table.form-table table textarea{width:auto}.woocommerce table.form-table textarea.wide-input{width:100%}.woocommerce table.form-table .woocommerce-help-tip,.woocommerce table.form-table img.help_tip{padding:0;margin:-4px 5px 0 0;vertical-align:middle;cursor:help;line-height:1}.woocommerce table.form-table span.help_tip{cursor:help;color:#2ea2cc}.woocommerce table.form-table th{position:relative;padding-left:24px}.woocommerce table.form-table th label{position:relative;display:block}.woocommerce table.form-table th label .woocommerce-help-tip,.woocommerce table.form-table th label img.help_tip{margin:-8px 0 0 -24px;position:absolute;left:0;top:50%}.woocommerce table.form-table th label+.woocommerce-help-tip{margin:0;position:absolute;left:0;top:20px}.woocommerce table.form-table woocommerce-help-tip .select2-container{vertical-align:top;margin-bottom:3px}.woocommerce table.form-table table.widefat th{padding-left:inherit}.woocommerce table.form-table .wp-list-table .woocommerce-help-tip{float:none}.woocommerce table.form-table fieldset{margin-top:4px}.woocommerce table.form-table fieldset .woocommerce-help-tip,.woocommerce table.form-table fieldset img.help_tip{margin:-3px 5px 0 0}.woocommerce table.form-table fieldset p.description{margin-bottom:8px}.woocommerce table.form-table fieldset:first-child{margin-top:0}.woocommerce table.form-table .iris-picker{z-index:100;display:none;position:absolute;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.2)}.woocommerce table.form-table .iris-picker .ui-slider{border:0!important;margin:0!important;width:auto!important;height:auto!important;background:none transparent!important}.woocommerce table.form-table .iris-picker .ui-slider .ui-slider-handle{margin-bottom:0!important}.woocommerce table.form-table .iris-error{background-color:#ffafaf}.woocommerce table.form-table .colorpickpreview{padding:7px 0;line-height:1em;display:inline-block;width:26px;border:1px solid #ddd;font-size:14px}.woocommerce table.form-table .image_width_settings{vertical-align:middle}.woocommerce table.form-table .image_width_settings label{margin-right:10px}.woocommerce table.form-table .image_width_settings input{width:auto}.woocommerce table.form-table .wc_emails_wrapper,.woocommerce table.form-table .wc_payment_gateways_wrapper{padding:0 0 10px 15px}.woocommerce #tabs-wrap table a.remove{margin-right:4px}.woocommerce #tabs-wrap table p{margin:0 0 4px!important;overflow:hidden;zoom:1}.woocommerce #tabs-wrap table p a.add{float:right}#wp-excerpt-editor-container{background:#fff}#product_variation-parent #parent_id{width:100%}#postimagediv img{border:1px solid #d5d5d5;max-width:100%}#woocommerce-product-images .inside{margin:0;padding:0}#woocommerce-product-images .inside .add_product_images{padding:0 12px 12px}#woocommerce-product-images .inside #product_images_container{padding:0 9px 0 0}#woocommerce-product-images .inside #product_images_container ul{margin:0;padding:0}#woocommerce-product-images .inside #product_images_container ul::after,#woocommerce-product-images .inside #product_images_container ul::before{content:' ';display:table}#woocommerce-product-images .inside #product_images_container ul::after{clear:both}#woocommerce-product-images .inside #product_images_container ul li.add,#woocommerce-product-images .inside #product_images_container ul li.image,#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder{width:80px;float:right;cursor:move;border:1px solid #d5d5d5;margin:9px 0 0 9px;background:#f7f7f7;border-radius:2px;position:relative;box-sizing:border-box}#woocommerce-product-images .inside #product_images_container ul li.add img,#woocommerce-product-images .inside #product_images_container ul li.image img,#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder img{width:100%;height:auto;display:block}#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder{border:3px dashed #ddd;position:relative}#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";font-size:2.618em;line-height:72px;color:#ddd}#woocommerce-product-images .inside #product_images_container ul ul.actions{position:absolute;top:-8px;left:-8px;padding:2px;display:none}#woocommerce-product-images .inside #product_images_container ul ul.actions li{float:left;margin:0 2px 0 0}#woocommerce-product-images .inside #product_images_container ul ul.actions li a{width:1em;height:1em;margin:0;height:0;display:block;overflow:hidden}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.tips{cursor:pointer}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.delete{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.4em}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.delete::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#999;background:#fff;border-radius:50%;height:1em;width:1em;line-height:1em}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.delete:hover::before{color:#a00}#woocommerce-product-images .inside #product_images_container ul li:hover ul.actions{display:block}#woocommerce-product-data .hndle{padding:10px}#woocommerce-product-data .hndle span{display:block;vertical-align:middle;line-height:24px}#woocommerce-product-data .hndle span span{display:inline;line-height:inherit;vertical-align:baseline}#woocommerce-product-data .hndle select{margin:0}#woocommerce-product-data .hndle label{padding-left:1em;font-size:12px;vertical-align:baseline}#woocommerce-product-data .hndle label:first-child{margin-left:1em;border-left:1px solid #dfdfdf}#woocommerce-product-data .hndle input,#woocommerce-product-data .hndle select{margin-top:-3px 0 0;vertical-align:middle}#woocommerce-product-data .hndle select{margin-right:.5em}#woocommerce-product-data>.handlediv{margin-top:4px}#woocommerce-product-data .wrap{margin:0}#woocommerce-coupon-description{padding:3px 8px;font-size:1.7em;line-height:1.42em;height:auto;width:100%;outline:0;margin:10px 0;display:block}#woocommerce-coupon-description::-webkit-input-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-description::-moz-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-description:-ms-input-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-description:-moz-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-data .panel-wrap,#woocommerce-product-data .panel-wrap{background:#fff}#woocommerce-coupon-data .wc-metaboxes-wrapper,#woocommerce-coupon-data .woocommerce_options_panel,#woocommerce-product-data .wc-metaboxes-wrapper,#woocommerce-product-data .woocommerce_options_panel{float:right;width:80%}#woocommerce-coupon-data .wc-metaboxes-wrapper .wc-radios,#woocommerce-coupon-data .woocommerce_options_panel .wc-radios,#woocommerce-product-data .wc-metaboxes-wrapper .wc-radios,#woocommerce-product-data .woocommerce_options_panel .wc-radios{display:block;float:right;margin:0}#woocommerce-coupon-data .wc-metaboxes-wrapper .wc-radios li,#woocommerce-coupon-data .woocommerce_options_panel .wc-radios li,#woocommerce-product-data .wc-metaboxes-wrapper .wc-radios li,#woocommerce-product-data .woocommerce_options_panel .wc-radios li{display:block;padding:0 0 10px}#woocommerce-coupon-data .wc-metaboxes-wrapper .wc-radios li input,#woocommerce-coupon-data .woocommerce_options_panel .wc-radios li input,#woocommerce-product-data .wc-metaboxes-wrapper .wc-radios li input,#woocommerce-product-data .woocommerce_options_panel .wc-radios li input{width:auto}#woocommerce-coupon-data .panel-wrap,#woocommerce-product-data .panel-wrap,.woocommerce .panel-wrap{overflow:hidden}#woocommerce-coupon-data ul.wc-tabs,#woocommerce-product-data ul.wc-tabs,.woocommerce ul.wc-tabs{margin:0;width:20%;float:right;line-height:1em;padding:0 0 10px;position:relative;background-color:#fafafa;border-left:1px solid #eee;box-sizing:border-box}#woocommerce-coupon-data ul.wc-tabs::after,#woocommerce-product-data ul.wc-tabs::after,.woocommerce ul.wc-tabs::after{content:'';display:block;width:100%;height:9999em;position:absolute;bottom:-9999em;right:0;background-color:#fafafa;border-left:1px solid #eee}#woocommerce-coupon-data ul.wc-tabs li,#woocommerce-product-data ul.wc-tabs li,.woocommerce ul.wc-tabs li{margin:0;padding:0;display:block;position:relative}#woocommerce-coupon-data ul.wc-tabs li a,#woocommerce-product-data ul.wc-tabs li a,.woocommerce ul.wc-tabs li a{margin:0;padding:10px;display:block;box-shadow:none;text-decoration:none;line-height:20px!important;border-bottom:1px solid #eee}#woocommerce-coupon-data ul.wc-tabs li a span,#woocommerce-product-data ul.wc-tabs li a span,.woocommerce ul.wc-tabs li a span{margin-right:.618em;margin-left:.618em}#woocommerce-coupon-data ul.wc-tabs li a::before,#woocommerce-product-data ul.wc-tabs li a::before,.woocommerce ul.wc-tabs li a::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;content:"";text-decoration:none}#woocommerce-coupon-data ul.wc-tabs li.general_options a::before,#woocommerce-product-data ul.wc-tabs li.general_options a::before,.woocommerce ul.wc-tabs li.general_options a::before{content:'\f107'}#woocommerce-coupon-data ul.wc-tabs li.inventory_options a::before,#woocommerce-product-data ul.wc-tabs li.inventory_options a::before,.woocommerce ul.wc-tabs li.inventory_options a::before{content:'\f481'}#woocommerce-coupon-data ul.wc-tabs li.shipping_options a::before,#woocommerce-product-data ul.wc-tabs li.shipping_options a::before,.woocommerce ul.wc-tabs li.shipping_options a::before{font-family:WooCommerce;content:'\e01a'}#woocommerce-coupon-data ul.wc-tabs li.linked_product_options a::before,#woocommerce-product-data ul.wc-tabs li.linked_product_options a::before,.woocommerce ul.wc-tabs li.linked_product_options a::before{content:'\f103'}#woocommerce-coupon-data ul.wc-tabs li.attribute_options a::before,#woocommerce-product-data ul.wc-tabs li.attribute_options a::before,.woocommerce ul.wc-tabs li.attribute_options a::before{content:'\f175'}#woocommerce-coupon-data ul.wc-tabs li.advanced_options a::before,#woocommerce-product-data ul.wc-tabs li.advanced_options a::before,.woocommerce ul.wc-tabs li.advanced_options a::before{font-family:Dashicons;content:'\f111'}#woocommerce-coupon-data ul.wc-tabs li.variations_options a::before,#woocommerce-product-data ul.wc-tabs li.variations_options a::before,.woocommerce ul.wc-tabs li.variations_options a::before{content:'\f509'}#woocommerce-coupon-data ul.wc-tabs li.usage_restriction_options a::before,#woocommerce-product-data ul.wc-tabs li.usage_restriction_options a::before,.woocommerce ul.wc-tabs li.usage_restriction_options a::before{font-family:WooCommerce;content:'\e602'}#woocommerce-coupon-data ul.wc-tabs li.usage_limit_options a::before,#woocommerce-product-data ul.wc-tabs li.usage_limit_options a::before,.woocommerce ul.wc-tabs li.usage_limit_options a::before{font-family:WooCommerce;content:'\e601'}#woocommerce-coupon-data ul.wc-tabs li.general_coupon_data a::before,#woocommerce-product-data ul.wc-tabs li.general_coupon_data a::before,.woocommerce ul.wc-tabs li.general_coupon_data a::before{font-family:WooCommerce;content:'\e600'}#woocommerce-coupon-data ul.wc-tabs li.active a,#woocommerce-product-data ul.wc-tabs li.active a,.woocommerce ul.wc-tabs li.active a{color:#555;position:relative;background-color:#eee}.woocommerce_page_wc-settings input[type=email],.woocommerce_page_wc-settings input[type=url]{direction:rtl}.woocommerce_page_wc-settings .shippingrows th.check-column{padding-top:20px}.woocommerce_page_wc-settings .shippingrows tfoot th{padding-right:10px}.woocommerce_page_wc-settings .shippingrows .add.button::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-left:.618em;content:"";text-decoration:none}.woocommerce_page_wc-settings h3.wc-settings-sub-title{font-size:1.2em}#woocommerce-coupon-data .inside,#woocommerce-order-data .inside,#woocommerce-order-downloads .inside,#woocommerce-product-data .inside,#woocommerce-product-type-options .inside{margin:0;padding:0}.panel,.woocommerce_options_panel{padding:9px;color:#555}.panel .form-field .woocommerce-help-tip,.woocommerce_options_panel .form-field .woocommerce-help-tip{font-size:1.4em}.panel,.woocommerce_page_settings .woocommerce_options_panel{padding:0}#woocommerce-product-specs .inside,#woocommerce-product-type-options .panel{margin:0;padding:9px}#woocommerce-product-type-options .panel p,.woocommerce_options_panel fieldset.form-field,.woocommerce_options_panel p{margin:0 0 9px;font-size:12px;padding:5px 9px;line-height:24px}#woocommerce-product-type-options .panel p::after,.woocommerce_options_panel fieldset.form-field::after,.woocommerce_options_panel p::after{content:'.';display:block;height:0;clear:both;visibility:hidden}.woocommerce_options_panel .checkbox,.woocommerce_variable_attributes .checkbox{width:auto;margin:4px 0!important;vertical-align:middle;float:right}.woocommerce_options_panel .downloadable_files table,.woocommerce_variations .downloadable_files table{width:100%;padding:0!important}.woocommerce_options_panel .downloadable_files table th,.woocommerce_variations .downloadable_files table th{padding:7px 7px 7px 0!important}.woocommerce_options_panel .downloadable_files table th.sort,.woocommerce_variations .downloadable_files table th.sort{width:17px;padding:7px!important}.woocommerce_options_panel .downloadable_files table th .woocommerce-help-tip,.woocommerce_variations .downloadable_files table th .woocommerce-help-tip{font-size:1.1em;margin-right:0}.woocommerce_options_panel .downloadable_files table td,.woocommerce_variations .downloadable_files table td{vertical-align:middle!important;padding:4px 7px 4px 0!important;position:relative}.woocommerce_options_panel .downloadable_files table td:last-child,.woocommerce_variations .downloadable_files table td:last-child{padding-left:7px!important}.woocommerce_options_panel .downloadable_files table td input.input_text,.woocommerce_variations .downloadable_files table td input.input_text{width:100%;float:none;min-width:0;margin:1px 0}.woocommerce_options_panel .downloadable_files table td .upload_file_button,.woocommerce_variations .downloadable_files table td .upload_file_button{width:auto;float:left;cursor:pointer}.woocommerce_options_panel .downloadable_files table td .delete,.woocommerce_variations .downloadable_files table td .delete{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.2em}.woocommerce_options_panel .downloadable_files table td .delete::before,.woocommerce_variations .downloadable_files table td .delete::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#999}.woocommerce_options_panel .downloadable_files table td .delete:hover::before,.woocommerce_variations .downloadable_files table td .delete:hover::before{color:#a00}.woocommerce_options_panel .downloadable_files table td.sort,.woocommerce_variations .downloadable_files table td.sort{width:17px;cursor:move;font-size:15px;text-align:center;background:#f9f9f9;padding-left:7px!important}.woocommerce_options_panel .downloadable_files table td.sort::before,.woocommerce_variations .downloadable_files table td.sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:right;height:100%}.woocommerce_options_panel .downloadable_files table td.sort:hover::before,.woocommerce_variations .downloadable_files table td.sort:hover::before{color:#333}.woocommerce_variation h3 .sort{width:17px;height:26px;cursor:move;float:left;font-size:15px;font-weight:400;margin-left:.5em;visibility:hidden;text-align:center;vertical-align:middle}.woocommerce_variation h3 .sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:28px;color:#999;display:block;width:17px;float:right;height:100%}.woocommerce_variation h3 .sort:hover::before{color:#777}.woocommerce_variation h3:hover .sort,.woocommerce_variation.ui-sortable-helper .sort{visibility:visible}.woocommerce_options_panel{min-height:175px;box-sizing:border-box}.woocommerce_options_panel .downloadable_files{padding:0 162px 0 9px;position:relative;margin:9px 0}.woocommerce_options_panel .downloadable_files label{position:absolute;right:0;margin:0 12px 0 0;line-height:24px}.woocommerce_options_panel p{margin:9px 0}.woocommerce_options_panel fieldset.form-field,.woocommerce_options_panel p.form-field{padding:5px 162px 5px 20px!important}.woocommerce_options_panel .sale_price_dates_fields .short:first-of-type{margin-bottom:1em}.woocommerce_options_panel .sale_price_dates_fields .short:nth-of-type(2){clear:right}.woocommerce_options_panel label,.woocommerce_options_panel legend{float:right;width:150px;padding:0;margin:0 -150px 0 0}.woocommerce_options_panel label .req,.woocommerce_options_panel legend .req{font-weight:700;font-style:normal;color:#a00}.woocommerce_options_panel .description{padding:0;margin:0 7px 0 0;clear:none;display:inline}.woocommerce_options_panel .description-block{margin-right:0;display:block}.woocommerce_options_panel input,.woocommerce_options_panel select,.woocommerce_options_panel textarea{margin:0}.woocommerce_options_panel textarea{float:right;height:3.5em;line-height:1.5em;vertical-align:top}.woocommerce_options_panel input[type=email],.woocommerce_options_panel input[type=number],.woocommerce_options_panel input[type=password],.woocommerce_options_panel input[type=text]{width:50%;float:right}.woocommerce_options_panel input.button{width:auto;margin-right:8px}.woocommerce_options_panel select{float:right}.woocommerce_options_panel .short,.woocommerce_options_panel input[type=email].short,.woocommerce_options_panel input[type=number].short,.woocommerce_options_panel input[type=password].short,.woocommerce_options_panel input[type=text].short{width:50%}.woocommerce_options_panel .sized{width:auto!important;margin-left:6px}.woocommerce_options_panel .options_group{border-top:1px solid #fff;border-bottom:1px solid #eee}.woocommerce_options_panel .options_group:first-child{border-top:0}.woocommerce_options_panel .options_group:last-child{border-bottom:0}.woocommerce_options_panel .options_group fieldset{margin:9px 0;font-size:12px;padding:5px 9px;line-height:24px}.woocommerce_options_panel .options_group fieldset label{width:auto;float:none}.woocommerce_options_panel .options_group fieldset ul{float:right;width:50%;margin:0;padding:0}.woocommerce_options_panel .options_group fieldset ul li{margin:0;width:auto}.woocommerce_options_panel .options_group fieldset ul li input{width:auto;float:none;margin-left:4px}.woocommerce_options_panel .options_group fieldset ul.wc-radios label{margin-right:0}.woocommerce_options_panel .dimensions_field .wrap{display:block;width:50%}.woocommerce_options_panel .dimensions_field .wrap input{width:30.75%;margin-left:3.8%}.woocommerce_options_panel .dimensions_field .wrap .last{margin-left:0}.woocommerce_options_panel.padded{padding:1em}.woocommerce_options_panel .select2-container{float:right}#woocommerce-product-data input.dp-applied{float:right}#grouped_product_options,#simple_product_options,#virtual_product_options{padding:12px;font-style:italic;color:#666}.wc-metaboxes-wrapper .toolbar{margin:0!important;border-top:1px solid #fff;border-bottom:1px solid #eee;padding:9px 12px!important}.wc-metaboxes-wrapper .toolbar:first-child{border-top:0}.wc-metaboxes-wrapper .toolbar:last-child{border-bottom:0}.wc-metaboxes-wrapper .toolbar .add_variation{float:left;margin-right:5px}.wc-metaboxes-wrapper .toolbar .cancel-variation-changes,.wc-metaboxes-wrapper .toolbar .save-variation-changes{float:right;margin-left:5px}.wc-metaboxes-wrapper p.toolbar{overflow:hidden;zoom:1}.wc-metaboxes-wrapper .expand-close{margin-left:2px;color:#777;font-size:12px;font-style:italic}.wc-metaboxes-wrapper .expand-close a{background:0 0;padding:0;font-size:12px;text-decoration:none}.wc-metaboxes-wrapper#product_attributes .expand-close{float:left;line-height:28px}.wc-metaboxes-wrapper .fr,.wc-metaboxes-wrapper button.add_variable_attribute{float:left;margin:0 6px 0 0}.wc-metaboxes-wrapper .wc-metaboxes{border-bottom:1px solid #eee}.wc-metaboxes-wrapper .wc-metabox-sortable-placeholder{border-color:#bbb;background-color:#f5f5f5;margin-bottom:9px;border-width:1px;border-style:dashed}.wc-metaboxes-wrapper .wc-metabox{background:#fff;border-bottom:1px solid #eee;margin:0!important}.wc-metaboxes-wrapper .wc-metabox select{font-weight:400}.wc-metaboxes-wrapper .wc-metabox:last-of-type{border-bottom:0}.wc-metaboxes-wrapper .wc-metabox .handlediv{width:27px}.wc-metaboxes-wrapper .wc-metabox .handlediv::before{content:'\f142'!important;cursor:pointer;display:inline-block;font:400 20px/1 Dashicons;line-height:.5!important;padding:8px 10px;position:relative;left:12px;top:0}.wc-metaboxes-wrapper .wc-metabox.closed{border-radius:3px}.wc-metaboxes-wrapper .wc-metabox.closed .handlediv::before{content:'\f140'!important}.wc-metaboxes-wrapper .wc-metabox.closed h3{border:0}.wc-metaboxes-wrapper .wc-metabox h3{margin:0!important;padding:.75em 1em .75em .75em!important;font-size:1em!important;overflow:hidden;zoom:1;cursor:move}.wc-metaboxes-wrapper .wc-metabox h3 a.delete,.wc-metaboxes-wrapper .wc-metabox h3 button{float:left}.wc-metaboxes-wrapper .wc-metabox h3 a.delete{color:red;font-weight:400;line-height:26px;text-decoration:none;position:relative;visibility:hidden}.wc-metaboxes-wrapper .wc-metabox h3 strong{font-weight:400;line-height:26px;font-weight:700}.wc-metaboxes-wrapper .wc-metabox h3 select{font-family:sans-serif;max-width:20%;margin:.25em 0 .25em .25em}.wc-metaboxes-wrapper .wc-metabox h3 .handlediv{background-position:6px 5px!important;visibility:hidden;height:26px}.wc-metaboxes-wrapper .wc-metabox h3.fixed{cursor:pointer!important}.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3{cursor:pointer;padding:.5em 1em .5em .75em!important}.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3 .handlediv,.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3 .sort,.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3 a.delete{margin-top:.25em}.wc-metaboxes-wrapper .wc-metabox h3:hover .handlediv,.wc-metaboxes-wrapper .wc-metabox h3:hover a.delete,.wc-metaboxes-wrapper .wc-metabox.ui-sortable-helper .handlediv,.wc-metaboxes-wrapper .wc-metabox.ui-sortable-helper a.delete{visibility:visible}.wc-metaboxes-wrapper .wc-metabox table{width:100%;position:relative;background-color:#fdfdfd;padding:1em;border-top:1px solid #eee}.wc-metaboxes-wrapper .wc-metabox table td{text-align:right;padding:0 0 1em 6px;vertical-align:top;border:0}.wc-metaboxes-wrapper .wc-metabox table td label{text-align:right;display:block;line-height:21px}.wc-metaboxes-wrapper .wc-metabox table td input{float:right;min-width:200px}.wc-metaboxes-wrapper .wc-metabox table td input,.wc-metaboxes-wrapper .wc-metabox table td textarea{width:100%;margin:0;display:block;font-size:14px;padding:4px;color:#555}.wc-metaboxes-wrapper .wc-metabox table td .select2-container,.wc-metaboxes-wrapper .wc-metabox table td select{width:100%!important}.wc-metaboxes-wrapper .wc-metabox table td input.short{width:200px}.wc-metaboxes-wrapper .wc-metabox table td input.checkbox{width:16px;min-width:inherit;vertical-align:text-bottom;display:inline-block;float:none}.wc-metaboxes-wrapper .wc-metabox table td.attribute_name{width:200px}.wc-metaboxes-wrapper .wc-metabox table .minus,.wc-metaboxes-wrapper .wc-metabox table .plus{margin-top:6px}.wc-metaboxes-wrapper .wc-metabox table .fl{float:right}.wc-metaboxes-wrapper .wc-metabox table .fr{float:left}.variations-pagenav{float:left;line-height:24px}.variations-pagenav .displaying-num{color:#777;font-size:12px;font-style:italic}.variations-pagenav a{padding:0 10px 3px;background:rgba(0,0,0,.05);font-size:16px;font-weight:400;text-decoration:none}.variations-pagenav a.disabled,.variations-pagenav a.disabled:active,.variations-pagenav a.disabled:focus,.variations-pagenav a.disabled:hover{color:#a0a5aa;background:rgba(0,0,0,.05)}.variations-defaults{float:right}.variations-defaults select{margin:.25em 0 .25em .25em}.woocommerce_variable_attributes{background-color:#fdfdfd;border-top:1px solid #eee}.woocommerce_variable_attributes .data{padding:1em 2em}.woocommerce_variable_attributes .data::after,.woocommerce_variable_attributes .data::before{content:' ';display:table}.woocommerce_variable_attributes .data::after{clear:both}.woocommerce_variable_attributes .upload_image_button{display:block;width:64px;height:64px;float:right;margin-left:20px;position:relative;cursor:pointer}.woocommerce_variable_attributes .upload_image_button img{width:100%;height:auto;display:none}.woocommerce_variable_attributes .upload_image_button::before{content:'\f128';font-family:Dashicons;position:absolute;top:0;right:0;left:0;bottom:0;text-align:center;line-height:64px;font-size:64px;font-weight:400;-webkit-font-smoothing:antialiased}.woocommerce_variable_attributes .upload_image_button.remove img{display:block}.woocommerce_variable_attributes .upload_image_button.remove::before{content:'\f335';display:none}.woocommerce_variable_attributes .upload_image_button.remove:hover::before{display:block}.woocommerce_variable_attributes .options{border:1px solid #eee;border-width:1px 0;padding:.25em 0}.woocommerce_variable_attributes .options label{display:inline-block;padding:4px 0 2px 1em}.woocommerce_variable_attributes .options input[type=checkbox]{margin:0 .5em 0 5px!important;vertical-align:middle}.form-row label{display:inline-block}.form-row .woocommerce-help-tip{float:left}.form-row input[type=number],.form-row input[type=text],.form-row select,.form-row textarea{width:100%;vertical-align:middle;margin:2px 0 0;padding:5px}.form-row select{height:30px;line-height:30px}.form-row.dimensions_field .wrap{clear:right;display:block}.form-row.dimensions_field input{width:33%;float:right;vertical-align:middle}.form-row.dimensions_field input:last-of-type{margin-left:0;width:34%}.form-row.form-row-first,.form-row.form-row-last{width:48%;float:left}.form-row.form-row-first{clear:both;float:right}.form-row.form-row-full{clear:both}.tips{cursor:help;text-decoration:none}img.tips{padding:5px 0 0}#tiptip_holder{display:none;z-index:8675309;position:absolute;top:0;left:0}#tiptip_holder.tip_top{padding-bottom:5px}#tiptip_holder.tip_top #tiptip_arrow_inner{margin-top:-7px;margin-right:-6px;border-top-color:#333}#tiptip_holder.tip_bottom{padding-top:5px}#tiptip_holder.tip_bottom #tiptip_arrow_inner{margin-top:-5px;margin-right:-6px;border-bottom-color:#333}#tiptip_holder.tip_right{padding-right:5px}#tiptip_holder.tip_right #tiptip_arrow_inner{margin-top:-6px;margin-right:-5px;border-left-color:#333}#tiptip_holder.tip_left{padding-left:5px}#tiptip_holder.tip_left #tiptip_arrow_inner{margin-top:-6px;margin-right:-7px;border-right-color:#333}#tiptip_content,.chart-tooltip,.wc_error_tip{color:#fff;font-size:.8em;max-width:150px;background:#333;text-align:center;border-radius:3px;padding:.618em 1em;box-shadow:0 1px 3px rgba(0,0,0,.2)}#tiptip_content code,.chart-tooltip code,.wc_error_tip code{padding:1px;background:#888}#tiptip_arrow,#tiptip_arrow_inner{position:absolute;border-color:transparent;border-style:solid;border-width:6px;height:0;width:0}#tiptip_arrow{right:50%;margin-right:-6px}.wc_error_tip{max-width:20em;line-height:1.8em;position:absolute;white-space:normal;background:#d82223;margin:1.5em -1em 0 1px;z-index:9999999}.wc_error_tip::after{content:'';display:block;border:8px solid #d82223;border-left-color:transparent;border-right-color:transparent;border-top-color:transparent;position:absolute;top:-3px;right:50%;margin:-1em -3px 0 0}img.ui-datepicker-trigger{vertical-align:middle;margin-top:-1px;cursor:pointer}.wc-metabox-content img.ui-datepicker-trigger,.woocommerce_options_panel img.ui-datepicker-trigger{float:right;margin-left:8px;margin-top:4px;margin-right:4px}#ui-datepicker-div{display:none}.woocommerce-reports-remove-filter{color:red;text-decoration:none}.woocommerce-reports-wide.woocommerce-reports-wrap,.woocommerce-reports-wrap.woocommerce-reports-wrap{margin-right:300px;padding-top:18px}.woocommerce-reports-wide.halved,.woocommerce-reports-wrap.halved{margin:0;overflow:hidden;zoom:1}.woocommerce-reports-wide .widefat th,.woocommerce-reports-wrap .widefat th{padding:7px}.woocommerce-reports-wide .widefat td,.woocommerce-reports-wrap .widefat td{vertical-align:top;padding:7px}.woocommerce-reports-wide .widefat td .description,.woocommerce-reports-wrap .widefat td .description{margin:4px 0 0}.woocommerce-reports-wide .postbox::after,.woocommerce-reports-wrap .postbox::after{content:'.';display:block;height:0;clear:both;visibility:hidden}.woocommerce-reports-wide .postbox h3,.woocommerce-reports-wrap .postbox h3{cursor:default!important}.woocommerce-reports-wide .postbox .inside,.woocommerce-reports-wrap .postbox .inside{padding:10px;margin:0!important}.woocommerce-reports-wide .postbox div.stats_range,.woocommerce-reports-wide .postbox h3.stats_range,.woocommerce-reports-wrap .postbox div.stats_range,.woocommerce-reports-wrap .postbox h3.stats_range{border-bottom-color:#dfdfdf;margin:0;padding:0!important}.woocommerce-reports-wide .postbox div.stats_range .export_csv,.woocommerce-reports-wide .postbox h3.stats_range .export_csv,.woocommerce-reports-wrap .postbox div.stats_range .export_csv,.woocommerce-reports-wrap .postbox h3.stats_range .export_csv{float:left;line-height:26px;border-right:1px solid #dfdfdf;padding:10px;display:block;text-decoration:none}.woocommerce-reports-wide .postbox div.stats_range .export_csv::before,.woocommerce-reports-wide .postbox h3.stats_range .export_csv::before,.woocommerce-reports-wrap .postbox div.stats_range .export_csv::before,.woocommerce-reports-wrap .postbox h3.stats_range .export_csv::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;content:"";text-decoration:none;margin-left:4px}.woocommerce-reports-wide .postbox div.stats_range ul,.woocommerce-reports-wide .postbox h3.stats_range ul,.woocommerce-reports-wrap .postbox div.stats_range ul,.woocommerce-reports-wrap .postbox h3.stats_range ul{list-style:none outside;margin:0;padding:0;zoom:1;background:#f5f5f5;border-bottom:1px solid #ccc}.woocommerce-reports-wide .postbox div.stats_range ul::after,.woocommerce-reports-wide .postbox div.stats_range ul::before,.woocommerce-reports-wide .postbox h3.stats_range ul::after,.woocommerce-reports-wide .postbox h3.stats_range ul::before,.woocommerce-reports-wrap .postbox div.stats_range ul::after,.woocommerce-reports-wrap .postbox div.stats_range ul::before,.woocommerce-reports-wrap .postbox h3.stats_range ul::after,.woocommerce-reports-wrap .postbox h3.stats_range ul::before{content:' ';display:table}.woocommerce-reports-wide .postbox div.stats_range ul::after,.woocommerce-reports-wide .postbox h3.stats_range ul::after,.woocommerce-reports-wrap .postbox div.stats_range ul::after,.woocommerce-reports-wrap .postbox h3.stats_range ul::after{clear:both}.woocommerce-reports-wide .postbox div.stats_range ul li,.woocommerce-reports-wide .postbox h3.stats_range ul li,.woocommerce-reports-wrap .postbox div.stats_range ul li,.woocommerce-reports-wrap .postbox h3.stats_range ul li{float:right;margin:0;padding:0;line-height:26px;font-weight:700;font-size:14px}.woocommerce-reports-wide .postbox div.stats_range ul li a,.woocommerce-reports-wide .postbox h3.stats_range ul li a,.woocommerce-reports-wrap .postbox div.stats_range ul li a,.woocommerce-reports-wrap .postbox h3.stats_range ul li a{border-left:1px solid #dfdfdf;padding:10px;display:block;text-decoration:none}.woocommerce-reports-wide .postbox div.stats_range ul li.active,.woocommerce-reports-wide .postbox h3.stats_range ul li.active,.woocommerce-reports-wrap .postbox div.stats_range ul li.active,.woocommerce-reports-wrap .postbox h3.stats_range ul li.active{background:#fff;box-shadow:0 4px 0 0 #fff}.woocommerce-reports-wide .postbox div.stats_range ul li.active a,.woocommerce-reports-wide .postbox h3.stats_range ul li.active a,.woocommerce-reports-wrap .postbox div.stats_range ul li.active a,.woocommerce-reports-wrap .postbox h3.stats_range ul li.active a{color:#777}.woocommerce-reports-wide .postbox div.stats_range ul li.custom,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom{padding:9px 10px;vertical-align:middle}.woocommerce-reports-wide .postbox div.stats_range ul li.custom div,.woocommerce-reports-wide .postbox div.stats_range ul li.custom form,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom div,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom form,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom div,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom form,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom div,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom form{display:inline;margin:0}.woocommerce-reports-wide .postbox div.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wide .postbox div.stats_range ul li.custom form input.range_datepicker,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom form input.range_datepicker,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom form input.range_datepicker,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom form input.range_datepicker{padding:0;margin:0 0 0 10px;background:0 0;border:0;color:#777;text-align:center;box-shadow:none}.woocommerce-reports-wide .postbox div.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wide .postbox div.stats_range ul li.custom form input.range_datepicker.from,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom form input.range_datepicker.from,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom form input.range_datepicker.from,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom form input.range_datepicker.from{margin-left:0}.woocommerce-reports-wide .postbox .chart-with-sidebar,.woocommerce-reports-wrap .postbox .chart-with-sidebar{padding:12px 249px 12px 12px;margin:0!important}.woocommerce-reports-wide .postbox .chart-with-sidebar .chart-sidebar,.woocommerce-reports-wrap .postbox .chart-with-sidebar .chart-sidebar{width:225px;margin-right:-237px;float:right}.woocommerce-reports-wide .postbox .chart-widgets,.woocommerce-reports-wrap .postbox .chart-widgets{margin:0;padding:0}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget{margin:0 0 1em;background:#fafafa;border:1px solid #dfdfdf}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget::after,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget::after{content:'.';display:block;height:0;clear:both;visibility:hidden}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget h4,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget h4{background:#fff;border:1px solid #dfdfdf;border-right-width:0;border-left-width:0;padding:10px;margin:0;color:#2ea2cc;border-top-width:0;background-image:-webkit-linear-gradient(bottom,#ececec,#f9f9f9);background-image:linear-gradient(to top,#ececec,#f9f9f9)}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget h4.section_title:hover,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget h4.section_title:hover{color:#a00}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title{cursor:pointer}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title span,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title span{display:block}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title span::after,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title span::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-right:.618em;content:"";text-decoration:none;float:left;font-size:.9em;line-height:1.618}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title.open,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title.open{color:#333}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title.open span::after,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title.open span::after{display:none}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section{border-bottom:1px solid #dfdfdf}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section .select2-container,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section .select2-container{width:100%!important}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section:last-of-type,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section:last-of-type{border-radius:0 0 3px 3px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table{width:100%}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td{padding:7px 10px;vertical-align:top;border-top:1px solid #e5e5e5;line-height:1.4em}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table tr:first-child td,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table tr:first-child td{border-top:0}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.count,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.count{background:#f5f5f5}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.name,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.name{max-width:175px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.name a,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.name a{word-wrap:break-word}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.sparkline,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.sparkline{vertical-align:middle}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table .wc_sparkline,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table .wc_sparkline{width:32px;height:1em;display:block;float:left}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table tr.active td,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table tr.active td{background:#f5f5f5}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget form,.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget p,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget form,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget p{margin:0;padding:10px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget form .submit,.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget p .submit,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget form .submit,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget p .submit{margin-top:10px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget #product_ids,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget #product_ids{width:100%}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .select_all,.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .select_none,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .select_all,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .select_none{float:left;color:#999;margin-right:4px;margin-top:10px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .description,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .description{margin-right:.5em;font-weight:400;opacity:.8}.woocommerce-reports-wide .postbox .chart-legend,.woocommerce-reports-wrap .postbox .chart-legend{list-style:none outside;margin:0 0 1em;padding:0;border:1px solid #dfdfdf;border-left-width:0;border-bottom-width:0;background:#fff}.woocommerce-reports-wide .postbox .chart-legend li,.woocommerce-reports-wrap .postbox .chart-legend li{border-left:5px solid #aaa;color:#aaa;padding:1em;display:block;margin:0;-webkit-transition:all ease .5s;transition:all ease .5s;box-shadow:inset 0 -1px 0 0 #dfdfdf}.woocommerce-reports-wide .postbox .chart-legend li strong,.woocommerce-reports-wrap .postbox .chart-legend li strong{font-size:1.618em;line-height:1.2em;color:#464646;font-weight:400;display:block;font-family:HelveticaNeue-Light,'Helvetica Neue Light','Helvetica Neue',sans-serif}.woocommerce-reports-wide .postbox .chart-legend li strong del,.woocommerce-reports-wrap .postbox .chart-legend li strong del{color:#e74c3c;font-weight:400}.woocommerce-reports-wide .postbox .chart-legend li:hover,.woocommerce-reports-wrap .postbox .chart-legend li:hover{box-shadow:inset 0 -1px 0 0 #dfdfdf,inset -300px 0 0 rgba(156,93,144,.1);border-left:5px solid #9c5d90!important;padding-right:1.5em;color:#9c5d90}.woocommerce-reports-wide .postbox .pie-chart-legend,.woocommerce-reports-wrap .postbox .pie-chart-legend{margin:12px 0 0;overflow:hidden}.woocommerce-reports-wide .postbox .pie-chart-legend li,.woocommerce-reports-wrap .postbox .pie-chart-legend li{float:right;margin:0;padding:6px 0 0;border-top:4px solid #999;text-align:center;box-sizing:border-box;width:50%}.woocommerce-reports-wide .postbox .stat,.woocommerce-reports-wrap .postbox .stat{font-size:1.5em!important;font-weight:700;text-align:center}.woocommerce-reports-wide .postbox .chart-placeholder,.woocommerce-reports-wrap .postbox .chart-placeholder{width:100%;height:650px;overflow:hidden;position:relative}.woocommerce-reports-wide .postbox .chart-prompt,.woocommerce-reports-wrap .postbox .chart-prompt{line-height:650px;margin:0;color:#999;font-size:1.2em;font-style:italic;text-align:center}.woocommerce-reports-wide .postbox .chart-container,.woocommerce-reports-wrap .postbox .chart-container{background:#fff;padding:12px;position:relative;border:1px solid #dfdfdf;border-radius:3px}.woocommerce-reports-wide .postbox .main .chart-legend,.woocommerce-reports-wrap .postbox .main .chart-legend{margin-top:12px}.woocommerce-reports-wide .postbox .main .chart-legend li,.woocommerce-reports-wrap .postbox .main .chart-legend li{border-left:0;margin:0 0 0 8px;float:right;border-top:4px solid #aaa}.woocommerce-reports-wide .woocommerce-reports-main,.woocommerce-reports-wrap .woocommerce-reports-main{float:right;min-width:100%}.woocommerce-reports-wide .woocommerce-reports-main table td,.woocommerce-reports-wrap .woocommerce-reports-main table td{padding:9px}.woocommerce-reports-wide .woocommerce-reports-sidebar,.woocommerce-reports-wrap .woocommerce-reports-sidebar{display:inline;width:281px;margin-right:-300px;clear:both;float:right}.woocommerce-reports-wide .woocommerce-reports-left,.woocommerce-reports-wrap .woocommerce-reports-left{width:49.5%;float:right}.woocommerce-reports-wide .woocommerce-reports-right,.woocommerce-reports-wrap .woocommerce-reports-right{width:49.5%;float:left}.woocommerce-wide-reports-wrap{padding-bottom:11px}.woocommerce-wide-reports-wrap .widefat .export-data{float:left}.woocommerce-wide-reports-wrap .widefat td,.woocommerce-wide-reports-wrap .widefat th{vertical-align:middle;padding:7px}form.report_filters p{vertical-align:middle}form.report_filters div,form.report_filters input,form.report_filters label{vertical-align:middle}.chart-tooltip{position:absolute;display:none;line-height:1}table.bar_chart{width:100%}table.bar_chart thead th{text-align:right;color:#ccc;padding:6px 0}table.bar_chart tbody th{padding:6px 0;width:25%;text-align:right!important;font-weight:400!important;border-bottom:1px solid #fee}table.bar_chart tbody td{text-align:left;line-height:24px;padding:6px 0 6px 6px;border-bottom:1px solid #fee}table.bar_chart tbody td span{color:#8a4b75;display:block}table.bar_chart tbody td span.alt{color:#47a03e;margin-top:6px}table.bar_chart tbody td.bars{position:relative;text-align:right;padding:6px 0 6px 6px;border-bottom:1px solid #fee}table.bar_chart tbody td.bars a,table.bar_chart tbody td.bars span{text-decoration:none;clear:both;background:#8a4b75;float:right;display:block;line-height:24px;height:24px;border-radius:3px}table.bar_chart tbody td.bars span.alt{clear:both;background:#47a03e}table.bar_chart tbody td.bars span.alt span{margin:0;color:#c5dec2!important;text-shadow:0 1px 0 #47a03e;background:0 0}.post-type-shop_order .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}.post-type-shop_coupon .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}.post-type-product .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}.woocommerce-BlankState--api .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}.woocommerce-BlankState--webhooks .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:""}.woocommerce-BlankState{text-align:center;padding:5em 0 0}.woocommerce-BlankState .woocommerce-BlankState-message{color:#aaa;margin:0 auto 1.5em;line-height:1.5em;font-size:1.2em;max-width:500px}.woocommerce-BlankState .woocommerce-BlankState-message::before{color:#ddd;text-shadow:0 -1px 1px rgba(0,0,0,.2),0 1px 0 rgba(255,255,255,.8);font-size:8em;display:block;position:relative!important;top:auto;right:auto;line-height:1em;margin:0 0 .1875em}.woocommerce-BlankState .woocommerce-BlankState-cta{font-size:1.2em;padding:.75em 1.5em;margin:0 .25em;height:auto;display:inline-block!important}@media only screen and (max-width:1280px){#order_data .order_data_column{width:48%}#order_data .order_data_column:first-child{width:100%}.woocommerce_options_panel .description{display:block;clear:both;margin-right:0}.woocommerce_options_panel .dimensions_field .wrap,.woocommerce_options_panel .short,.woocommerce_options_panel input[type=email].short,.woocommerce_options_panel input[type=number].short,.woocommerce_options_panel input[type=password].short,.woocommerce_options_panel input[type=text].short{width:80%}.woocommerce_options_panel .downloadable_files,.woocommerce_variations .downloadable_files{padding:0;clear:both}.woocommerce_options_panel .downloadable_files label,.woocommerce_variations .downloadable_files label{position:static}.woocommerce_options_panel .downloadable_files table,.woocommerce_variations .downloadable_files table{margin:0 12px 24px;width:94%}.woocommerce_options_panel .downloadable_files table .sort,.woocommerce_variations .downloadable_files table .sort{visibility:hidden}.woocommerce_options_panel .woocommerce_variable_attributes .downloadable_files table,.woocommerce_variations .woocommerce_variable_attributes .downloadable_files table{margin:0 0 1em;width:100%}}@media only screen and (max-width:900px){#woocommerce-coupon-data ul.coupon_data_tabs,#woocommerce-product-data .wc-tabs-back,#woocommerce-product-data ul.product_data_tabs{width:10%}#woocommerce-coupon-data .wc-metaboxes-wrapper,#woocommerce-coupon-data .woocommerce_options_panel,#woocommerce-product-data .wc-metaboxes-wrapper,#woocommerce-product-data .woocommerce_options_panel{width:90%}#woocommerce-coupon-data ul.coupon_data_tabs li a,#woocommerce-product-data ul.product_data_tabs li a{position:relative;text-indent:-999px;padding:10px}#woocommerce-coupon-data ul.coupon_data_tabs li a::before,#woocommerce-product-data ul.product_data_tabs li a::before{position:absolute;top:0;left:0;bottom:0;right:0;text-indent:0;text-align:center;line-height:40px;width:100%;height:40px}}@media only screen and (max-width:782px){#wp-excerpt-media-buttons a{font-size:16px;line-height:37px;height:39px;padding:0 15px 0 20px}#wp-excerpt-editor-tools{padding-top:20px;padding-left:15px;overflow:hidden;margin-bottom:-1px}#woocommerce-product-data .checkbox{width:25px}.variations-pagenav{float:none;text-align:center;font-size:18px}.variations-pagenav .displaying-num{font-size:16px}.variations-pagenav a{padding:8px 20px 11px;font-size:18px}.variations-pagenav select{padding:0 20px}.variations-defaults{float:none;text-align:center;margin-top:10px}.post-type-product .wp-list-table .column-thumb{display:none;text-align:right;padding-bottom:0}.post-type-product .wp-list-table .column-thumb::before{display:none!important}.post-type-product .wp-list-table .column-thumb img{max-width:32px}.post-type-product .wp-list-table .is-expanded td:not(.hidden){overflow:visible}.post-type-product .wp-list-table .toggle-row{top:-28px}.post-type-shop_order .wp-list-table .column-customer_message,.post-type-shop_order .wp-list-table .column-order_notes{text-align:inherit}.post-type-shop_order .wp-list-table .column-order_notes .note-on{font-size:1.3em;margin:0}.post-type-shop_order .wp-list-table .is-expanded td:not(.hidden){overflow:visible}.post-type-shop_order .wp-list-table .toggle-row{top:-15px}}@media only screen and (max-width:500px){.woocommerce_options_panel label,.woocommerce_options_panel legend{float:none;width:auto;display:block;margin:0}.woocommerce_options_panel fieldset.form-field,.woocommerce_options_panel p.form-field{padding:5px 20px!important}.addons-wcs-banner-block{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.wc_addons_wrap .addons-wcs-banner-block{padding:40px}.wc_addons_wrap .addons-wcs-banner-block-image{padding:1em;text-align:center;width:100%;padding:2em 0;margin:0}.wc_addons_wrap .addons-wcs-banner-block-image .addons-img{margin:0}}.wc-backbone-modal *{box-sizing:border-box}.wc-backbone-modal .wc-backbone-modal-content{position:fixed;background:#fff;z-index:100000;right:50%;top:50%;-webkit-transform:translate(50%,-50%);-ms-transform:translate(50%,-50%);transform:translate(50%,-50%);max-width:100%;min-width:500px}.wc-backbone-modal .wc-backbone-modal-content article{overflow:auto}.wc-backbone-modal.wc-backbone-modal-shipping-method-settings .wc-backbone-modal-content{width:75%;min-width:500px}.wc-backbone-modal .select2-container{width:100%!important}@media screen and (max-width:782px){.wc-backbone-modal .wc-backbone-modal-content{width:100%;height:100%;min-width:100%}}.wc-backbone-modal-backdrop{position:fixed;top:0;right:0;left:0;bottom:0;min-height:360px;background:#000;opacity:.7;z-index:99900}.wc-backbone-modal-main{padding-bottom:55px}.wc-backbone-modal-main article,.wc-backbone-modal-main header{display:block;position:relative}.wc-backbone-modal-main .wc-backbone-modal-header{height:auto;background:#fcfcfc;padding:1em 1.5em;border-bottom:1px solid #ddd}.wc-backbone-modal-main .wc-backbone-modal-header h1{margin:0;font-size:18px;font-weight:700;line-height:1.5em}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link{cursor:pointer;color:#777;height:54px;width:54px;padding:0;position:absolute;top:0;left:0;text-align:center;border:0;border-right:1px solid #ddd;background-color:transparent;-webkit-transition:color .1s ease-in-out,background .1s ease-in-out;transition:color .1s ease-in-out,background .1s ease-in-out}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link::before{font:normal 22px/50px dashicons!important;color:#666;display:block;content:'\f335';font-weight:300}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link:focus,.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link:hover{background:#ddd;border-color:#ccc;color:#000}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link:focus{outline:0}.wc-backbone-modal-main article{padding:1.5em}.wc-backbone-modal-main article p{margin:1.5em 0}.wc-backbone-modal-main article p:first-child{margin-top:0}.wc-backbone-modal-main article p:last-child{margin-bottom:0}.wc-backbone-modal-main article .pagination{padding:10px 0 0;text-align:center}.wc-backbone-modal-main article table.widefat{margin:0;width:100%;border:0;box-shadow:none}.wc-backbone-modal-main article table.widefat thead th{padding:0 1em 1em 1em;text-align:right}.wc-backbone-modal-main article table.widefat thead th:first-child{padding-right:0}.wc-backbone-modal-main article table.widefat thead th:last-child{padding-left:0;text-align:left}.wc-backbone-modal-main article table.widefat tbody td,.wc-backbone-modal-main article table.widefat tbody th{padding:1em;text-align:right;vertical-align:middle}.wc-backbone-modal-main article table.widefat tbody td:first-child,.wc-backbone-modal-main article table.widefat tbody th:first-child{padding-right:0}.wc-backbone-modal-main article table.widefat tbody td:last-child,.wc-backbone-modal-main article table.widefat tbody th:last-child{padding-left:0;text-align:left}.wc-backbone-modal-main article table.widefat tbody td .select2-container,.wc-backbone-modal-main article table.widefat tbody td select,.wc-backbone-modal-main article table.widefat tbody th .select2-container,.wc-backbone-modal-main article table.widefat tbody th select{width:100%}.wc-backbone-modal-main footer{position:absolute;right:0;left:0;bottom:0;z-index:100;padding:1em 1.5em;background:#fcfcfc;border-top:1px solid #dfdfdf;box-shadow:0 -4px 4px -4px rgba(0,0,0,.1)}.wc-backbone-modal-main footer .inner{text-align:left;line-height:23px}.wc-backbone-modal-main footer .inner .button{margin-bottom:0}.select2-drop,.select2-dropdown{z-index:999999!important}.select2-results{line-height:1.5em}.select2-results .select2-results__group,.select2-results .select2-results__option{margin:0;padding:8px}.select2-results .description{display:block;color:#999;padding-top:4px}.select2-dropdown{border-color:#ddd}.select2-dropdown--below{box-shadow:0 1px 1px rgba(0,0,0,.1)}.select2-dropdown--above{box-shadow:0 -1px 1px rgba(0,0,0,.1)}.select2-container .select2-selection__rendered.ui-sortable li{cursor:move}.select2-container .select2-selection{border-color:#ddd}.select2-container .select2-search__field{min-width:150px}.select2-container .select2-selection--single{height:32px}.select2-container .select2-selection--single .select2-selection__rendered{line-height:32px;padding-left:24px}.select2-container .select2-selection--single .select2-selection__arrow{left:3px;height:30px}.select2-container .select2-selection--multiple{min-height:28px;border-radius:0;line-height:1.5}.select2-container .select2-selection--multiple li{margin:0}.select2-container .select2-selection--multiple .select2-selection__choice{padding:2px 6px}.select2-container .select2-selection--multiple .select2-selection__choice .description{display:none}.select2-container .select2-selection__clear{color:#999;margin-top:-1px}.select2-container .select2-search--inline .select2-search__field{font-family:inherit;font-size:inherit;font-weight:inherit;padding:3px 0}.woocommerce table.form-table .select2-container{min-width:400px!important}.post-type-product .tablenav .actions,.post-type-shop_order .tablenav .actions{overflow:visible}.post-type-product .tablenav input,.post-type-product .tablenav select,.post-type-shop_order .tablenav input,.post-type-shop_order .tablenav select{line-height:1;height:32px}.post-type-product .tablenav .select2-container,.post-type-shop_order .tablenav .select2-container{float:right;width:240px!important;font-size:14px;vertical-align:middle;margin:1px 1px 4px 6px}.woocommerce-exporter-wrapper,.woocommerce-importer-wrapper,.woocommerce-progress-form-wrapper{text-align:center;max-width:700px;margin:40px auto}.woocommerce-exporter-wrapper .error,.woocommerce-importer-wrapper .error,.woocommerce-progress-form-wrapper .error{text-align:right}.woocommerce-exporter-wrapper .wc-progress-steps,.woocommerce-importer-wrapper .wc-progress-steps,.woocommerce-progress-form-wrapper .wc-progress-steps{padding:0 0 24px;margin:0;list-style:none outside;overflow:hidden;color:#ccc;width:100%;display:-ms-inline-flexbox;display:-webkit-inline-box;display:inline-flex}.woocommerce-exporter-wrapper .wc-progress-steps li,.woocommerce-importer-wrapper .wc-progress-steps li,.woocommerce-progress-form-wrapper .wc-progress-steps li{width:25%;float:right;padding:0 0 .8em;margin:0;text-align:center;position:relative;border-bottom:4px solid #ccc;line-height:1.4em}.woocommerce-exporter-wrapper .wc-progress-steps li::before,.woocommerce-importer-wrapper .wc-progress-steps li::before,.woocommerce-progress-form-wrapper .wc-progress-steps li::before{content:'';border:4px solid #ccc;border-radius:100%;width:4px;height:4px;position:absolute;bottom:0;right:50%;margin-right:-6px;margin-bottom:-8px;background:#fff}.woocommerce-exporter-wrapper .wc-progress-steps li.active,.woocommerce-importer-wrapper .wc-progress-steps li.active,.woocommerce-progress-form-wrapper .wc-progress-steps li.active{border-color:#a16696;color:#a16696}.woocommerce-exporter-wrapper .wc-progress-steps li.active::before,.woocommerce-importer-wrapper .wc-progress-steps li.active::before,.woocommerce-progress-form-wrapper .wc-progress-steps li.active::before{border-color:#a16696}.woocommerce-exporter-wrapper .wc-progress-steps li.done,.woocommerce-importer-wrapper .wc-progress-steps li.done,.woocommerce-progress-form-wrapper .wc-progress-steps li.done{border-color:#a16696;color:#a16696}.woocommerce-exporter-wrapper .wc-progress-steps li.done::before,.woocommerce-importer-wrapper .wc-progress-steps li.done::before,.woocommerce-progress-form-wrapper .wc-progress-steps li.done::before{border-color:#a16696;background:#a16696}.woocommerce-exporter-wrapper .button,.woocommerce-importer-wrapper .button,.woocommerce-progress-form-wrapper .button{font-size:1.25em;padding:.5em 1em!important;line-height:1.5em!important;margin-left:.5em;margin-bottom:2px;height:auto!important;border-radius:4px;background-color:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;text-shadow:0 -1px 1px #a36597,-1px 0 1px #a36597,0 1px 1px #a36597,1px 0 1px #a36597;margin:0;opacity:1}.woocommerce-exporter-wrapper .button:active,.woocommerce-exporter-wrapper .button:focus,.woocommerce-exporter-wrapper .button:hover,.woocommerce-importer-wrapper .button:active,.woocommerce-importer-wrapper .button:focus,.woocommerce-importer-wrapper .button:hover,.woocommerce-progress-form-wrapper .button:active,.woocommerce-progress-form-wrapper .button:focus,.woocommerce-progress-form-wrapper .button:hover{background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.woocommerce-exporter-wrapper .error .button,.woocommerce-importer-wrapper .error .button,.woocommerce-progress-form-wrapper .error .button{font-size:1em}.woocommerce-exporter-wrapper .wc-actions,.woocommerce-importer-wrapper .wc-actions,.woocommerce-progress-form-wrapper .wc-actions{overflow:hidden;border-top:1px solid #eee;margin:0;padding:23px 24px 24px;line-height:3em}.woocommerce-exporter-wrapper .wc-actions .button,.woocommerce-importer-wrapper .wc-actions .button,.woocommerce-progress-form-wrapper .wc-actions .button{float:left}.woocommerce-exporter-wrapper .wc-actions .woocommerce-importer-toggle-advanced-options,.woocommerce-importer-wrapper .wc-actions .woocommerce-importer-toggle-advanced-options,.woocommerce-progress-form-wrapper .wc-actions .woocommerce-importer-toggle-advanced-options{color:#999}.woocommerce-exporter-wrapper .wc-progress-form-content,.woocommerce-exporter-wrapper .woocommerce-exporter,.woocommerce-exporter-wrapper .woocommerce-importer,.woocommerce-importer-wrapper .wc-progress-form-content,.woocommerce-importer-wrapper .woocommerce-exporter,.woocommerce-importer-wrapper .woocommerce-importer,.woocommerce-progress-form-wrapper .wc-progress-form-content,.woocommerce-progress-form-wrapper .woocommerce-exporter,.woocommerce-progress-form-wrapper .woocommerce-importer{background:#fff;overflow:hidden;padding:0;margin:0 0 16px;box-shadow:0 1px 3px rgba(0,0,0,.13);color:#555;text-align:right}.woocommerce-exporter-wrapper .wc-progress-form-content header,.woocommerce-exporter-wrapper .woocommerce-exporter header,.woocommerce-exporter-wrapper .woocommerce-importer header,.woocommerce-importer-wrapper .wc-progress-form-content header,.woocommerce-importer-wrapper .woocommerce-exporter header,.woocommerce-importer-wrapper .woocommerce-importer header,.woocommerce-progress-form-wrapper .wc-progress-form-content header,.woocommerce-progress-form-wrapper .woocommerce-exporter header,.woocommerce-progress-form-wrapper .woocommerce-importer header{border-bottom:1px solid #eee;margin:0;padding:24px 24px 0}.woocommerce-exporter-wrapper .wc-progress-form-content section,.woocommerce-exporter-wrapper .woocommerce-exporter section,.woocommerce-exporter-wrapper .woocommerce-importer section,.woocommerce-importer-wrapper .wc-progress-form-content section,.woocommerce-importer-wrapper .woocommerce-exporter section,.woocommerce-importer-wrapper .woocommerce-importer section,.woocommerce-progress-form-wrapper .wc-progress-form-content section,.woocommerce-progress-form-wrapper .woocommerce-exporter section,.woocommerce-progress-form-wrapper .woocommerce-importer section{padding:24px 24px 0}.woocommerce-exporter-wrapper .wc-progress-form-content h2,.woocommerce-exporter-wrapper .woocommerce-exporter h2,.woocommerce-exporter-wrapper .woocommerce-importer h2,.woocommerce-importer-wrapper .wc-progress-form-content h2,.woocommerce-importer-wrapper .woocommerce-exporter h2,.woocommerce-importer-wrapper .woocommerce-importer h2,.woocommerce-progress-form-wrapper .wc-progress-form-content h2,.woocommerce-progress-form-wrapper .woocommerce-exporter h2,.woocommerce-progress-form-wrapper .woocommerce-importer h2{margin:0 0 24px;color:#555;font-size:24px;font-weight:400;line-height:1em}.woocommerce-exporter-wrapper .wc-progress-form-content p,.woocommerce-exporter-wrapper .woocommerce-exporter p,.woocommerce-exporter-wrapper .woocommerce-importer p,.woocommerce-importer-wrapper .wc-progress-form-content p,.woocommerce-importer-wrapper .woocommerce-exporter p,.woocommerce-importer-wrapper .woocommerce-importer p,.woocommerce-progress-form-wrapper .wc-progress-form-content p,.woocommerce-progress-form-wrapper .woocommerce-exporter p,.woocommerce-progress-form-wrapper .woocommerce-importer p{font-size:1em;line-height:1.75em;font-size:16px;color:#555;margin:0 0 24px}.woocommerce-exporter-wrapper .wc-progress-form-content .form-row,.woocommerce-exporter-wrapper .woocommerce-exporter .form-row,.woocommerce-exporter-wrapper .woocommerce-importer .form-row,.woocommerce-importer-wrapper .wc-progress-form-content .form-row,.woocommerce-importer-wrapper .woocommerce-exporter .form-row,.woocommerce-importer-wrapper .woocommerce-importer .form-row,.woocommerce-progress-form-wrapper .wc-progress-form-content .form-row,.woocommerce-progress-form-wrapper .woocommerce-exporter .form-row,.woocommerce-progress-form-wrapper .woocommerce-importer .form-row{margin-top:24px}.woocommerce-exporter-wrapper .wc-progress-form-content .spinner,.woocommerce-exporter-wrapper .woocommerce-exporter .spinner,.woocommerce-exporter-wrapper .woocommerce-importer .spinner,.woocommerce-importer-wrapper .wc-progress-form-content .spinner,.woocommerce-importer-wrapper .woocommerce-exporter .spinner,.woocommerce-importer-wrapper .woocommerce-importer .spinner,.woocommerce-progress-form-wrapper .wc-progress-form-content .spinner,.woocommerce-progress-form-wrapper .woocommerce-exporter .spinner,.woocommerce-progress-form-wrapper .woocommerce-importer .spinner{display:none}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th{vertical-align:top;line-height:1.75em;padding:0 0 24px 0}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td label,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th label,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td label,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th label{color:#555;font-weight:400}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=checkbox],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=checkbox],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=checkbox],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=checkbox]{margin:0 0 0 4px;padding:7px}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=text],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=text],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=text],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=text]{padding:7px;height:auto;margin:0}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper{border:1px solid #ddd;box-shadow:inset 0 1px 2px rgba(0,0,0,.07);background-color:#fff;color:#32373c;outline:0;line-height:1;display:block}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code{background:0 0;font-size:smaller;padding:0;margin:0;color:#999;padding:7px 7px 0 0;display:inline-block}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input{font-family:Consolas,Monaco,monospace;border:0;margin:0;outline:0;box-shadow:none;display:inline-block;min-width:100%}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th{width:35%;padding-left:20px}.woocommerce-exporter-wrapper .wc-progress-form-content progress,.woocommerce-exporter-wrapper .woocommerce-exporter progress,.woocommerce-exporter-wrapper .woocommerce-importer progress,.woocommerce-importer-wrapper .wc-progress-form-content progress,.woocommerce-importer-wrapper .woocommerce-exporter progress,.woocommerce-importer-wrapper .woocommerce-importer progress,.woocommerce-progress-form-wrapper .wc-progress-form-content progress,.woocommerce-progress-form-wrapper .woocommerce-exporter progress,.woocommerce-progress-form-wrapper .woocommerce-importer progress{width:100%;height:42px;margin:0 auto 24px;display:block;-webkit-appearance:none;border:none;display:none;background:#f5f5f5;border:2px solid #eee;border-radius:4px;padding:0;box-shadow:0 1px 0 0 rgba(255,255,255,.2)}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-webkit-progress-bar,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-webkit-progress-bar,.woocommerce-exporter-wrapper .woocommerce-importer progress::-webkit-progress-bar,.woocommerce-importer-wrapper .wc-progress-form-content progress::-webkit-progress-bar,.woocommerce-importer-wrapper .woocommerce-exporter progress::-webkit-progress-bar,.woocommerce-importer-wrapper .woocommerce-importer progress::-webkit-progress-bar,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-webkit-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-webkit-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-webkit-progress-bar{background:transparent none;border:0;border-radius:4px;padding:0;box-shadow:none}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-webkit-progress-value,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-webkit-progress-value,.woocommerce-exporter-wrapper .woocommerce-importer progress::-webkit-progress-value,.woocommerce-importer-wrapper .wc-progress-form-content progress::-webkit-progress-value,.woocommerce-importer-wrapper .woocommerce-exporter progress::-webkit-progress-value,.woocommerce-importer-wrapper .woocommerce-importer progress::-webkit-progress-value,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-webkit-progress-value,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-webkit-progress-value,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-webkit-progress-value{border-radius:3px;box-shadow:inset 0 1px 1px 0 rgba(255,255,255,.4);background:#a46497;background:-webkit-linear-gradient(top,#a46497,#66405f),#a46497;background:linear-gradient(top,#a46497,#66405f),#a46497;-webkit-transition:width 1s ease;transition:width 1s ease}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-moz-progress-bar,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-moz-progress-bar,.woocommerce-exporter-wrapper .woocommerce-importer progress::-moz-progress-bar,.woocommerce-importer-wrapper .wc-progress-form-content progress::-moz-progress-bar,.woocommerce-importer-wrapper .woocommerce-exporter progress::-moz-progress-bar,.woocommerce-importer-wrapper .woocommerce-importer progress::-moz-progress-bar,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-moz-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-moz-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-moz-progress-bar{border-radius:3px;box-shadow:inset 0 1px 1px 0 rgba(255,255,255,.4);background:#a46497;background:linear-gradient(top,#a46497,#66405f),#a46497;-webkit-transition:width 1s ease;transition:width 1s ease}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-ms-fill,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-ms-fill,.woocommerce-exporter-wrapper .woocommerce-importer progress::-ms-fill,.woocommerce-importer-wrapper .wc-progress-form-content progress::-ms-fill,.woocommerce-importer-wrapper .woocommerce-exporter progress::-ms-fill,.woocommerce-importer-wrapper .woocommerce-importer progress::-ms-fill,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-ms-fill,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-ms-fill,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-ms-fill{border-radius:3px;box-shadow:inset 0 1px 1px 0 rgba(255,255,255,.4);background:#a46497;background:linear-gradient(to bottom,#a46497,#66405f),#a46497;-webkit-transition:width 1s ease;transition:width 1s ease}.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .spinner,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing .spinner,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .spinner,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing .spinner,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting .spinner,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing .spinner,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .spinner,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing .spinner,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .spinner,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing .spinner,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting .spinner,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing .spinner,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .spinner,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing .spinner,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .spinner,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing .spinner,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting .spinner,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing .spinner{display:block}.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting progress,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing progress,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting progress,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing progress,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting progress,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing progress,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting progress,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing progress,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting progress,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing progress,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting progress,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing progress,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting progress,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing progress,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting progress,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing progress,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting progress,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing progress{display:block}.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .wc-actions,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing .wc-actions,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .wc-actions,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing .wc-actions,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting .wc-actions,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing .wc-actions,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .wc-actions,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing .wc-actions,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .wc-actions,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing .wc-actions,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting .wc-actions,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing .wc-actions,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .wc-actions,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing .wc-actions,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing .woocommerce-exporter-options{display:none}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table-wrapper{padding:0}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table{margin:0;border:0;box-shadow:none;width:100%;table-layout:fixed}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th{border:0;padding:12px;vertical-align:middle;word-wrap:break-word}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td select,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th select,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td select,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th select{width:100%}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) th{background:#fbfbfb}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th{font-weight:700}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td:first-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th:first-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td:first-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th:first-child{padding-right:24px}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td:last-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th:last-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td:last-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th:last-child{padding-left:24px}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name{width:50%}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description{color:#999;margin-top:4px;display:block}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description code{background:0 0;padding:0;white-space:pre-line;word-wrap:break-word;word-break:break-all}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-done,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-done,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-done,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-done,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-done,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-done,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-done,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-done,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-done{text-align:center;padding:48px 24px;font-size:1.5em;line-height:1.75em}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-done::before,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-done::before,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-done::before,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-done::before,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-done::before,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-done::before,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-done::before,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-done::before,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-done::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";color:#a16696;position:static;font-size:100px;display:block;float:none;margin:0 0 24px}.wc-pointer .wc-pointer-buttons .close{float:right;margin:6px 15px 0 0} \ No newline at end of file diff --git a/assets/css/admin.css b/assets/css/admin.css index 57582da762e..9856c8e6ec4 100644 --- a/assets/css/admin.css +++ b/assets/css/admin.css @@ -1,2 +1,2 @@ -.select2-container{-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer;display:block;height:28px;margin:0 0 -4px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer;display:block;min-height:32px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left;padding:0}.select2-container .select2-search--inline .select2-search__field{-webkit-box-sizing:border-box;box-sizing:border-box;border:none;font-size:100%;margin:0;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border:1px solid #aaa;border-radius:4px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected],.select2-results__option[data-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{-webkit-box-sizing:border-box;box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none;margin:5px 5px 0 0}.select2-container--default .select2-selection--multiple .select2-selection__rendered li:before{content:'';display:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid #000 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:0 0;border:none;outline:0;-webkit-box-shadow:none;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true],.select2-container--default .select2-results__option[data-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected],.select2-container--default .select2-results__option--highlighted[data-selected]{background-color:#0073aa;color:#fff}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(50%,#fff),to(#eee));background-image:-webkit-linear-gradient(top,#fff 50%,#eee 100%);background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single:focus{border:1px solid #0073aa}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(50%,#eee),to(#ccc));background-image:-webkit-linear-gradient(top,#eee 50%,#ccc 100%);background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #0073aa}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:0 0;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-gradient(linear,left top,left bottom,from(white),color-stop(50%,#eee));background-image:-webkit-linear-gradient(top,#fff 0,#eee 50%);background-image:linear-gradient(to bottom,#fff 0,#eee 50%);background-repeat:repeat-x}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(50%,#eee),to(white));background-image:-webkit-linear-gradient(top,#eee 50%,#fff 100%);background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #0073aa}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #0073aa}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;-webkit-box-shadow:none;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected],.select2-container--classic .select2-results__option--highlighted[data-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#0073aa} -@charset "UTF-8";@-webkit-keyframes spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}.blockUI.blockOverlay::before{height:1em;width:1em;display:block;position:absolute;top:50%;left:50%;margin-left:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.wc_addons_wrap{max-width:1200px}.wc_addons_wrap h1.search-form-title{clear:left;padding:0}.wc_addons_wrap form.search-form{clear:both;display:block;position:relative;margin-top:1em;margin-bottom:1em}.wc_addons_wrap form.search-form input{border:1px solid #ddd;-webkit-box-shadow:none;box-shadow:none;height:53px;padding-left:50px;width:100%;margin:0}.wc_addons_wrap form.search-form button{background:0 0;border:none;cursor:pointer;height:53px;position:absolute;width:53px}.wc_addons_wrap .update-plugins .update-count{background-color:#d54e21;border-radius:10px;color:#fff;display:inline-block;font-size:9px;font-weight:600;line-height:17px;margin:1px 0 0 2px;padding:0 6px;vertical-align:text-top}.wc_addons_wrap .addons-featured{margin:0}.wc_addons_wrap ul.subsubsub.subsubsub{margin:-2px 0 12px}.wc_addons_wrap .subsubsub li::after{content:'|'}.wc_addons_wrap .subsubsub li:last-child::after{content:''}.wc_addons_wrap .addons-banner-block-item-icon,.wc_addons_wrap .addons-column-block-item-icon{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.wc_addons_wrap .addons-banner-block,.wc_addons_wrap .addons-wcs-banner-block{background:#fff;border:1px solid #ddd;margin:0 0 1em 0;padding:2em 2em 1em}.wc_addons_wrap .addons-banner-block img{height:62px}.wc_addons_wrap .addons-banner-block p{margin:0 0 20px}.wc_addons_wrap .addons-banner-block-items{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around;margin:0 -10px 0 -10px}.wc_addons_wrap .addons-banner-block-item{border:1px solid #e6e6e6;border-radius:3px;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin:1em;min-width:200px;width:30%}.wc_addons_wrap .addons-banner-block-item-icon{background:#f7f7f7;height:143px}.wc_addons_wrap .addons-banner-block-item-content{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:184px;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:24px}.wc_addons_wrap .addons-banner-block-item-content h3{margin-top:0}.wc_addons_wrap .addons-banner-block-item-content p{margin:0 0 auto}.wc_addons_wrap .addons-wcs-banner-block{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.wc_addons_wrap .addons-wcs-banner-block-image{background:#f7f7f7;border:1px solid #e6e6e6;margin-right:2em;padding:4em}.wc_addons_wrap .addons-wcs-banner-block-image .addons-img{max-height:86px;max-width:97px}.wc_addons_wrap .addons-shipping-methods .addons-wcs-banner-block{margin-left:0;margin-right:0;margin-top:1em}.wc_addons_wrap .addons-wcs-banner-block-content{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;padding:1em 0}.wc_addons_wrap .addons-wcs-banner-block-content h1{padding-bottom:0}.wc_addons_wrap .addons-wcs-banner-block-content p{margin-bottom:0}.wc_addons_wrap .addons-wcs-banner-block-content .wcs-service-logo{max-width:40px}.wc_addons_wrap .addons-column-section{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}.wc_addons_wrap .addons-column{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:50%;padding:0 .5em}.wc_addons_wrap .addons-column:nth-child(2){margin-right:0}.wc_addons_wrap .addons-column-block,.wc_addons_wrap .addons-small-dark-block,.wc_addons_wrap .addons-small-light-block{-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #ddd;margin:0 0 1em;padding:20px}.wc_addons_wrap .addons-column-block img{max-height:50px;max-width:50px}.wc_addons_wrap .addons-column-block,.wc_addons_wrap .addons-small-light-block{background:#fff}.wc_addons_wrap .addons-column-block-left{float:left}.wc_addons_wrap .addons-column-block-right{float:right}.wc_addons_wrap .addons-column-block-item{border-top:2px solid #f9f9f9;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:0 -20px;padding:20px}.wc_addons_wrap .addons-column-block-item-icon{background:#f7f7f7;border:1px solid #e6e6e6;height:100px;margin:0 10px 10px 0;width:100px}.wc_addons_wrap .addons-column-block-item-content{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;height:20%;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-width:200px}.wc_addons_wrap .addons-column-block-item-content h2{float:left;margin-top:8px}.wc_addons_wrap .addons-column-block-item-content a{float:right}.wc_addons_wrap .addons-column-block-item-content p{float:left}.wc_addons_wrap .addons-banner-block-item,.wc_addons_wrap .addons-column-block-item{display:none}.wc_addons_wrap .addons-banner-block-item:nth-child(-n+3){display:block}.wc_addons_wrap .addons-column-block-item:nth-of-type(-n+3){display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wc_addons_wrap .addons-small-dark-block{background-color:#54687d;text-align:center}.wc_addons_wrap .addons-small-dark-items{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}.wc_addons_wrap .addons-small-dark-item{margin:0 0 20px}.wc_addons_wrap .addons-small-dark-block h1{color:#fff}.wc_addons_wrap .addons-small-dark-block p{color:#fafafa}.wc_addons_wrap .addons-small-dark-item-icon img{height:30px}.wc_addons_wrap .addons-small-dark-item a{margin:28px auto 0}.wc_addons_wrap .addons-small-light-block{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.wc_addons_wrap .addons-small-light-block h1{margin-top:-12px}.wc_addons_wrap .addons-small-light-block p{margin-top:0}.wc_addons_wrap .addons-small-light-block img{height:225px;margin:0 0 0 -20px}.wc_addons_wrap .addons-small-light-block-content{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1 1 100px;-ms-flex:1 1 100px;flex:1 1 100px;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}.wc_addons_wrap .addons-small-light-block-buttons{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.wc_addons_wrap .addons-small-light-block-content a{width:48%}.wc_addons_wrap .addons-button{border-radius:3px;cursor:pointer;display:block;height:37px;line-height:37px;text-align:center;text-decoration:none;width:124px}.wc_addons_wrap .addons-button-solid{background-color:#955a89;color:#fff}.wc_addons_wrap .addons-button-solid:hover{color:#fff;opacity:.8}.wc_addons_wrap .addons-button-outline-green{border:1px solid #73ae39;color:#73ae39}.wc_addons_wrap .addons-button-outline-green:hover{color:#73ae39;opacity:.8}.wc_addons_wrap .addons-button-outline-white{border:1px solid #fff;color:#fff}.wc_addons_wrap .addons-button-outline-white:hover{color:#fff;opacity:.8}.wc_addons_wrap .addons-button-installed{background:#e6e6e6;color:#3c3c3c}.wc_addons_wrap .addons-button-installed:hover{color:#3c3c3c;opacity:.8}@media only screen and (max-width:400px){.wc_addons_wrap .addons-featured{margin:-1% -5%}.wc_addons_wrap .addons-button{width:100%}.wc_addons_wrap .addons-small-dark-item{width:100%}.wc_addons_wrap .addons-column-block-item-icon{background:0 0;border:none;height:75px;margin:0 10px 10px 0;width:75px}}.wc_addons_wrap .products{overflow:hidden;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row;-ms-flex-flow:row;flex-flow:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0 -.5em}.wc_addons_wrap .products li{float:left;border:1px solid #ddd;margin:0 .5em 1em!important;padding:0;vertical-align:top;width:25%;min-width:280px;min-height:220px;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;overflow:hidden;background:#f5f5f5;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),inset 0 -1px 0 rgba(0,0,0,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),inset 0 -1px 0 rgba(0,0,0,.1)}.wc_addons_wrap .products li a{text-decoration:none;color:inherit;display:block;height:100%}.wc_addons_wrap .products li a .product-img-wrap{background:#fff;display:block}.wc_addons_wrap .products li a img{max-width:258px;max-height:24px;padding:17px 20px;display:block;margin:0;background:#fff;border-right:260px solid #fff}.wc_addons_wrap .products li a img.extension-thumb+h3{display:none}.wc_addons_wrap .products li a .price{display:none}.wc_addons_wrap .products li a h2,.wc_addons_wrap .products li a h3{margin:0!important;padding:20px!important;background:#fff}.wc_addons_wrap .products li a p{padding:20px!important;margin:0!important;border-top:1px solid #f1f1f1}.wc_addons_wrap .products li a:focus,.wc_addons_wrap .products li a:hover{background-color:#fff}.wc_addons_wrap .storefront{background:url(../images/storefront-bg.jpg) bottom right #f6f6f6;border:1px solid #ddd;margin-top:1em;padding:20px;overflow:hidden;zoom:1}.wc_addons_wrap .storefront img{width:278px;height:auto;float:left;margin:0 20px 0 0;-webkit-box-shadow:0 1px 6px rgba(0,0,0,.1);box-shadow:0 1px 6px rgba(0,0,0,.1)}.wc_addons_wrap .storefront p{max-width:750px}.woocommerce-BlankState a.button-primary,.woocommerce-BlankState button.button-primary,.woocommerce-message a.button-primary,.woocommerce-message button.button-primary{background:#bb77ae;border-color:#a36597;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;color:#fff;text-shadow:0 -1px 1px #a36597,1px 0 1px #a36597,0 1px 1px #a36597,-1px 0 1px #a36597;display:inline-block}.woocommerce-BlankState a.button-primary:active,.woocommerce-BlankState a.button-primary:focus,.woocommerce-BlankState a.button-primary:hover,.woocommerce-BlankState button.button-primary:active,.woocommerce-BlankState button.button-primary:focus,.woocommerce-BlankState button.button-primary:hover,.woocommerce-message a.button-primary:active,.woocommerce-message a.button-primary:focus,.woocommerce-message a.button-primary:hover,.woocommerce-message button.button-primary:active,.woocommerce-message button.button-primary:focus,.woocommerce-message button.button-primary:hover{background:#a36597;border-color:#a36597;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.woocommerce-message{position:relative;border-left-color:#cc99c2!important;overflow:hidden}.woocommerce-message a.docs,.woocommerce-message a.skip{text-decoration:none!important}.woocommerce-message a.woocommerce-message-close{position:static;float:right;padding:0 15px 10px 28px;margin-top:-10px;font-size:13px;line-height:1.23076923;text-decoration:none}.woocommerce-message a.woocommerce-message-close::before{position:relative;top:18px;left:-20px;-webkit-transition:all .1s ease-in-out;transition:all .1s ease-in-out}.woocommerce-message .twitter-share-button{margin-top:-3px;margin-left:3px;vertical-align:middle}#variable_product_options #message,#variable_product_options .notice{margin:10px}.clear{clear:both}.wrap.woocommerce div.error,.wrap.woocommerce div.updated{margin-top:10px}mark.amount{background:transparent none;color:inherit}.simplify-commerce-banner{overflow:hidden}.simplify-commerce-banner img{float:right;padding:15px 0;margin-left:1em;width:200px}.woocommerce-help-tip{color:#666;display:inline-block;font-size:1.1em;font-style:normal;height:16px;line-height:16px;position:relative;vertical-align:middle;width:16px}.woocommerce-help-tip::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";cursor:help}h2 .woocommerce-help-tip{margin-top:-5px;margin-left:.25em}table.wc_status_table{margin-bottom:1em}table.wc_status_table h2{font-size:14px;margin:0}table.wc_status_table tr:nth-child(2n) td,table.wc_status_table tr:nth-child(2n) th{background:#fcfcfc}table.wc_status_table th{font-weight:700;padding:9px}table.wc_status_table td:first-child{width:33%}table.wc_status_table td.help{width:1em}table.wc_status_table td,table.wc_status_table th{font-size:1.1em;font-weight:400}table.wc_status_table td.run-tool,table.wc_status_table th.run-tool{text-align:right}table.wc_status_table td strong.name,table.wc_status_table th strong.name{display:block;margin-bottom:.5em}table.wc_status_table td mark,table.wc_status_table th mark{background:transparent none}table.wc_status_table td mark.yes,table.wc_status_table th mark.yes{color:#7ad03a}table.wc_status_table td mark.no,table.wc_status_table th mark.no{color:#999}table.wc_status_table td .red,table.wc_status_table td mark.error,table.wc_status_table th .red,table.wc_status_table th mark.error{color:#a00}table.wc_status_table td ul,table.wc_status_table th ul{margin:0}table.wc_status_table .help_tip{cursor:help}table.wc_status_table--tools td,table.wc_status_table--tools th{padding:2em}.taxonomy-product_cat .column-thumb .woocommerce-help-tip{font-size:1.5em;margin:0 0 0 -34px;padding:0 2px 5px;display:block;position:absolute}#debug-report{display:none;margin:10px 0;padding:0;position:relative}#debug-report textarea{font-family:monospace;width:100%;margin:0;height:300px;padding:20px;border-radius:0;resize:none;font-size:12px;line-height:20px;outline:0}.wp-list-table.logs .log-level{display:inline;padding:.2em .6em .3em;font-size:80%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.2em}.wp-list-table.logs .log-level:empty{display:none}.wp-list-table.logs .log-level--alert,.wp-list-table.logs .log-level--emergency{background-color:#ff4136}.wp-list-table.logs .log-level--critical,.wp-list-table.logs .log-level--error{background-color:#ff851b}.wp-list-table.logs .log-level--notice,.wp-list-table.logs .log-level--warning{color:#222;background-color:#ffdc00}.wp-list-table.logs .log-level--info{background-color:#0074d9}.wp-list-table.logs .log-level--debug{background-color:#3d9970}@media screen and (min-width:783px){.wp-list-table.logs .column-timestamp{width:18%}.wp-list-table.logs .column-level{width:14%}.wp-list-table.logs .column-source{width:15%}}#log-viewer-select{padding:10px 0 8px;line-height:28px}#log-viewer-select h2 a{vertical-align:middle}#log-viewer{background:#fff;border:1px solid #e5e5e5;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.04);box-shadow:0 1px 1px rgba(0,0,0,.04);padding:5px 20px}#log-viewer pre{font-family:monospace;white-space:pre-wrap;word-wrap:break-word}.inline-edit-product.quick-edit-row .inline-edit-col-center,.inline-edit-product.quick-edit-row .inline-edit-col-right{float:right!important}#woocommerce-fields.inline-edit-col{clear:left}#woocommerce-fields.inline-edit-col label.featured,#woocommerce-fields.inline-edit-col label.manage_stock{margin-left:10px}#woocommerce-fields.inline-edit-col label.stock_status_field{clear:both;float:left}#woocommerce-fields.inline-edit-col .dimensions div{display:block;margin:.2em 0}#woocommerce-fields.inline-edit-col .dimensions div span.title{display:block;float:left;width:5em}#woocommerce-fields.inline-edit-col .dimensions div span.input-text-wrap{display:block;margin-left:5em}#woocommerce-fields.inline-edit-col .text{-webkit-box-sizing:border-box;box-sizing:border-box;width:99%;float:left;margin:1px 1% 1px 1px}#woocommerce-fields.inline-edit-col .height,#woocommerce-fields.inline-edit-col .length,#woocommerce-fields.inline-edit-col .width{width:32.33%}#woocommerce-fields.inline-edit-col .height{margin-right:0}#woocommerce-fields-bulk.inline-edit-col label{clear:left}#woocommerce-fields-bulk.inline-edit-col .inline-edit-group label{clear:none;width:49%;margin:.2em 0}#woocommerce-fields-bulk.inline-edit-col .inline-edit-group.dimensions label{width:75%;max-width:75%}#woocommerce-fields-bulk.inline-edit-col .length,#woocommerce-fields-bulk.inline-edit-col .regular_price,#woocommerce-fields-bulk.inline-edit-col .sale_price,#woocommerce-fields-bulk.inline-edit-col .stock,#woocommerce-fields-bulk.inline-edit-col .weight{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;margin-left:4.4em}#woocommerce-fields-bulk.inline-edit-col .height,#woocommerce-fields-bulk.inline-edit-col .length,#woocommerce-fields-bulk.inline-edit-col .width{-webkit-box-sizing:border-box;box-sizing:border-box;width:25%}.column-coupon_code{line-height:2.25em}.column-coupon_code,ul.wc_coupon_list{margin:0;overflow:hidden;zoom:1;clear:both}ul.wc_coupon_list{padding-bottom:5px}ul.wc_coupon_list li{margin:0}ul.wc_coupon_list li.code{display:inline-block;position:relative;padding:0 .5em;background-color:#fff;border:1px solid #aaa;-webkit-box-shadow:0 1px 0 #dfdfdf;box-shadow:0 1px 0 #dfdfdf;border-radius:4px;margin-right:5px;margin-top:5px}ul.wc_coupon_list li.code.editable{padding-right:2em}ul.wc_coupon_list li.code .tips{cursor:pointer}ul.wc_coupon_list li.code .tips span{color:#888}ul.wc_coupon_list li.code .tips span:hover{color:#000}ul.wc_coupon_list li.code .remove-coupon{text-decoration:none;color:#888;position:absolute;top:7px;right:20px}ul.wc_coupon_list li.code .remove-coupon::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}ul.wc_coupon_list li.code .remove-coupon:hover::before{color:#a00}ul.wc_coupon_list_block{margin:0;padding-bottom:2px}ul.wc_coupon_list_block li{border-top:1px solid #fff;border-bottom:1px solid #ccc;line-height:2.5em;margin:0;padding:.5em 0}ul.wc_coupon_list_block li:first-child{border-top:0;padding-top:0}ul.wc_coupon_list_block li:last-child{border-bottom:0;padding-bottom:0}.button.wc-reload{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;padding:0;height:28px;width:28px!important;display:inline-block}.button.wc-reload::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";line-height:28px}#woocommerce-order-data .handlediv,#woocommerce-order-data .hndle{display:none}#woocommerce-order-data .inside{display:block!important}#order_data{padding:23px 24px 12px}#order_data h2{margin:0;font-family:HelveticaNeue-Light,'Helvetica Neue Light','Helvetica Neue',sans-serif;font-size:21px;font-weight:400;line-height:1.2;text-shadow:1px 1px 1px #fff;padding:0}#order_data h3{font-size:14px}#order_data h3,#order_data h4{color:#333;margin:1.33em 0 0}#order_data p{color:#777}#order_data p.order_number{margin:0;font-family:HelveticaNeue-Light,'Helvetica Neue Light','Helvetica Neue',sans-serif;font-weight:400;line-height:1.6em;font-size:16px}#order_data .order_data_column_container{clear:both}#order_data .order_data_column{width:32%;padding:0 2% 0 0;float:left}#order_data .order_data_column>h3 span{display:block}#order_data .order_data_column:last-child{padding-right:0}#order_data .order_data_column p{padding:0!important}#order_data .order_data_column .address strong{display:block}#order_data .order_data_column .form-field{float:left;clear:left;width:48%;padding:0;margin:9px 0 0}#order_data .order_data_column .form-field label{display:block;padding:0 0 3px}#order_data .order_data_column .form-field input,#order_data .order_data_column .form-field textarea{width:100%}#order_data .order_data_column .form-field select{width:100%}#order_data .order_data_column .form-field .select2-container{width:100%!important}#order_data .order_data_column .form-field .date-picker{width:50%}#order_data .order_data_column .form-field .hour,#order_data .order_data_column .form-field .minute{width:3.5em}#order_data .order_data_column .form-field small{display:block;margin:5px 0 0;color:#999}#order_data .order_data_column ._billing_address_2_field,#order_data .order_data_column ._billing_last_name_field,#order_data .order_data_column ._billing_phone_field,#order_data .order_data_column ._billing_postcode_field,#order_data .order_data_column ._billing_state_field,#order_data .order_data_column ._shipping_address_2_field,#order_data .order_data_column ._shipping_last_name_field,#order_data .order_data_column ._shipping_postcode_field,#order_data .order_data_column ._shipping_state_field,#order_data .order_data_column .form-field.last{float:right;clear:right}#order_data .order_data_column ._billing_company_field,#order_data .order_data_column ._shipping_company_field,#order_data .order_data_column ._transaction_id_field,#order_data .order_data_column .form-field-wide{width:100%;clear:both}#order_data .order_data_column ._billing_company_field .wc-category-search,#order_data .order_data_column ._billing_company_field .wc-customer-search,#order_data .order_data_column ._billing_company_field .wc-enhanced-select,#order_data .order_data_column ._billing_company_field input,#order_data .order_data_column ._billing_company_field select,#order_data .order_data_column ._billing_company_field textarea,#order_data .order_data_column ._shipping_company_field .wc-category-search,#order_data .order_data_column ._shipping_company_field .wc-customer-search,#order_data .order_data_column ._shipping_company_field .wc-enhanced-select,#order_data .order_data_column ._shipping_company_field input,#order_data .order_data_column ._shipping_company_field select,#order_data .order_data_column ._shipping_company_field textarea,#order_data .order_data_column ._transaction_id_field .wc-category-search,#order_data .order_data_column ._transaction_id_field .wc-customer-search,#order_data .order_data_column ._transaction_id_field .wc-enhanced-select,#order_data .order_data_column ._transaction_id_field input,#order_data .order_data_column ._transaction_id_field select,#order_data .order_data_column ._transaction_id_field textarea,#order_data .order_data_column .form-field-wide .wc-category-search,#order_data .order_data_column .form-field-wide .wc-customer-search,#order_data .order_data_column .form-field-wide .wc-enhanced-select,#order_data .order_data_column .form-field-wide input,#order_data .order_data_column .form-field-wide select,#order_data .order_data_column .form-field-wide textarea{width:100%}#order_data .order_data_column p.none_set{color:#999}#order_data .order_data_column div.edit_address{display:none;zoom:1;padding-right:1px}#order_data .order_data_column .wc-customer-user label a,#order_data .order_data_column .wc-order-status label a{float:right;margin-left:8px}#order_data .order_data_column a.edit_address{width:14px;height:0;padding:14px 0 0;margin:0 0 0 6px;overflow:hidden;position:relative;color:#999;border:0;float:right}#order_data .order_data_column a.edit_address:focus,#order_data .order_data_column a.edit_address:hover{color:#000}#order_data .order_data_column a.edit_address::after{font-family:WooCommerce;position:absolute;top:0;left:0;text-align:center;vertical-align:top;line-height:14px;font-size:14px;font-weight:400}#order_data .order_data_column a.edit_address::after{font-family:Dashicons;content:'\f464'}#order_data .order_data_column .billing-same-as-shipping,#order_data .order_data_column .load_customer_billing,#order_data .order_data_column .load_customer_shipping{font-size:13px;display:inline-block;font-weight:400}#order_data .order_data_column .load_customer_shipping{margin-right:.3em}.order_actions{margin:0;overflow:hidden;zoom:1}.order_actions li{border-top:1px solid #fff;border-bottom:1px solid #ddd;padding:6px 0;margin:0;line-height:1.6em;float:left;width:50%;text-align:center}.order_actions li a{float:none;text-align:center;text-decoration:underline}.order_actions li.wide{width:auto;float:none;clear:both;padding:6px;text-align:left;overflow:hidden}.order_actions li #delete-action{line-height:25px;vertical-align:middle;text-align:left;float:left}.order_actions li .save_order{float:right}.order_actions li#actions{overflow:hidden}.order_actions li#actions .button{width:24px;-webkit-box-sizing:border-box;box-sizing:border-box;float:right}.order_actions li#actions select{width:225px;-webkit-box-sizing:border-box;box-sizing:border-box;float:left}#woocommerce-order-items .inside{margin:0;padding:0;background:#fefefe}#woocommerce-order-items .wc-order-data-row{border-bottom:1px solid #dfdfdf;padding:1.5em 2em;background:#f8f8f8;line-height:2em;text-align:right}#woocommerce-order-items .wc-order-data-row::after,#woocommerce-order-items .wc-order-data-row::before{content:' ';display:table}#woocommerce-order-items .wc-order-data-row::after{clear:both}#woocommerce-order-items .wc-order-data-row p{margin:0;line-height:2em}#woocommerce-order-items .wc-order-data-row .wc-used-coupons{text-align:left}#woocommerce-order-items .wc-order-data-row .wc-used-coupons .tips{display:inline-block}#woocommerce-order-items .wc-used-coupons{float:left;width:50%}#woocommerce-order-items .wc-order-totals{float:right;width:50%;margin:0;padding:0;text-align:right}#woocommerce-order-items .wc-order-totals .amount{font-weight:700}#woocommerce-order-items .wc-order-totals .label{vertical-align:top}#woocommerce-order-items .wc-order-totals .total{font-size:1em!important;width:10em;margin:0 0 0 .5em;-webkit-box-sizing:border-box;box-sizing:border-box}#woocommerce-order-items .wc-order-totals .total input[type=text]{width:96%;float:right}#woocommerce-order-items .wc-order-totals .refunded-total{color:#a00}#woocommerce-order-items .refund-actions{margin-top:5px;padding-top:12px;border-top:1px solid #dfdfdf}#woocommerce-order-items .refund-actions .button{float:right;margin-left:4px}#woocommerce-order-items .refund-actions .cancel-action{float:left;margin-left:0}#woocommerce-order-items .add_meta{margin-left:0!important}#woocommerce-order-items h3 small{color:#999}#woocommerce-order-items .amount{white-space:nowrap}#woocommerce-order-items .add-items .description{margin-right:10px}#woocommerce-order-items .add-items .button{float:left;margin-right:.25em}#woocommerce-order-items .add-items .button-primary{float:none;margin-right:0}#woocommerce-order-items .inside{display:block!important}#woocommerce-order-items .handlediv,#woocommerce-order-items .hndle{display:none}#woocommerce-order-items .woocommerce_order_items_wrapper{margin:0;overflow-x:auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items{width:100%;background:#fff}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th{text-align:left;padding:1em;font-weight:400;color:#999;background:#f8f8f8;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th.sortable{cursor:pointer}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th:last-child{padding-right:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th:first-child{padding-left:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th .wc-arrow{float:right;position:relative;margin-right:-1em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td{padding:1.5em 1em 1em;text-align:left;line-height:1.5em;vertical-align:top;border-bottom:1px solid #f8f8f8}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td textarea{width:100%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td select{width:50%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td textarea{font-size:14px;padding:4px;color:#555}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th:last-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td:last-child{padding-right:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td:first-child{padding-left:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody tr:last-child td{border-bottom:1px solid #dfdfdf}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody tr:first-child td{border-top:8px solid #f8f8f8}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody#order_line_items tr:first-child td{border-top:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb{text-align:left;width:38px;padding-bottom:1.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb .wc-order-item-thumbnail{width:38px;height:38px;border:2px solid #e8e8e8;background:#f8f8f8;color:#ccc;position:relative;font-size:21px;display:block;text-align:center}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb .wc-order-item-thumbnail::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";width:38px;line-height:38px;display:block}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb .wc-order-item-thumbnail img{width:100%;height:100%;margin:0;padding:0;position:relative}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.name .wc-order-item-sku,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.name .wc-order-item-variation{display:block;margin-top:.5em;font-size:.92em!important;color:#888}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item{min-width:200px}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .center,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .variation-id{text-align:center}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class{text-align:right}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class label{white-space:nowrap;color:#999;font-size:.833em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class label input{display:inline}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class input{width:70px;vertical-align:middle;text-align:right}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class select{width:85px;height:26px;vertical-align:middle;font-size:1em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input{display:inline-block;background:#fff;border:1px solid #ddd;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.07);box-shadow:inset 0 1px 2px rgba(0,0,0,.07);margin:1px 0;min-width:80px;overflow:hidden;line-height:1em;text-align:right}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input{width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input label{font-size:.75em;padding:4px 6px 0;color:#555;display:block}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input input{width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;border:0;-webkit-box-shadow:none;box-shadow:none;margin:0;padding:0 6px 4px;color:#555;background:0 0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input input::-webkit-input-placeholder{color:#ddd}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input:first-child{border-bottom:1px dashed #ddd;background:#fff}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input:first-child label{color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input:first-child input{color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .view{white-space:nowrap}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .edit{text-align:left}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class small.times{font-size:.92em!important;color:#888}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-taxes{margin:0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-taxes label{display:block}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-discount{display:block;margin-top:.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class small.times{margin-right:.25em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity{text-align:center}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity input{text-align:center;width:50px}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items span.subtotal{opacity:.5}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.tax_class,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.tax_class{text-align:left}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .calculated{border-color:#ae8ca2;border-style:dotted}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta{width:100%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta{margin:.5em 0 0;font-size:.92em!important;color:#888}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr th,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr th{border:0;padding:0 4px .5em 0;line-height:1.5em;width:20%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td{padding:0 4px .5em 0;border:0;line-height:1.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td input{width:100%;margin:0;position:relative;border-bottom:0;-webkit-box-shadow:none;box-shadow:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td textarea{width:100%;height:4em;margin:0;-webkit-box-shadow:none;box-shadow:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td input:focus+textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td input:focus+textarea{border-top-color:#999}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td p,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td p{margin:0 0 .5em;line-height:1.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td p:last-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td p:last-child{margin:0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .refund_by{border-bottom:1px dotted #999}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.fee .thumb div{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.5em;line-height:1em;vertical-align:middle;margin:0 auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.fee .thumb div::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.refund .thumb div{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.5em;line-height:1em;vertical-align:middle;margin:0 auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.refund .thumb div::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .thumb div{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.5em;line-height:1em;vertical-align:middle;margin:0 auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .thumb div::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .shipping_method,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .shipping_method_name{width:100%;margin:0 0 .5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax{white-space:nowrap}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax .delete-order-tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax .delete-order-tax{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;float:right;font-size:14px;visibility:hidden;margin:3px -18px 0 0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax .delete-order-tax::before,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax .delete-order-tax::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#999}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax .delete-order-tax:hover::before,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax .delete-order-tax:hover::before{color:#a00}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax:hover .delete-order-tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax:hover .delete-order-tax{visibility:visible}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items small.refunded{display:block;color:#a00;white-space:nowrap;margin-top:.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items small.refunded::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";position:relative;top:auto;left:auto;margin:-1px 4px 0 0;vertical-align:middle;line-height:1em}#woocommerce-order-items .wc-order-edit-line-item{padding-left:0}#woocommerce-order-items .wc-order-edit-line-item-actions{width:44px;text-align:right;padding-left:0;vertical-align:middle}#woocommerce-order-items .wc-order-edit-line-item-actions a{color:#ccc;display:inline-block;cursor:pointer;padding:0 0 .5em;margin:0 0 0 12px;vertical-align:middle;text-decoration:none;line-height:16px;width:16px;overflow:hidden}#woocommerce-order-items .wc-order-edit-line-item-actions a::before{margin:0;padding:0;font-size:16px;width:16px;height:16px}#woocommerce-order-items .wc-order-edit-line-item-actions a:hover::before{color:#999}#woocommerce-order-items .wc-order-edit-line-item-actions a:first-child{margin-left:0}#woocommerce-order-items .wc-order-edit-line-item-actions .edit-order-item::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";position:relative}#woocommerce-order-items .wc-order-edit-line-item-actions .delete-order-item::before,#woocommerce-order-items .wc-order-edit-line-item-actions .delete_refund::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";position:relative}#woocommerce-order-items .wc-order-edit-line-item-actions .delete-order-item:hover::before,#woocommerce-order-items .wc-order-edit-line-item-actions .delete_refund:hover::before{color:#a00}#woocommerce-order-items tbody tr .wc-order-edit-line-item-actions{visibility:hidden}#woocommerce-order-items tbody tr:hover .wc-order-edit-line-item-actions{visibility:visible}#woocommerce-order-items .wc-order-totals .wc-order-edit-line-item-actions{width:1.5em;visibility:visible!important}#woocommerce-order-items .wc-order-totals .wc-order-edit-line-item-actions a{padding:0}#woocommerce-order-downloads .buttons{float:left;padding:0;margin:0;vertical-align:top}#woocommerce-order-downloads .buttons .add_item_id,#woocommerce-order-downloads .buttons .select2-container{width:400px!important;margin-right:9px;vertical-align:top;float:left}#woocommerce-order-downloads .buttons button{margin:2px 0 0}#woocommerce-order-downloads h3 small{color:#999}#poststuff #woocommerce-order-actions .inside{margin:0;padding:0}#poststuff #woocommerce-order-actions .inside ul.order_actions li{padding:6px 10px;-webkit-box-sizing:border-box;box-sizing:border-box}#poststuff #woocommerce-order-actions .inside ul.order_actions li:last-child{border-bottom:0}#poststuff #woocommerce-order-notes .inside{margin:0;padding:0}#poststuff #woocommerce-order-notes .inside ul.order_notes li{padding:0 10px}#woocommerce_customers p.search-box{margin:6px 0 4px;float:left}#woocommerce_customers .tablenav{float:right;clear:none}.widefat.customers td{vertical-align:middle;padding:4px 7px}.widefat .column-order_title{width:15%}.widefat .column-order_title time{display:block;color:#999;margin:3px 0}.widefat .column-orders,.widefat .column-paying,.widefat .column-spent{text-align:center;width:8%}.widefat .column-last_order{width:11%}.widefat .column-wc_actions{width:110px}.widefat .column-wc_actions a.button{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;display:inline-block;margin:2px 4px 2px 0;padding:0!important;height:2em!important;width:2em;overflow:hidden}.widefat .column-wc_actions a.button::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;line-height:1.85}.widefat .column-wc_actions a.button img{display:block;width:12px;height:auto}.widefat .column-wc_actions a.edit::after{content:'\f464'}.widefat .column-wc_actions a.link::after{font-family:WooCommerce;content:'\e00d'}.widefat .column-wc_actions a.view::after{content:'\f177'}.widefat .column-wc_actions a.refresh::after{font-family:WooCommerce;content:'\e031'}.widefat .column-wc_actions a.processing::after{font-family:WooCommerce;content:'\e00f'}.widefat .column-wc_actions a.complete::after{content:'\f147'}.widefat small.meta{display:block;color:#999;font-size:inherit;margin:3px 0}.post-type-shop_order .tablenav .one-page .displaying-num{display:none}.post-type-shop_order .wp-list-table{margin-top:1em}.post-type-shop_order .wp-list-table tfoot th,.post-type-shop_order .wp-list-table thead th{padding:.75em 1em}.post-type-shop_order .wp-list-table tfoot th.sortable a,.post-type-shop_order .wp-list-table tfoot th.sorted a,.post-type-shop_order .wp-list-table thead th.sortable a,.post-type-shop_order .wp-list-table thead th.sorted a{padding:0}.post-type-shop_order .wp-list-table tfoot th:first-child,.post-type-shop_order .wp-list-table thead th:first-child{padding-left:2em}.post-type-shop_order .wp-list-table tfoot th:last-child,.post-type-shop_order .wp-list-table thead th:last-child{padding-right:2em}.post-type-shop_order .wp-list-table tbody td,.post-type-shop_order .wp-list-table tbody th{padding:1em;line-height:26px}.post-type-shop_order .wp-list-table tbody td:first-child{padding-left:2em}.post-type-shop_order .wp-list-table tbody td:last-child{padding-right:2em}.post-type-shop_order .wp-list-table tbody tr{border-top:1px solid #f5f5f5}.post-type-shop_order .wp-list-table tbody tr:hover:not(.status-trash):not(.no-link) td{cursor:pointer}.post-type-shop_order .wp-list-table .no-link{cursor:default!important}.post-type-shop_order .wp-list-table td,.post-type-shop_order .wp-list-table th{width:12ch;vertical-align:middle}.post-type-shop_order .wp-list-table td p,.post-type-shop_order .wp-list-table th p{margin:0}.post-type-shop_order .wp-list-table .check-column{width:1px;white-space:nowrap;padding:1em 1em 1em 1em!important;vertical-align:middle}.post-type-shop_order .wp-list-table .check-column input{vertical-align:text-top;margin:1px 0}.post-type-shop_order .wp-list-table .column-order_number{width:20ch}.post-type-shop_order .wp-list-table .column-order_total{width:8ch;text-align:right}.post-type-shop_order .wp-list-table .column-order_total a span{float:right}.post-type-shop_order .wp-list-table .column-order_date,.post-type-shop_order .wp-list-table .column-order_status{width:10ch}.post-type-shop_order .wp-list-table .column-order_status{width:14ch}.post-type-shop_order .wp-list-table .column-billing_address,.post-type-shop_order .wp-list-table .column-shipping_address{width:20ch;line-height:1.5em}.post-type-shop_order .wp-list-table .column-billing_address .description,.post-type-shop_order .wp-list-table .column-shipping_address .description{display:block;color:#999}.post-type-shop_order .wp-list-table .column-wc_actions{text-align:right}.post-type-shop_order .wp-list-table .column-wc_actions a.button{text-indent:9999px;margin:2px 0 2px 4px}.post-type-shop_order .wp-list-table .order-preview{float:right;width:16px;padding:20px 4px 4px 4px;height:0;overflow:hidden;position:relative;border:2px solid transparent;border-radius:4px}.post-type-shop_order .wp-list-table .order-preview::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";line-height:16px;font-size:14px;vertical-align:middle;top:4px}.post-type-shop_order .wp-list-table .order-preview:hover{border:2px solid #00a0d2}.post-type-shop_order .wp-list-table .order-preview.disabled::before{content:'';background:url(../images/wpspin.gif) no-repeat center top}.order-status{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;line-height:2.5em;color:#777;background:#e5e5e5;border-radius:4px;border-bottom:1px solid rgba(0,0,0,.05);margin:-.25em 0;cursor:inherit!important;white-space:nowrap;max-width:100%}.order-status.status-completed{background:#c8d7e1;color:#2e4453}.order-status.status-on-hold{background:#f8dda7;color:#94660c}.order-status.status-failed{background:#eba3a3;color:#761919}.order-status.status-processing{background:#c6e1c6;color:#5b841b}.order-status.status-trash{background:#eba3a3;color:#761919}.order-status>span{margin:0 1em;overflow:hidden;text-overflow:ellipsis}.wc-order-preview .order-status{float:right;margin-right:54px}.wc-order-preview article{padding:0!important}.wc-order-preview .modal-close{border-radius:0}.wc-order-preview .wc-order-preview-table{width:100%;margin:0}.wc-order-preview .wc-order-preview-table td,.wc-order-preview .wc-order-preview-table th{padding:1em 1.5em;text-align:left;border:0;border-bottom:1px solid #eee;margin:0;background:0 0;-webkit-box-shadow:none;box-shadow:none;text-align:right;vertical-align:top}.wc-order-preview .wc-order-preview-table td:first-child,.wc-order-preview .wc-order-preview-table th:first-child{text-align:left}.wc-order-preview .wc-order-preview-table th{border-color:#ccc}.wc-order-preview .wc-order-preview-table tr:last-child td{border:0}.wc-order-preview .wc-order-preview-table .wc-order-item-sku{margin-top:.5em}.wc-order-preview .wc-order-preview-table .wc-order-item-meta{margin-top:.5em}.wc-order-preview .wc-order-preview-table .wc-order-item-meta td,.wc-order-preview .wc-order-preview-table .wc-order-item-meta th{padding:0;border:0;text-align:left;vertical-align:top}.wc-order-preview .wc-order-preview-table .wc-order-item-meta td:last-child{padding-left:.5em}.wc-order-preview .wc-order-preview-addresses{overflow:hidden;padding-bottom:1.5em}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note{width:50%;float:left;padding:1.5em 1.5em 0;-webkit-box-sizing:border-box;box-sizing:border-box;word-wrap:break-word}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address h2,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note h2{margin-top:0}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address strong,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note strong{display:block;margin-top:1.5em}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address strong:first-child,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note strong:first-child{margin-top:0}.wc-order-preview footer .wc-action-button-group{display:inline-block;float:left}.wc-order-preview footer .button.button-large{margin-left:10px;padding:0 10px!important;line-height:28px;height:auto;display:inline-block}.wc-order-preview .wc-action-button-group label{display:none}.wc-action-button-group{vertical-align:middle;line-height:26px;text-align:left}.wc-action-button-group label{margin-right:6px;cursor:default;font-weight:700;line-height:28px}.wc-action-button-group .wc-action-button-group__items{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-align-content:flex-start;-ms-flex-line-pack:start;align-content:flex-start;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.wc-action-button-group .wc-action-button{margin:0 0 0 -1px!important;border:1px solid #ccc;padding:0 10px!important;border-radius:0!important;float:none;line-height:28px;height:auto;z-index:1;position:relative;overflow:hidden;text-overflow:ellipsis;-webkit-box-flex:1;-webkit-flex:1 0 auto;-ms-flex:1 0 auto;flex:1 0 auto;-webkit-box-sizing:border-box;box-sizing:border-box;text-align:center;white-space:nowrap}.wc-action-button-group .wc-action-button:focus,.wc-action-button-group .wc-action-button:hover{border:1px solid #999;z-index:2}.wc-action-button-group .wc-action-button:first-child{margin-left:0!important;border-top-left-radius:3px!important;border-bottom-left-radius:3px!important}.wc-action-button-group .wc-action-button:last-child{border-top-right-radius:3px!important;border-bottom-right-radius:3px!important}@media screen and (max-width:782px){.wc-order-preview footer .wc-action-button-group .wc-action-button-group__items{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wc-order-preview footer .wc-action-button-group{float:none;display:block;margin-bottom:4px}.wc-order-preview footer .button.button-large{width:100%;float:none;text-align:center;margin:0;display:block}.post-type-shop_order .wp-list-table td.check-column{width:1em}.post-type-shop_order .wp-list-table td.column-order_number{padding-left:0;padding-bottom:.5em}.post-type-shop_order .wp-list-table td.column-order_date,.post-type-shop_order .wp-list-table td.column-order_status{display:inline-block!important;padding:0 1em 1em 1em!important}.post-type-shop_order .wp-list-table td.column-order_date:before,.post-type-shop_order .wp-list-table td.column-order_status:before{display:none!important}.post-type-shop_order .wp-list-table td.column-order_date{padding-left:0!important}.post-type-shop_order .wp-list-table td.column-order_status{float:right}}.column-customer_message .note-on{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto;color:#999}.column-customer_message .note-on::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";line-height:16px}.column-order_notes .note-on{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto;color:#999}.column-order_notes .note-on::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";line-height:16px}.attributes-table td,.attributes-table th{width:15%;vertical-align:top}.attributes-table .attribute-terms{width:32%}.attributes-table .attribute-actions{width:2em}.attributes-table .attribute-actions .configure-terms{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;padding:0!important;height:2em!important;width:2em}.attributes-table .attribute-actions .configure-terms::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";font-family:Dashicons;line-height:1.85}ul.order_notes{padding:2px 0 0}ul.order_notes li .note_content{padding:10px;background:#efefef;position:relative}ul.order_notes li .note_content p{margin:0;padding:0;word-wrap:break-word}ul.order_notes li p.meta{padding:10px;color:#999;margin:0;font-size:11px}ul.order_notes li p.meta .exact-date{border-bottom:1px dotted #999}ul.order_notes li a.delete_note{color:#a00}ul.order_notes li .note_content::after{content:'';display:block;position:absolute;bottom:-10px;left:20px;width:0;height:0;border-width:10px 10px 0 0;border-style:solid;border-color:#efefef transparent}ul.order_notes li.system-note .note_content{background:#d7cad2}ul.order_notes li.system-note .note_content::after{border-color:#d7cad2 transparent}ul.order_notes li.customer-note .note_content{background:#a7cedc}ul.order_notes li.customer-note .note_content::after{border-color:#a7cedc transparent}.add_note{border-top:1px solid #ddd;padding:10px 10px 0}.add_note h4{margin-top:5px!important}.add_note #add_order_note{width:100%;height:50px}table.wp-list-table .column-thumb{width:52px;text-align:center;white-space:nowrap}table.wp-list-table .column-handle{width:17px;display:none}table.wp-list-table tbody td.column-handle{cursor:move;width:17px;text-align:center;vertical-align:text-top}table.wp-list-table tbody td.column-handle::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;height:100%;margin:4px 0 0 0}table.wp-list-table .column-name{width:22%}table.wp-list-table .column-product_cat,table.wp-list-table .column-product_tag{width:11%!important}table.wp-list-table .column-featured,table.wp-list-table .column-product_type{width:48px;text-align:left!important}table.wp-list-table .column-customer_message,table.wp-list-table .column-order_notes{width:48px;text-align:center}table.wp-list-table .column-customer_message img,table.wp-list-table .column-order_notes img{margin:0 auto;padding-top:0!important}table.wp-list-table .manage-column.column-featured img,table.wp-list-table .manage-column.column-product_type img{padding-left:2px}table.wp-list-table .column-price .woocommerce-price-suffix{display:none}table.wp-list-table img{margin:1px 2px}table.wp-list-table .row-actions{color:#999}table.wp-list-table td.column-thumb img{margin:0;width:auto;height:auto;max-width:40px;max-height:40px;vertical-align:middle}table.wp-list-table span.na{color:#999}table.wp-list-table .column-sku{width:10%}table.wp-list-table .column-price{width:10ch}table.wp-list-table .column-is_in_stock{text-align:left!important;width:12ch}table.wp-list-table span.wc-featured,table.wp-list-table span.wc-image{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto}table.wp-list-table span.wc-featured::before,table.wp-list-table span.wc-image::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}table.wp-list-table span.wc-featured::before{content:'\f155'}table.wp-list-table span.wc-featured.not-featured::before{content:'\f154'}table.wp-list-table td.column-featured span.wc-featured{font-size:1.6em;cursor:pointer}table.wp-list-table mark.instock,table.wp-list-table mark.onbackorder,table.wp-list-table mark.outofstock{font-weight:700;background:transparent none;line-height:1}table.wp-list-table mark.instock{color:#7ad03a}table.wp-list-table mark.outofstock{color:#a44}table.wp-list-table mark.onbackorder{color:#eaa600}table.wp-list-table .notes_head,table.wp-list-table .order-notes_head,table.wp-list-table .status_head{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto}table.wp-list-table .notes_head::after,table.wp-list-table .order-notes_head::after,table.wp-list-table .status_head::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}table.wp-list-table .order-notes_head::after{content:'\e028'}table.wp-list-table .notes_head::after{content:'\e026'}table.wp-list-table .status_head::after{content:'\e011'}table.wp-list-table .column-order_items{width:12%}table.wp-list-table .column-order_items table.order_items{width:100%;margin:3px 0 0;padding:0;display:none}table.wp-list-table .column-order_items table.order_items td{border:0;margin:0;padding:0 0 3px}table.wp-list-table .column-order_items table.order_items td.qty{color:#999;padding-right:6px;text-align:left}mark.notice{background:#fff;color:#a00;margin:0 0 0 10px}a.export_rates,a.import_rates{float:right;margin-left:9px;margin-top:-2px;margin-bottom:0}#rates-search{float:right}#rates-search input.wc-tax-rates-search-field{padding:4px 8px;font-size:1.2em}#rates-pagination{float:right;margin-right:.5em}#rates-pagination .tablenav{margin:0}.wc_input_table_wrapper{overflow-x:auto;display:block}table.wc_input_table,table.wc_tax_rates{width:100%}table.wc_input_table td,table.wc_input_table th,table.wc_tax_rates td,table.wc_tax_rates th{display:table-cell!important}table.wc_input_table span.tips,table.wc_tax_rates span.tips{color:#2ea2cc}table.wc_input_table th,table.wc_tax_rates th{white-space:nowrap;padding:10px}table.wc_input_table td,table.wc_tax_rates td{padding:0;border-right:1px solid #dfdfdf;border-bottom:1px solid #dfdfdf;border-top:0;background:#fff;cursor:default}table.wc_input_table td input[type=number],table.wc_input_table td input[type=text],table.wc_tax_rates td input[type=number],table.wc_tax_rates td input[type=text]{width:100%!important;min-width:100px;padding:8px 10px;margin:0;border:0;outline:0;background:transparent none}table.wc_input_table td input[type=number]:focus,table.wc_input_table td input[type=text]:focus,table.wc_tax_rates td input[type=number]:focus,table.wc_tax_rates td input[type=text]:focus{outline:0;-webkit-box-shadow:none;box-shadow:none}table.wc_input_table td.apply_to_shipping,table.wc_input_table td.compound,table.wc_tax_rates td.apply_to_shipping,table.wc_tax_rates td.compound{padding:5px 7px;vertical-align:middle}table.wc_input_table td.apply_to_shipping input,table.wc_input_table td.compound input,table.wc_tax_rates td.apply_to_shipping input,table.wc_tax_rates td.compound input{width:auto;padding:0}table.wc_input_table td:last-child,table.wc_tax_rates td:last-child{border-right:0}table.wc_input_table tr.current td,table.wc_tax_rates tr.current td{background-color:#fefbcc}table.wc_input_table .cost,table.wc_input_table .item_cost,table.wc_tax_rates .cost,table.wc_tax_rates .item_cost{text-align:right}table.wc_input_table .cost input,table.wc_input_table .item_cost input,table.wc_tax_rates .cost input,table.wc_tax_rates .item_cost input{text-align:right}table.wc_input_table th.sort,table.wc_tax_rates th.sort{width:17px;padding:0 4px}table.wc_input_table td.sort,table.wc_tax_rates td.sort{padding:0 4px}table.wc_input_table .ui-sortable:not(.ui-sortable-disabled) td.sort,table.wc_tax_rates .ui-sortable:not(.ui-sortable-disabled) td.sort{cursor:move;font-size:15px;background:#f9f9f9;text-align:center;vertical-align:middle}table.wc_input_table .ui-sortable:not(.ui-sortable-disabled) td.sort::before,table.wc_tax_rates .ui-sortable:not(.ui-sortable-disabled) td.sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:left;height:100%}table.wc_input_table .ui-sortable:not(.ui-sortable-disabled) td.sort:hover::before,table.wc_tax_rates .ui-sortable:not(.ui-sortable-disabled) td.sort:hover::before{color:#333}table.wc_input_table .button,table.wc_tax_rates .button{float:left;margin-right:5px}table.wc_input_table .export,table.wc_input_table .import,table.wc_tax_rates .export,table.wc_tax_rates .import{float:right;margin-right:0;margin-left:5px}table.wc_input_table span.tips,table.wc_tax_rates span.tips{padding:0 3px}table.wc_input_table .pagination,table.wc_tax_rates .pagination{float:right}table.wc_input_table .pagination .button,table.wc_tax_rates .pagination .button{margin-left:5px;margin-right:0}table.wc_input_table .pagination .current,table.wc_tax_rates .pagination .current{background:#bbb;text-shadow:none}table.wc_input_table tr:last-child td,table.wc_tax_rates tr:last-child td{border-bottom:0}table.wc_emails,table.wc_gateways,table.wc_shipping{position:relative}table.wc_emails td,table.wc_emails th,table.wc_gateways td,table.wc_gateways th,table.wc_shipping td,table.wc_shipping th{display:table-cell!important;padding:1em!important;vertical-align:top;line-height:1.75em}table.wc_emails.wc_emails td,table.wc_gateways.wc_emails td,table.wc_shipping.wc_emails td{vertical-align:middle}table.wc_emails tr:nth-child(odd) td,table.wc_gateways tr:nth-child(odd) td,table.wc_shipping tr:nth-child(odd) td{background:#f9f9f9}table.wc_emails td.name,table.wc_gateways td.name,table.wc_shipping td.name{font-weight:700}table.wc_emails .settings,table.wc_gateways .settings,table.wc_shipping .settings{text-align:right}table.wc_emails .default,table.wc_emails .radio,table.wc_emails .status,table.wc_gateways .default,table.wc_gateways .radio,table.wc_gateways .status,table.wc_shipping .default,table.wc_shipping .radio,table.wc_shipping .status{text-align:center}table.wc_emails .default .tips,table.wc_emails .radio .tips,table.wc_emails .status .tips,table.wc_gateways .default .tips,table.wc_gateways .radio .tips,table.wc_gateways .status .tips,table.wc_shipping .default .tips,table.wc_shipping .radio .tips,table.wc_shipping .status .tips{margin:0 auto}table.wc_emails .default input,table.wc_emails .radio input,table.wc_emails .status input,table.wc_gateways .default input,table.wc_gateways .radio input,table.wc_gateways .status input,table.wc_shipping .default input,table.wc_shipping .radio input,table.wc_shipping .status input{margin:0}table.wc_emails td.sort,table.wc_gateways td.sort,table.wc_shipping td.sort{font-size:15px;text-align:center}table.wc_emails td.sort .wc-item-reorder-nav,table.wc_gateways td.sort .wc-item-reorder-nav,table.wc_shipping td.sort .wc-item-reorder-nav{white-space:nowrap;width:72px}table.wc_emails td.sort .wc-item-reorder-nav:before,table.wc_gateways td.sort .wc-item-reorder-nav:before,table.wc_shipping td.sort .wc-item-reorder-nav:before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:24px;float:left;height:100%;line-height:24px;cursor:move}table.wc_emails td.sort .wc-item-reorder-nav button,table.wc_gateways td.sort .wc-item-reorder-nav button,table.wc_shipping td.sort .wc-item-reorder-nav button{position:relative;overflow:hidden;float:left;display:block;width:24px;height:24px;margin:0;background:0 0;border:none;-webkit-box-shadow:none;box-shadow:none;color:#82878c;text-indent:-9999px;cursor:pointer;outline:0}table.wc_emails td.sort .wc-item-reorder-nav button:before,table.wc_gateways td.sort .wc-item-reorder-nav button:before,table.wc_shipping td.sort .wc-item-reorder-nav button:before{display:inline-block;position:absolute;top:0;right:0;width:100%;height:100%;font:normal 20px/23px dashicons;text-align:center;text-indent:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}table.wc_emails td.sort .wc-item-reorder-nav button:focus,table.wc_emails td.sort .wc-item-reorder-nav button:hover,table.wc_gateways td.sort .wc-item-reorder-nav button:focus,table.wc_gateways td.sort .wc-item-reorder-nav button:hover,table.wc_shipping td.sort .wc-item-reorder-nav button:focus,table.wc_shipping td.sort .wc-item-reorder-nav button:hover{color:#191e23}table.wc_emails td.sort .wc-item-reorder-nav .wc-move-down:before,table.wc_gateways td.sort .wc-item-reorder-nav .wc-move-down:before,table.wc_shipping td.sort .wc-item-reorder-nav .wc-move-down:before{content:"\f347"}table.wc_emails td.sort .wc-item-reorder-nav .wc-move-up:before,table.wc_gateways td.sort .wc-item-reorder-nav .wc-move-up:before,table.wc_shipping td.sort .wc-item-reorder-nav .wc-move-up:before{content:"\f343"}table.wc_emails td.sort .wc-item-reorder-nav .wc-move-disabled,table.wc_gateways td.sort .wc-item-reorder-nav .wc-move-disabled,table.wc_shipping td.sort .wc-item-reorder-nav .wc-move-disabled{color:#d5d5d5!important;cursor:default;pointer-events:none}table.wc_emails .wc-payment-gateway-method-name,table.wc_gateways .wc-payment-gateway-method-name,table.wc_shipping .wc-payment-gateway-method-name{font-weight:400}table.wc_emails .wc-email-settings-table-name,table.wc_gateways .wc-email-settings-table-name,table.wc_shipping .wc-email-settings-table-name{font-weight:700}table.wc_emails .wc-email-settings-table-name span,table.wc_gateways .wc-email-settings-table-name span,table.wc_shipping .wc-email-settings-table-name span{font-weight:400;color:#999;margin:0 0 0 4px!important}table.wc_emails .wc-payment-gateway-method-toggle-disabled,table.wc_emails .wc-payment-gateway-method-toggle-enabled,table.wc_gateways .wc-payment-gateway-method-toggle-disabled,table.wc_gateways .wc-payment-gateway-method-toggle-enabled,table.wc_shipping .wc-payment-gateway-method-toggle-disabled,table.wc_shipping .wc-payment-gateway-method-toggle-enabled{padding-top:1px;display:block;outline:0;-webkit-box-shadow:none;box-shadow:none}table.wc_emails .wc-email-settings-table-status,table.wc_gateways .wc-email-settings-table-status,table.wc_shipping .wc-email-settings-table-status{text-align:center;width:1em}table.wc_emails .wc-email-settings-table-status .tips,table.wc_gateways .wc-email-settings-table-status .tips,table.wc_shipping .wc-email-settings-table-status .tips{margin:0 auto}.wc-shipping-zone-settings th{padding:24px 24px 24px 0}.wc-shipping-zone-settings td.forminp input,.wc-shipping-zone-settings td.forminp textarea{padding:8px;width:448px;max-width:100%!important}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select{width:448px;max-width:100%!important}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select .select2-choices{padding:8px 8px 4px;border-color:#ddd;min-height:0;line-height:1}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select .select2-choices input{padding:0}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select .select2-choices li{margin:0 4px 4px 0}.wc-shipping-zone-settings .wc-shipping-zone-postcodes-toggle{margin:.5em 0 0;font-size:.9em;text-decoration:underline;display:block}.wc-shipping-zone-settings .wc-shipping-zone-postcodes-toggle+.wc-shipping-zone-postcodes{display:none}.wc-shipping-zone-settings .wc-shipping-zone-postcodes textarea{margin:10px 0}.wc-shipping-zone-settings .wc-shipping-zone-postcodes .description{font-size:.9em;color:#999}.wc-shipping-zone-settings+p.submit{margin-top:0}table tr table.wc-shipping-zone-methods tr .row-actions,table tr:hover table.wc-shipping-zone-methods tr .row-actions{position:relative}table tr table.wc-shipping-zone-methods tr:hover .row-actions,table tr:hover table.wc-shipping-zone-methods tr:hover .row-actions{position:static}.wc-shipping-zones-heading .page-title-action{display:inline-block}table.wc-shipping-classes td,table.wc-shipping-classes th,table.wc-shipping-zone-methods td,table.wc-shipping-zone-methods th,table.wc-shipping-zones td,table.wc-shipping-zones th{vertical-align:top;line-height:24px;padding:1em!important;font-size:14px;background:#fff;display:table-cell!important}table.wc-shipping-classes td li,table.wc-shipping-classes th li,table.wc-shipping-zone-methods td li,table.wc-shipping-zone-methods th li,table.wc-shipping-zones td li,table.wc-shipping-zones th li{line-height:24px;font-size:14px}table.wc-shipping-classes td .woocommerce-help-tip,table.wc-shipping-classes th .woocommerce-help-tip,table.wc-shipping-zone-methods td .woocommerce-help-tip,table.wc-shipping-zone-methods th .woocommerce-help-tip,table.wc-shipping-zones td .woocommerce-help-tip,table.wc-shipping-zones th .woocommerce-help-tip{margin:0!important}table.wc-shipping-classes thead th,table.wc-shipping-zone-methods thead th,table.wc-shipping-zones thead th{vertical-align:middle}table.wc-shipping-classes thead .wc-shipping-zone-sort,table.wc-shipping-zone-methods thead .wc-shipping-zone-sort,table.wc-shipping-zones thead .wc-shipping-zone-sort{text-align:center}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state,table.wc-shipping-classes td.wc-shipping-zones-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state,table.wc-shipping-zones td.wc-shipping-zones-blank-state{background:#f7f1f6!important;overflow:hidden;position:relative;padding:7.5em 7.5%!important;border-bottom:2px solid #eee2ec}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-classes td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zones td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state{padding:2em!important}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-classes td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zones td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state p{margin-bottom:0}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state li,table.wc-shipping-classes td.wc-shipping-zone-method-blank-state p,table.wc-shipping-classes td.wc-shipping-zones-blank-state li,table.wc-shipping-classes td.wc-shipping-zones-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state p,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state p,table.wc-shipping-zones td.wc-shipping-zones-blank-state li,table.wc-shipping-zones td.wc-shipping-zones-blank-state p{color:#a46497;font-size:1.5em;line-height:1.5em;margin:0 0 1em;position:relative;z-index:1;text-shadow:1px 1px 1px #fff}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state li.main,table.wc-shipping-classes td.wc-shipping-zone-method-blank-state p.main,table.wc-shipping-classes td.wc-shipping-zones-blank-state li.main,table.wc-shipping-classes td.wc-shipping-zones-blank-state p.main,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state li.main,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state p.main,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state li.main,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state p.main,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state li.main,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state p.main,table.wc-shipping-zones td.wc-shipping-zones-blank-state li.main,table.wc-shipping-zones td.wc-shipping-zones-blank-state p.main{font-size:2em}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state li,table.wc-shipping-classes td.wc-shipping-zones-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state li,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zones td.wc-shipping-zones-blank-state li{margin-left:1em;list-style:circle inside}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state::before,table.wc-shipping-classes td.wc-shipping-zones-blank-state::before,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state::before,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state::before,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state::before,table.wc-shipping-zones td.wc-shipping-zones-blank-state::before{content:'\e01b';font-family:WooCommerce;text-align:center;line-height:1;color:#eee2ec;display:block;width:1em;font-size:40em;top:50%;right:-3.75%;margin-top:-.1875em;position:absolute}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state .button-primary,table.wc-shipping-classes td.wc-shipping-zones-blank-state .button-primary,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state .button-primary,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state .button-primary,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state .button-primary,table.wc-shipping-zones td.wc-shipping-zones-blank-state .button-primary{background-color:#804877;border-color:#804877;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 0 rgba(0,0,0,.15);margin:0;opacity:1;text-shadow:0 -1px 1px #8a4f7f,1px 0 1px #8a4f7f,0 1px 1px #8a4f7f,-1px 0 1px #8a4f7f;font-size:1.5em;padding:.75em 1em;height:auto;position:relative;z-index:1}table.wc-shipping-classes .wc-shipping-zone-method-rows tr:nth-child(even) td,table.wc-shipping-zone-methods .wc-shipping-zone-method-rows tr:nth-child(even) td,table.wc-shipping-zones .wc-shipping-zone-method-rows tr:nth-child(even) td{background:#f9f9f9}table.wc-shipping-classes .wc-shipping-class-rows tr:nth-child(odd) td,table.wc-shipping-classes tr.odd td,table.wc-shipping-zone-methods .wc-shipping-class-rows tr:nth-child(odd) td,table.wc-shipping-zone-methods tr.odd td,table.wc-shipping-zones .wc-shipping-class-rows tr:nth-child(odd) td,table.wc-shipping-zones tr.odd td{background:#f9f9f9}table.wc-shipping-classes tbody.wc-shipping-zone-rows td,table.wc-shipping-zone-methods tbody.wc-shipping-zone-rows td,table.wc-shipping-zones tbody.wc-shipping-zone-rows td{border-top:2px solid #f9f9f9}table.wc-shipping-classes tbody.wc-shipping-zone-rows tr:first-child td,table.wc-shipping-zone-methods tbody.wc-shipping-zone-rows tr:first-child td,table.wc-shipping-zones tbody.wc-shipping-zone-rows tr:first-child td{border-top:0}table.wc-shipping-classes tr.wc-shipping-zone-worldwide td,table.wc-shipping-zone-methods tr.wc-shipping-zone-worldwide td,table.wc-shipping-zones tr.wc-shipping-zone-worldwide td{background:#f9f9f9;border-top:2px solid #e1e1e1}table.wc-shipping-classes p,table.wc-shipping-classes ul,table.wc-shipping-zone-methods p,table.wc-shipping-zone-methods ul,table.wc-shipping-zones p,table.wc-shipping-zones ul{margin:0}table.wc-shipping-classes td.wc-shipping-zone-method-sort,table.wc-shipping-classes td.wc-shipping-zone-sort,table.wc-shipping-zone-methods td.wc-shipping-zone-method-sort,table.wc-shipping-zone-methods td.wc-shipping-zone-sort,table.wc-shipping-zones td.wc-shipping-zone-method-sort,table.wc-shipping-zones td.wc-shipping-zone-sort{cursor:move;font-size:15px;text-align:center}table.wc-shipping-classes td.wc-shipping-zone-method-sort::before,table.wc-shipping-classes td.wc-shipping-zone-sort::before,table.wc-shipping-zone-methods td.wc-shipping-zone-method-sort::before,table.wc-shipping-zone-methods td.wc-shipping-zone-sort::before,table.wc-shipping-zones td.wc-shipping-zone-method-sort::before,table.wc-shipping-zones td.wc-shipping-zone-sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:left;height:100%;line-height:24px}table.wc-shipping-classes td.wc-shipping-zone-method-sort:hover::before,table.wc-shipping-classes td.wc-shipping-zone-sort:hover::before,table.wc-shipping-zone-methods td.wc-shipping-zone-method-sort:hover::before,table.wc-shipping-zone-methods td.wc-shipping-zone-sort:hover::before,table.wc-shipping-zones td.wc-shipping-zone-method-sort:hover::before,table.wc-shipping-zones td.wc-shipping-zone-sort:hover::before{color:#333}table.wc-shipping-classes td.wc-shipping-zone-worldwide,table.wc-shipping-zone-methods td.wc-shipping-zone-worldwide,table.wc-shipping-zones td.wc-shipping-zone-worldwide{text-align:center}table.wc-shipping-classes td.wc-shipping-zone-worldwide::before,table.wc-shipping-zone-methods td.wc-shipping-zone-worldwide::before,table.wc-shipping-zones td.wc-shipping-zone-worldwide::before{content:'\f319';font-family:dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:left;height:100%;line-height:24px}table.wc-shipping-classes .wc-shipping-zone-methods,table.wc-shipping-classes .wc-shipping-zone-name,table.wc-shipping-zone-methods .wc-shipping-zone-methods,table.wc-shipping-zone-methods .wc-shipping-zone-name,table.wc-shipping-zones .wc-shipping-zone-methods,table.wc-shipping-zones .wc-shipping-zone-name{width:25%}table.wc-shipping-classes .wc-shipping-class-description input,table.wc-shipping-classes .wc-shipping-class-description select,table.wc-shipping-classes .wc-shipping-class-description textarea,table.wc-shipping-classes .wc-shipping-class-name input,table.wc-shipping-classes .wc-shipping-class-name select,table.wc-shipping-classes .wc-shipping-class-name textarea,table.wc-shipping-classes .wc-shipping-class-slug input,table.wc-shipping-classes .wc-shipping-class-slug select,table.wc-shipping-classes .wc-shipping-class-slug textarea,table.wc-shipping-classes .wc-shipping-zone-name input,table.wc-shipping-classes .wc-shipping-zone-name select,table.wc-shipping-classes .wc-shipping-zone-name textarea,table.wc-shipping-classes .wc-shipping-zone-region input,table.wc-shipping-classes .wc-shipping-zone-region select,table.wc-shipping-classes .wc-shipping-zone-region textarea,table.wc-shipping-zone-methods .wc-shipping-class-description input,table.wc-shipping-zone-methods .wc-shipping-class-description select,table.wc-shipping-zone-methods .wc-shipping-class-description textarea,table.wc-shipping-zone-methods .wc-shipping-class-name input,table.wc-shipping-zone-methods .wc-shipping-class-name select,table.wc-shipping-zone-methods .wc-shipping-class-name textarea,table.wc-shipping-zone-methods .wc-shipping-class-slug input,table.wc-shipping-zone-methods .wc-shipping-class-slug select,table.wc-shipping-zone-methods .wc-shipping-class-slug textarea,table.wc-shipping-zone-methods .wc-shipping-zone-name input,table.wc-shipping-zone-methods .wc-shipping-zone-name select,table.wc-shipping-zone-methods .wc-shipping-zone-name textarea,table.wc-shipping-zone-methods .wc-shipping-zone-region input,table.wc-shipping-zone-methods .wc-shipping-zone-region select,table.wc-shipping-zone-methods .wc-shipping-zone-region textarea,table.wc-shipping-zones .wc-shipping-class-description input,table.wc-shipping-zones .wc-shipping-class-description select,table.wc-shipping-zones .wc-shipping-class-description textarea,table.wc-shipping-zones .wc-shipping-class-name input,table.wc-shipping-zones .wc-shipping-class-name select,table.wc-shipping-zones .wc-shipping-class-name textarea,table.wc-shipping-zones .wc-shipping-class-slug input,table.wc-shipping-zones .wc-shipping-class-slug select,table.wc-shipping-zones .wc-shipping-class-slug textarea,table.wc-shipping-zones .wc-shipping-zone-name input,table.wc-shipping-zones .wc-shipping-zone-name select,table.wc-shipping-zones .wc-shipping-zone-name textarea,table.wc-shipping-zones .wc-shipping-zone-region input,table.wc-shipping-zones .wc-shipping-zone-region select,table.wc-shipping-zones .wc-shipping-zone-region textarea{width:100%}table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-zone-delete{color:#a00}table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-zone-delete:hover{color:red}table.wc-shipping-classes .wc-shipping-class-count,table.wc-shipping-zone-methods .wc-shipping-class-count,table.wc-shipping-zones .wc-shipping-class-count{text-align:center}table.wc-shipping-classes td.wc-shipping-zone-methods,table.wc-shipping-zone-methods td.wc-shipping-zone-methods,table.wc-shipping-zones td.wc-shipping-zone-methods{color:#555}table.wc-shipping-classes td.wc-shipping-zone-methods .method_disabled,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .method_disabled,table.wc-shipping-zones td.wc-shipping-zone-methods .method_disabled{text-decoration:line-through}table.wc-shipping-classes td.wc-shipping-zone-methods ul,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul,table.wc-shipping-zones td.wc-shipping-zone-methods ul{position:relative;padding-right:32px}table.wc-shipping-classes td.wc-shipping-zone-methods ul li,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul li,table.wc-shipping-zones td.wc-shipping-zone-methods ul li{color:#555;display:inline;margin:0}table.wc-shipping-classes td.wc-shipping-zone-methods ul li::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul li::before,table.wc-shipping-zones td.wc-shipping-zone-methods ul li::before{content:', '}table.wc-shipping-classes td.wc-shipping-zone-methods ul li:first-child::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul li:first-child::before,table.wc-shipping-zones td.wc-shipping-zone-methods ul li:first-child::before{content:''}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method{display:block;width:24px;padding:24px 0 0;height:0;overflow:hidden;cursor:pointer}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method::before,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";font-family:Dashicons;content:'\f502';color:#999;vertical-align:middle;line-height:24px;font-size:16px;margin:0}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method.disabled,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method.disabled,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method.disabled{cursor:not-allowed}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method.disabled::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method.disabled::before,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method.disabled::before{color:#ccc}table.wc-shipping-classes .wc-shipping-zone-method-title,table.wc-shipping-zone-methods .wc-shipping-zone-method-title,table.wc-shipping-zones .wc-shipping-zone-method-title{width:25%}table.wc-shipping-classes .wc-shipping-zone-method-title .wc-shipping-zone-method-delete,table.wc-shipping-zone-methods .wc-shipping-zone-method-title .wc-shipping-zone-method-delete,table.wc-shipping-zones .wc-shipping-zone-method-title .wc-shipping-zone-method-delete{color:red}table.wc-shipping-classes .wc-shipping-zone-method-enabled,table.wc-shipping-zone-methods .wc-shipping-zone-method-enabled,table.wc-shipping-zones .wc-shipping-zone-method-enabled{text-align:center}table.wc-shipping-classes .wc-shipping-zone-method-enabled a,table.wc-shipping-zone-methods .wc-shipping-zone-method-enabled a,table.wc-shipping-zones .wc-shipping-zone-method-enabled a{display:inline-block}table.wc-shipping-classes .wc-shipping-zone-method-enabled .woocommerce-input-toggle,table.wc-shipping-zone-methods .wc-shipping-zone-method-enabled .woocommerce-input-toggle,table.wc-shipping-zones .wc-shipping-zone-method-enabled .woocommerce-input-toggle{margin-top:3px}table.wc-shipping-classes .wc-shipping-zone-method-type,table.wc-shipping-zone-methods .wc-shipping-zone-method-type,table.wc-shipping-zones .wc-shipping-zone-method-type{display:block}table.wc-shipping-classes tfoot input,table.wc-shipping-classes tfoot select,table.wc-shipping-zone-methods tfoot input,table.wc-shipping-zone-methods tfoot select,table.wc-shipping-zones tfoot input,table.wc-shipping-zones tfoot select{vertical-align:middle!important}table.wc-shipping-classes tfoot .button-secondary,table.wc-shipping-zone-methods tfoot .button-secondary,table.wc-shipping-zones tfoot .button-secondary{float:right}table.wc-shipping-classes .editing .wc-shipping-zone-edit,table.wc-shipping-classes .editing .wc-shipping-zone-view,table.wc-shipping-zone-methods .editing .wc-shipping-zone-edit,table.wc-shipping-zone-methods .editing .wc-shipping-zone-view,table.wc-shipping-zones .editing .wc-shipping-zone-edit,table.wc-shipping-zones .editing .wc-shipping-zone-view{display:none}.woocommerce-input-toggle{height:16px;width:32px;border:2px solid #935687;background-color:#935687;display:inline-block;text-indent:-9999px;border-radius:10em;position:relative;margin-top:-1px;vertical-align:text-top}.woocommerce-input-toggle:before{content:"";display:block;width:16px;height:16px;background:#fff;position:absolute;top:0;right:0;border-radius:100%}.woocommerce-input-toggle.woocommerce-input-toggle--disabled{border-color:#999;background-color:#999}.woocommerce-input-toggle.woocommerce-input-toggle--disabled:before{right:auto;left:0}.woocommerce-input-toggle.woocommerce-input-toggle--loading{opacity:.5}.wc-modal-shipping-method-settings{background:#f8f8f8;padding:1em!important}.wc-modal-shipping-method-settings form .form-table{width:100%;background:#fff;margin:0 0 1.5em}.wc-modal-shipping-method-settings form .form-table tr th{width:30%;position:relative}.wc-modal-shipping-method-settings form .form-table tr th .woocommerce-help-tip{float:right;margin:-8px -.5em 0 0;vertical-align:middle;right:0;top:50%;position:absolute}.wc-modal-shipping-method-settings form .form-table tr td input,.wc-modal-shipping-method-settings form .form-table tr td select,.wc-modal-shipping-method-settings form .form-table tr td textarea{width:50%;min-width:250px}.wc-modal-shipping-method-settings form .form-table tr td input[type=checkbox]{width:auto;min-width:16px}.wc-modal-shipping-method-settings form .form-table tr td,.wc-modal-shipping-method-settings form .form-table tr th{vertical-align:middle;margin:0;line-height:24px;padding:1em;border-bottom:1px solid #f8f8f8}.wc-modal-shipping-method-settings form .form-table:last-of-type{margin-bottom:0}.wc-backbone-modal .wc-shipping-zone-method-selector p{margin-top:0}.wc-backbone-modal .wc-shipping-zone-method-selector .wc-shipping-zone-method-description{margin:.75em 1px 0;line-height:1.5em;color:#999;font-style:italic}.wc-backbone-modal .wc-shipping-zone-method-selector select{width:100%;cursor:pointer}img.help_tip{margin:0 0 0 9px;vertical-align:middle}.postbox img.help_tip{margin-top:0}.postbox .woocommerce-help-tip{margin:0 0 0 9px}.status-disabled,.status-enabled,.status-manual{font-size:1.4em;display:block;text-indent:-9999px;position:relative;height:1em;width:1em}.status-manual::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#999}.status-enabled::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#a46497}.status-disabled::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}.woocommerce h2.woo-nav-tab-wrapper{margin-bottom:1em}.woocommerce nav.woo-nav-tab-wrapper{margin:1.5em 0 1em}.woocommerce .subsubsub{margin:-8px 0 0}.woocommerce .wc-admin-breadcrumb{margin-left:.5em}.woocommerce .wc-admin-breadcrumb a{color:#a46497}.woocommerce #template div{margin:0}.woocommerce #template div p .button{float:right;margin-left:10px;margin-top:-4px}.woocommerce #template div .editor textarea{margin-bottom:8px}.woocommerce textarea[disabled=disabled]{background:#dfdfdf!important}.woocommerce table.form-table{margin:0;position:relative;table-layout:fixed}.woocommerce table.form-table .forminp-radio ul{margin:0}.woocommerce table.form-table .forminp-radio ul li{line-height:1.4em}.woocommerce table.form-table input[type=email],.woocommerce table.form-table input[type=number],.woocommerce table.form-table input[type=text]{height:auto}.woocommerce table.form-table textarea.input-text{height:100%;min-width:150px;display:block}.woocommerce table.form-table input.regular-input,.woocommerce table.form-table input[type=email],.woocommerce table.form-table input[type=number],.woocommerce table.form-table input[type=text],.woocommerce table.form-table textarea{width:400px;margin:0;padding:6px;-webkit-box-sizing:border-box;box-sizing:border-box;vertical-align:top}.woocommerce table.form-table select{width:400px;margin:0;-webkit-box-sizing:border-box;box-sizing:border-box;height:32px;line-height:32px;vertical-align:top}.woocommerce table.form-table input[size]{width:auto!important}.woocommerce table.form-table table input.regular-input,.woocommerce table.form-table table input[type=email],.woocommerce table.form-table table input[type=number],.woocommerce table.form-table table input[type=text],.woocommerce table.form-table table select,.woocommerce table.form-table table textarea{width:auto}.woocommerce table.form-table textarea.wide-input{width:100%}.woocommerce table.form-table .woocommerce-help-tip,.woocommerce table.form-table img.help_tip{padding:0;margin:-4px 0 0 5px;vertical-align:middle;cursor:help;line-height:1}.woocommerce table.form-table span.help_tip{cursor:help;color:#2ea2cc}.woocommerce table.form-table th{position:relative;padding-right:24px}.woocommerce table.form-table th label{position:relative;display:block}.woocommerce table.form-table th label .woocommerce-help-tip,.woocommerce table.form-table th label img.help_tip{margin:-8px -24px 0 0;position:absolute;right:0;top:50%}.woocommerce table.form-table th label+.woocommerce-help-tip{margin:0;position:absolute;right:0;top:20px}.woocommerce table.form-table woocommerce-help-tip .select2-container{vertical-align:top;margin-bottom:3px}.woocommerce table.form-table table.widefat th{padding-right:inherit}.woocommerce table.form-table .wp-list-table .woocommerce-help-tip{float:none}.woocommerce table.form-table fieldset{margin-top:4px}.woocommerce table.form-table fieldset .woocommerce-help-tip,.woocommerce table.form-table fieldset img.help_tip{margin:-3px 0 0 5px}.woocommerce table.form-table fieldset p.description{margin-bottom:8px}.woocommerce table.form-table fieldset:first-child{margin-top:0}.woocommerce table.form-table .iris-picker{z-index:100;display:none;position:absolute;border:1px solid #ccc;border-radius:3px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.2);box-shadow:0 1px 3px rgba(0,0,0,.2)}.woocommerce table.form-table .iris-picker .ui-slider{border:0!important;margin:0!important;width:auto!important;height:auto!important;background:none transparent!important}.woocommerce table.form-table .iris-picker .ui-slider .ui-slider-handle{margin-bottom:0!important}.woocommerce table.form-table .iris-error{background-color:#ffafaf}.woocommerce table.form-table .colorpickpreview{padding:7px 0;line-height:1em;display:inline-block;width:26px;border:1px solid #ddd;font-size:14px}.woocommerce table.form-table .image_width_settings{vertical-align:middle}.woocommerce table.form-table .image_width_settings label{margin-left:10px}.woocommerce table.form-table .image_width_settings input{width:auto}.woocommerce table.form-table .wc_emails_wrapper,.woocommerce table.form-table .wc_payment_gateways_wrapper{padding:0 15px 10px 0}.woocommerce #tabs-wrap table a.remove{margin-left:4px}.woocommerce #tabs-wrap table p{margin:0 0 4px!important;overflow:hidden;zoom:1}.woocommerce #tabs-wrap table p a.add{float:left}#wp-excerpt-editor-container{background:#fff}#product_variation-parent #parent_id{width:100%}#postimagediv img{border:1px solid #d5d5d5;max-width:100%}#woocommerce-product-images .inside{margin:0;padding:0}#woocommerce-product-images .inside .add_product_images{padding:0 12px 12px}#woocommerce-product-images .inside #product_images_container{padding:0 0 0 9px}#woocommerce-product-images .inside #product_images_container ul{margin:0;padding:0}#woocommerce-product-images .inside #product_images_container ul::after,#woocommerce-product-images .inside #product_images_container ul::before{content:' ';display:table}#woocommerce-product-images .inside #product_images_container ul::after{clear:both}#woocommerce-product-images .inside #product_images_container ul li.add,#woocommerce-product-images .inside #product_images_container ul li.image,#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder{width:80px;float:left;cursor:move;border:1px solid #d5d5d5;margin:9px 9px 0 0;background:#f7f7f7;border-radius:2px;position:relative;-webkit-box-sizing:border-box;box-sizing:border-box}#woocommerce-product-images .inside #product_images_container ul li.add img,#woocommerce-product-images .inside #product_images_container ul li.image img,#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder img{width:100%;height:auto;display:block}#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder{border:3px dashed #ddd;position:relative}#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";font-size:2.618em;line-height:72px;color:#ddd}#woocommerce-product-images .inside #product_images_container ul ul.actions{position:absolute;top:-8px;right:-8px;padding:2px;display:none}#woocommerce-product-images .inside #product_images_container ul ul.actions li{float:right;margin:0 0 0 2px}#woocommerce-product-images .inside #product_images_container ul ul.actions li a{width:1em;height:1em;margin:0;height:0;display:block;overflow:hidden}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.tips{cursor:pointer}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.delete{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.4em}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.delete::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#999;background:#fff;border-radius:50%;height:1em;width:1em;line-height:1em}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.delete:hover::before{color:#a00}#woocommerce-product-images .inside #product_images_container ul li:hover ul.actions{display:block}#woocommerce-product-data .hndle{padding:10px}#woocommerce-product-data .hndle span{display:block;vertical-align:middle;line-height:24px}#woocommerce-product-data .hndle span span{display:inline;line-height:inherit;vertical-align:baseline}#woocommerce-product-data .hndle select{margin:0}#woocommerce-product-data .hndle label{padding-right:1em;font-size:12px;vertical-align:baseline}#woocommerce-product-data .hndle label:first-child{margin-right:1em;border-right:1px solid #dfdfdf}#woocommerce-product-data .hndle input,#woocommerce-product-data .hndle select{margin-top:-3px 0 0;vertical-align:middle}#woocommerce-product-data .hndle select{margin-left:.5em}#woocommerce-product-data>.handlediv{margin-top:4px}#woocommerce-product-data .wrap{margin:0}#woocommerce-coupon-description{padding:3px 8px;font-size:1.7em;line-height:1.42em;height:auto;width:100%;outline:0;margin:10px 0;display:block}#woocommerce-coupon-description::-webkit-input-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-description::-moz-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-description:-ms-input-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-description:-moz-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-data .panel-wrap,#woocommerce-product-data .panel-wrap{background:#fff}#woocommerce-coupon-data .wc-metaboxes-wrapper,#woocommerce-coupon-data .woocommerce_options_panel,#woocommerce-product-data .wc-metaboxes-wrapper,#woocommerce-product-data .woocommerce_options_panel{float:left;width:80%}#woocommerce-coupon-data .wc-metaboxes-wrapper .wc-radios,#woocommerce-coupon-data .woocommerce_options_panel .wc-radios,#woocommerce-product-data .wc-metaboxes-wrapper .wc-radios,#woocommerce-product-data .woocommerce_options_panel .wc-radios{display:block;float:left;margin:0}#woocommerce-coupon-data .wc-metaboxes-wrapper .wc-radios li,#woocommerce-coupon-data .woocommerce_options_panel .wc-radios li,#woocommerce-product-data .wc-metaboxes-wrapper .wc-radios li,#woocommerce-product-data .woocommerce_options_panel .wc-radios li{display:block;padding:0 0 10px}#woocommerce-coupon-data .wc-metaboxes-wrapper .wc-radios li input,#woocommerce-coupon-data .woocommerce_options_panel .wc-radios li input,#woocommerce-product-data .wc-metaboxes-wrapper .wc-radios li input,#woocommerce-product-data .woocommerce_options_panel .wc-radios li input{width:auto}#woocommerce-coupon-data .panel-wrap,#woocommerce-product-data .panel-wrap,.woocommerce .panel-wrap{overflow:hidden}#woocommerce-coupon-data ul.wc-tabs,#woocommerce-product-data ul.wc-tabs,.woocommerce ul.wc-tabs{margin:0;width:20%;float:left;line-height:1em;padding:0 0 10px;position:relative;background-color:#fafafa;border-right:1px solid #eee;-webkit-box-sizing:border-box;box-sizing:border-box}#woocommerce-coupon-data ul.wc-tabs::after,#woocommerce-product-data ul.wc-tabs::after,.woocommerce ul.wc-tabs::after{content:'';display:block;width:100%;height:9999em;position:absolute;bottom:-9999em;left:0;background-color:#fafafa;border-right:1px solid #eee}#woocommerce-coupon-data ul.wc-tabs li,#woocommerce-product-data ul.wc-tabs li,.woocommerce ul.wc-tabs li{margin:0;padding:0;display:block;position:relative}#woocommerce-coupon-data ul.wc-tabs li a,#woocommerce-product-data ul.wc-tabs li a,.woocommerce ul.wc-tabs li a{margin:0;padding:10px;display:block;-webkit-box-shadow:none;box-shadow:none;text-decoration:none;line-height:20px!important;border-bottom:1px solid #eee}#woocommerce-coupon-data ul.wc-tabs li a span,#woocommerce-product-data ul.wc-tabs li a span,.woocommerce ul.wc-tabs li a span{margin-left:.618em;margin-right:.618em}#woocommerce-coupon-data ul.wc-tabs li a::before,#woocommerce-product-data ul.wc-tabs li a::before,.woocommerce ul.wc-tabs li a::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;content:"";text-decoration:none}#woocommerce-coupon-data ul.wc-tabs li.general_options a::before,#woocommerce-product-data ul.wc-tabs li.general_options a::before,.woocommerce ul.wc-tabs li.general_options a::before{content:'\f107'}#woocommerce-coupon-data ul.wc-tabs li.inventory_options a::before,#woocommerce-product-data ul.wc-tabs li.inventory_options a::before,.woocommerce ul.wc-tabs li.inventory_options a::before{content:'\f481'}#woocommerce-coupon-data ul.wc-tabs li.shipping_options a::before,#woocommerce-product-data ul.wc-tabs li.shipping_options a::before,.woocommerce ul.wc-tabs li.shipping_options a::before{font-family:WooCommerce;content:'\e01a'}#woocommerce-coupon-data ul.wc-tabs li.linked_product_options a::before,#woocommerce-product-data ul.wc-tabs li.linked_product_options a::before,.woocommerce ul.wc-tabs li.linked_product_options a::before{content:'\f103'}#woocommerce-coupon-data ul.wc-tabs li.attribute_options a::before,#woocommerce-product-data ul.wc-tabs li.attribute_options a::before,.woocommerce ul.wc-tabs li.attribute_options a::before{content:'\f175'}#woocommerce-coupon-data ul.wc-tabs li.advanced_options a::before,#woocommerce-product-data ul.wc-tabs li.advanced_options a::before,.woocommerce ul.wc-tabs li.advanced_options a::before{font-family:Dashicons;content:'\f111'}#woocommerce-coupon-data ul.wc-tabs li.variations_options a::before,#woocommerce-product-data ul.wc-tabs li.variations_options a::before,.woocommerce ul.wc-tabs li.variations_options a::before{content:'\f509'}#woocommerce-coupon-data ul.wc-tabs li.usage_restriction_options a::before,#woocommerce-product-data ul.wc-tabs li.usage_restriction_options a::before,.woocommerce ul.wc-tabs li.usage_restriction_options a::before{font-family:WooCommerce;content:'\e602'}#woocommerce-coupon-data ul.wc-tabs li.usage_limit_options a::before,#woocommerce-product-data ul.wc-tabs li.usage_limit_options a::before,.woocommerce ul.wc-tabs li.usage_limit_options a::before{font-family:WooCommerce;content:'\e601'}#woocommerce-coupon-data ul.wc-tabs li.general_coupon_data a::before,#woocommerce-product-data ul.wc-tabs li.general_coupon_data a::before,.woocommerce ul.wc-tabs li.general_coupon_data a::before{font-family:WooCommerce;content:'\e600'}#woocommerce-coupon-data ul.wc-tabs li.active a,#woocommerce-product-data ul.wc-tabs li.active a,.woocommerce ul.wc-tabs li.active a{color:#555;position:relative;background-color:#eee}.woocommerce_page_wc-settings input[type=email],.woocommerce_page_wc-settings input[type=url]{direction:ltr}.woocommerce_page_wc-settings .shippingrows th.check-column{padding-top:20px}.woocommerce_page_wc-settings .shippingrows tfoot th{padding-left:10px}.woocommerce_page_wc-settings .shippingrows .add.button::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-right:.618em;content:"";text-decoration:none}.woocommerce_page_wc-settings h3.wc-settings-sub-title{font-size:1.2em}#woocommerce-coupon-data .inside,#woocommerce-order-data .inside,#woocommerce-order-downloads .inside,#woocommerce-product-data .inside,#woocommerce-product-type-options .inside{margin:0;padding:0}.panel,.woocommerce_options_panel{padding:9px;color:#555}.panel .form-field .woocommerce-help-tip,.woocommerce_options_panel .form-field .woocommerce-help-tip{font-size:1.4em}.panel,.woocommerce_page_settings .woocommerce_options_panel{padding:0}#woocommerce-product-specs .inside,#woocommerce-product-type-options .panel{margin:0;padding:9px}#woocommerce-product-type-options .panel p,.woocommerce_options_panel fieldset.form-field,.woocommerce_options_panel p{margin:0 0 9px;font-size:12px;padding:5px 9px;line-height:24px}#woocommerce-product-type-options .panel p::after,.woocommerce_options_panel fieldset.form-field::after,.woocommerce_options_panel p::after{content:'.';display:block;height:0;clear:both;visibility:hidden}.woocommerce_options_panel .checkbox,.woocommerce_variable_attributes .checkbox{width:auto;margin:4px 0!important;vertical-align:middle;float:left}.woocommerce_options_panel .downloadable_files table,.woocommerce_variations .downloadable_files table{width:100%;padding:0!important}.woocommerce_options_panel .downloadable_files table th,.woocommerce_variations .downloadable_files table th{padding:7px 0 7px 7px!important}.woocommerce_options_panel .downloadable_files table th.sort,.woocommerce_variations .downloadable_files table th.sort{width:17px;padding:7px!important}.woocommerce_options_panel .downloadable_files table th .woocommerce-help-tip,.woocommerce_variations .downloadable_files table th .woocommerce-help-tip{font-size:1.1em;margin-left:0}.woocommerce_options_panel .downloadable_files table td,.woocommerce_variations .downloadable_files table td{vertical-align:middle!important;padding:4px 0 4px 7px!important;position:relative}.woocommerce_options_panel .downloadable_files table td:last-child,.woocommerce_variations .downloadable_files table td:last-child{padding-right:7px!important}.woocommerce_options_panel .downloadable_files table td input.input_text,.woocommerce_variations .downloadable_files table td input.input_text{width:100%;float:none;min-width:0;margin:1px 0}.woocommerce_options_panel .downloadable_files table td .upload_file_button,.woocommerce_variations .downloadable_files table td .upload_file_button{width:auto;float:right;cursor:pointer}.woocommerce_options_panel .downloadable_files table td .delete,.woocommerce_variations .downloadable_files table td .delete{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.2em}.woocommerce_options_panel .downloadable_files table td .delete::before,.woocommerce_variations .downloadable_files table td .delete::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#999}.woocommerce_options_panel .downloadable_files table td .delete:hover::before,.woocommerce_variations .downloadable_files table td .delete:hover::before{color:#a00}.woocommerce_options_panel .downloadable_files table td.sort,.woocommerce_variations .downloadable_files table td.sort{width:17px;cursor:move;font-size:15px;text-align:center;background:#f9f9f9;padding-right:7px!important}.woocommerce_options_panel .downloadable_files table td.sort::before,.woocommerce_variations .downloadable_files table td.sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:left;height:100%}.woocommerce_options_panel .downloadable_files table td.sort:hover::before,.woocommerce_variations .downloadable_files table td.sort:hover::before{color:#333}.woocommerce_variation h3 .sort{width:17px;height:26px;cursor:move;float:right;font-size:15px;font-weight:400;margin-right:.5em;visibility:hidden;text-align:center;vertical-align:middle}.woocommerce_variation h3 .sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:28px;color:#999;display:block;width:17px;float:left;height:100%}.woocommerce_variation h3 .sort:hover::before{color:#777}.woocommerce_variation h3:hover .sort,.woocommerce_variation.ui-sortable-helper .sort{visibility:visible}.woocommerce_options_panel{min-height:175px;-webkit-box-sizing:border-box;box-sizing:border-box}.woocommerce_options_panel .downloadable_files{padding:0 9px 0 162px;position:relative;margin:9px 0}.woocommerce_options_panel .downloadable_files label{position:absolute;left:0;margin:0 0 0 12px;line-height:24px}.woocommerce_options_panel p{margin:9px 0}.woocommerce_options_panel fieldset.form-field,.woocommerce_options_panel p.form-field{padding:5px 20px 5px 162px!important}.woocommerce_options_panel .sale_price_dates_fields .short:first-of-type{margin-bottom:1em}.woocommerce_options_panel .sale_price_dates_fields .short:nth-of-type(2){clear:left}.woocommerce_options_panel label,.woocommerce_options_panel legend{float:left;width:150px;padding:0;margin:0 0 0 -150px}.woocommerce_options_panel label .req,.woocommerce_options_panel legend .req{font-weight:700;font-style:normal;color:#a00}.woocommerce_options_panel .description{padding:0;margin:0 0 0 7px;clear:none;display:inline}.woocommerce_options_panel .description-block{margin-left:0;display:block}.woocommerce_options_panel input,.woocommerce_options_panel select,.woocommerce_options_panel textarea{margin:0}.woocommerce_options_panel textarea{float:left;height:3.5em;line-height:1.5em;vertical-align:top}.woocommerce_options_panel input[type=email],.woocommerce_options_panel input[type=number],.woocommerce_options_panel input[type=password],.woocommerce_options_panel input[type=text]{width:50%;float:left}.woocommerce_options_panel input.button{width:auto;margin-left:8px}.woocommerce_options_panel select{float:left}.woocommerce_options_panel .short,.woocommerce_options_panel input[type=email].short,.woocommerce_options_panel input[type=number].short,.woocommerce_options_panel input[type=password].short,.woocommerce_options_panel input[type=text].short{width:50%}.woocommerce_options_panel .sized{width:auto!important;margin-right:6px}.woocommerce_options_panel .options_group{border-top:1px solid #fff;border-bottom:1px solid #eee}.woocommerce_options_panel .options_group:first-child{border-top:0}.woocommerce_options_panel .options_group:last-child{border-bottom:0}.woocommerce_options_panel .options_group fieldset{margin:9px 0;font-size:12px;padding:5px 9px;line-height:24px}.woocommerce_options_panel .options_group fieldset label{width:auto;float:none}.woocommerce_options_panel .options_group fieldset ul{float:left;width:50%;margin:0;padding:0}.woocommerce_options_panel .options_group fieldset ul li{margin:0;width:auto}.woocommerce_options_panel .options_group fieldset ul li input{width:auto;float:none;margin-right:4px}.woocommerce_options_panel .options_group fieldset ul.wc-radios label{margin-left:0}.woocommerce_options_panel .dimensions_field .wrap{display:block;width:50%}.woocommerce_options_panel .dimensions_field .wrap input{width:30.75%;margin-right:3.8%}.woocommerce_options_panel .dimensions_field .wrap .last{margin-right:0}.woocommerce_options_panel.padded{padding:1em}.woocommerce_options_panel .select2-container{float:left}#woocommerce-product-data input.dp-applied{float:left}#grouped_product_options,#simple_product_options,#virtual_product_options{padding:12px;font-style:italic;color:#666}.wc-metaboxes-wrapper .toolbar{margin:0!important;border-top:1px solid #fff;border-bottom:1px solid #eee;padding:9px 12px!important}.wc-metaboxes-wrapper .toolbar:first-child{border-top:0}.wc-metaboxes-wrapper .toolbar:last-child{border-bottom:0}.wc-metaboxes-wrapper .toolbar .add_variation{float:right;margin-left:5px}.wc-metaboxes-wrapper .toolbar .cancel-variation-changes,.wc-metaboxes-wrapper .toolbar .save-variation-changes{float:left;margin-right:5px}.wc-metaboxes-wrapper p.toolbar{overflow:hidden;zoom:1}.wc-metaboxes-wrapper .expand-close{margin-right:2px;color:#777;font-size:12px;font-style:italic}.wc-metaboxes-wrapper .expand-close a{background:0 0;padding:0;font-size:12px;text-decoration:none}.wc-metaboxes-wrapper#product_attributes .expand-close{float:right;line-height:28px}.wc-metaboxes-wrapper .fr,.wc-metaboxes-wrapper button.add_variable_attribute{float:right;margin:0 0 0 6px}.wc-metaboxes-wrapper .wc-metaboxes{border-bottom:1px solid #eee}.wc-metaboxes-wrapper .wc-metabox-sortable-placeholder{border-color:#bbb;background-color:#f5f5f5;margin-bottom:9px;border-width:1px;border-style:dashed}.wc-metaboxes-wrapper .wc-metabox{background:#fff;border-bottom:1px solid #eee;margin:0!important}.wc-metaboxes-wrapper .wc-metabox select{font-weight:400}.wc-metaboxes-wrapper .wc-metabox:last-of-type{border-bottom:0}.wc-metaboxes-wrapper .wc-metabox .handlediv{width:27px}.wc-metaboxes-wrapper .wc-metabox .handlediv::before{content:'\f142'!important;cursor:pointer;display:inline-block;font:400 20px/1 Dashicons;line-height:.5!important;padding:8px 10px;position:relative;right:12px;top:0}.wc-metaboxes-wrapper .wc-metabox.closed{border-radius:3px}.wc-metaboxes-wrapper .wc-metabox.closed .handlediv::before{content:'\f140'!important}.wc-metaboxes-wrapper .wc-metabox.closed h3{border:0}.wc-metaboxes-wrapper .wc-metabox h3{margin:0!important;padding:.75em .75em .75em 1em!important;font-size:1em!important;overflow:hidden;zoom:1;cursor:move}.wc-metaboxes-wrapper .wc-metabox h3 a.delete,.wc-metaboxes-wrapper .wc-metabox h3 button{float:right}.wc-metaboxes-wrapper .wc-metabox h3 a.delete{color:red;font-weight:400;line-height:26px;text-decoration:none;position:relative;visibility:hidden}.wc-metaboxes-wrapper .wc-metabox h3 strong{font-weight:400;line-height:26px;font-weight:700}.wc-metaboxes-wrapper .wc-metabox h3 select{font-family:sans-serif;max-width:20%;margin:.25em .25em .25em 0}.wc-metaboxes-wrapper .wc-metabox h3 .handlediv{background-position:6px 5px!important;visibility:hidden;height:26px}.wc-metaboxes-wrapper .wc-metabox h3.fixed{cursor:pointer!important}.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3{cursor:pointer;padding:.5em .75em .5em 1em!important}.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3 .handlediv,.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3 .sort,.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3 a.delete{margin-top:.25em}.wc-metaboxes-wrapper .wc-metabox h3:hover .handlediv,.wc-metaboxes-wrapper .wc-metabox h3:hover a.delete,.wc-metaboxes-wrapper .wc-metabox.ui-sortable-helper .handlediv,.wc-metaboxes-wrapper .wc-metabox.ui-sortable-helper a.delete{visibility:visible}.wc-metaboxes-wrapper .wc-metabox table{width:100%;position:relative;background-color:#fdfdfd;padding:1em;border-top:1px solid #eee}.wc-metaboxes-wrapper .wc-metabox table td{text-align:left;padding:0 6px 1em 0;vertical-align:top;border:0}.wc-metaboxes-wrapper .wc-metabox table td label{text-align:left;display:block;line-height:21px}.wc-metaboxes-wrapper .wc-metabox table td input{float:left;min-width:200px}.wc-metaboxes-wrapper .wc-metabox table td input,.wc-metaboxes-wrapper .wc-metabox table td textarea{width:100%;margin:0;display:block;font-size:14px;padding:4px;color:#555}.wc-metaboxes-wrapper .wc-metabox table td .select2-container,.wc-metaboxes-wrapper .wc-metabox table td select{width:100%!important}.wc-metaboxes-wrapper .wc-metabox table td input.short{width:200px}.wc-metaboxes-wrapper .wc-metabox table td input.checkbox{width:16px;min-width:inherit;vertical-align:text-bottom;display:inline-block;float:none}.wc-metaboxes-wrapper .wc-metabox table td.attribute_name{width:200px}.wc-metaboxes-wrapper .wc-metabox table .minus,.wc-metaboxes-wrapper .wc-metabox table .plus{margin-top:6px}.wc-metaboxes-wrapper .wc-metabox table .fl{float:left}.wc-metaboxes-wrapper .wc-metabox table .fr{float:right}.variations-pagenav{float:right;line-height:24px}.variations-pagenav .displaying-num{color:#777;font-size:12px;font-style:italic}.variations-pagenav a{padding:0 10px 3px;background:rgba(0,0,0,.05);font-size:16px;font-weight:400;text-decoration:none}.variations-pagenav a.disabled,.variations-pagenav a.disabled:active,.variations-pagenav a.disabled:focus,.variations-pagenav a.disabled:hover{color:#a0a5aa;background:rgba(0,0,0,.05)}.variations-defaults{float:left}.variations-defaults select{margin:.25em .25em .25em 0}.woocommerce_variable_attributes{background-color:#fdfdfd;border-top:1px solid #eee}.woocommerce_variable_attributes .data{padding:1em 2em}.woocommerce_variable_attributes .data::after,.woocommerce_variable_attributes .data::before{content:' ';display:table}.woocommerce_variable_attributes .data::after{clear:both}.woocommerce_variable_attributes .upload_image_button{display:block;width:64px;height:64px;float:left;margin-right:20px;position:relative;cursor:pointer}.woocommerce_variable_attributes .upload_image_button img{width:100%;height:auto;display:none}.woocommerce_variable_attributes .upload_image_button::before{content:'\f128';font-family:Dashicons;position:absolute;top:0;left:0;right:0;bottom:0;text-align:center;line-height:64px;font-size:64px;font-weight:400;-webkit-font-smoothing:antialiased}.woocommerce_variable_attributes .upload_image_button.remove img{display:block}.woocommerce_variable_attributes .upload_image_button.remove::before{content:'\f335';display:none}.woocommerce_variable_attributes .upload_image_button.remove:hover::before{display:block}.woocommerce_variable_attributes .options{border:1px solid #eee;border-width:1px 0;padding:.25em 0}.woocommerce_variable_attributes .options label{display:inline-block;padding:4px 1em 2px 0}.woocommerce_variable_attributes .options input[type=checkbox]{margin:0 5px 0 .5em!important;vertical-align:middle}.form-row label{display:inline-block}.form-row .woocommerce-help-tip{float:right}.form-row input[type=number],.form-row input[type=text],.form-row select,.form-row textarea{width:100%;vertical-align:middle;margin:2px 0 0;padding:5px}.form-row select{height:30px;line-height:30px}.form-row.dimensions_field .wrap{clear:left;display:block}.form-row.dimensions_field input{width:33%;float:left;vertical-align:middle}.form-row.dimensions_field input:last-of-type{margin-right:0;width:34%}.form-row.form-row-first,.form-row.form-row-last{width:48%;float:right}.form-row.form-row-first{clear:both;float:left}.form-row.form-row-full{clear:both}.tips{cursor:help;text-decoration:none}img.tips{padding:5px 0 0}#tiptip_holder{display:none;z-index:8675309;position:absolute;top:0;left:0}#tiptip_holder.tip_top{padding-bottom:5px}#tiptip_holder.tip_top #tiptip_arrow_inner{margin-top:-7px;margin-left:-6px;border-top-color:#333}#tiptip_holder.tip_bottom{padding-top:5px}#tiptip_holder.tip_bottom #tiptip_arrow_inner{margin-top:-5px;margin-left:-6px;border-bottom-color:#333}#tiptip_holder.tip_right{padding-left:5px}#tiptip_holder.tip_right #tiptip_arrow_inner{margin-top:-6px;margin-left:-5px;border-right-color:#333}#tiptip_holder.tip_left{padding-right:5px}#tiptip_holder.tip_left #tiptip_arrow_inner{margin-top:-6px;margin-left:-7px;border-left-color:#333}#tiptip_content,.chart-tooltip,.wc_error_tip{color:#fff;font-size:.8em;max-width:150px;background:#333;text-align:center;border-radius:3px;padding:.618em 1em;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.2);box-shadow:0 1px 3px rgba(0,0,0,.2)}#tiptip_content code,.chart-tooltip code,.wc_error_tip code{padding:1px;background:#888}#tiptip_arrow,#tiptip_arrow_inner{position:absolute;border-color:transparent;border-style:solid;border-width:6px;height:0;width:0}.wc_error_tip{max-width:20em;line-height:1.8em;position:absolute;white-space:normal;background:#d82223;margin:1.5em 1px 0 -1em;z-index:9999999}.wc_error_tip::after{content:'';display:block;border:8px solid #d82223;border-right-color:transparent;border-left-color:transparent;border-top-color:transparent;position:absolute;top:-3px;left:50%;margin:-1em 0 0 -3px}img.ui-datepicker-trigger{vertical-align:middle;margin-top:-1px;cursor:pointer}.wc-metabox-content img.ui-datepicker-trigger,.woocommerce_options_panel img.ui-datepicker-trigger{float:left;margin-right:8px;margin-top:4px;margin-left:4px}#ui-datepicker-div{display:none}.woocommerce-reports-remove-filter{color:red;text-decoration:none}.woocommerce-reports-wide.woocommerce-reports-wrap,.woocommerce-reports-wrap.woocommerce-reports-wrap{margin-left:300px;padding-top:18px}.woocommerce-reports-wide.halved,.woocommerce-reports-wrap.halved{margin:0;overflow:hidden;zoom:1}.woocommerce-reports-wide .widefat th,.woocommerce-reports-wrap .widefat th{padding:7px}.woocommerce-reports-wide .widefat td,.woocommerce-reports-wrap .widefat td{vertical-align:top;padding:7px}.woocommerce-reports-wide .widefat td .description,.woocommerce-reports-wrap .widefat td .description{margin:4px 0 0}.woocommerce-reports-wide .postbox::after,.woocommerce-reports-wrap .postbox::after{content:'.';display:block;height:0;clear:both;visibility:hidden}.woocommerce-reports-wide .postbox h3,.woocommerce-reports-wrap .postbox h3{cursor:default!important}.woocommerce-reports-wide .postbox .inside,.woocommerce-reports-wrap .postbox .inside{padding:10px;margin:0!important}.woocommerce-reports-wide .postbox div.stats_range,.woocommerce-reports-wide .postbox h3.stats_range,.woocommerce-reports-wrap .postbox div.stats_range,.woocommerce-reports-wrap .postbox h3.stats_range{border-bottom-color:#dfdfdf;margin:0;padding:0!important}.woocommerce-reports-wide .postbox div.stats_range .export_csv,.woocommerce-reports-wide .postbox h3.stats_range .export_csv,.woocommerce-reports-wrap .postbox div.stats_range .export_csv,.woocommerce-reports-wrap .postbox h3.stats_range .export_csv{float:right;line-height:26px;border-left:1px solid #dfdfdf;padding:10px;display:block;text-decoration:none}.woocommerce-reports-wide .postbox div.stats_range .export_csv::before,.woocommerce-reports-wide .postbox h3.stats_range .export_csv::before,.woocommerce-reports-wrap .postbox div.stats_range .export_csv::before,.woocommerce-reports-wrap .postbox h3.stats_range .export_csv::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;content:"";text-decoration:none;margin-right:4px}.woocommerce-reports-wide .postbox div.stats_range ul,.woocommerce-reports-wide .postbox h3.stats_range ul,.woocommerce-reports-wrap .postbox div.stats_range ul,.woocommerce-reports-wrap .postbox h3.stats_range ul{list-style:none outside;margin:0;padding:0;zoom:1;background:#f5f5f5;border-bottom:1px solid #ccc}.woocommerce-reports-wide .postbox div.stats_range ul::after,.woocommerce-reports-wide .postbox div.stats_range ul::before,.woocommerce-reports-wide .postbox h3.stats_range ul::after,.woocommerce-reports-wide .postbox h3.stats_range ul::before,.woocommerce-reports-wrap .postbox div.stats_range ul::after,.woocommerce-reports-wrap .postbox div.stats_range ul::before,.woocommerce-reports-wrap .postbox h3.stats_range ul::after,.woocommerce-reports-wrap .postbox h3.stats_range ul::before{content:' ';display:table}.woocommerce-reports-wide .postbox div.stats_range ul::after,.woocommerce-reports-wide .postbox h3.stats_range ul::after,.woocommerce-reports-wrap .postbox div.stats_range ul::after,.woocommerce-reports-wrap .postbox h3.stats_range ul::after{clear:both}.woocommerce-reports-wide .postbox div.stats_range ul li,.woocommerce-reports-wide .postbox h3.stats_range ul li,.woocommerce-reports-wrap .postbox div.stats_range ul li,.woocommerce-reports-wrap .postbox h3.stats_range ul li{float:left;margin:0;padding:0;line-height:26px;font-weight:700;font-size:14px}.woocommerce-reports-wide .postbox div.stats_range ul li a,.woocommerce-reports-wide .postbox h3.stats_range ul li a,.woocommerce-reports-wrap .postbox div.stats_range ul li a,.woocommerce-reports-wrap .postbox h3.stats_range ul li a{border-right:1px solid #dfdfdf;padding:10px;display:block;text-decoration:none}.woocommerce-reports-wide .postbox div.stats_range ul li.active,.woocommerce-reports-wide .postbox h3.stats_range ul li.active,.woocommerce-reports-wrap .postbox div.stats_range ul li.active,.woocommerce-reports-wrap .postbox h3.stats_range ul li.active{background:#fff;-webkit-box-shadow:0 4px 0 0 #fff;box-shadow:0 4px 0 0 #fff}.woocommerce-reports-wide .postbox div.stats_range ul li.active a,.woocommerce-reports-wide .postbox h3.stats_range ul li.active a,.woocommerce-reports-wrap .postbox div.stats_range ul li.active a,.woocommerce-reports-wrap .postbox h3.stats_range ul li.active a{color:#777}.woocommerce-reports-wide .postbox div.stats_range ul li.custom,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom{padding:9px 10px;vertical-align:middle}.woocommerce-reports-wide .postbox div.stats_range ul li.custom div,.woocommerce-reports-wide .postbox div.stats_range ul li.custom form,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom div,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom form,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom div,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom form,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom div,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom form{display:inline;margin:0}.woocommerce-reports-wide .postbox div.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wide .postbox div.stats_range ul li.custom form input.range_datepicker,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom form input.range_datepicker,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom form input.range_datepicker,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom form input.range_datepicker{padding:0;margin:0 10px 0 0;background:0 0;border:0;color:#777;text-align:center;-webkit-box-shadow:none;box-shadow:none}.woocommerce-reports-wide .postbox div.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wide .postbox div.stats_range ul li.custom form input.range_datepicker.from,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom form input.range_datepicker.from,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom form input.range_datepicker.from,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom form input.range_datepicker.from{margin-right:0}.woocommerce-reports-wide .postbox .chart-with-sidebar,.woocommerce-reports-wrap .postbox .chart-with-sidebar{padding:12px 12px 12px 249px;margin:0!important}.woocommerce-reports-wide .postbox .chart-with-sidebar .chart-sidebar,.woocommerce-reports-wrap .postbox .chart-with-sidebar .chart-sidebar{width:225px;margin-left:-237px;float:left}.woocommerce-reports-wide .postbox .chart-widgets,.woocommerce-reports-wrap .postbox .chart-widgets{margin:0;padding:0}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget{margin:0 0 1em;background:#fafafa;border:1px solid #dfdfdf}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget::after,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget::after{content:'.';display:block;height:0;clear:both;visibility:hidden}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget h4,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget h4{background:#fff;border:1px solid #dfdfdf;border-left-width:0;border-right-width:0;padding:10px;margin:0;color:#2ea2cc;border-top-width:0;background-image:-webkit-gradient(linear,left bottom,left top,from(#ececec),to(#f9f9f9));background-image:-webkit-linear-gradient(bottom,#ececec,#f9f9f9);background-image:linear-gradient(to top,#ececec,#f9f9f9)}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget h4.section_title:hover,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget h4.section_title:hover{color:#a00}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title{cursor:pointer}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title span,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title span{display:block}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title span::after,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title span::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-left:.618em;content:"";text-decoration:none;float:right;font-size:.9em;line-height:1.618}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title.open,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title.open{color:#333}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title.open span::after,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title.open span::after{display:none}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section{border-bottom:1px solid #dfdfdf}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section .select2-container,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section .select2-container{width:100%!important}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section:last-of-type,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section:last-of-type{border-radius:0 0 3px 3px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table{width:100%}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td{padding:7px 10px;vertical-align:top;border-top:1px solid #e5e5e5;line-height:1.4em}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table tr:first-child td,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table tr:first-child td{border-top:0}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.count,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.count{background:#f5f5f5}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.name,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.name{max-width:175px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.name a,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.name a{word-wrap:break-word}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.sparkline,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.sparkline{vertical-align:middle}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table .wc_sparkline,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table .wc_sparkline{width:32px;height:1em;display:block;float:right}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table tr.active td,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table tr.active td{background:#f5f5f5}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget form,.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget p,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget form,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget p{margin:0;padding:10px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget form .submit,.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget p .submit,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget form .submit,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget p .submit{margin-top:10px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget #product_ids,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget #product_ids{width:100%}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .select_all,.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .select_none,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .select_all,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .select_none{float:right;color:#999;margin-left:4px;margin-top:10px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .description,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .description{margin-left:.5em;font-weight:400;opacity:.8}.woocommerce-reports-wide .postbox .chart-legend,.woocommerce-reports-wrap .postbox .chart-legend{list-style:none outside;margin:0 0 1em;padding:0;border:1px solid #dfdfdf;border-right-width:0;border-bottom-width:0;background:#fff}.woocommerce-reports-wide .postbox .chart-legend li,.woocommerce-reports-wrap .postbox .chart-legend li{border-right:5px solid #aaa;color:#aaa;padding:1em;display:block;margin:0;-webkit-transition:all ease .5s;transition:all ease .5s;-webkit-box-shadow:inset 0 -1px 0 0 #dfdfdf;box-shadow:inset 0 -1px 0 0 #dfdfdf}.woocommerce-reports-wide .postbox .chart-legend li strong,.woocommerce-reports-wrap .postbox .chart-legend li strong{font-size:1.618em;line-height:1.2em;color:#464646;font-weight:400;display:block;font-family:HelveticaNeue-Light,'Helvetica Neue Light','Helvetica Neue',sans-serif}.woocommerce-reports-wide .postbox .chart-legend li strong del,.woocommerce-reports-wrap .postbox .chart-legend li strong del{color:#e74c3c;font-weight:400}.woocommerce-reports-wide .postbox .chart-legend li:hover,.woocommerce-reports-wrap .postbox .chart-legend li:hover{-webkit-box-shadow:inset 0 -1px 0 0 #dfdfdf,inset 300px 0 0 rgba(156,93,144,.1);box-shadow:inset 0 -1px 0 0 #dfdfdf,inset 300px 0 0 rgba(156,93,144,.1);border-right:5px solid #9c5d90!important;padding-left:1.5em;color:#9c5d90}.woocommerce-reports-wide .postbox .pie-chart-legend,.woocommerce-reports-wrap .postbox .pie-chart-legend{margin:12px 0 0;overflow:hidden}.woocommerce-reports-wide .postbox .pie-chart-legend li,.woocommerce-reports-wrap .postbox .pie-chart-legend li{float:left;margin:0;padding:6px 0 0;border-top:4px solid #999;text-align:center;-webkit-box-sizing:border-box;box-sizing:border-box;width:50%}.woocommerce-reports-wide .postbox .stat,.woocommerce-reports-wrap .postbox .stat{font-size:1.5em!important;font-weight:700;text-align:center}.woocommerce-reports-wide .postbox .chart-placeholder,.woocommerce-reports-wrap .postbox .chart-placeholder{width:100%;height:650px;overflow:hidden;position:relative}.woocommerce-reports-wide .postbox .chart-prompt,.woocommerce-reports-wrap .postbox .chart-prompt{line-height:650px;margin:0;color:#999;font-size:1.2em;font-style:italic;text-align:center}.woocommerce-reports-wide .postbox .chart-container,.woocommerce-reports-wrap .postbox .chart-container{background:#fff;padding:12px;position:relative;border:1px solid #dfdfdf;border-radius:3px}.woocommerce-reports-wide .postbox .main .chart-legend,.woocommerce-reports-wrap .postbox .main .chart-legend{margin-top:12px}.woocommerce-reports-wide .postbox .main .chart-legend li,.woocommerce-reports-wrap .postbox .main .chart-legend li{border-right:0;margin:0 8px 0 0;float:left;border-top:4px solid #aaa}.woocommerce-reports-wide .woocommerce-reports-main,.woocommerce-reports-wrap .woocommerce-reports-main{float:left;min-width:100%}.woocommerce-reports-wide .woocommerce-reports-main table td,.woocommerce-reports-wrap .woocommerce-reports-main table td{padding:9px}.woocommerce-reports-wide .woocommerce-reports-sidebar,.woocommerce-reports-wrap .woocommerce-reports-sidebar{display:inline;width:281px;margin-left:-300px;clear:both;float:left}.woocommerce-reports-wide .woocommerce-reports-left,.woocommerce-reports-wrap .woocommerce-reports-left{width:49.5%;float:left}.woocommerce-reports-wide .woocommerce-reports-right,.woocommerce-reports-wrap .woocommerce-reports-right{width:49.5%;float:right}.woocommerce-wide-reports-wrap{padding-bottom:11px}.woocommerce-wide-reports-wrap .widefat .export-data{float:right}.woocommerce-wide-reports-wrap .widefat td,.woocommerce-wide-reports-wrap .widefat th{vertical-align:middle;padding:7px}form.report_filters p{vertical-align:middle}form.report_filters div,form.report_filters input,form.report_filters label{vertical-align:middle}.chart-tooltip{position:absolute;display:none;line-height:1}table.bar_chart{width:100%}table.bar_chart thead th{text-align:left;color:#ccc;padding:6px 0}table.bar_chart tbody th{padding:6px 0;width:25%;text-align:left!important;font-weight:400!important;border-bottom:1px solid #fee}table.bar_chart tbody td{text-align:right;line-height:24px;padding:6px 6px 6px 0;border-bottom:1px solid #fee}table.bar_chart tbody td span{color:#8a4b75;display:block}table.bar_chart tbody td span.alt{color:#47a03e;margin-top:6px}table.bar_chart tbody td.bars{position:relative;text-align:left;padding:6px 6px 6px 0;border-bottom:1px solid #fee}table.bar_chart tbody td.bars a,table.bar_chart tbody td.bars span{text-decoration:none;clear:both;background:#8a4b75;float:left;display:block;line-height:24px;height:24px;border-radius:3px}table.bar_chart tbody td.bars span.alt{clear:both;background:#47a03e}table.bar_chart tbody td.bars span.alt span{margin:0;color:#c5dec2!important;text-shadow:0 1px 0 #47a03e;background:0 0}.post-type-shop_order .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}.post-type-shop_coupon .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}.post-type-product .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}.woocommerce-BlankState--api .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}.woocommerce-BlankState--webhooks .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}.woocommerce-BlankState{text-align:center;padding:5em 0 0}.woocommerce-BlankState .woocommerce-BlankState-message{color:#aaa;margin:0 auto 1.5em;line-height:1.5em;font-size:1.2em;max-width:500px}.woocommerce-BlankState .woocommerce-BlankState-message::before{color:#ddd;text-shadow:0 -1px 1px rgba(0,0,0,.2),0 1px 0 rgba(255,255,255,.8);font-size:8em;display:block;position:relative!important;top:auto;left:auto;line-height:1em;margin:0 0 .1875em}.woocommerce-BlankState .woocommerce-BlankState-cta{font-size:1.2em;padding:.75em 1.5em;margin:0 .25em;height:auto;display:inline-block!important}@media only screen and (max-width:1280px){#order_data .order_data_column{width:48%}#order_data .order_data_column:first-child{width:100%}.woocommerce_options_panel .description{display:block;clear:both;margin-left:0}.woocommerce_options_panel .dimensions_field .wrap,.woocommerce_options_panel .short,.woocommerce_options_panel input[type=email].short,.woocommerce_options_panel input[type=number].short,.woocommerce_options_panel input[type=password].short,.woocommerce_options_panel input[type=text].short{width:80%}.woocommerce_options_panel .downloadable_files,.woocommerce_variations .downloadable_files{padding:0;clear:both}.woocommerce_options_panel .downloadable_files label,.woocommerce_variations .downloadable_files label{position:static}.woocommerce_options_panel .downloadable_files table,.woocommerce_variations .downloadable_files table{margin:0 12px 24px;width:94%}.woocommerce_options_panel .downloadable_files table .sort,.woocommerce_variations .downloadable_files table .sort{visibility:hidden}.woocommerce_options_panel .woocommerce_variable_attributes .downloadable_files table,.woocommerce_variations .woocommerce_variable_attributes .downloadable_files table{margin:0 0 1em;width:100%}}@media only screen and (max-width:900px){#woocommerce-coupon-data ul.coupon_data_tabs,#woocommerce-product-data .wc-tabs-back,#woocommerce-product-data ul.product_data_tabs{width:10%}#woocommerce-coupon-data .wc-metaboxes-wrapper,#woocommerce-coupon-data .woocommerce_options_panel,#woocommerce-product-data .wc-metaboxes-wrapper,#woocommerce-product-data .woocommerce_options_panel{width:90%}#woocommerce-coupon-data ul.coupon_data_tabs li a,#woocommerce-product-data ul.product_data_tabs li a{position:relative;text-indent:-999px;padding:10px}#woocommerce-coupon-data ul.coupon_data_tabs li a::before,#woocommerce-product-data ul.product_data_tabs li a::before{position:absolute;top:0;right:0;bottom:0;left:0;text-indent:0;text-align:center;line-height:40px;width:100%;height:40px}}@media only screen and (max-width:782px){#wp-excerpt-media-buttons a{font-size:16px;line-height:37px;height:39px;padding:0 20px 0 15px}#wp-excerpt-editor-tools{padding-top:20px;padding-right:15px;overflow:hidden;margin-bottom:-1px}#woocommerce-product-data .checkbox{width:25px}.variations-pagenav{float:none;text-align:center;font-size:18px}.variations-pagenav .displaying-num{font-size:16px}.variations-pagenav a{padding:8px 20px 11px;font-size:18px}.variations-pagenav select{padding:0 20px}.variations-defaults{float:none;text-align:center;margin-top:10px}.post-type-product .wp-list-table .column-thumb{display:none;text-align:left;padding-bottom:0}.post-type-product .wp-list-table .column-thumb::before{display:none!important}.post-type-product .wp-list-table .column-thumb img{max-width:32px}.post-type-product .wp-list-table .is-expanded td:not(.hidden){overflow:visible}.post-type-product .wp-list-table .toggle-row{top:-28px}.post-type-shop_order .wp-list-table .column-customer_message,.post-type-shop_order .wp-list-table .column-order_notes{text-align:inherit}.post-type-shop_order .wp-list-table .column-order_notes .note-on{font-size:1.3em;margin:0}.post-type-shop_order .wp-list-table .is-expanded td:not(.hidden){overflow:visible}.post-type-shop_order .wp-list-table .toggle-row{top:-15px}}@media only screen and (max-width:500px){.woocommerce_options_panel label,.woocommerce_options_panel legend{float:none;width:auto;display:block;margin:0}.woocommerce_options_panel fieldset.form-field,.woocommerce_options_panel p.form-field{padding:5px 20px!important}.addons-wcs-banner-block{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.wc_addons_wrap .addons-wcs-banner-block{padding:40px}.wc_addons_wrap .addons-wcs-banner-block-image{padding:1em;text-align:center;width:100%;padding:2em 0;margin:0}.wc_addons_wrap .addons-wcs-banner-block-image .addons-img{margin:0}}.wc-backbone-modal *{-webkit-box-sizing:border-box;box-sizing:border-box}.wc-backbone-modal .wc-backbone-modal-content{position:fixed;background:#fff;z-index:100000;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);max-width:100%;min-width:500px}.wc-backbone-modal .wc-backbone-modal-content article{overflow:auto}.wc-backbone-modal.wc-backbone-modal-shipping-method-settings .wc-backbone-modal-content{width:75%;min-width:500px}.wc-backbone-modal .select2-container{width:100%!important}@media screen and (max-width:782px){.wc-backbone-modal .wc-backbone-modal-content{width:100%;height:100%;min-width:100%}}.wc-backbone-modal-backdrop{position:fixed;top:0;left:0;right:0;bottom:0;min-height:360px;background:#000;opacity:.7;z-index:99900}.wc-backbone-modal-main{padding-bottom:55px}.wc-backbone-modal-main article,.wc-backbone-modal-main header{display:block;position:relative}.wc-backbone-modal-main .wc-backbone-modal-header{height:auto;background:#fcfcfc;padding:1em 1.5em;border-bottom:1px solid #ddd}.wc-backbone-modal-main .wc-backbone-modal-header h1{margin:0;font-size:18px;font-weight:700;line-height:1.5em}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link{cursor:pointer;color:#777;height:54px;width:54px;padding:0;position:absolute;top:0;right:0;text-align:center;border:0;border-left:1px solid #ddd;background-color:transparent;-webkit-transition:color .1s ease-in-out,background .1s ease-in-out;transition:color .1s ease-in-out,background .1s ease-in-out}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link::before{font:normal 22px/50px dashicons!important;color:#666;display:block;content:'\f335';font-weight:300}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link:focus,.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link:hover{background:#ddd;border-color:#ccc;color:#000}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link:focus{outline:0}.wc-backbone-modal-main article{padding:1.5em}.wc-backbone-modal-main article p{margin:1.5em 0}.wc-backbone-modal-main article p:first-child{margin-top:0}.wc-backbone-modal-main article p:last-child{margin-bottom:0}.wc-backbone-modal-main article .pagination{padding:10px 0 0;text-align:center}.wc-backbone-modal-main article table.widefat{margin:0;width:100%;border:0;-webkit-box-shadow:none;box-shadow:none}.wc-backbone-modal-main article table.widefat thead th{padding:0 1em 1em 1em;text-align:left}.wc-backbone-modal-main article table.widefat thead th:first-child{padding-left:0}.wc-backbone-modal-main article table.widefat thead th:last-child{padding-right:0;text-align:right}.wc-backbone-modal-main article table.widefat tbody td,.wc-backbone-modal-main article table.widefat tbody th{padding:1em;text-align:left;vertical-align:middle}.wc-backbone-modal-main article table.widefat tbody td:first-child,.wc-backbone-modal-main article table.widefat tbody th:first-child{padding-left:0}.wc-backbone-modal-main article table.widefat tbody td:last-child,.wc-backbone-modal-main article table.widefat tbody th:last-child{padding-right:0;text-align:right}.wc-backbone-modal-main article table.widefat tbody td .select2-container,.wc-backbone-modal-main article table.widefat tbody td select,.wc-backbone-modal-main article table.widefat tbody th .select2-container,.wc-backbone-modal-main article table.widefat tbody th select{width:100%}.wc-backbone-modal-main footer{position:absolute;left:0;right:0;bottom:0;z-index:100;padding:1em 1.5em;background:#fcfcfc;border-top:1px solid #dfdfdf;-webkit-box-shadow:0 -4px 4px -4px rgba(0,0,0,.1);box-shadow:0 -4px 4px -4px rgba(0,0,0,.1)}.wc-backbone-modal-main footer .inner{text-align:right;line-height:23px}.wc-backbone-modal-main footer .inner .button{margin-bottom:0}.select2-drop,.select2-dropdown{z-index:999999!important}.select2-results{line-height:1.5em}.select2-results .select2-results__group,.select2-results .select2-results__option{margin:0;padding:8px}.select2-results .description{display:block;color:#999;padding-top:4px}.select2-dropdown{border-color:#ddd}.select2-dropdown--below{-webkit-box-shadow:0 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px rgba(0,0,0,.1)}.select2-dropdown--above{-webkit-box-shadow:0 -1px 1px rgba(0,0,0,.1);box-shadow:0 -1px 1px rgba(0,0,0,.1)}.select2-container .select2-selection__rendered.ui-sortable li{cursor:move}.select2-container .select2-selection{border-color:#ddd}.select2-container .select2-search__field{min-width:150px}.select2-container .select2-selection--single{height:32px}.select2-container .select2-selection--single .select2-selection__rendered{line-height:32px;padding-right:24px}.select2-container .select2-selection--single .select2-selection__arrow{right:3px;height:30px}.select2-container .select2-selection--multiple{min-height:28px;border-radius:0;line-height:1.5}.select2-container .select2-selection--multiple li{margin:0}.select2-container .select2-selection--multiple .select2-selection__choice{padding:2px 6px}.select2-container .select2-selection--multiple .select2-selection__choice .description{display:none}.select2-container .select2-selection__clear{color:#999;margin-top:-1px}.select2-container .select2-search--inline .select2-search__field{font-family:inherit;font-size:inherit;font-weight:inherit;padding:3px 0}.woocommerce table.form-table .select2-container{min-width:400px!important}.post-type-product .tablenav .actions,.post-type-shop_order .tablenav .actions{overflow:visible}.post-type-product .tablenav input,.post-type-product .tablenav select,.post-type-shop_order .tablenav input,.post-type-shop_order .tablenav select{line-height:1;height:32px}.post-type-product .tablenav .select2-container,.post-type-shop_order .tablenav .select2-container{float:left;width:240px!important;font-size:14px;vertical-align:middle;margin:1px 6px 4px 1px}.woocommerce-exporter-wrapper,.woocommerce-importer-wrapper,.woocommerce-progress-form-wrapper{text-align:center;max-width:700px;margin:40px auto}.woocommerce-exporter-wrapper .error,.woocommerce-importer-wrapper .error,.woocommerce-progress-form-wrapper .error{text-align:left}.woocommerce-exporter-wrapper .wc-progress-steps,.woocommerce-importer-wrapper .wc-progress-steps,.woocommerce-progress-form-wrapper .wc-progress-steps{padding:0 0 24px;margin:0;list-style:none outside;overflow:hidden;color:#ccc;width:100%;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:-webkit-inline-box;display:inline-flex}.woocommerce-exporter-wrapper .wc-progress-steps li,.woocommerce-importer-wrapper .wc-progress-steps li,.woocommerce-progress-form-wrapper .wc-progress-steps li{width:25%;float:left;padding:0 0 .8em;margin:0;text-align:center;position:relative;border-bottom:4px solid #ccc;line-height:1.4em}.woocommerce-exporter-wrapper .wc-progress-steps li::before,.woocommerce-importer-wrapper .wc-progress-steps li::before,.woocommerce-progress-form-wrapper .wc-progress-steps li::before{content:'';border:4px solid #ccc;border-radius:100%;width:4px;height:4px;position:absolute;bottom:0;left:50%;margin-left:-6px;margin-bottom:-8px;background:#fff}.woocommerce-exporter-wrapper .wc-progress-steps li.active,.woocommerce-importer-wrapper .wc-progress-steps li.active,.woocommerce-progress-form-wrapper .wc-progress-steps li.active{border-color:#a16696;color:#a16696}.woocommerce-exporter-wrapper .wc-progress-steps li.active::before,.woocommerce-importer-wrapper .wc-progress-steps li.active::before,.woocommerce-progress-form-wrapper .wc-progress-steps li.active::before{border-color:#a16696}.woocommerce-exporter-wrapper .wc-progress-steps li.done,.woocommerce-importer-wrapper .wc-progress-steps li.done,.woocommerce-progress-form-wrapper .wc-progress-steps li.done{border-color:#a16696;color:#a16696}.woocommerce-exporter-wrapper .wc-progress-steps li.done::before,.woocommerce-importer-wrapper .wc-progress-steps li.done::before,.woocommerce-progress-form-wrapper .wc-progress-steps li.done::before{border-color:#a16696;background:#a16696}.woocommerce-exporter-wrapper .button,.woocommerce-importer-wrapper .button,.woocommerce-progress-form-wrapper .button{font-size:1.25em;padding:.5em 1em!important;line-height:1.5em!important;margin-right:.5em;margin-bottom:2px;height:auto!important;border-radius:4px;background-color:#bb77ae;border-color:#a36597;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;text-shadow:0 -1px 1px #a36597,1px 0 1px #a36597,0 1px 1px #a36597,-1px 0 1px #a36597;margin:0;opacity:1}.woocommerce-exporter-wrapper .button:active,.woocommerce-exporter-wrapper .button:focus,.woocommerce-exporter-wrapper .button:hover,.woocommerce-importer-wrapper .button:active,.woocommerce-importer-wrapper .button:focus,.woocommerce-importer-wrapper .button:hover,.woocommerce-progress-form-wrapper .button:active,.woocommerce-progress-form-wrapper .button:focus,.woocommerce-progress-form-wrapper .button:hover{background:#a36597;border-color:#a36597;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.woocommerce-exporter-wrapper .error .button,.woocommerce-importer-wrapper .error .button,.woocommerce-progress-form-wrapper .error .button{font-size:1em}.woocommerce-exporter-wrapper .wc-actions,.woocommerce-importer-wrapper .wc-actions,.woocommerce-progress-form-wrapper .wc-actions{overflow:hidden;border-top:1px solid #eee;margin:0;padding:23px 24px 24px;line-height:3em}.woocommerce-exporter-wrapper .wc-actions .button,.woocommerce-importer-wrapper .wc-actions .button,.woocommerce-progress-form-wrapper .wc-actions .button{float:right}.woocommerce-exporter-wrapper .wc-actions .woocommerce-importer-toggle-advanced-options,.woocommerce-importer-wrapper .wc-actions .woocommerce-importer-toggle-advanced-options,.woocommerce-progress-form-wrapper .wc-actions .woocommerce-importer-toggle-advanced-options{color:#999}.woocommerce-exporter-wrapper .wc-progress-form-content,.woocommerce-exporter-wrapper .woocommerce-exporter,.woocommerce-exporter-wrapper .woocommerce-importer,.woocommerce-importer-wrapper .wc-progress-form-content,.woocommerce-importer-wrapper .woocommerce-exporter,.woocommerce-importer-wrapper .woocommerce-importer,.woocommerce-progress-form-wrapper .wc-progress-form-content,.woocommerce-progress-form-wrapper .woocommerce-exporter,.woocommerce-progress-form-wrapper .woocommerce-importer{background:#fff;overflow:hidden;padding:0;margin:0 0 16px;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.13);box-shadow:0 1px 3px rgba(0,0,0,.13);color:#555;text-align:left}.woocommerce-exporter-wrapper .wc-progress-form-content header,.woocommerce-exporter-wrapper .woocommerce-exporter header,.woocommerce-exporter-wrapper .woocommerce-importer header,.woocommerce-importer-wrapper .wc-progress-form-content header,.woocommerce-importer-wrapper .woocommerce-exporter header,.woocommerce-importer-wrapper .woocommerce-importer header,.woocommerce-progress-form-wrapper .wc-progress-form-content header,.woocommerce-progress-form-wrapper .woocommerce-exporter header,.woocommerce-progress-form-wrapper .woocommerce-importer header{border-bottom:1px solid #eee;margin:0;padding:24px 24px 0}.woocommerce-exporter-wrapper .wc-progress-form-content section,.woocommerce-exporter-wrapper .woocommerce-exporter section,.woocommerce-exporter-wrapper .woocommerce-importer section,.woocommerce-importer-wrapper .wc-progress-form-content section,.woocommerce-importer-wrapper .woocommerce-exporter section,.woocommerce-importer-wrapper .woocommerce-importer section,.woocommerce-progress-form-wrapper .wc-progress-form-content section,.woocommerce-progress-form-wrapper .woocommerce-exporter section,.woocommerce-progress-form-wrapper .woocommerce-importer section{padding:24px 24px 0}.woocommerce-exporter-wrapper .wc-progress-form-content h2,.woocommerce-exporter-wrapper .woocommerce-exporter h2,.woocommerce-exporter-wrapper .woocommerce-importer h2,.woocommerce-importer-wrapper .wc-progress-form-content h2,.woocommerce-importer-wrapper .woocommerce-exporter h2,.woocommerce-importer-wrapper .woocommerce-importer h2,.woocommerce-progress-form-wrapper .wc-progress-form-content h2,.woocommerce-progress-form-wrapper .woocommerce-exporter h2,.woocommerce-progress-form-wrapper .woocommerce-importer h2{margin:0 0 24px;color:#555;font-size:24px;font-weight:400;line-height:1em}.woocommerce-exporter-wrapper .wc-progress-form-content p,.woocommerce-exporter-wrapper .woocommerce-exporter p,.woocommerce-exporter-wrapper .woocommerce-importer p,.woocommerce-importer-wrapper .wc-progress-form-content p,.woocommerce-importer-wrapper .woocommerce-exporter p,.woocommerce-importer-wrapper .woocommerce-importer p,.woocommerce-progress-form-wrapper .wc-progress-form-content p,.woocommerce-progress-form-wrapper .woocommerce-exporter p,.woocommerce-progress-form-wrapper .woocommerce-importer p{font-size:1em;line-height:1.75em;font-size:16px;color:#555;margin:0 0 24px}.woocommerce-exporter-wrapper .wc-progress-form-content .form-row,.woocommerce-exporter-wrapper .woocommerce-exporter .form-row,.woocommerce-exporter-wrapper .woocommerce-importer .form-row,.woocommerce-importer-wrapper .wc-progress-form-content .form-row,.woocommerce-importer-wrapper .woocommerce-exporter .form-row,.woocommerce-importer-wrapper .woocommerce-importer .form-row,.woocommerce-progress-form-wrapper .wc-progress-form-content .form-row,.woocommerce-progress-form-wrapper .woocommerce-exporter .form-row,.woocommerce-progress-form-wrapper .woocommerce-importer .form-row{margin-top:24px}.woocommerce-exporter-wrapper .wc-progress-form-content .spinner,.woocommerce-exporter-wrapper .woocommerce-exporter .spinner,.woocommerce-exporter-wrapper .woocommerce-importer .spinner,.woocommerce-importer-wrapper .wc-progress-form-content .spinner,.woocommerce-importer-wrapper .woocommerce-exporter .spinner,.woocommerce-importer-wrapper .woocommerce-importer .spinner,.woocommerce-progress-form-wrapper .wc-progress-form-content .spinner,.woocommerce-progress-form-wrapper .woocommerce-exporter .spinner,.woocommerce-progress-form-wrapper .woocommerce-importer .spinner{display:none}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th{vertical-align:top;line-height:1.75em;padding:0 0 24px 0}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td label,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th label,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td label,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th label{color:#555;font-weight:400}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=checkbox],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=checkbox],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=checkbox],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=checkbox]{margin:0 4px 0 0;padding:7px}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=text],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=text],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=text],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=text]{padding:7px;height:auto;margin:0}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper{border:1px solid #ddd;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.07);box-shadow:inset 0 1px 2px rgba(0,0,0,.07);background-color:#fff;color:#32373c;outline:0;line-height:1;display:block}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code{background:0 0;font-size:smaller;padding:0;margin:0;color:#999;padding:7px 0 0 7px;display:inline-block}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input{font-family:Consolas,Monaco,monospace;border:0;margin:0;outline:0;-webkit-box-shadow:none;box-shadow:none;display:inline-block;min-width:100%}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th{width:35%;padding-right:20px}.woocommerce-exporter-wrapper .wc-progress-form-content progress,.woocommerce-exporter-wrapper .woocommerce-exporter progress,.woocommerce-exporter-wrapper .woocommerce-importer progress,.woocommerce-importer-wrapper .wc-progress-form-content progress,.woocommerce-importer-wrapper .woocommerce-exporter progress,.woocommerce-importer-wrapper .woocommerce-importer progress,.woocommerce-progress-form-wrapper .wc-progress-form-content progress,.woocommerce-progress-form-wrapper .woocommerce-exporter progress,.woocommerce-progress-form-wrapper .woocommerce-importer progress{width:100%;height:42px;margin:0 auto 24px;display:block;-webkit-appearance:none;border:none;display:none;background:#f5f5f5;border:2px solid #eee;border-radius:4px;padding:0;-webkit-box-shadow:0 1px 0 0 rgba(255,255,255,.2);box-shadow:0 1px 0 0 rgba(255,255,255,.2)}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-webkit-progress-bar,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-webkit-progress-bar,.woocommerce-exporter-wrapper .woocommerce-importer progress::-webkit-progress-bar,.woocommerce-importer-wrapper .wc-progress-form-content progress::-webkit-progress-bar,.woocommerce-importer-wrapper .woocommerce-exporter progress::-webkit-progress-bar,.woocommerce-importer-wrapper .woocommerce-importer progress::-webkit-progress-bar,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-webkit-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-webkit-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-webkit-progress-bar{background:transparent none;border:0;border-radius:4px;padding:0;-webkit-box-shadow:none;box-shadow:none}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-webkit-progress-value,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-webkit-progress-value,.woocommerce-exporter-wrapper .woocommerce-importer progress::-webkit-progress-value,.woocommerce-importer-wrapper .wc-progress-form-content progress::-webkit-progress-value,.woocommerce-importer-wrapper .woocommerce-exporter progress::-webkit-progress-value,.woocommerce-importer-wrapper .woocommerce-importer progress::-webkit-progress-value,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-webkit-progress-value,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-webkit-progress-value,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-webkit-progress-value{border-radius:3px;-webkit-box-shadow:inset 0 1px 1px 0 rgba(255,255,255,.4);box-shadow:inset 0 1px 1px 0 rgba(255,255,255,.4);background:#a46497;background:-webkit-gradient(linear,left top,left bottom,from(#a46497),to(#66405f)),#a46497;background:-webkit-linear-gradient(top,#a46497,#66405f),#a46497;background:linear-gradient(top,#a46497,#66405f),#a46497;-webkit-transition:width 1s ease;transition:width 1s ease}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-moz-progress-bar,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-moz-progress-bar,.woocommerce-exporter-wrapper .woocommerce-importer progress::-moz-progress-bar,.woocommerce-importer-wrapper .wc-progress-form-content progress::-moz-progress-bar,.woocommerce-importer-wrapper .woocommerce-exporter progress::-moz-progress-bar,.woocommerce-importer-wrapper .woocommerce-importer progress::-moz-progress-bar,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-moz-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-moz-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-moz-progress-bar{border-radius:3px;box-shadow:inset 0 1px 1px 0 rgba(255,255,255,.4);background:#a46497;background:linear-gradient(top,#a46497,#66405f),#a46497;-webkit-transition:width 1s ease;transition:width 1s ease}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-ms-fill,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-ms-fill,.woocommerce-exporter-wrapper .woocommerce-importer progress::-ms-fill,.woocommerce-importer-wrapper .wc-progress-form-content progress::-ms-fill,.woocommerce-importer-wrapper .woocommerce-exporter progress::-ms-fill,.woocommerce-importer-wrapper .woocommerce-importer progress::-ms-fill,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-ms-fill,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-ms-fill,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-ms-fill{border-radius:3px;box-shadow:inset 0 1px 1px 0 rgba(255,255,255,.4);background:#a46497;background:linear-gradient(to bottom,#a46497,#66405f),#a46497;-webkit-transition:width 1s ease;transition:width 1s ease}.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .spinner,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing .spinner,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .spinner,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing .spinner,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting .spinner,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing .spinner,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .spinner,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing .spinner,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .spinner,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing .spinner,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting .spinner,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing .spinner,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .spinner,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing .spinner,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .spinner,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing .spinner,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting .spinner,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing .spinner{display:block}.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting progress,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing progress,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting progress,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing progress,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting progress,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing progress,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting progress,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing progress,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting progress,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing progress,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting progress,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing progress,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting progress,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing progress,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting progress,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing progress,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting progress,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing progress{display:block}.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .wc-actions,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing .wc-actions,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .wc-actions,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing .wc-actions,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting .wc-actions,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing .wc-actions,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .wc-actions,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing .wc-actions,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .wc-actions,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing .wc-actions,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting .wc-actions,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing .wc-actions,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .wc-actions,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing .wc-actions,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing .woocommerce-exporter-options{display:none}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table-wrapper{padding:0}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table{margin:0;border:0;-webkit-box-shadow:none;box-shadow:none;width:100%;table-layout:fixed}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th{border:0;padding:12px;vertical-align:middle;word-wrap:break-word}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td select,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th select,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td select,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th select{width:100%}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) th{background:#fbfbfb}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th{font-weight:700}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td:first-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th:first-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td:first-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th:first-child{padding-left:24px}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td:last-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th:last-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td:last-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th:last-child{padding-right:24px}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name{width:50%}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description{color:#999;margin-top:4px;display:block}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description code{background:0 0;padding:0;white-space:pre-line;word-wrap:break-word;word-break:break-all}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-done,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-done,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-done,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-done,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-done,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-done,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-done,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-done,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-done{text-align:center;padding:48px 24px;font-size:1.5em;line-height:1.75em}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-done::before,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-done::before,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-done::before,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-done::before,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-done::before,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-done::before,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-done::before,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-done::before,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-done::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#a16696;position:static;font-size:100px;display:block;float:none;margin:0 0 24px}.wc-pointer .wc-pointer-buttons .close{float:left;margin:6px 0 0 15px} \ No newline at end of file +.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;margin:0 0 -4px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left;padding:0}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin:0;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected],.select2-results__option[data-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none;margin:5px 5px 0 0}.select2-container--default .select2-selection--multiple .select2-selection__rendered li:before{content:'';display:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid #000 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:0 0;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true],.select2-container--default .select2-results__option[data-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected],.select2-container--default .select2-results__option--highlighted[data-selected]{background-color:#0073aa;color:#fff}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top,#fff 50%,#eee 100%);background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single:focus{border:1px solid #0073aa}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top,#eee 50%,#ccc 100%);background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #0073aa}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:0 0;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top,#fff 0,#eee 50%);background-image:linear-gradient(to bottom,#fff 0,#eee 50%);background-repeat:repeat-x}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top,#eee 50%,#fff 100%);background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #0073aa}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #0073aa}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected],.select2-container--classic .select2-results__option--highlighted[data-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#0073aa} +@charset "UTF-8";@-webkit-keyframes spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}.blockUI.blockOverlay::before{height:1em;width:1em;display:block;position:absolute;top:50%;left:50%;margin-left:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.wc_addons_wrap{max-width:1200px}.wc_addons_wrap h1.search-form-title{clear:left;padding:0}.wc_addons_wrap form.search-form{clear:both;display:block;position:relative;margin-top:1em;margin-bottom:1em}.wc_addons_wrap form.search-form input{border:1px solid #ddd;box-shadow:none;height:53px;padding-left:50px;width:100%;margin:0}.wc_addons_wrap form.search-form button{background:0 0;border:none;cursor:pointer;height:53px;position:absolute;width:53px}.wc_addons_wrap .update-plugins .update-count{background-color:#d54e21;border-radius:10px;color:#fff;display:inline-block;font-size:9px;font-weight:600;line-height:17px;margin:1px 0 0 2px;padding:0 6px;vertical-align:text-top}.wc_addons_wrap .addons-featured{margin:0}.wc_addons_wrap ul.subsubsub.subsubsub{margin:-2px 0 12px}.wc_addons_wrap .subsubsub li::after{content:'|'}.wc_addons_wrap .subsubsub li:last-child::after{content:''}.wc_addons_wrap .addons-banner-block-item-icon,.wc_addons_wrap .addons-column-block-item-icon{-webkit-box-align:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.wc_addons_wrap .addons-banner-block,.wc_addons_wrap .addons-wcs-banner-block{background:#fff;border:1px solid #ddd;margin:0 0 1em 0;padding:2em 2em 1em}.wc_addons_wrap .addons-banner-block img{height:62px}.wc_addons_wrap .addons-banner-block p{margin:0 0 20px}.wc_addons_wrap .addons-banner-block-items{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:distribute;justify-content:space-around;margin:0 -10px 0 -10px}.wc_addons_wrap .addons-banner-block-item{border:1px solid #e6e6e6;border-radius:3px;-webkit-box-flex:1;-ms-flex:1;flex:1;margin:1em;min-width:200px;width:30%}.wc_addons_wrap .addons-banner-block-item-icon{background:#f7f7f7;height:143px}.wc_addons_wrap .addons-banner-block-item-content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;height:184px;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:24px}.wc_addons_wrap .addons-banner-block-item-content h3{margin-top:0}.wc_addons_wrap .addons-banner-block-item-content p{margin:0 0 auto}.wc_addons_wrap .addons-wcs-banner-block{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.wc_addons_wrap .addons-wcs-banner-block-image{background:#f7f7f7;border:1px solid #e6e6e6;margin-right:2em;padding:4em}.wc_addons_wrap .addons-wcs-banner-block-image .addons-img{max-height:86px;max-width:97px}.wc_addons_wrap .addons-shipping-methods .addons-wcs-banner-block{margin-left:0;margin-right:0;margin-top:1em}.wc_addons_wrap .addons-wcs-banner-block-content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:distribute;justify-content:space-around;-ms-flex-item-align:stretch;align-self:stretch;padding:1em 0}.wc_addons_wrap .addons-wcs-banner-block-content h1{padding-bottom:0}.wc_addons_wrap .addons-wcs-banner-block-content p{margin-bottom:0}.wc_addons_wrap .addons-wcs-banner-block-content .wcs-service-logo{max-width:40px}.wc_addons_wrap .addons-column-section{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:distribute;justify-content:space-around}.wc_addons_wrap .addons-column{-webkit-box-flex:1;-ms-flex:1;flex:1;width:50%;padding:0 .5em}.wc_addons_wrap .addons-column:nth-child(2){margin-right:0}.wc_addons_wrap .addons-column-block,.wc_addons_wrap .addons-small-dark-block,.wc_addons_wrap .addons-small-light-block{box-sizing:border-box;border:1px solid #ddd;margin:0 0 1em;padding:20px}.wc_addons_wrap .addons-column-block img{max-height:50px;max-width:50px}.wc_addons_wrap .addons-column-block,.wc_addons_wrap .addons-small-light-block{background:#fff}.wc_addons_wrap .addons-column-block-left{float:left}.wc_addons_wrap .addons-column-block-right{float:right}.wc_addons_wrap .addons-column-block-item{border-top:2px solid #f9f9f9;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;margin:0 -20px;padding:20px}.wc_addons_wrap .addons-column-block-item-icon{background:#f7f7f7;border:1px solid #e6e6e6;height:100px;margin:0 10px 10px 0;width:100px}.wc_addons_wrap .addons-column-block-item-content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1;flex:1;-ms-flex-wrap:wrap;flex-wrap:wrap;height:20%;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;min-width:200px}.wc_addons_wrap .addons-column-block-item-content h2{float:left;margin-top:8px}.wc_addons_wrap .addons-column-block-item-content a{float:right}.wc_addons_wrap .addons-column-block-item-content p{float:left}.wc_addons_wrap .addons-banner-block-item,.wc_addons_wrap .addons-column-block-item{display:none}.wc_addons_wrap .addons-banner-block-item:nth-child(-n+3){display:block}.wc_addons_wrap .addons-column-block-item:nth-of-type(-n+3){display:-webkit-box;display:-ms-flexbox;display:flex}.wc_addons_wrap .addons-small-dark-block{background-color:#54687d;text-align:center}.wc_addons_wrap .addons-small-dark-items{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:distribute;justify-content:space-around}.wc_addons_wrap .addons-small-dark-item{margin:0 0 20px}.wc_addons_wrap .addons-small-dark-block h1{color:#fff}.wc_addons_wrap .addons-small-dark-block p{color:#fafafa}.wc_addons_wrap .addons-small-dark-item-icon img{height:30px}.wc_addons_wrap .addons-small-dark-item a{margin:28px auto 0}.wc_addons_wrap .addons-small-light-block{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap}.wc_addons_wrap .addons-small-light-block h1{margin-top:-12px}.wc_addons_wrap .addons-small-light-block p{margin-top:0}.wc_addons_wrap .addons-small-light-block img{height:225px;margin:0 0 0 -20px}.wc_addons_wrap .addons-small-light-block-content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 1 100px;flex:1 1 100px;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:distribute;justify-content:space-around}.wc_addons_wrap .addons-small-light-block-buttons{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.wc_addons_wrap .addons-small-light-block-content a{width:48%}.wc_addons_wrap .addons-button{border-radius:3px;cursor:pointer;display:block;height:37px;line-height:37px;text-align:center;text-decoration:none;width:124px}.wc_addons_wrap .addons-button-solid{background-color:#955a89;color:#fff}.wc_addons_wrap .addons-button-solid:hover{color:#fff;opacity:.8}.wc_addons_wrap .addons-button-outline-green{border:1px solid #73ae39;color:#73ae39}.wc_addons_wrap .addons-button-outline-green:hover{color:#73ae39;opacity:.8}.wc_addons_wrap .addons-button-outline-white{border:1px solid #fff;color:#fff}.wc_addons_wrap .addons-button-outline-white:hover{color:#fff;opacity:.8}.wc_addons_wrap .addons-button-installed{background:#e6e6e6;color:#3c3c3c}.wc_addons_wrap .addons-button-installed:hover{color:#3c3c3c;opacity:.8}@media only screen and (max-width:400px){.wc_addons_wrap .addons-featured{margin:-1% -5%}.wc_addons_wrap .addons-button{width:100%}.wc_addons_wrap .addons-small-dark-item{width:100%}.wc_addons_wrap .addons-column-block-item-icon{background:0 0;border:none;height:75px;margin:0 10px 10px 0;width:75px}}.wc_addons_wrap .products{overflow:hidden;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row;flex-flow:row;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0 -.5em}.wc_addons_wrap .products li{float:left;border:1px solid #ddd;margin:0 .5em 1em!important;padding:0;vertical-align:top;width:25%;min-width:280px;min-height:220px;-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:hidden;background:#f5f5f5;box-shadow:inset 0 1px 0 rgba(255,255,255,.2),inset 0 -1px 0 rgba(0,0,0,.1)}.wc_addons_wrap .products li a{text-decoration:none;color:inherit;display:block;height:100%}.wc_addons_wrap .products li a .product-img-wrap{background:#fff;display:block}.wc_addons_wrap .products li a img{max-width:258px;max-height:24px;padding:17px 20px;display:block;margin:0;background:#fff;border-right:260px solid #fff}.wc_addons_wrap .products li a img.extension-thumb+h3{display:none}.wc_addons_wrap .products li a .price{display:none}.wc_addons_wrap .products li a h2,.wc_addons_wrap .products li a h3{margin:0!important;padding:20px!important;background:#fff}.wc_addons_wrap .products li a p{padding:20px!important;margin:0!important;border-top:1px solid #f1f1f1}.wc_addons_wrap .products li a:focus,.wc_addons_wrap .products li a:hover{background-color:#fff}.wc_addons_wrap .storefront{background:url(../images/storefront-bg.jpg) bottom right #f6f6f6;border:1px solid #ddd;margin-top:1em;padding:20px;overflow:hidden;zoom:1}.wc_addons_wrap .storefront img{width:278px;height:auto;float:left;margin:0 20px 0 0;box-shadow:0 1px 6px rgba(0,0,0,.1)}.wc_addons_wrap .storefront p{max-width:750px}.woocommerce-BlankState a.button-primary,.woocommerce-BlankState button.button-primary,.woocommerce-message a.button-primary,.woocommerce-message button.button-primary{background:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;color:#fff;text-shadow:0 -1px 1px #a36597,1px 0 1px #a36597,0 1px 1px #a36597,-1px 0 1px #a36597;display:inline-block}.woocommerce-BlankState a.button-primary:active,.woocommerce-BlankState a.button-primary:focus,.woocommerce-BlankState a.button-primary:hover,.woocommerce-BlankState button.button-primary:active,.woocommerce-BlankState button.button-primary:focus,.woocommerce-BlankState button.button-primary:hover,.woocommerce-message a.button-primary:active,.woocommerce-message a.button-primary:focus,.woocommerce-message a.button-primary:hover,.woocommerce-message button.button-primary:active,.woocommerce-message button.button-primary:focus,.woocommerce-message button.button-primary:hover{background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.woocommerce-message{position:relative;border-left-color:#cc99c2!important;overflow:hidden}.woocommerce-message a.docs,.woocommerce-message a.skip{text-decoration:none!important}.woocommerce-message a.woocommerce-message-close{position:static;float:right;padding:0 15px 10px 28px;margin-top:-10px;font-size:13px;line-height:1.23076923;text-decoration:none}.woocommerce-message a.woocommerce-message-close::before{position:relative;top:18px;left:-20px;-webkit-transition:all .1s ease-in-out;transition:all .1s ease-in-out}.woocommerce-message .twitter-share-button{margin-top:-3px;margin-left:3px;vertical-align:middle}#variable_product_options #message,#variable_product_options .notice{margin:10px}.clear{clear:both}.wrap.woocommerce div.error,.wrap.woocommerce div.updated{margin-top:10px}mark.amount{background:transparent none;color:inherit}.simplify-commerce-banner{overflow:hidden}.simplify-commerce-banner img{float:right;padding:15px 0;margin-left:1em;width:200px}.woocommerce-help-tip{color:#666;display:inline-block;font-size:1.1em;font-style:normal;height:16px;line-height:16px;position:relative;vertical-align:middle;width:16px}.woocommerce-help-tip::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";cursor:help}h2 .woocommerce-help-tip{margin-top:-5px;margin-left:.25em}table.wc_status_table{margin-bottom:1em}table.wc_status_table h2{font-size:14px;margin:0}table.wc_status_table tr:nth-child(2n) td,table.wc_status_table tr:nth-child(2n) th{background:#fcfcfc}table.wc_status_table th{font-weight:700;padding:9px}table.wc_status_table td:first-child{width:33%}table.wc_status_table td.help{width:1em}table.wc_status_table td,table.wc_status_table th{font-size:1.1em;font-weight:400}table.wc_status_table td.run-tool,table.wc_status_table th.run-tool{text-align:right}table.wc_status_table td strong.name,table.wc_status_table th strong.name{display:block;margin-bottom:.5em}table.wc_status_table td mark,table.wc_status_table th mark{background:transparent none}table.wc_status_table td mark.yes,table.wc_status_table th mark.yes{color:#7ad03a}table.wc_status_table td mark.no,table.wc_status_table th mark.no{color:#999}table.wc_status_table td .red,table.wc_status_table td mark.error,table.wc_status_table th .red,table.wc_status_table th mark.error{color:#a00}table.wc_status_table td ul,table.wc_status_table th ul{margin:0}table.wc_status_table .help_tip{cursor:help}table.wc_status_table--tools td,table.wc_status_table--tools th{padding:2em}.taxonomy-product_cat .column-thumb .woocommerce-help-tip{font-size:1.5em;margin:0 0 0 -34px;padding:0 2px 5px;display:block;position:absolute}#debug-report{display:none;margin:10px 0;padding:0;position:relative}#debug-report textarea{font-family:monospace;width:100%;margin:0;height:300px;padding:20px;border-radius:0;resize:none;font-size:12px;line-height:20px;outline:0}.wp-list-table.logs .log-level{display:inline;padding:.2em .6em .3em;font-size:80%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.2em}.wp-list-table.logs .log-level:empty{display:none}.wp-list-table.logs .log-level--alert,.wp-list-table.logs .log-level--emergency{background-color:#ff4136}.wp-list-table.logs .log-level--critical,.wp-list-table.logs .log-level--error{background-color:#ff851b}.wp-list-table.logs .log-level--notice,.wp-list-table.logs .log-level--warning{color:#222;background-color:#ffdc00}.wp-list-table.logs .log-level--info{background-color:#0074d9}.wp-list-table.logs .log-level--debug{background-color:#3d9970}@media screen and (min-width:783px){.wp-list-table.logs .column-timestamp{width:18%}.wp-list-table.logs .column-level{width:14%}.wp-list-table.logs .column-source{width:15%}}#log-viewer-select{padding:10px 0 8px;line-height:28px}#log-viewer-select h2 a{vertical-align:middle}#log-viewer{background:#fff;border:1px solid #e5e5e5;box-shadow:0 1px 1px rgba(0,0,0,.04);padding:5px 20px}#log-viewer pre{font-family:monospace;white-space:pre-wrap;word-wrap:break-word}.inline-edit-product.quick-edit-row .inline-edit-col-center,.inline-edit-product.quick-edit-row .inline-edit-col-right{float:right!important}#woocommerce-fields.inline-edit-col{clear:left}#woocommerce-fields.inline-edit-col label.featured,#woocommerce-fields.inline-edit-col label.manage_stock{margin-left:10px}#woocommerce-fields.inline-edit-col label.stock_status_field{clear:both;float:left}#woocommerce-fields.inline-edit-col .dimensions div{display:block;margin:.2em 0}#woocommerce-fields.inline-edit-col .dimensions div span.title{display:block;float:left;width:5em}#woocommerce-fields.inline-edit-col .dimensions div span.input-text-wrap{display:block;margin-left:5em}#woocommerce-fields.inline-edit-col .text{box-sizing:border-box;width:99%;float:left;margin:1px 1% 1px 1px}#woocommerce-fields.inline-edit-col .height,#woocommerce-fields.inline-edit-col .length,#woocommerce-fields.inline-edit-col .width{width:32.33%}#woocommerce-fields.inline-edit-col .height{margin-right:0}#woocommerce-fields-bulk.inline-edit-col label{clear:left}#woocommerce-fields-bulk.inline-edit-col .inline-edit-group label{clear:none;width:49%;margin:.2em 0}#woocommerce-fields-bulk.inline-edit-col .inline-edit-group.dimensions label{width:75%;max-width:75%}#woocommerce-fields-bulk.inline-edit-col .length,#woocommerce-fields-bulk.inline-edit-col .regular_price,#woocommerce-fields-bulk.inline-edit-col .sale_price,#woocommerce-fields-bulk.inline-edit-col .stock,#woocommerce-fields-bulk.inline-edit-col .weight{box-sizing:border-box;width:100%;margin-left:4.4em}#woocommerce-fields-bulk.inline-edit-col .height,#woocommerce-fields-bulk.inline-edit-col .length,#woocommerce-fields-bulk.inline-edit-col .width{box-sizing:border-box;width:25%}.column-coupon_code{line-height:2.25em}.column-coupon_code,ul.wc_coupon_list{margin:0;overflow:hidden;zoom:1;clear:both}ul.wc_coupon_list{padding-bottom:5px}ul.wc_coupon_list li{margin:0}ul.wc_coupon_list li.code{display:inline-block;position:relative;padding:0 .5em;background-color:#fff;border:1px solid #aaa;box-shadow:0 1px 0 #dfdfdf;border-radius:4px;margin-right:5px;margin-top:5px}ul.wc_coupon_list li.code.editable{padding-right:2em}ul.wc_coupon_list li.code .tips{cursor:pointer}ul.wc_coupon_list li.code .tips span{color:#888}ul.wc_coupon_list li.code .tips span:hover{color:#000}ul.wc_coupon_list li.code .remove-coupon{text-decoration:none;color:#888;position:absolute;top:7px;right:20px}ul.wc_coupon_list li.code .remove-coupon::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}ul.wc_coupon_list li.code .remove-coupon:hover::before{color:#a00}ul.wc_coupon_list_block{margin:0;padding-bottom:2px}ul.wc_coupon_list_block li{border-top:1px solid #fff;border-bottom:1px solid #ccc;line-height:2.5em;margin:0;padding:.5em 0}ul.wc_coupon_list_block li:first-child{border-top:0;padding-top:0}ul.wc_coupon_list_block li:last-child{border-bottom:0;padding-bottom:0}.button.wc-reload{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;padding:0;height:28px;width:28px!important;display:inline-block}.button.wc-reload::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";line-height:28px}#woocommerce-order-data .handlediv,#woocommerce-order-data .hndle{display:none}#woocommerce-order-data .inside{display:block!important}#order_data{padding:23px 24px 12px}#order_data h2{margin:0;font-family:HelveticaNeue-Light,'Helvetica Neue Light','Helvetica Neue',sans-serif;font-size:21px;font-weight:400;line-height:1.2;text-shadow:1px 1px 1px #fff;padding:0}#order_data h3{font-size:14px}#order_data h3,#order_data h4{color:#333;margin:1.33em 0 0}#order_data p{color:#777}#order_data p.order_number{margin:0;font-family:HelveticaNeue-Light,'Helvetica Neue Light','Helvetica Neue',sans-serif;font-weight:400;line-height:1.6em;font-size:16px}#order_data .order_data_column_container{clear:both}#order_data .order_data_column{width:32%;padding:0 2% 0 0;float:left}#order_data .order_data_column>h3 span{display:block}#order_data .order_data_column:last-child{padding-right:0}#order_data .order_data_column p{padding:0!important}#order_data .order_data_column .address strong{display:block}#order_data .order_data_column .form-field{float:left;clear:left;width:48%;padding:0;margin:9px 0 0}#order_data .order_data_column .form-field label{display:block;padding:0 0 3px}#order_data .order_data_column .form-field input,#order_data .order_data_column .form-field textarea{width:100%}#order_data .order_data_column .form-field select{width:100%}#order_data .order_data_column .form-field .select2-container{width:100%!important}#order_data .order_data_column .form-field .date-picker{width:50%}#order_data .order_data_column .form-field .hour,#order_data .order_data_column .form-field .minute{width:3.5em}#order_data .order_data_column .form-field small{display:block;margin:5px 0 0;color:#999}#order_data .order_data_column ._billing_address_2_field,#order_data .order_data_column ._billing_last_name_field,#order_data .order_data_column ._billing_phone_field,#order_data .order_data_column ._billing_postcode_field,#order_data .order_data_column ._billing_state_field,#order_data .order_data_column ._shipping_address_2_field,#order_data .order_data_column ._shipping_last_name_field,#order_data .order_data_column ._shipping_postcode_field,#order_data .order_data_column ._shipping_state_field,#order_data .order_data_column .form-field.last{float:right;clear:right}#order_data .order_data_column ._billing_company_field,#order_data .order_data_column ._shipping_company_field,#order_data .order_data_column ._transaction_id_field,#order_data .order_data_column .form-field-wide{width:100%;clear:both}#order_data .order_data_column ._billing_company_field .wc-category-search,#order_data .order_data_column ._billing_company_field .wc-customer-search,#order_data .order_data_column ._billing_company_field .wc-enhanced-select,#order_data .order_data_column ._billing_company_field input,#order_data .order_data_column ._billing_company_field select,#order_data .order_data_column ._billing_company_field textarea,#order_data .order_data_column ._shipping_company_field .wc-category-search,#order_data .order_data_column ._shipping_company_field .wc-customer-search,#order_data .order_data_column ._shipping_company_field .wc-enhanced-select,#order_data .order_data_column ._shipping_company_field input,#order_data .order_data_column ._shipping_company_field select,#order_data .order_data_column ._shipping_company_field textarea,#order_data .order_data_column ._transaction_id_field .wc-category-search,#order_data .order_data_column ._transaction_id_field .wc-customer-search,#order_data .order_data_column ._transaction_id_field .wc-enhanced-select,#order_data .order_data_column ._transaction_id_field input,#order_data .order_data_column ._transaction_id_field select,#order_data .order_data_column ._transaction_id_field textarea,#order_data .order_data_column .form-field-wide .wc-category-search,#order_data .order_data_column .form-field-wide .wc-customer-search,#order_data .order_data_column .form-field-wide .wc-enhanced-select,#order_data .order_data_column .form-field-wide input,#order_data .order_data_column .form-field-wide select,#order_data .order_data_column .form-field-wide textarea{width:100%}#order_data .order_data_column p.none_set{color:#999}#order_data .order_data_column div.edit_address{display:none;zoom:1;padding-right:1px}#order_data .order_data_column .wc-customer-user label a,#order_data .order_data_column .wc-order-status label a{float:right;margin-left:8px}#order_data .order_data_column a.edit_address{width:14px;height:0;padding:14px 0 0;margin:0 0 0 6px;overflow:hidden;position:relative;color:#999;border:0;float:right}#order_data .order_data_column a.edit_address:focus,#order_data .order_data_column a.edit_address:hover{color:#000}#order_data .order_data_column a.edit_address::after{font-family:WooCommerce;position:absolute;top:0;left:0;text-align:center;vertical-align:top;line-height:14px;font-size:14px;font-weight:400}#order_data .order_data_column a.edit_address::after{font-family:Dashicons;content:'\f464'}#order_data .order_data_column .billing-same-as-shipping,#order_data .order_data_column .load_customer_billing,#order_data .order_data_column .load_customer_shipping{font-size:13px;display:inline-block;font-weight:400}#order_data .order_data_column .load_customer_shipping{margin-right:.3em}.order_actions{margin:0;overflow:hidden;zoom:1}.order_actions li{border-top:1px solid #fff;border-bottom:1px solid #ddd;padding:6px 0;margin:0;line-height:1.6em;float:left;width:50%;text-align:center}.order_actions li a{float:none;text-align:center;text-decoration:underline}.order_actions li.wide{width:auto;float:none;clear:both;padding:6px;text-align:left;overflow:hidden}.order_actions li #delete-action{line-height:25px;vertical-align:middle;text-align:left;float:left}.order_actions li .save_order{float:right}.order_actions li#actions{overflow:hidden}.order_actions li#actions .button{width:24px;box-sizing:border-box;float:right}.order_actions li#actions select{width:225px;box-sizing:border-box;float:left}#woocommerce-order-items .inside{margin:0;padding:0;background:#fefefe}#woocommerce-order-items .wc-order-data-row{border-bottom:1px solid #dfdfdf;padding:1.5em 2em;background:#f8f8f8;line-height:2em;text-align:right}#woocommerce-order-items .wc-order-data-row::after,#woocommerce-order-items .wc-order-data-row::before{content:' ';display:table}#woocommerce-order-items .wc-order-data-row::after{clear:both}#woocommerce-order-items .wc-order-data-row p{margin:0;line-height:2em}#woocommerce-order-items .wc-order-data-row .wc-used-coupons{text-align:left}#woocommerce-order-items .wc-order-data-row .wc-used-coupons .tips{display:inline-block}#woocommerce-order-items .wc-used-coupons{float:left;width:50%}#woocommerce-order-items .wc-order-totals{float:right;width:50%;margin:0;padding:0;text-align:right}#woocommerce-order-items .wc-order-totals .amount{font-weight:700}#woocommerce-order-items .wc-order-totals .label{vertical-align:top}#woocommerce-order-items .wc-order-totals .total{font-size:1em!important;width:10em;margin:0 0 0 .5em;box-sizing:border-box}#woocommerce-order-items .wc-order-totals .total input[type=text]{width:96%;float:right}#woocommerce-order-items .wc-order-totals .refunded-total{color:#a00}#woocommerce-order-items .refund-actions{margin-top:5px;padding-top:12px;border-top:1px solid #dfdfdf}#woocommerce-order-items .refund-actions .button{float:right;margin-left:4px}#woocommerce-order-items .refund-actions .cancel-action{float:left;margin-left:0}#woocommerce-order-items .add_meta{margin-left:0!important}#woocommerce-order-items h3 small{color:#999}#woocommerce-order-items .amount{white-space:nowrap}#woocommerce-order-items .add-items .description{margin-right:10px}#woocommerce-order-items .add-items .button{float:left;margin-right:.25em}#woocommerce-order-items .add-items .button-primary{float:none;margin-right:0}#woocommerce-order-items .inside{display:block!important}#woocommerce-order-items .handlediv,#woocommerce-order-items .hndle{display:none}#woocommerce-order-items .woocommerce_order_items_wrapper{margin:0;overflow-x:auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items{width:100%;background:#fff}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th{text-align:left;padding:1em;font-weight:400;color:#999;background:#f8f8f8;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th.sortable{cursor:pointer}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th:last-child{padding-right:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th:first-child{padding-left:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th .wc-arrow{float:right;position:relative;margin-right:-1em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td{padding:1.5em 1em 1em;text-align:left;line-height:1.5em;vertical-align:top;border-bottom:1px solid #f8f8f8}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td textarea{width:100%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td select{width:50%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td textarea{font-size:14px;padding:4px;color:#555}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th:last-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td:last-child{padding-right:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td:first-child{padding-left:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody tr:last-child td{border-bottom:1px solid #dfdfdf}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody tr:first-child td{border-top:8px solid #f8f8f8}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody#order_line_items tr:first-child td{border-top:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb{text-align:left;width:38px;padding-bottom:1.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb .wc-order-item-thumbnail{width:38px;height:38px;border:2px solid #e8e8e8;background:#f8f8f8;color:#ccc;position:relative;font-size:21px;display:block;text-align:center}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb .wc-order-item-thumbnail::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";width:38px;line-height:38px;display:block}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb .wc-order-item-thumbnail img{width:100%;height:100%;margin:0;padding:0;position:relative}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.name .wc-order-item-sku,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.name .wc-order-item-variation{display:block;margin-top:.5em;font-size:.92em!important;color:#888}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item{min-width:200px}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .center,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .variation-id{text-align:center}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class{text-align:right}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class label{white-space:nowrap;color:#999;font-size:.833em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class label input{display:inline}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class input{width:70px;vertical-align:middle;text-align:right}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class select{width:85px;height:26px;vertical-align:middle;font-size:1em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input{display:inline-block;background:#fff;border:1px solid #ddd;box-shadow:inset 0 1px 2px rgba(0,0,0,.07);margin:1px 0;min-width:80px;overflow:hidden;line-height:1em;text-align:right}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input{width:100%;box-sizing:border-box}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input label{font-size:.75em;padding:4px 6px 0;color:#555;display:block}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input input{width:100%;box-sizing:border-box;border:0;box-shadow:none;margin:0;padding:0 6px 4px;color:#555;background:0 0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input input::-webkit-input-placeholder{color:#ddd}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input:first-child{border-bottom:1px dashed #ddd;background:#fff}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input:first-child label{color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input:first-child input{color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .view{white-space:nowrap}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .edit{text-align:left}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class small.times{font-size:.92em!important;color:#888}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-taxes{margin:0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-taxes label{display:block}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-discount{display:block;margin-top:.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class small.times{margin-right:.25em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity{text-align:center}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity input{text-align:center;width:50px}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items span.subtotal{opacity:.5}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.tax_class,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.tax_class{text-align:left}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .calculated{border-color:#ae8ca2;border-style:dotted}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta{width:100%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta{margin:.5em 0 0;font-size:.92em!important;color:#888}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr th,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr th{border:0;padding:0 4px .5em 0;line-height:1.5em;width:20%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td{padding:0 4px .5em 0;border:0;line-height:1.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td input{width:100%;margin:0;position:relative;border-bottom:0;box-shadow:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td textarea{width:100%;height:4em;margin:0;box-shadow:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td input:focus+textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td input:focus+textarea{border-top-color:#999}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td p,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td p{margin:0 0 .5em;line-height:1.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td p:last-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td p:last-child{margin:0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .refund_by{border-bottom:1px dotted #999}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.fee .thumb div{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.5em;line-height:1em;vertical-align:middle;margin:0 auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.fee .thumb div::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.refund .thumb div{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.5em;line-height:1em;vertical-align:middle;margin:0 auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.refund .thumb div::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .thumb div{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.5em;line-height:1em;vertical-align:middle;margin:0 auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .thumb div::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .shipping_method,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .shipping_method_name{width:100%;margin:0 0 .5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax{white-space:nowrap}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax .delete-order-tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax .delete-order-tax{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;float:right;font-size:14px;visibility:hidden;margin:3px -18px 0 0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax .delete-order-tax::before,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax .delete-order-tax::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#999}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax .delete-order-tax:hover::before,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax .delete-order-tax:hover::before{color:#a00}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax:hover .delete-order-tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax:hover .delete-order-tax{visibility:visible}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items small.refunded{display:block;color:#a00;white-space:nowrap;margin-top:.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items small.refunded::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";position:relative;top:auto;left:auto;margin:-1px 4px 0 0;vertical-align:middle;line-height:1em}#woocommerce-order-items .wc-order-edit-line-item{padding-left:0}#woocommerce-order-items .wc-order-edit-line-item-actions{width:44px;text-align:right;padding-left:0;vertical-align:middle}#woocommerce-order-items .wc-order-edit-line-item-actions a{color:#ccc;display:inline-block;cursor:pointer;padding:0 0 .5em;margin:0 0 0 12px;vertical-align:middle;text-decoration:none;line-height:16px;width:16px;overflow:hidden}#woocommerce-order-items .wc-order-edit-line-item-actions a::before{margin:0;padding:0;font-size:16px;width:16px;height:16px}#woocommerce-order-items .wc-order-edit-line-item-actions a:hover::before{color:#999}#woocommerce-order-items .wc-order-edit-line-item-actions a:first-child{margin-left:0}#woocommerce-order-items .wc-order-edit-line-item-actions .edit-order-item::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";position:relative}#woocommerce-order-items .wc-order-edit-line-item-actions .delete-order-item::before,#woocommerce-order-items .wc-order-edit-line-item-actions .delete_refund::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";position:relative}#woocommerce-order-items .wc-order-edit-line-item-actions .delete-order-item:hover::before,#woocommerce-order-items .wc-order-edit-line-item-actions .delete_refund:hover::before{color:#a00}#woocommerce-order-items tbody tr .wc-order-edit-line-item-actions{visibility:hidden}#woocommerce-order-items tbody tr:hover .wc-order-edit-line-item-actions{visibility:visible}#woocommerce-order-items .wc-order-totals .wc-order-edit-line-item-actions{width:1.5em;visibility:visible!important}#woocommerce-order-items .wc-order-totals .wc-order-edit-line-item-actions a{padding:0}#woocommerce-order-downloads .buttons{float:left;padding:0;margin:0;vertical-align:top}#woocommerce-order-downloads .buttons .add_item_id,#woocommerce-order-downloads .buttons .select2-container{width:400px!important;margin-right:9px;vertical-align:top;float:left}#woocommerce-order-downloads .buttons button{margin:2px 0 0}#woocommerce-order-downloads h3 small{color:#999}#poststuff #woocommerce-order-actions .inside{margin:0;padding:0}#poststuff #woocommerce-order-actions .inside ul.order_actions li{padding:6px 10px;box-sizing:border-box}#poststuff #woocommerce-order-actions .inside ul.order_actions li:last-child{border-bottom:0}#poststuff #woocommerce-order-notes .inside{margin:0;padding:0}#poststuff #woocommerce-order-notes .inside ul.order_notes li{padding:0 10px}#woocommerce_customers p.search-box{margin:6px 0 4px;float:left}#woocommerce_customers .tablenav{float:right;clear:none}.widefat.customers td{vertical-align:middle;padding:4px 7px}.widefat .column-order_title{width:15%}.widefat .column-order_title time{display:block;color:#999;margin:3px 0}.widefat .column-orders,.widefat .column-paying,.widefat .column-spent{text-align:center;width:8%}.widefat .column-last_order{width:11%}.widefat .column-wc_actions{width:110px}.widefat .column-wc_actions a.button{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;display:inline-block;margin:2px 4px 2px 0;padding:0!important;height:2em!important;width:2em;overflow:hidden}.widefat .column-wc_actions a.button::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;line-height:1.85}.widefat .column-wc_actions a.button img{display:block;width:12px;height:auto}.widefat .column-wc_actions a.edit::after{content:'\f464'}.widefat .column-wc_actions a.link::after{font-family:WooCommerce;content:'\e00d'}.widefat .column-wc_actions a.view::after{content:'\f177'}.widefat .column-wc_actions a.refresh::after{font-family:WooCommerce;content:'\e031'}.widefat .column-wc_actions a.processing::after{font-family:WooCommerce;content:'\e00f'}.widefat .column-wc_actions a.complete::after{content:'\f147'}.widefat small.meta{display:block;color:#999;font-size:inherit;margin:3px 0}.post-type-shop_order .tablenav .one-page .displaying-num{display:none}.post-type-shop_order .wp-list-table{margin-top:1em}.post-type-shop_order .wp-list-table tfoot th,.post-type-shop_order .wp-list-table thead th{padding:.75em 1em}.post-type-shop_order .wp-list-table tfoot th.sortable a,.post-type-shop_order .wp-list-table tfoot th.sorted a,.post-type-shop_order .wp-list-table thead th.sortable a,.post-type-shop_order .wp-list-table thead th.sorted a{padding:0}.post-type-shop_order .wp-list-table tfoot th:first-child,.post-type-shop_order .wp-list-table thead th:first-child{padding-left:2em}.post-type-shop_order .wp-list-table tfoot th:last-child,.post-type-shop_order .wp-list-table thead th:last-child{padding-right:2em}.post-type-shop_order .wp-list-table tbody td,.post-type-shop_order .wp-list-table tbody th{padding:1em;line-height:26px}.post-type-shop_order .wp-list-table tbody td:first-child{padding-left:2em}.post-type-shop_order .wp-list-table tbody td:last-child{padding-right:2em}.post-type-shop_order .wp-list-table tbody tr{border-top:1px solid #f5f5f5}.post-type-shop_order .wp-list-table tbody tr:hover:not(.status-trash):not(.no-link) td{cursor:pointer}.post-type-shop_order .wp-list-table .no-link{cursor:default!important}.post-type-shop_order .wp-list-table td,.post-type-shop_order .wp-list-table th{width:12ch;vertical-align:middle}.post-type-shop_order .wp-list-table td p,.post-type-shop_order .wp-list-table th p{margin:0}.post-type-shop_order .wp-list-table .check-column{width:1px;white-space:nowrap;padding:1em 1em 1em 1em!important;vertical-align:middle}.post-type-shop_order .wp-list-table .check-column input{vertical-align:text-top;margin:1px 0}.post-type-shop_order .wp-list-table .column-order_number{width:20ch}.post-type-shop_order .wp-list-table .column-order_total{width:8ch;text-align:right}.post-type-shop_order .wp-list-table .column-order_total a span{float:right}.post-type-shop_order .wp-list-table .column-order_date,.post-type-shop_order .wp-list-table .column-order_status{width:10ch}.post-type-shop_order .wp-list-table .column-order_status{width:14ch}.post-type-shop_order .wp-list-table .column-billing_address,.post-type-shop_order .wp-list-table .column-shipping_address{width:20ch;line-height:1.5em}.post-type-shop_order .wp-list-table .column-billing_address .description,.post-type-shop_order .wp-list-table .column-shipping_address .description{display:block;color:#999}.post-type-shop_order .wp-list-table .column-wc_actions{text-align:right}.post-type-shop_order .wp-list-table .column-wc_actions a.button{text-indent:9999px;margin:2px 0 2px 4px}.post-type-shop_order .wp-list-table .order-preview{float:right;width:16px;padding:20px 4px 4px 4px;height:0;overflow:hidden;position:relative;border:2px solid transparent;border-radius:4px}.post-type-shop_order .wp-list-table .order-preview::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";line-height:16px;font-size:14px;vertical-align:middle;top:4px}.post-type-shop_order .wp-list-table .order-preview:hover{border:2px solid #00a0d2}.post-type-shop_order .wp-list-table .order-preview.disabled::before{content:'';background:url(../images/wpspin.gif) no-repeat center top}.order-status{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;line-height:2.5em;color:#777;background:#e5e5e5;border-radius:4px;border-bottom:1px solid rgba(0,0,0,.05);margin:-.25em 0;cursor:inherit!important;white-space:nowrap;max-width:100%}.order-status.status-completed{background:#c8d7e1;color:#2e4453}.order-status.status-on-hold{background:#f8dda7;color:#94660c}.order-status.status-failed{background:#eba3a3;color:#761919}.order-status.status-processing{background:#c6e1c6;color:#5b841b}.order-status.status-trash{background:#eba3a3;color:#761919}.order-status>span{margin:0 1em;overflow:hidden;text-overflow:ellipsis}.wc-order-preview .order-status{float:right;margin-right:54px}.wc-order-preview article{padding:0!important}.wc-order-preview .modal-close{border-radius:0}.wc-order-preview .wc-order-preview-table{width:100%;margin:0}.wc-order-preview .wc-order-preview-table td,.wc-order-preview .wc-order-preview-table th{padding:1em 1.5em;text-align:left;border:0;border-bottom:1px solid #eee;margin:0;background:0 0;box-shadow:none;text-align:right;vertical-align:top}.wc-order-preview .wc-order-preview-table td:first-child,.wc-order-preview .wc-order-preview-table th:first-child{text-align:left}.wc-order-preview .wc-order-preview-table th{border-color:#ccc}.wc-order-preview .wc-order-preview-table tr:last-child td{border:0}.wc-order-preview .wc-order-preview-table .wc-order-item-sku{margin-top:.5em}.wc-order-preview .wc-order-preview-table .wc-order-item-meta{margin-top:.5em}.wc-order-preview .wc-order-preview-table .wc-order-item-meta td,.wc-order-preview .wc-order-preview-table .wc-order-item-meta th{padding:0;border:0;text-align:left;vertical-align:top}.wc-order-preview .wc-order-preview-table .wc-order-item-meta td:last-child{padding-left:.5em}.wc-order-preview .wc-order-preview-addresses{overflow:hidden;padding-bottom:1.5em}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note{width:50%;float:left;padding:1.5em 1.5em 0;box-sizing:border-box;word-wrap:break-word}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address h2,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note h2{margin-top:0}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address strong,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note strong{display:block;margin-top:1.5em}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address strong:first-child,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note strong:first-child{margin-top:0}.wc-order-preview footer .wc-action-button-group{display:inline-block;float:left}.wc-order-preview footer .button.button-large{margin-left:10px;padding:0 10px!important;line-height:28px;height:auto;display:inline-block}.wc-order-preview .wc-action-button-group label{display:none}.wc-action-button-group{vertical-align:middle;line-height:26px;text-align:left}.wc-action-button-group label{margin-right:6px;cursor:default;font-weight:700;line-height:28px}.wc-action-button-group .wc-action-button-group__items{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-line-pack:start;align-content:flex-start;-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.wc-action-button-group .wc-action-button{margin:0 0 0 -1px!important;border:1px solid #ccc;padding:0 10px!important;border-radius:0!important;float:none;line-height:28px;height:auto;z-index:1;position:relative;overflow:hidden;text-overflow:ellipsis;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;box-sizing:border-box;text-align:center;white-space:nowrap}.wc-action-button-group .wc-action-button:focus,.wc-action-button-group .wc-action-button:hover{border:1px solid #999;z-index:2}.wc-action-button-group .wc-action-button:first-child{margin-left:0!important;border-top-left-radius:3px!important;border-bottom-left-radius:3px!important}.wc-action-button-group .wc-action-button:last-child{border-top-right-radius:3px!important;border-bottom-right-radius:3px!important}@media screen and (max-width:782px){.wc-order-preview footer .wc-action-button-group .wc-action-button-group__items{display:-webkit-box;display:-ms-flexbox;display:flex}.wc-order-preview footer .wc-action-button-group{float:none;display:block;margin-bottom:4px}.wc-order-preview footer .button.button-large{width:100%;float:none;text-align:center;margin:0;display:block}.post-type-shop_order .wp-list-table td.check-column{width:1em}.post-type-shop_order .wp-list-table td.column-order_number{padding-left:0;padding-bottom:.5em}.post-type-shop_order .wp-list-table td.column-order_date,.post-type-shop_order .wp-list-table td.column-order_status{display:inline-block!important;padding:0 1em 1em 1em!important}.post-type-shop_order .wp-list-table td.column-order_date:before,.post-type-shop_order .wp-list-table td.column-order_status:before{display:none!important}.post-type-shop_order .wp-list-table td.column-order_date{padding-left:0!important}.post-type-shop_order .wp-list-table td.column-order_status{float:right}}.column-customer_message .note-on{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto;color:#999}.column-customer_message .note-on::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";line-height:16px}.column-order_notes .note-on{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto;color:#999}.column-order_notes .note-on::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";line-height:16px}.attributes-table td,.attributes-table th{width:15%;vertical-align:top}.attributes-table .attribute-terms{width:32%}.attributes-table .attribute-actions{width:2em}.attributes-table .attribute-actions .configure-terms{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;padding:0!important;height:2em!important;width:2em}.attributes-table .attribute-actions .configure-terms::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";font-family:Dashicons;line-height:1.85}ul.order_notes{padding:2px 0 0}ul.order_notes li .note_content{padding:10px;background:#efefef;position:relative}ul.order_notes li .note_content p{margin:0;padding:0;word-wrap:break-word}ul.order_notes li p.meta{padding:10px;color:#999;margin:0;font-size:11px}ul.order_notes li p.meta .exact-date{border-bottom:1px dotted #999}ul.order_notes li a.delete_note{color:#a00}ul.order_notes li .note_content::after{content:'';display:block;position:absolute;bottom:-10px;left:20px;width:0;height:0;border-width:10px 10px 0 0;border-style:solid;border-color:#efefef transparent}ul.order_notes li.system-note .note_content{background:#d7cad2}ul.order_notes li.system-note .note_content::after{border-color:#d7cad2 transparent}ul.order_notes li.customer-note .note_content{background:#a7cedc}ul.order_notes li.customer-note .note_content::after{border-color:#a7cedc transparent}.add_note{border-top:1px solid #ddd;padding:10px 10px 0}.add_note h4{margin-top:5px!important}.add_note #add_order_note{width:100%;height:50px}table.wp-list-table .column-thumb{width:52px;text-align:center;white-space:nowrap}table.wp-list-table .column-handle{width:17px;display:none}table.wp-list-table tbody td.column-handle{cursor:move;width:17px;text-align:center;vertical-align:text-top}table.wp-list-table tbody td.column-handle::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;height:100%;margin:4px 0 0 0}table.wp-list-table .column-name{width:22%}table.wp-list-table .column-product_cat,table.wp-list-table .column-product_tag{width:11%!important}table.wp-list-table .column-featured,table.wp-list-table .column-product_type{width:48px;text-align:left!important}table.wp-list-table .column-customer_message,table.wp-list-table .column-order_notes{width:48px;text-align:center}table.wp-list-table .column-customer_message img,table.wp-list-table .column-order_notes img{margin:0 auto;padding-top:0!important}table.wp-list-table .manage-column.column-featured img,table.wp-list-table .manage-column.column-product_type img{padding-left:2px}table.wp-list-table .column-price .woocommerce-price-suffix{display:none}table.wp-list-table img{margin:1px 2px}table.wp-list-table .row-actions{color:#999}table.wp-list-table td.column-thumb img{margin:0;width:auto;height:auto;max-width:40px;max-height:40px;vertical-align:middle}table.wp-list-table span.na{color:#999}table.wp-list-table .column-sku{width:10%}table.wp-list-table .column-price{width:10ch}table.wp-list-table .column-is_in_stock{text-align:left!important;width:12ch}table.wp-list-table span.wc-featured,table.wp-list-table span.wc-image{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto}table.wp-list-table span.wc-featured::before,table.wp-list-table span.wc-image::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}table.wp-list-table span.wc-featured::before{content:'\f155'}table.wp-list-table span.wc-featured.not-featured::before{content:'\f154'}table.wp-list-table td.column-featured span.wc-featured{font-size:1.6em;cursor:pointer}table.wp-list-table mark.instock,table.wp-list-table mark.onbackorder,table.wp-list-table mark.outofstock{font-weight:700;background:transparent none;line-height:1}table.wp-list-table mark.instock{color:#7ad03a}table.wp-list-table mark.outofstock{color:#a44}table.wp-list-table mark.onbackorder{color:#eaa600}table.wp-list-table .notes_head,table.wp-list-table .order-notes_head,table.wp-list-table .status_head{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto}table.wp-list-table .notes_head::after,table.wp-list-table .order-notes_head::after,table.wp-list-table .status_head::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}table.wp-list-table .order-notes_head::after{content:'\e028'}table.wp-list-table .notes_head::after{content:'\e026'}table.wp-list-table .status_head::after{content:'\e011'}table.wp-list-table .column-order_items{width:12%}table.wp-list-table .column-order_items table.order_items{width:100%;margin:3px 0 0;padding:0;display:none}table.wp-list-table .column-order_items table.order_items td{border:0;margin:0;padding:0 0 3px}table.wp-list-table .column-order_items table.order_items td.qty{color:#999;padding-right:6px;text-align:left}mark.notice{background:#fff;color:#a00;margin:0 0 0 10px}a.export_rates,a.import_rates{float:right;margin-left:9px;margin-top:-2px;margin-bottom:0}#rates-search{float:right}#rates-search input.wc-tax-rates-search-field{padding:4px 8px;font-size:1.2em}#rates-pagination{float:right;margin-right:.5em}#rates-pagination .tablenav{margin:0}.wc_input_table_wrapper{overflow-x:auto;display:block}table.wc_input_table,table.wc_tax_rates{width:100%}table.wc_input_table td,table.wc_input_table th,table.wc_tax_rates td,table.wc_tax_rates th{display:table-cell!important}table.wc_input_table span.tips,table.wc_tax_rates span.tips{color:#2ea2cc}table.wc_input_table th,table.wc_tax_rates th{white-space:nowrap;padding:10px}table.wc_input_table td,table.wc_tax_rates td{padding:0;border-right:1px solid #dfdfdf;border-bottom:1px solid #dfdfdf;border-top:0;background:#fff;cursor:default}table.wc_input_table td input[type=number],table.wc_input_table td input[type=text],table.wc_tax_rates td input[type=number],table.wc_tax_rates td input[type=text]{width:100%!important;min-width:100px;padding:8px 10px;margin:0;border:0;outline:0;background:transparent none}table.wc_input_table td input[type=number]:focus,table.wc_input_table td input[type=text]:focus,table.wc_tax_rates td input[type=number]:focus,table.wc_tax_rates td input[type=text]:focus{outline:0;box-shadow:none}table.wc_input_table td.apply_to_shipping,table.wc_input_table td.compound,table.wc_tax_rates td.apply_to_shipping,table.wc_tax_rates td.compound{padding:5px 7px;vertical-align:middle}table.wc_input_table td.apply_to_shipping input,table.wc_input_table td.compound input,table.wc_tax_rates td.apply_to_shipping input,table.wc_tax_rates td.compound input{width:auto;padding:0}table.wc_input_table td:last-child,table.wc_tax_rates td:last-child{border-right:0}table.wc_input_table tr.current td,table.wc_tax_rates tr.current td{background-color:#fefbcc}table.wc_input_table .cost,table.wc_input_table .item_cost,table.wc_tax_rates .cost,table.wc_tax_rates .item_cost{text-align:right}table.wc_input_table .cost input,table.wc_input_table .item_cost input,table.wc_tax_rates .cost input,table.wc_tax_rates .item_cost input{text-align:right}table.wc_input_table th.sort,table.wc_tax_rates th.sort{width:17px;padding:0 4px}table.wc_input_table td.sort,table.wc_tax_rates td.sort{padding:0 4px}table.wc_input_table .ui-sortable:not(.ui-sortable-disabled) td.sort,table.wc_tax_rates .ui-sortable:not(.ui-sortable-disabled) td.sort{cursor:move;font-size:15px;background:#f9f9f9;text-align:center;vertical-align:middle}table.wc_input_table .ui-sortable:not(.ui-sortable-disabled) td.sort::before,table.wc_tax_rates .ui-sortable:not(.ui-sortable-disabled) td.sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:left;height:100%}table.wc_input_table .ui-sortable:not(.ui-sortable-disabled) td.sort:hover::before,table.wc_tax_rates .ui-sortable:not(.ui-sortable-disabled) td.sort:hover::before{color:#333}table.wc_input_table .button,table.wc_tax_rates .button{float:left;margin-right:5px}table.wc_input_table .export,table.wc_input_table .import,table.wc_tax_rates .export,table.wc_tax_rates .import{float:right;margin-right:0;margin-left:5px}table.wc_input_table span.tips,table.wc_tax_rates span.tips{padding:0 3px}table.wc_input_table .pagination,table.wc_tax_rates .pagination{float:right}table.wc_input_table .pagination .button,table.wc_tax_rates .pagination .button{margin-left:5px;margin-right:0}table.wc_input_table .pagination .current,table.wc_tax_rates .pagination .current{background:#bbb;text-shadow:none}table.wc_input_table tr:last-child td,table.wc_tax_rates tr:last-child td{border-bottom:0}table.wc_emails,table.wc_gateways,table.wc_shipping{position:relative}table.wc_emails td,table.wc_emails th,table.wc_gateways td,table.wc_gateways th,table.wc_shipping td,table.wc_shipping th{display:table-cell!important;padding:1em!important;vertical-align:top;line-height:1.75em}table.wc_emails.wc_emails td,table.wc_gateways.wc_emails td,table.wc_shipping.wc_emails td{vertical-align:middle}table.wc_emails tr:nth-child(odd) td,table.wc_gateways tr:nth-child(odd) td,table.wc_shipping tr:nth-child(odd) td{background:#f9f9f9}table.wc_emails td.name,table.wc_gateways td.name,table.wc_shipping td.name{font-weight:700}table.wc_emails .settings,table.wc_gateways .settings,table.wc_shipping .settings{text-align:right}table.wc_emails .default,table.wc_emails .radio,table.wc_emails .status,table.wc_gateways .default,table.wc_gateways .radio,table.wc_gateways .status,table.wc_shipping .default,table.wc_shipping .radio,table.wc_shipping .status{text-align:center}table.wc_emails .default .tips,table.wc_emails .radio .tips,table.wc_emails .status .tips,table.wc_gateways .default .tips,table.wc_gateways .radio .tips,table.wc_gateways .status .tips,table.wc_shipping .default .tips,table.wc_shipping .radio .tips,table.wc_shipping .status .tips{margin:0 auto}table.wc_emails .default input,table.wc_emails .radio input,table.wc_emails .status input,table.wc_gateways .default input,table.wc_gateways .radio input,table.wc_gateways .status input,table.wc_shipping .default input,table.wc_shipping .radio input,table.wc_shipping .status input{margin:0}table.wc_emails td.sort,table.wc_gateways td.sort,table.wc_shipping td.sort{font-size:15px;text-align:center}table.wc_emails td.sort .wc-item-reorder-nav,table.wc_gateways td.sort .wc-item-reorder-nav,table.wc_shipping td.sort .wc-item-reorder-nav{white-space:nowrap;width:72px}table.wc_emails td.sort .wc-item-reorder-nav:before,table.wc_gateways td.sort .wc-item-reorder-nav:before,table.wc_shipping td.sort .wc-item-reorder-nav:before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:24px;float:left;height:100%;line-height:24px;cursor:move}table.wc_emails td.sort .wc-item-reorder-nav button,table.wc_gateways td.sort .wc-item-reorder-nav button,table.wc_shipping td.sort .wc-item-reorder-nav button{position:relative;overflow:hidden;float:left;display:block;width:24px;height:24px;margin:0;background:0 0;border:none;box-shadow:none;color:#82878c;text-indent:-9999px;cursor:pointer;outline:0}table.wc_emails td.sort .wc-item-reorder-nav button:before,table.wc_gateways td.sort .wc-item-reorder-nav button:before,table.wc_shipping td.sort .wc-item-reorder-nav button:before{display:inline-block;position:absolute;top:0;right:0;width:100%;height:100%;font:normal 20px/23px dashicons;text-align:center;text-indent:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}table.wc_emails td.sort .wc-item-reorder-nav button:focus,table.wc_emails td.sort .wc-item-reorder-nav button:hover,table.wc_gateways td.sort .wc-item-reorder-nav button:focus,table.wc_gateways td.sort .wc-item-reorder-nav button:hover,table.wc_shipping td.sort .wc-item-reorder-nav button:focus,table.wc_shipping td.sort .wc-item-reorder-nav button:hover{color:#191e23}table.wc_emails td.sort .wc-item-reorder-nav .wc-move-down:before,table.wc_gateways td.sort .wc-item-reorder-nav .wc-move-down:before,table.wc_shipping td.sort .wc-item-reorder-nav .wc-move-down:before{content:"\f347"}table.wc_emails td.sort .wc-item-reorder-nav .wc-move-up:before,table.wc_gateways td.sort .wc-item-reorder-nav .wc-move-up:before,table.wc_shipping td.sort .wc-item-reorder-nav .wc-move-up:before{content:"\f343"}table.wc_emails td.sort .wc-item-reorder-nav .wc-move-disabled,table.wc_gateways td.sort .wc-item-reorder-nav .wc-move-disabled,table.wc_shipping td.sort .wc-item-reorder-nav .wc-move-disabled{color:#d5d5d5!important;cursor:default;pointer-events:none}table.wc_emails .wc-payment-gateway-method-name,table.wc_gateways .wc-payment-gateway-method-name,table.wc_shipping .wc-payment-gateway-method-name{font-weight:400}table.wc_emails .wc-email-settings-table-name,table.wc_gateways .wc-email-settings-table-name,table.wc_shipping .wc-email-settings-table-name{font-weight:700}table.wc_emails .wc-email-settings-table-name span,table.wc_gateways .wc-email-settings-table-name span,table.wc_shipping .wc-email-settings-table-name span{font-weight:400;color:#999;margin:0 0 0 4px!important}table.wc_emails .wc-payment-gateway-method-toggle-disabled,table.wc_emails .wc-payment-gateway-method-toggle-enabled,table.wc_gateways .wc-payment-gateway-method-toggle-disabled,table.wc_gateways .wc-payment-gateway-method-toggle-enabled,table.wc_shipping .wc-payment-gateway-method-toggle-disabled,table.wc_shipping .wc-payment-gateway-method-toggle-enabled{padding-top:1px;display:block;outline:0;box-shadow:none}table.wc_emails .wc-email-settings-table-status,table.wc_gateways .wc-email-settings-table-status,table.wc_shipping .wc-email-settings-table-status{text-align:center;width:1em}table.wc_emails .wc-email-settings-table-status .tips,table.wc_gateways .wc-email-settings-table-status .tips,table.wc_shipping .wc-email-settings-table-status .tips{margin:0 auto}.wc-shipping-zone-settings th{padding:24px 24px 24px 0}.wc-shipping-zone-settings td.forminp input,.wc-shipping-zone-settings td.forminp textarea{padding:8px;width:448px;max-width:100%!important}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select{width:448px;max-width:100%!important}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select .select2-choices{padding:8px 8px 4px;border-color:#ddd;min-height:0;line-height:1}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select .select2-choices input{padding:0}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select .select2-choices li{margin:0 4px 4px 0}.wc-shipping-zone-settings .wc-shipping-zone-postcodes-toggle{margin:.5em 0 0;font-size:.9em;text-decoration:underline;display:block}.wc-shipping-zone-settings .wc-shipping-zone-postcodes-toggle+.wc-shipping-zone-postcodes{display:none}.wc-shipping-zone-settings .wc-shipping-zone-postcodes textarea{margin:10px 0}.wc-shipping-zone-settings .wc-shipping-zone-postcodes .description{font-size:.9em;color:#999}.wc-shipping-zone-settings+p.submit{margin-top:0}table tr table.wc-shipping-zone-methods tr .row-actions,table tr:hover table.wc-shipping-zone-methods tr .row-actions{position:relative}table tr table.wc-shipping-zone-methods tr:hover .row-actions,table tr:hover table.wc-shipping-zone-methods tr:hover .row-actions{position:static}.wc-shipping-zones-heading .page-title-action{display:inline-block}table.wc-shipping-classes td,table.wc-shipping-classes th,table.wc-shipping-zone-methods td,table.wc-shipping-zone-methods th,table.wc-shipping-zones td,table.wc-shipping-zones th{vertical-align:top;line-height:24px;padding:1em!important;font-size:14px;background:#fff;display:table-cell!important}table.wc-shipping-classes td li,table.wc-shipping-classes th li,table.wc-shipping-zone-methods td li,table.wc-shipping-zone-methods th li,table.wc-shipping-zones td li,table.wc-shipping-zones th li{line-height:24px;font-size:14px}table.wc-shipping-classes td .woocommerce-help-tip,table.wc-shipping-classes th .woocommerce-help-tip,table.wc-shipping-zone-methods td .woocommerce-help-tip,table.wc-shipping-zone-methods th .woocommerce-help-tip,table.wc-shipping-zones td .woocommerce-help-tip,table.wc-shipping-zones th .woocommerce-help-tip{margin:0!important}table.wc-shipping-classes thead th,table.wc-shipping-zone-methods thead th,table.wc-shipping-zones thead th{vertical-align:middle}table.wc-shipping-classes thead .wc-shipping-zone-sort,table.wc-shipping-zone-methods thead .wc-shipping-zone-sort,table.wc-shipping-zones thead .wc-shipping-zone-sort{text-align:center}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state,table.wc-shipping-classes td.wc-shipping-zones-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state,table.wc-shipping-zones td.wc-shipping-zones-blank-state{background:#f7f1f6!important;overflow:hidden;position:relative;padding:7.5em 7.5%!important;border-bottom:2px solid #eee2ec}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-classes td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zones td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state{padding:2em!important}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-classes td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zones td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state p{margin-bottom:0}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state li,table.wc-shipping-classes td.wc-shipping-zone-method-blank-state p,table.wc-shipping-classes td.wc-shipping-zones-blank-state li,table.wc-shipping-classes td.wc-shipping-zones-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state p,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state p,table.wc-shipping-zones td.wc-shipping-zones-blank-state li,table.wc-shipping-zones td.wc-shipping-zones-blank-state p{color:#a46497;font-size:1.5em;line-height:1.5em;margin:0 0 1em;position:relative;z-index:1;text-shadow:1px 1px 1px #fff}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state li.main,table.wc-shipping-classes td.wc-shipping-zone-method-blank-state p.main,table.wc-shipping-classes td.wc-shipping-zones-blank-state li.main,table.wc-shipping-classes td.wc-shipping-zones-blank-state p.main,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state li.main,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state p.main,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state li.main,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state p.main,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state li.main,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state p.main,table.wc-shipping-zones td.wc-shipping-zones-blank-state li.main,table.wc-shipping-zones td.wc-shipping-zones-blank-state p.main{font-size:2em}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state li,table.wc-shipping-classes td.wc-shipping-zones-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state li,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zones td.wc-shipping-zones-blank-state li{margin-left:1em;list-style:circle inside}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state::before,table.wc-shipping-classes td.wc-shipping-zones-blank-state::before,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state::before,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state::before,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state::before,table.wc-shipping-zones td.wc-shipping-zones-blank-state::before{content:'\e01b';font-family:WooCommerce;text-align:center;line-height:1;color:#eee2ec;display:block;width:1em;font-size:40em;top:50%;right:-3.75%;margin-top:-.1875em;position:absolute}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state .button-primary,table.wc-shipping-classes td.wc-shipping-zones-blank-state .button-primary,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state .button-primary,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state .button-primary,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state .button-primary,table.wc-shipping-zones td.wc-shipping-zones-blank-state .button-primary{background-color:#804877;border-color:#804877;box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 0 rgba(0,0,0,.15);margin:0;opacity:1;text-shadow:0 -1px 1px #8a4f7f,1px 0 1px #8a4f7f,0 1px 1px #8a4f7f,-1px 0 1px #8a4f7f;font-size:1.5em;padding:.75em 1em;height:auto;position:relative;z-index:1}table.wc-shipping-classes .wc-shipping-zone-method-rows tr:nth-child(even) td,table.wc-shipping-zone-methods .wc-shipping-zone-method-rows tr:nth-child(even) td,table.wc-shipping-zones .wc-shipping-zone-method-rows tr:nth-child(even) td{background:#f9f9f9}table.wc-shipping-classes .wc-shipping-class-rows tr:nth-child(odd) td,table.wc-shipping-classes tr.odd td,table.wc-shipping-zone-methods .wc-shipping-class-rows tr:nth-child(odd) td,table.wc-shipping-zone-methods tr.odd td,table.wc-shipping-zones .wc-shipping-class-rows tr:nth-child(odd) td,table.wc-shipping-zones tr.odd td{background:#f9f9f9}table.wc-shipping-classes tbody.wc-shipping-zone-rows td,table.wc-shipping-zone-methods tbody.wc-shipping-zone-rows td,table.wc-shipping-zones tbody.wc-shipping-zone-rows td{border-top:2px solid #f9f9f9}table.wc-shipping-classes tbody.wc-shipping-zone-rows tr:first-child td,table.wc-shipping-zone-methods tbody.wc-shipping-zone-rows tr:first-child td,table.wc-shipping-zones tbody.wc-shipping-zone-rows tr:first-child td{border-top:0}table.wc-shipping-classes tr.wc-shipping-zone-worldwide td,table.wc-shipping-zone-methods tr.wc-shipping-zone-worldwide td,table.wc-shipping-zones tr.wc-shipping-zone-worldwide td{background:#f9f9f9;border-top:2px solid #e1e1e1}table.wc-shipping-classes p,table.wc-shipping-classes ul,table.wc-shipping-zone-methods p,table.wc-shipping-zone-methods ul,table.wc-shipping-zones p,table.wc-shipping-zones ul{margin:0}table.wc-shipping-classes td.wc-shipping-zone-method-sort,table.wc-shipping-classes td.wc-shipping-zone-sort,table.wc-shipping-zone-methods td.wc-shipping-zone-method-sort,table.wc-shipping-zone-methods td.wc-shipping-zone-sort,table.wc-shipping-zones td.wc-shipping-zone-method-sort,table.wc-shipping-zones td.wc-shipping-zone-sort{cursor:move;font-size:15px;text-align:center}table.wc-shipping-classes td.wc-shipping-zone-method-sort::before,table.wc-shipping-classes td.wc-shipping-zone-sort::before,table.wc-shipping-zone-methods td.wc-shipping-zone-method-sort::before,table.wc-shipping-zone-methods td.wc-shipping-zone-sort::before,table.wc-shipping-zones td.wc-shipping-zone-method-sort::before,table.wc-shipping-zones td.wc-shipping-zone-sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:left;height:100%;line-height:24px}table.wc-shipping-classes td.wc-shipping-zone-method-sort:hover::before,table.wc-shipping-classes td.wc-shipping-zone-sort:hover::before,table.wc-shipping-zone-methods td.wc-shipping-zone-method-sort:hover::before,table.wc-shipping-zone-methods td.wc-shipping-zone-sort:hover::before,table.wc-shipping-zones td.wc-shipping-zone-method-sort:hover::before,table.wc-shipping-zones td.wc-shipping-zone-sort:hover::before{color:#333}table.wc-shipping-classes td.wc-shipping-zone-worldwide,table.wc-shipping-zone-methods td.wc-shipping-zone-worldwide,table.wc-shipping-zones td.wc-shipping-zone-worldwide{text-align:center}table.wc-shipping-classes td.wc-shipping-zone-worldwide::before,table.wc-shipping-zone-methods td.wc-shipping-zone-worldwide::before,table.wc-shipping-zones td.wc-shipping-zone-worldwide::before{content:'\f319';font-family:dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:left;height:100%;line-height:24px}table.wc-shipping-classes .wc-shipping-zone-methods,table.wc-shipping-classes .wc-shipping-zone-name,table.wc-shipping-zone-methods .wc-shipping-zone-methods,table.wc-shipping-zone-methods .wc-shipping-zone-name,table.wc-shipping-zones .wc-shipping-zone-methods,table.wc-shipping-zones .wc-shipping-zone-name{width:25%}table.wc-shipping-classes .wc-shipping-class-description input,table.wc-shipping-classes .wc-shipping-class-description select,table.wc-shipping-classes .wc-shipping-class-description textarea,table.wc-shipping-classes .wc-shipping-class-name input,table.wc-shipping-classes .wc-shipping-class-name select,table.wc-shipping-classes .wc-shipping-class-name textarea,table.wc-shipping-classes .wc-shipping-class-slug input,table.wc-shipping-classes .wc-shipping-class-slug select,table.wc-shipping-classes .wc-shipping-class-slug textarea,table.wc-shipping-classes .wc-shipping-zone-name input,table.wc-shipping-classes .wc-shipping-zone-name select,table.wc-shipping-classes .wc-shipping-zone-name textarea,table.wc-shipping-classes .wc-shipping-zone-region input,table.wc-shipping-classes .wc-shipping-zone-region select,table.wc-shipping-classes .wc-shipping-zone-region textarea,table.wc-shipping-zone-methods .wc-shipping-class-description input,table.wc-shipping-zone-methods .wc-shipping-class-description select,table.wc-shipping-zone-methods .wc-shipping-class-description textarea,table.wc-shipping-zone-methods .wc-shipping-class-name input,table.wc-shipping-zone-methods .wc-shipping-class-name select,table.wc-shipping-zone-methods .wc-shipping-class-name textarea,table.wc-shipping-zone-methods .wc-shipping-class-slug input,table.wc-shipping-zone-methods .wc-shipping-class-slug select,table.wc-shipping-zone-methods .wc-shipping-class-slug textarea,table.wc-shipping-zone-methods .wc-shipping-zone-name input,table.wc-shipping-zone-methods .wc-shipping-zone-name select,table.wc-shipping-zone-methods .wc-shipping-zone-name textarea,table.wc-shipping-zone-methods .wc-shipping-zone-region input,table.wc-shipping-zone-methods .wc-shipping-zone-region select,table.wc-shipping-zone-methods .wc-shipping-zone-region textarea,table.wc-shipping-zones .wc-shipping-class-description input,table.wc-shipping-zones .wc-shipping-class-description select,table.wc-shipping-zones .wc-shipping-class-description textarea,table.wc-shipping-zones .wc-shipping-class-name input,table.wc-shipping-zones .wc-shipping-class-name select,table.wc-shipping-zones .wc-shipping-class-name textarea,table.wc-shipping-zones .wc-shipping-class-slug input,table.wc-shipping-zones .wc-shipping-class-slug select,table.wc-shipping-zones .wc-shipping-class-slug textarea,table.wc-shipping-zones .wc-shipping-zone-name input,table.wc-shipping-zones .wc-shipping-zone-name select,table.wc-shipping-zones .wc-shipping-zone-name textarea,table.wc-shipping-zones .wc-shipping-zone-region input,table.wc-shipping-zones .wc-shipping-zone-region select,table.wc-shipping-zones .wc-shipping-zone-region textarea{width:100%}table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-zone-delete{color:#a00}table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-zone-delete:hover{color:red}table.wc-shipping-classes .wc-shipping-class-count,table.wc-shipping-zone-methods .wc-shipping-class-count,table.wc-shipping-zones .wc-shipping-class-count{text-align:center}table.wc-shipping-classes td.wc-shipping-zone-methods,table.wc-shipping-zone-methods td.wc-shipping-zone-methods,table.wc-shipping-zones td.wc-shipping-zone-methods{color:#555}table.wc-shipping-classes td.wc-shipping-zone-methods .method_disabled,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .method_disabled,table.wc-shipping-zones td.wc-shipping-zone-methods .method_disabled{text-decoration:line-through}table.wc-shipping-classes td.wc-shipping-zone-methods ul,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul,table.wc-shipping-zones td.wc-shipping-zone-methods ul{position:relative;padding-right:32px}table.wc-shipping-classes td.wc-shipping-zone-methods ul li,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul li,table.wc-shipping-zones td.wc-shipping-zone-methods ul li{color:#555;display:inline;margin:0}table.wc-shipping-classes td.wc-shipping-zone-methods ul li::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul li::before,table.wc-shipping-zones td.wc-shipping-zone-methods ul li::before{content:', '}table.wc-shipping-classes td.wc-shipping-zone-methods ul li:first-child::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul li:first-child::before,table.wc-shipping-zones td.wc-shipping-zone-methods ul li:first-child::before{content:''}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method{display:block;width:24px;padding:24px 0 0;height:0;overflow:hidden;cursor:pointer}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method::before,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";font-family:Dashicons;content:'\f502';color:#999;vertical-align:middle;line-height:24px;font-size:16px;margin:0}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method.disabled,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method.disabled,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method.disabled{cursor:not-allowed}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method.disabled::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method.disabled::before,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method.disabled::before{color:#ccc}table.wc-shipping-classes .wc-shipping-zone-method-title,table.wc-shipping-zone-methods .wc-shipping-zone-method-title,table.wc-shipping-zones .wc-shipping-zone-method-title{width:25%}table.wc-shipping-classes .wc-shipping-zone-method-title .wc-shipping-zone-method-delete,table.wc-shipping-zone-methods .wc-shipping-zone-method-title .wc-shipping-zone-method-delete,table.wc-shipping-zones .wc-shipping-zone-method-title .wc-shipping-zone-method-delete{color:red}table.wc-shipping-classes .wc-shipping-zone-method-enabled,table.wc-shipping-zone-methods .wc-shipping-zone-method-enabled,table.wc-shipping-zones .wc-shipping-zone-method-enabled{text-align:center}table.wc-shipping-classes .wc-shipping-zone-method-enabled a,table.wc-shipping-zone-methods .wc-shipping-zone-method-enabled a,table.wc-shipping-zones .wc-shipping-zone-method-enabled a{display:inline-block}table.wc-shipping-classes .wc-shipping-zone-method-enabled .woocommerce-input-toggle,table.wc-shipping-zone-methods .wc-shipping-zone-method-enabled .woocommerce-input-toggle,table.wc-shipping-zones .wc-shipping-zone-method-enabled .woocommerce-input-toggle{margin-top:3px}table.wc-shipping-classes .wc-shipping-zone-method-type,table.wc-shipping-zone-methods .wc-shipping-zone-method-type,table.wc-shipping-zones .wc-shipping-zone-method-type{display:block}table.wc-shipping-classes tfoot input,table.wc-shipping-classes tfoot select,table.wc-shipping-zone-methods tfoot input,table.wc-shipping-zone-methods tfoot select,table.wc-shipping-zones tfoot input,table.wc-shipping-zones tfoot select{vertical-align:middle!important}table.wc-shipping-classes tfoot .button-secondary,table.wc-shipping-zone-methods tfoot .button-secondary,table.wc-shipping-zones tfoot .button-secondary{float:right}table.wc-shipping-classes .editing .wc-shipping-zone-edit,table.wc-shipping-classes .editing .wc-shipping-zone-view,table.wc-shipping-zone-methods .editing .wc-shipping-zone-edit,table.wc-shipping-zone-methods .editing .wc-shipping-zone-view,table.wc-shipping-zones .editing .wc-shipping-zone-edit,table.wc-shipping-zones .editing .wc-shipping-zone-view{display:none}.woocommerce-input-toggle{height:16px;width:32px;border:2px solid #935687;background-color:#935687;display:inline-block;text-indent:-9999px;border-radius:10em;position:relative;margin-top:-1px;vertical-align:text-top}.woocommerce-input-toggle:before{content:"";display:block;width:16px;height:16px;background:#fff;position:absolute;top:0;right:0;border-radius:100%}.woocommerce-input-toggle.woocommerce-input-toggle--disabled{border-color:#999;background-color:#999}.woocommerce-input-toggle.woocommerce-input-toggle--disabled:before{right:auto;left:0}.woocommerce-input-toggle.woocommerce-input-toggle--loading{opacity:.5}.wc-modal-shipping-method-settings{background:#f8f8f8;padding:1em!important}.wc-modal-shipping-method-settings form .form-table{width:100%;background:#fff;margin:0 0 1.5em}.wc-modal-shipping-method-settings form .form-table tr th{width:30%;position:relative}.wc-modal-shipping-method-settings form .form-table tr th .woocommerce-help-tip{float:right;margin:-8px -.5em 0 0;vertical-align:middle;right:0;top:50%;position:absolute}.wc-modal-shipping-method-settings form .form-table tr td input,.wc-modal-shipping-method-settings form .form-table tr td select,.wc-modal-shipping-method-settings form .form-table tr td textarea{width:50%;min-width:250px}.wc-modal-shipping-method-settings form .form-table tr td input[type=checkbox]{width:auto;min-width:16px}.wc-modal-shipping-method-settings form .form-table tr td,.wc-modal-shipping-method-settings form .form-table tr th{vertical-align:middle;margin:0;line-height:24px;padding:1em;border-bottom:1px solid #f8f8f8}.wc-modal-shipping-method-settings form .form-table:last-of-type{margin-bottom:0}.wc-backbone-modal .wc-shipping-zone-method-selector p{margin-top:0}.wc-backbone-modal .wc-shipping-zone-method-selector .wc-shipping-zone-method-description{margin:.75em 1px 0;line-height:1.5em;color:#999;font-style:italic}.wc-backbone-modal .wc-shipping-zone-method-selector select{width:100%;cursor:pointer}img.help_tip{margin:0 0 0 9px;vertical-align:middle}.postbox img.help_tip{margin-top:0}.postbox .woocommerce-help-tip{margin:0 0 0 9px}.status-disabled,.status-enabled,.status-manual{font-size:1.4em;display:block;text-indent:-9999px;position:relative;height:1em;width:1em}.status-manual::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#999}.status-enabled::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#a46497}.status-disabled::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}.woocommerce h2.woo-nav-tab-wrapper{margin-bottom:1em}.woocommerce nav.woo-nav-tab-wrapper{margin:1.5em 0 1em}.woocommerce .subsubsub{margin:-8px 0 0}.woocommerce .wc-admin-breadcrumb{margin-left:.5em}.woocommerce .wc-admin-breadcrumb a{color:#a46497}.woocommerce #template div{margin:0}.woocommerce #template div p .button{float:right;margin-left:10px;margin-top:-4px}.woocommerce #template div .editor textarea{margin-bottom:8px}.woocommerce textarea[disabled=disabled]{background:#dfdfdf!important}.woocommerce table.form-table{margin:0;position:relative;table-layout:fixed}.woocommerce table.form-table .forminp-radio ul{margin:0}.woocommerce table.form-table .forminp-radio ul li{line-height:1.4em}.woocommerce table.form-table input[type=email],.woocommerce table.form-table input[type=number],.woocommerce table.form-table input[type=text]{height:auto}.woocommerce table.form-table textarea.input-text{height:100%;min-width:150px;display:block}.woocommerce table.form-table input.regular-input,.woocommerce table.form-table input[type=email],.woocommerce table.form-table input[type=number],.woocommerce table.form-table input[type=text],.woocommerce table.form-table textarea{width:400px;margin:0;padding:6px;box-sizing:border-box;vertical-align:top}.woocommerce table.form-table select{width:400px;margin:0;box-sizing:border-box;height:32px;line-height:32px;vertical-align:top}.woocommerce table.form-table input[size]{width:auto!important}.woocommerce table.form-table table input.regular-input,.woocommerce table.form-table table input[type=email],.woocommerce table.form-table table input[type=number],.woocommerce table.form-table table input[type=text],.woocommerce table.form-table table select,.woocommerce table.form-table table textarea{width:auto}.woocommerce table.form-table textarea.wide-input{width:100%}.woocommerce table.form-table .woocommerce-help-tip,.woocommerce table.form-table img.help_tip{padding:0;margin:-4px 0 0 5px;vertical-align:middle;cursor:help;line-height:1}.woocommerce table.form-table span.help_tip{cursor:help;color:#2ea2cc}.woocommerce table.form-table th{position:relative;padding-right:24px}.woocommerce table.form-table th label{position:relative;display:block}.woocommerce table.form-table th label .woocommerce-help-tip,.woocommerce table.form-table th label img.help_tip{margin:-8px -24px 0 0;position:absolute;right:0;top:50%}.woocommerce table.form-table th label+.woocommerce-help-tip{margin:0;position:absolute;right:0;top:20px}.woocommerce table.form-table woocommerce-help-tip .select2-container{vertical-align:top;margin-bottom:3px}.woocommerce table.form-table table.widefat th{padding-right:inherit}.woocommerce table.form-table .wp-list-table .woocommerce-help-tip{float:none}.woocommerce table.form-table fieldset{margin-top:4px}.woocommerce table.form-table fieldset .woocommerce-help-tip,.woocommerce table.form-table fieldset img.help_tip{margin:-3px 0 0 5px}.woocommerce table.form-table fieldset p.description{margin-bottom:8px}.woocommerce table.form-table fieldset:first-child{margin-top:0}.woocommerce table.form-table .iris-picker{z-index:100;display:none;position:absolute;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.2)}.woocommerce table.form-table .iris-picker .ui-slider{border:0!important;margin:0!important;width:auto!important;height:auto!important;background:none transparent!important}.woocommerce table.form-table .iris-picker .ui-slider .ui-slider-handle{margin-bottom:0!important}.woocommerce table.form-table .iris-error{background-color:#ffafaf}.woocommerce table.form-table .colorpickpreview{padding:7px 0;line-height:1em;display:inline-block;width:26px;border:1px solid #ddd;font-size:14px}.woocommerce table.form-table .image_width_settings{vertical-align:middle}.woocommerce table.form-table .image_width_settings label{margin-left:10px}.woocommerce table.form-table .image_width_settings input{width:auto}.woocommerce table.form-table .wc_emails_wrapper,.woocommerce table.form-table .wc_payment_gateways_wrapper{padding:0 15px 10px 0}.woocommerce #tabs-wrap table a.remove{margin-left:4px}.woocommerce #tabs-wrap table p{margin:0 0 4px!important;overflow:hidden;zoom:1}.woocommerce #tabs-wrap table p a.add{float:left}#wp-excerpt-editor-container{background:#fff}#product_variation-parent #parent_id{width:100%}#postimagediv img{border:1px solid #d5d5d5;max-width:100%}#woocommerce-product-images .inside{margin:0;padding:0}#woocommerce-product-images .inside .add_product_images{padding:0 12px 12px}#woocommerce-product-images .inside #product_images_container{padding:0 0 0 9px}#woocommerce-product-images .inside #product_images_container ul{margin:0;padding:0}#woocommerce-product-images .inside #product_images_container ul::after,#woocommerce-product-images .inside #product_images_container ul::before{content:' ';display:table}#woocommerce-product-images .inside #product_images_container ul::after{clear:both}#woocommerce-product-images .inside #product_images_container ul li.add,#woocommerce-product-images .inside #product_images_container ul li.image,#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder{width:80px;float:left;cursor:move;border:1px solid #d5d5d5;margin:9px 9px 0 0;background:#f7f7f7;border-radius:2px;position:relative;box-sizing:border-box}#woocommerce-product-images .inside #product_images_container ul li.add img,#woocommerce-product-images .inside #product_images_container ul li.image img,#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder img{width:100%;height:auto;display:block}#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder{border:3px dashed #ddd;position:relative}#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";font-size:2.618em;line-height:72px;color:#ddd}#woocommerce-product-images .inside #product_images_container ul ul.actions{position:absolute;top:-8px;right:-8px;padding:2px;display:none}#woocommerce-product-images .inside #product_images_container ul ul.actions li{float:right;margin:0 0 0 2px}#woocommerce-product-images .inside #product_images_container ul ul.actions li a{width:1em;height:1em;margin:0;height:0;display:block;overflow:hidden}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.tips{cursor:pointer}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.delete{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.4em}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.delete::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#999;background:#fff;border-radius:50%;height:1em;width:1em;line-height:1em}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.delete:hover::before{color:#a00}#woocommerce-product-images .inside #product_images_container ul li:hover ul.actions{display:block}#woocommerce-product-data .hndle{padding:10px}#woocommerce-product-data .hndle span{display:block;vertical-align:middle;line-height:24px}#woocommerce-product-data .hndle span span{display:inline;line-height:inherit;vertical-align:baseline}#woocommerce-product-data .hndle select{margin:0}#woocommerce-product-data .hndle label{padding-right:1em;font-size:12px;vertical-align:baseline}#woocommerce-product-data .hndle label:first-child{margin-right:1em;border-right:1px solid #dfdfdf}#woocommerce-product-data .hndle input,#woocommerce-product-data .hndle select{margin-top:-3px 0 0;vertical-align:middle}#woocommerce-product-data .hndle select{margin-left:.5em}#woocommerce-product-data>.handlediv{margin-top:4px}#woocommerce-product-data .wrap{margin:0}#woocommerce-coupon-description{padding:3px 8px;font-size:1.7em;line-height:1.42em;height:auto;width:100%;outline:0;margin:10px 0;display:block}#woocommerce-coupon-description::-webkit-input-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-description::-moz-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-description:-ms-input-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-description:-moz-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-data .panel-wrap,#woocommerce-product-data .panel-wrap{background:#fff}#woocommerce-coupon-data .wc-metaboxes-wrapper,#woocommerce-coupon-data .woocommerce_options_panel,#woocommerce-product-data .wc-metaboxes-wrapper,#woocommerce-product-data .woocommerce_options_panel{float:left;width:80%}#woocommerce-coupon-data .wc-metaboxes-wrapper .wc-radios,#woocommerce-coupon-data .woocommerce_options_panel .wc-radios,#woocommerce-product-data .wc-metaboxes-wrapper .wc-radios,#woocommerce-product-data .woocommerce_options_panel .wc-radios{display:block;float:left;margin:0}#woocommerce-coupon-data .wc-metaboxes-wrapper .wc-radios li,#woocommerce-coupon-data .woocommerce_options_panel .wc-radios li,#woocommerce-product-data .wc-metaboxes-wrapper .wc-radios li,#woocommerce-product-data .woocommerce_options_panel .wc-radios li{display:block;padding:0 0 10px}#woocommerce-coupon-data .wc-metaboxes-wrapper .wc-radios li input,#woocommerce-coupon-data .woocommerce_options_panel .wc-radios li input,#woocommerce-product-data .wc-metaboxes-wrapper .wc-radios li input,#woocommerce-product-data .woocommerce_options_panel .wc-radios li input{width:auto}#woocommerce-coupon-data .panel-wrap,#woocommerce-product-data .panel-wrap,.woocommerce .panel-wrap{overflow:hidden}#woocommerce-coupon-data ul.wc-tabs,#woocommerce-product-data ul.wc-tabs,.woocommerce ul.wc-tabs{margin:0;width:20%;float:left;line-height:1em;padding:0 0 10px;position:relative;background-color:#fafafa;border-right:1px solid #eee;box-sizing:border-box}#woocommerce-coupon-data ul.wc-tabs::after,#woocommerce-product-data ul.wc-tabs::after,.woocommerce ul.wc-tabs::after{content:'';display:block;width:100%;height:9999em;position:absolute;bottom:-9999em;left:0;background-color:#fafafa;border-right:1px solid #eee}#woocommerce-coupon-data ul.wc-tabs li,#woocommerce-product-data ul.wc-tabs li,.woocommerce ul.wc-tabs li{margin:0;padding:0;display:block;position:relative}#woocommerce-coupon-data ul.wc-tabs li a,#woocommerce-product-data ul.wc-tabs li a,.woocommerce ul.wc-tabs li a{margin:0;padding:10px;display:block;box-shadow:none;text-decoration:none;line-height:20px!important;border-bottom:1px solid #eee}#woocommerce-coupon-data ul.wc-tabs li a span,#woocommerce-product-data ul.wc-tabs li a span,.woocommerce ul.wc-tabs li a span{margin-left:.618em;margin-right:.618em}#woocommerce-coupon-data ul.wc-tabs li a::before,#woocommerce-product-data ul.wc-tabs li a::before,.woocommerce ul.wc-tabs li a::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;content:"";text-decoration:none}#woocommerce-coupon-data ul.wc-tabs li.general_options a::before,#woocommerce-product-data ul.wc-tabs li.general_options a::before,.woocommerce ul.wc-tabs li.general_options a::before{content:'\f107'}#woocommerce-coupon-data ul.wc-tabs li.inventory_options a::before,#woocommerce-product-data ul.wc-tabs li.inventory_options a::before,.woocommerce ul.wc-tabs li.inventory_options a::before{content:'\f481'}#woocommerce-coupon-data ul.wc-tabs li.shipping_options a::before,#woocommerce-product-data ul.wc-tabs li.shipping_options a::before,.woocommerce ul.wc-tabs li.shipping_options a::before{font-family:WooCommerce;content:'\e01a'}#woocommerce-coupon-data ul.wc-tabs li.linked_product_options a::before,#woocommerce-product-data ul.wc-tabs li.linked_product_options a::before,.woocommerce ul.wc-tabs li.linked_product_options a::before{content:'\f103'}#woocommerce-coupon-data ul.wc-tabs li.attribute_options a::before,#woocommerce-product-data ul.wc-tabs li.attribute_options a::before,.woocommerce ul.wc-tabs li.attribute_options a::before{content:'\f175'}#woocommerce-coupon-data ul.wc-tabs li.advanced_options a::before,#woocommerce-product-data ul.wc-tabs li.advanced_options a::before,.woocommerce ul.wc-tabs li.advanced_options a::before{font-family:Dashicons;content:'\f111'}#woocommerce-coupon-data ul.wc-tabs li.variations_options a::before,#woocommerce-product-data ul.wc-tabs li.variations_options a::before,.woocommerce ul.wc-tabs li.variations_options a::before{content:'\f509'}#woocommerce-coupon-data ul.wc-tabs li.usage_restriction_options a::before,#woocommerce-product-data ul.wc-tabs li.usage_restriction_options a::before,.woocommerce ul.wc-tabs li.usage_restriction_options a::before{font-family:WooCommerce;content:'\e602'}#woocommerce-coupon-data ul.wc-tabs li.usage_limit_options a::before,#woocommerce-product-data ul.wc-tabs li.usage_limit_options a::before,.woocommerce ul.wc-tabs li.usage_limit_options a::before{font-family:WooCommerce;content:'\e601'}#woocommerce-coupon-data ul.wc-tabs li.general_coupon_data a::before,#woocommerce-product-data ul.wc-tabs li.general_coupon_data a::before,.woocommerce ul.wc-tabs li.general_coupon_data a::before{font-family:WooCommerce;content:'\e600'}#woocommerce-coupon-data ul.wc-tabs li.active a,#woocommerce-product-data ul.wc-tabs li.active a,.woocommerce ul.wc-tabs li.active a{color:#555;position:relative;background-color:#eee}.woocommerce_page_wc-settings input[type=email],.woocommerce_page_wc-settings input[type=url]{direction:ltr}.woocommerce_page_wc-settings .shippingrows th.check-column{padding-top:20px}.woocommerce_page_wc-settings .shippingrows tfoot th{padding-left:10px}.woocommerce_page_wc-settings .shippingrows .add.button::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-right:.618em;content:"";text-decoration:none}.woocommerce_page_wc-settings h3.wc-settings-sub-title{font-size:1.2em}#woocommerce-coupon-data .inside,#woocommerce-order-data .inside,#woocommerce-order-downloads .inside,#woocommerce-product-data .inside,#woocommerce-product-type-options .inside{margin:0;padding:0}.panel,.woocommerce_options_panel{padding:9px;color:#555}.panel .form-field .woocommerce-help-tip,.woocommerce_options_panel .form-field .woocommerce-help-tip{font-size:1.4em}.panel,.woocommerce_page_settings .woocommerce_options_panel{padding:0}#woocommerce-product-specs .inside,#woocommerce-product-type-options .panel{margin:0;padding:9px}#woocommerce-product-type-options .panel p,.woocommerce_options_panel fieldset.form-field,.woocommerce_options_panel p{margin:0 0 9px;font-size:12px;padding:5px 9px;line-height:24px}#woocommerce-product-type-options .panel p::after,.woocommerce_options_panel fieldset.form-field::after,.woocommerce_options_panel p::after{content:'.';display:block;height:0;clear:both;visibility:hidden}.woocommerce_options_panel .checkbox,.woocommerce_variable_attributes .checkbox{width:auto;margin:4px 0!important;vertical-align:middle;float:left}.woocommerce_options_panel .downloadable_files table,.woocommerce_variations .downloadable_files table{width:100%;padding:0!important}.woocommerce_options_panel .downloadable_files table th,.woocommerce_variations .downloadable_files table th{padding:7px 0 7px 7px!important}.woocommerce_options_panel .downloadable_files table th.sort,.woocommerce_variations .downloadable_files table th.sort{width:17px;padding:7px!important}.woocommerce_options_panel .downloadable_files table th .woocommerce-help-tip,.woocommerce_variations .downloadable_files table th .woocommerce-help-tip{font-size:1.1em;margin-left:0}.woocommerce_options_panel .downloadable_files table td,.woocommerce_variations .downloadable_files table td{vertical-align:middle!important;padding:4px 0 4px 7px!important;position:relative}.woocommerce_options_panel .downloadable_files table td:last-child,.woocommerce_variations .downloadable_files table td:last-child{padding-right:7px!important}.woocommerce_options_panel .downloadable_files table td input.input_text,.woocommerce_variations .downloadable_files table td input.input_text{width:100%;float:none;min-width:0;margin:1px 0}.woocommerce_options_panel .downloadable_files table td .upload_file_button,.woocommerce_variations .downloadable_files table td .upload_file_button{width:auto;float:right;cursor:pointer}.woocommerce_options_panel .downloadable_files table td .delete,.woocommerce_variations .downloadable_files table td .delete{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.2em}.woocommerce_options_panel .downloadable_files table td .delete::before,.woocommerce_variations .downloadable_files table td .delete::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#999}.woocommerce_options_panel .downloadable_files table td .delete:hover::before,.woocommerce_variations .downloadable_files table td .delete:hover::before{color:#a00}.woocommerce_options_panel .downloadable_files table td.sort,.woocommerce_variations .downloadable_files table td.sort{width:17px;cursor:move;font-size:15px;text-align:center;background:#f9f9f9;padding-right:7px!important}.woocommerce_options_panel .downloadable_files table td.sort::before,.woocommerce_variations .downloadable_files table td.sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:left;height:100%}.woocommerce_options_panel .downloadable_files table td.sort:hover::before,.woocommerce_variations .downloadable_files table td.sort:hover::before{color:#333}.woocommerce_variation h3 .sort{width:17px;height:26px;cursor:move;float:right;font-size:15px;font-weight:400;margin-right:.5em;visibility:hidden;text-align:center;vertical-align:middle}.woocommerce_variation h3 .sort::before{content:'\f333';font-family:Dashicons;text-align:center;line-height:28px;color:#999;display:block;width:17px;float:left;height:100%}.woocommerce_variation h3 .sort:hover::before{color:#777}.woocommerce_variation h3:hover .sort,.woocommerce_variation.ui-sortable-helper .sort{visibility:visible}.woocommerce_options_panel{min-height:175px;box-sizing:border-box}.woocommerce_options_panel .downloadable_files{padding:0 9px 0 162px;position:relative;margin:9px 0}.woocommerce_options_panel .downloadable_files label{position:absolute;left:0;margin:0 0 0 12px;line-height:24px}.woocommerce_options_panel p{margin:9px 0}.woocommerce_options_panel fieldset.form-field,.woocommerce_options_panel p.form-field{padding:5px 20px 5px 162px!important}.woocommerce_options_panel .sale_price_dates_fields .short:first-of-type{margin-bottom:1em}.woocommerce_options_panel .sale_price_dates_fields .short:nth-of-type(2){clear:left}.woocommerce_options_panel label,.woocommerce_options_panel legend{float:left;width:150px;padding:0;margin:0 0 0 -150px}.woocommerce_options_panel label .req,.woocommerce_options_panel legend .req{font-weight:700;font-style:normal;color:#a00}.woocommerce_options_panel .description{padding:0;margin:0 0 0 7px;clear:none;display:inline}.woocommerce_options_panel .description-block{margin-left:0;display:block}.woocommerce_options_panel input,.woocommerce_options_panel select,.woocommerce_options_panel textarea{margin:0}.woocommerce_options_panel textarea{float:left;height:3.5em;line-height:1.5em;vertical-align:top}.woocommerce_options_panel input[type=email],.woocommerce_options_panel input[type=number],.woocommerce_options_panel input[type=password],.woocommerce_options_panel input[type=text]{width:50%;float:left}.woocommerce_options_panel input.button{width:auto;margin-left:8px}.woocommerce_options_panel select{float:left}.woocommerce_options_panel .short,.woocommerce_options_panel input[type=email].short,.woocommerce_options_panel input[type=number].short,.woocommerce_options_panel input[type=password].short,.woocommerce_options_panel input[type=text].short{width:50%}.woocommerce_options_panel .sized{width:auto!important;margin-right:6px}.woocommerce_options_panel .options_group{border-top:1px solid #fff;border-bottom:1px solid #eee}.woocommerce_options_panel .options_group:first-child{border-top:0}.woocommerce_options_panel .options_group:last-child{border-bottom:0}.woocommerce_options_panel .options_group fieldset{margin:9px 0;font-size:12px;padding:5px 9px;line-height:24px}.woocommerce_options_panel .options_group fieldset label{width:auto;float:none}.woocommerce_options_panel .options_group fieldset ul{float:left;width:50%;margin:0;padding:0}.woocommerce_options_panel .options_group fieldset ul li{margin:0;width:auto}.woocommerce_options_panel .options_group fieldset ul li input{width:auto;float:none;margin-right:4px}.woocommerce_options_panel .options_group fieldset ul.wc-radios label{margin-left:0}.woocommerce_options_panel .dimensions_field .wrap{display:block;width:50%}.woocommerce_options_panel .dimensions_field .wrap input{width:30.75%;margin-right:3.8%}.woocommerce_options_panel .dimensions_field .wrap .last{margin-right:0}.woocommerce_options_panel.padded{padding:1em}.woocommerce_options_panel .select2-container{float:left}#woocommerce-product-data input.dp-applied{float:left}#grouped_product_options,#simple_product_options,#virtual_product_options{padding:12px;font-style:italic;color:#666}.wc-metaboxes-wrapper .toolbar{margin:0!important;border-top:1px solid #fff;border-bottom:1px solid #eee;padding:9px 12px!important}.wc-metaboxes-wrapper .toolbar:first-child{border-top:0}.wc-metaboxes-wrapper .toolbar:last-child{border-bottom:0}.wc-metaboxes-wrapper .toolbar .add_variation{float:right;margin-left:5px}.wc-metaboxes-wrapper .toolbar .cancel-variation-changes,.wc-metaboxes-wrapper .toolbar .save-variation-changes{float:left;margin-right:5px}.wc-metaboxes-wrapper p.toolbar{overflow:hidden;zoom:1}.wc-metaboxes-wrapper .expand-close{margin-right:2px;color:#777;font-size:12px;font-style:italic}.wc-metaboxes-wrapper .expand-close a{background:0 0;padding:0;font-size:12px;text-decoration:none}.wc-metaboxes-wrapper#product_attributes .expand-close{float:right;line-height:28px}.wc-metaboxes-wrapper .fr,.wc-metaboxes-wrapper button.add_variable_attribute{float:right;margin:0 0 0 6px}.wc-metaboxes-wrapper .wc-metaboxes{border-bottom:1px solid #eee}.wc-metaboxes-wrapper .wc-metabox-sortable-placeholder{border-color:#bbb;background-color:#f5f5f5;margin-bottom:9px;border-width:1px;border-style:dashed}.wc-metaboxes-wrapper .wc-metabox{background:#fff;border-bottom:1px solid #eee;margin:0!important}.wc-metaboxes-wrapper .wc-metabox select{font-weight:400}.wc-metaboxes-wrapper .wc-metabox:last-of-type{border-bottom:0}.wc-metaboxes-wrapper .wc-metabox .handlediv{width:27px}.wc-metaboxes-wrapper .wc-metabox .handlediv::before{content:'\f142'!important;cursor:pointer;display:inline-block;font:400 20px/1 Dashicons;line-height:.5!important;padding:8px 10px;position:relative;right:12px;top:0}.wc-metaboxes-wrapper .wc-metabox.closed{border-radius:3px}.wc-metaboxes-wrapper .wc-metabox.closed .handlediv::before{content:'\f140'!important}.wc-metaboxes-wrapper .wc-metabox.closed h3{border:0}.wc-metaboxes-wrapper .wc-metabox h3{margin:0!important;padding:.75em .75em .75em 1em!important;font-size:1em!important;overflow:hidden;zoom:1;cursor:move}.wc-metaboxes-wrapper .wc-metabox h3 a.delete,.wc-metaboxes-wrapper .wc-metabox h3 button{float:right}.wc-metaboxes-wrapper .wc-metabox h3 a.delete{color:red;font-weight:400;line-height:26px;text-decoration:none;position:relative;visibility:hidden}.wc-metaboxes-wrapper .wc-metabox h3 strong{font-weight:400;line-height:26px;font-weight:700}.wc-metaboxes-wrapper .wc-metabox h3 select{font-family:sans-serif;max-width:20%;margin:.25em .25em .25em 0}.wc-metaboxes-wrapper .wc-metabox h3 .handlediv{background-position:6px 5px!important;visibility:hidden;height:26px}.wc-metaboxes-wrapper .wc-metabox h3.fixed{cursor:pointer!important}.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3{cursor:pointer;padding:.5em .75em .5em 1em!important}.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3 .handlediv,.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3 .sort,.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3 a.delete{margin-top:.25em}.wc-metaboxes-wrapper .wc-metabox h3:hover .handlediv,.wc-metaboxes-wrapper .wc-metabox h3:hover a.delete,.wc-metaboxes-wrapper .wc-metabox.ui-sortable-helper .handlediv,.wc-metaboxes-wrapper .wc-metabox.ui-sortable-helper a.delete{visibility:visible}.wc-metaboxes-wrapper .wc-metabox table{width:100%;position:relative;background-color:#fdfdfd;padding:1em;border-top:1px solid #eee}.wc-metaboxes-wrapper .wc-metabox table td{text-align:left;padding:0 6px 1em 0;vertical-align:top;border:0}.wc-metaboxes-wrapper .wc-metabox table td label{text-align:left;display:block;line-height:21px}.wc-metaboxes-wrapper .wc-metabox table td input{float:left;min-width:200px}.wc-metaboxes-wrapper .wc-metabox table td input,.wc-metaboxes-wrapper .wc-metabox table td textarea{width:100%;margin:0;display:block;font-size:14px;padding:4px;color:#555}.wc-metaboxes-wrapper .wc-metabox table td .select2-container,.wc-metaboxes-wrapper .wc-metabox table td select{width:100%!important}.wc-metaboxes-wrapper .wc-metabox table td input.short{width:200px}.wc-metaboxes-wrapper .wc-metabox table td input.checkbox{width:16px;min-width:inherit;vertical-align:text-bottom;display:inline-block;float:none}.wc-metaboxes-wrapper .wc-metabox table td.attribute_name{width:200px}.wc-metaboxes-wrapper .wc-metabox table .minus,.wc-metaboxes-wrapper .wc-metabox table .plus{margin-top:6px}.wc-metaboxes-wrapper .wc-metabox table .fl{float:left}.wc-metaboxes-wrapper .wc-metabox table .fr{float:right}.variations-pagenav{float:right;line-height:24px}.variations-pagenav .displaying-num{color:#777;font-size:12px;font-style:italic}.variations-pagenav a{padding:0 10px 3px;background:rgba(0,0,0,.05);font-size:16px;font-weight:400;text-decoration:none}.variations-pagenav a.disabled,.variations-pagenav a.disabled:active,.variations-pagenav a.disabled:focus,.variations-pagenav a.disabled:hover{color:#a0a5aa;background:rgba(0,0,0,.05)}.variations-defaults{float:left}.variations-defaults select{margin:.25em .25em .25em 0}.woocommerce_variable_attributes{background-color:#fdfdfd;border-top:1px solid #eee}.woocommerce_variable_attributes .data{padding:1em 2em}.woocommerce_variable_attributes .data::after,.woocommerce_variable_attributes .data::before{content:' ';display:table}.woocommerce_variable_attributes .data::after{clear:both}.woocommerce_variable_attributes .upload_image_button{display:block;width:64px;height:64px;float:left;margin-right:20px;position:relative;cursor:pointer}.woocommerce_variable_attributes .upload_image_button img{width:100%;height:auto;display:none}.woocommerce_variable_attributes .upload_image_button::before{content:'\f128';font-family:Dashicons;position:absolute;top:0;left:0;right:0;bottom:0;text-align:center;line-height:64px;font-size:64px;font-weight:400;-webkit-font-smoothing:antialiased}.woocommerce_variable_attributes .upload_image_button.remove img{display:block}.woocommerce_variable_attributes .upload_image_button.remove::before{content:'\f335';display:none}.woocommerce_variable_attributes .upload_image_button.remove:hover::before{display:block}.woocommerce_variable_attributes .options{border:1px solid #eee;border-width:1px 0;padding:.25em 0}.woocommerce_variable_attributes .options label{display:inline-block;padding:4px 1em 2px 0}.woocommerce_variable_attributes .options input[type=checkbox]{margin:0 5px 0 .5em!important;vertical-align:middle}.form-row label{display:inline-block}.form-row .woocommerce-help-tip{float:right}.form-row input[type=number],.form-row input[type=text],.form-row select,.form-row textarea{width:100%;vertical-align:middle;margin:2px 0 0;padding:5px}.form-row select{height:30px;line-height:30px}.form-row.dimensions_field .wrap{clear:left;display:block}.form-row.dimensions_field input{width:33%;float:left;vertical-align:middle}.form-row.dimensions_field input:last-of-type{margin-right:0;width:34%}.form-row.form-row-first,.form-row.form-row-last{width:48%;float:right}.form-row.form-row-first{clear:both;float:left}.form-row.form-row-full{clear:both}.tips{cursor:help;text-decoration:none}img.tips{padding:5px 0 0}#tiptip_holder{display:none;z-index:8675309;position:absolute;top:0;left:0}#tiptip_holder.tip_top{padding-bottom:5px}#tiptip_holder.tip_top #tiptip_arrow_inner{margin-top:-7px;margin-left:-6px;border-top-color:#333}#tiptip_holder.tip_bottom{padding-top:5px}#tiptip_holder.tip_bottom #tiptip_arrow_inner{margin-top:-5px;margin-left:-6px;border-bottom-color:#333}#tiptip_holder.tip_right{padding-left:5px}#tiptip_holder.tip_right #tiptip_arrow_inner{margin-top:-6px;margin-left:-5px;border-right-color:#333}#tiptip_holder.tip_left{padding-right:5px}#tiptip_holder.tip_left #tiptip_arrow_inner{margin-top:-6px;margin-left:-7px;border-left-color:#333}#tiptip_content,.chart-tooltip,.wc_error_tip{color:#fff;font-size:.8em;max-width:150px;background:#333;text-align:center;border-radius:3px;padding:.618em 1em;box-shadow:0 1px 3px rgba(0,0,0,.2)}#tiptip_content code,.chart-tooltip code,.wc_error_tip code{padding:1px;background:#888}#tiptip_arrow,#tiptip_arrow_inner{position:absolute;border-color:transparent;border-style:solid;border-width:6px;height:0;width:0}.wc_error_tip{max-width:20em;line-height:1.8em;position:absolute;white-space:normal;background:#d82223;margin:1.5em 1px 0 -1em;z-index:9999999}.wc_error_tip::after{content:'';display:block;border:8px solid #d82223;border-right-color:transparent;border-left-color:transparent;border-top-color:transparent;position:absolute;top:-3px;left:50%;margin:-1em 0 0 -3px}img.ui-datepicker-trigger{vertical-align:middle;margin-top:-1px;cursor:pointer}.wc-metabox-content img.ui-datepicker-trigger,.woocommerce_options_panel img.ui-datepicker-trigger{float:left;margin-right:8px;margin-top:4px;margin-left:4px}#ui-datepicker-div{display:none}.woocommerce-reports-remove-filter{color:red;text-decoration:none}.woocommerce-reports-wide.woocommerce-reports-wrap,.woocommerce-reports-wrap.woocommerce-reports-wrap{margin-left:300px;padding-top:18px}.woocommerce-reports-wide.halved,.woocommerce-reports-wrap.halved{margin:0;overflow:hidden;zoom:1}.woocommerce-reports-wide .widefat th,.woocommerce-reports-wrap .widefat th{padding:7px}.woocommerce-reports-wide .widefat td,.woocommerce-reports-wrap .widefat td{vertical-align:top;padding:7px}.woocommerce-reports-wide .widefat td .description,.woocommerce-reports-wrap .widefat td .description{margin:4px 0 0}.woocommerce-reports-wide .postbox::after,.woocommerce-reports-wrap .postbox::after{content:'.';display:block;height:0;clear:both;visibility:hidden}.woocommerce-reports-wide .postbox h3,.woocommerce-reports-wrap .postbox h3{cursor:default!important}.woocommerce-reports-wide .postbox .inside,.woocommerce-reports-wrap .postbox .inside{padding:10px;margin:0!important}.woocommerce-reports-wide .postbox div.stats_range,.woocommerce-reports-wide .postbox h3.stats_range,.woocommerce-reports-wrap .postbox div.stats_range,.woocommerce-reports-wrap .postbox h3.stats_range{border-bottom-color:#dfdfdf;margin:0;padding:0!important}.woocommerce-reports-wide .postbox div.stats_range .export_csv,.woocommerce-reports-wide .postbox h3.stats_range .export_csv,.woocommerce-reports-wrap .postbox div.stats_range .export_csv,.woocommerce-reports-wrap .postbox h3.stats_range .export_csv{float:right;line-height:26px;border-left:1px solid #dfdfdf;padding:10px;display:block;text-decoration:none}.woocommerce-reports-wide .postbox div.stats_range .export_csv::before,.woocommerce-reports-wide .postbox h3.stats_range .export_csv::before,.woocommerce-reports-wrap .postbox div.stats_range .export_csv::before,.woocommerce-reports-wrap .postbox h3.stats_range .export_csv::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;content:"";text-decoration:none;margin-right:4px}.woocommerce-reports-wide .postbox div.stats_range ul,.woocommerce-reports-wide .postbox h3.stats_range ul,.woocommerce-reports-wrap .postbox div.stats_range ul,.woocommerce-reports-wrap .postbox h3.stats_range ul{list-style:none outside;margin:0;padding:0;zoom:1;background:#f5f5f5;border-bottom:1px solid #ccc}.woocommerce-reports-wide .postbox div.stats_range ul::after,.woocommerce-reports-wide .postbox div.stats_range ul::before,.woocommerce-reports-wide .postbox h3.stats_range ul::after,.woocommerce-reports-wide .postbox h3.stats_range ul::before,.woocommerce-reports-wrap .postbox div.stats_range ul::after,.woocommerce-reports-wrap .postbox div.stats_range ul::before,.woocommerce-reports-wrap .postbox h3.stats_range ul::after,.woocommerce-reports-wrap .postbox h3.stats_range ul::before{content:' ';display:table}.woocommerce-reports-wide .postbox div.stats_range ul::after,.woocommerce-reports-wide .postbox h3.stats_range ul::after,.woocommerce-reports-wrap .postbox div.stats_range ul::after,.woocommerce-reports-wrap .postbox h3.stats_range ul::after{clear:both}.woocommerce-reports-wide .postbox div.stats_range ul li,.woocommerce-reports-wide .postbox h3.stats_range ul li,.woocommerce-reports-wrap .postbox div.stats_range ul li,.woocommerce-reports-wrap .postbox h3.stats_range ul li{float:left;margin:0;padding:0;line-height:26px;font-weight:700;font-size:14px}.woocommerce-reports-wide .postbox div.stats_range ul li a,.woocommerce-reports-wide .postbox h3.stats_range ul li a,.woocommerce-reports-wrap .postbox div.stats_range ul li a,.woocommerce-reports-wrap .postbox h3.stats_range ul li a{border-right:1px solid #dfdfdf;padding:10px;display:block;text-decoration:none}.woocommerce-reports-wide .postbox div.stats_range ul li.active,.woocommerce-reports-wide .postbox h3.stats_range ul li.active,.woocommerce-reports-wrap .postbox div.stats_range ul li.active,.woocommerce-reports-wrap .postbox h3.stats_range ul li.active{background:#fff;box-shadow:0 4px 0 0 #fff}.woocommerce-reports-wide .postbox div.stats_range ul li.active a,.woocommerce-reports-wide .postbox h3.stats_range ul li.active a,.woocommerce-reports-wrap .postbox div.stats_range ul li.active a,.woocommerce-reports-wrap .postbox h3.stats_range ul li.active a{color:#777}.woocommerce-reports-wide .postbox div.stats_range ul li.custom,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom{padding:9px 10px;vertical-align:middle}.woocommerce-reports-wide .postbox div.stats_range ul li.custom div,.woocommerce-reports-wide .postbox div.stats_range ul li.custom form,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom div,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom form,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom div,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom form,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom div,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom form{display:inline;margin:0}.woocommerce-reports-wide .postbox div.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wide .postbox div.stats_range ul li.custom form input.range_datepicker,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom form input.range_datepicker,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom form input.range_datepicker,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom form input.range_datepicker{padding:0;margin:0 10px 0 0;background:0 0;border:0;color:#777;text-align:center;box-shadow:none}.woocommerce-reports-wide .postbox div.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wide .postbox div.stats_range ul li.custom form input.range_datepicker.from,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom form input.range_datepicker.from,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom form input.range_datepicker.from,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom form input.range_datepicker.from{margin-right:0}.woocommerce-reports-wide .postbox .chart-with-sidebar,.woocommerce-reports-wrap .postbox .chart-with-sidebar{padding:12px 12px 12px 249px;margin:0!important}.woocommerce-reports-wide .postbox .chart-with-sidebar .chart-sidebar,.woocommerce-reports-wrap .postbox .chart-with-sidebar .chart-sidebar{width:225px;margin-left:-237px;float:left}.woocommerce-reports-wide .postbox .chart-widgets,.woocommerce-reports-wrap .postbox .chart-widgets{margin:0;padding:0}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget{margin:0 0 1em;background:#fafafa;border:1px solid #dfdfdf}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget::after,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget::after{content:'.';display:block;height:0;clear:both;visibility:hidden}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget h4,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget h4{background:#fff;border:1px solid #dfdfdf;border-left-width:0;border-right-width:0;padding:10px;margin:0;color:#2ea2cc;border-top-width:0;background-image:-webkit-linear-gradient(bottom,#ececec,#f9f9f9);background-image:linear-gradient(to top,#ececec,#f9f9f9)}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget h4.section_title:hover,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget h4.section_title:hover{color:#a00}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title{cursor:pointer}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title span,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title span{display:block}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title span::after,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title span::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-left:.618em;content:"";text-decoration:none;float:right;font-size:.9em;line-height:1.618}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title.open,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title.open{color:#333}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title.open span::after,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title.open span::after{display:none}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section{border-bottom:1px solid #dfdfdf}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section .select2-container,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section .select2-container{width:100%!important}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section:last-of-type,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section:last-of-type{border-radius:0 0 3px 3px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table{width:100%}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td{padding:7px 10px;vertical-align:top;border-top:1px solid #e5e5e5;line-height:1.4em}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table tr:first-child td,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table tr:first-child td{border-top:0}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.count,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.count{background:#f5f5f5}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.name,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.name{max-width:175px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.name a,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.name a{word-wrap:break-word}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.sparkline,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.sparkline{vertical-align:middle}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table .wc_sparkline,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table .wc_sparkline{width:32px;height:1em;display:block;float:right}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table tr.active td,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table tr.active td{background:#f5f5f5}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget form,.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget p,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget form,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget p{margin:0;padding:10px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget form .submit,.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget p .submit,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget form .submit,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget p .submit{margin-top:10px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget #product_ids,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget #product_ids{width:100%}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .select_all,.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .select_none,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .select_all,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .select_none{float:right;color:#999;margin-left:4px;margin-top:10px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .description,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .description{margin-left:.5em;font-weight:400;opacity:.8}.woocommerce-reports-wide .postbox .chart-legend,.woocommerce-reports-wrap .postbox .chart-legend{list-style:none outside;margin:0 0 1em;padding:0;border:1px solid #dfdfdf;border-right-width:0;border-bottom-width:0;background:#fff}.woocommerce-reports-wide .postbox .chart-legend li,.woocommerce-reports-wrap .postbox .chart-legend li{border-right:5px solid #aaa;color:#aaa;padding:1em;display:block;margin:0;-webkit-transition:all ease .5s;transition:all ease .5s;box-shadow:inset 0 -1px 0 0 #dfdfdf}.woocommerce-reports-wide .postbox .chart-legend li strong,.woocommerce-reports-wrap .postbox .chart-legend li strong{font-size:1.618em;line-height:1.2em;color:#464646;font-weight:400;display:block;font-family:HelveticaNeue-Light,'Helvetica Neue Light','Helvetica Neue',sans-serif}.woocommerce-reports-wide .postbox .chart-legend li strong del,.woocommerce-reports-wrap .postbox .chart-legend li strong del{color:#e74c3c;font-weight:400}.woocommerce-reports-wide .postbox .chart-legend li:hover,.woocommerce-reports-wrap .postbox .chart-legend li:hover{box-shadow:inset 0 -1px 0 0 #dfdfdf,inset 300px 0 0 rgba(156,93,144,.1);border-right:5px solid #9c5d90!important;padding-left:1.5em;color:#9c5d90}.woocommerce-reports-wide .postbox .pie-chart-legend,.woocommerce-reports-wrap .postbox .pie-chart-legend{margin:12px 0 0;overflow:hidden}.woocommerce-reports-wide .postbox .pie-chart-legend li,.woocommerce-reports-wrap .postbox .pie-chart-legend li{float:left;margin:0;padding:6px 0 0;border-top:4px solid #999;text-align:center;box-sizing:border-box;width:50%}.woocommerce-reports-wide .postbox .stat,.woocommerce-reports-wrap .postbox .stat{font-size:1.5em!important;font-weight:700;text-align:center}.woocommerce-reports-wide .postbox .chart-placeholder,.woocommerce-reports-wrap .postbox .chart-placeholder{width:100%;height:650px;overflow:hidden;position:relative}.woocommerce-reports-wide .postbox .chart-prompt,.woocommerce-reports-wrap .postbox .chart-prompt{line-height:650px;margin:0;color:#999;font-size:1.2em;font-style:italic;text-align:center}.woocommerce-reports-wide .postbox .chart-container,.woocommerce-reports-wrap .postbox .chart-container{background:#fff;padding:12px;position:relative;border:1px solid #dfdfdf;border-radius:3px}.woocommerce-reports-wide .postbox .main .chart-legend,.woocommerce-reports-wrap .postbox .main .chart-legend{margin-top:12px}.woocommerce-reports-wide .postbox .main .chart-legend li,.woocommerce-reports-wrap .postbox .main .chart-legend li{border-right:0;margin:0 8px 0 0;float:left;border-top:4px solid #aaa}.woocommerce-reports-wide .woocommerce-reports-main,.woocommerce-reports-wrap .woocommerce-reports-main{float:left;min-width:100%}.woocommerce-reports-wide .woocommerce-reports-main table td,.woocommerce-reports-wrap .woocommerce-reports-main table td{padding:9px}.woocommerce-reports-wide .woocommerce-reports-sidebar,.woocommerce-reports-wrap .woocommerce-reports-sidebar{display:inline;width:281px;margin-left:-300px;clear:both;float:left}.woocommerce-reports-wide .woocommerce-reports-left,.woocommerce-reports-wrap .woocommerce-reports-left{width:49.5%;float:left}.woocommerce-reports-wide .woocommerce-reports-right,.woocommerce-reports-wrap .woocommerce-reports-right{width:49.5%;float:right}.woocommerce-wide-reports-wrap{padding-bottom:11px}.woocommerce-wide-reports-wrap .widefat .export-data{float:right}.woocommerce-wide-reports-wrap .widefat td,.woocommerce-wide-reports-wrap .widefat th{vertical-align:middle;padding:7px}form.report_filters p{vertical-align:middle}form.report_filters div,form.report_filters input,form.report_filters label{vertical-align:middle}.chart-tooltip{position:absolute;display:none;line-height:1}table.bar_chart{width:100%}table.bar_chart thead th{text-align:left;color:#ccc;padding:6px 0}table.bar_chart tbody th{padding:6px 0;width:25%;text-align:left!important;font-weight:400!important;border-bottom:1px solid #fee}table.bar_chart tbody td{text-align:right;line-height:24px;padding:6px 6px 6px 0;border-bottom:1px solid #fee}table.bar_chart tbody td span{color:#8a4b75;display:block}table.bar_chart tbody td span.alt{color:#47a03e;margin-top:6px}table.bar_chart tbody td.bars{position:relative;text-align:left;padding:6px 6px 6px 0;border-bottom:1px solid #fee}table.bar_chart tbody td.bars a,table.bar_chart tbody td.bars span{text-decoration:none;clear:both;background:#8a4b75;float:left;display:block;line-height:24px;height:24px;border-radius:3px}table.bar_chart tbody td.bars span.alt{clear:both;background:#47a03e}table.bar_chart tbody td.bars span.alt span{margin:0;color:#c5dec2!important;text-shadow:0 1px 0 #47a03e;background:0 0}.post-type-shop_order .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}.post-type-shop_coupon .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}.post-type-product .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}.woocommerce-BlankState--api .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}.woocommerce-BlankState--webhooks .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}.woocommerce-BlankState{text-align:center;padding:5em 0 0}.woocommerce-BlankState .woocommerce-BlankState-message{color:#aaa;margin:0 auto 1.5em;line-height:1.5em;font-size:1.2em;max-width:500px}.woocommerce-BlankState .woocommerce-BlankState-message::before{color:#ddd;text-shadow:0 -1px 1px rgba(0,0,0,.2),0 1px 0 rgba(255,255,255,.8);font-size:8em;display:block;position:relative!important;top:auto;left:auto;line-height:1em;margin:0 0 .1875em}.woocommerce-BlankState .woocommerce-BlankState-cta{font-size:1.2em;padding:.75em 1.5em;margin:0 .25em;height:auto;display:inline-block!important}@media only screen and (max-width:1280px){#order_data .order_data_column{width:48%}#order_data .order_data_column:first-child{width:100%}.woocommerce_options_panel .description{display:block;clear:both;margin-left:0}.woocommerce_options_panel .dimensions_field .wrap,.woocommerce_options_panel .short,.woocommerce_options_panel input[type=email].short,.woocommerce_options_panel input[type=number].short,.woocommerce_options_panel input[type=password].short,.woocommerce_options_panel input[type=text].short{width:80%}.woocommerce_options_panel .downloadable_files,.woocommerce_variations .downloadable_files{padding:0;clear:both}.woocommerce_options_panel .downloadable_files label,.woocommerce_variations .downloadable_files label{position:static}.woocommerce_options_panel .downloadable_files table,.woocommerce_variations .downloadable_files table{margin:0 12px 24px;width:94%}.woocommerce_options_panel .downloadable_files table .sort,.woocommerce_variations .downloadable_files table .sort{visibility:hidden}.woocommerce_options_panel .woocommerce_variable_attributes .downloadable_files table,.woocommerce_variations .woocommerce_variable_attributes .downloadable_files table{margin:0 0 1em;width:100%}}@media only screen and (max-width:900px){#woocommerce-coupon-data ul.coupon_data_tabs,#woocommerce-product-data .wc-tabs-back,#woocommerce-product-data ul.product_data_tabs{width:10%}#woocommerce-coupon-data .wc-metaboxes-wrapper,#woocommerce-coupon-data .woocommerce_options_panel,#woocommerce-product-data .wc-metaboxes-wrapper,#woocommerce-product-data .woocommerce_options_panel{width:90%}#woocommerce-coupon-data ul.coupon_data_tabs li a,#woocommerce-product-data ul.product_data_tabs li a{position:relative;text-indent:-999px;padding:10px}#woocommerce-coupon-data ul.coupon_data_tabs li a::before,#woocommerce-product-data ul.product_data_tabs li a::before{position:absolute;top:0;right:0;bottom:0;left:0;text-indent:0;text-align:center;line-height:40px;width:100%;height:40px}}@media only screen and (max-width:782px){#wp-excerpt-media-buttons a{font-size:16px;line-height:37px;height:39px;padding:0 20px 0 15px}#wp-excerpt-editor-tools{padding-top:20px;padding-right:15px;overflow:hidden;margin-bottom:-1px}#woocommerce-product-data .checkbox{width:25px}.variations-pagenav{float:none;text-align:center;font-size:18px}.variations-pagenav .displaying-num{font-size:16px}.variations-pagenav a{padding:8px 20px 11px;font-size:18px}.variations-pagenav select{padding:0 20px}.variations-defaults{float:none;text-align:center;margin-top:10px}.post-type-product .wp-list-table .column-thumb{display:none;text-align:left;padding-bottom:0}.post-type-product .wp-list-table .column-thumb::before{display:none!important}.post-type-product .wp-list-table .column-thumb img{max-width:32px}.post-type-product .wp-list-table .is-expanded td:not(.hidden){overflow:visible}.post-type-product .wp-list-table .toggle-row{top:-28px}.post-type-shop_order .wp-list-table .column-customer_message,.post-type-shop_order .wp-list-table .column-order_notes{text-align:inherit}.post-type-shop_order .wp-list-table .column-order_notes .note-on{font-size:1.3em;margin:0}.post-type-shop_order .wp-list-table .is-expanded td:not(.hidden){overflow:visible}.post-type-shop_order .wp-list-table .toggle-row{top:-15px}}@media only screen and (max-width:500px){.woocommerce_options_panel label,.woocommerce_options_panel legend{float:none;width:auto;display:block;margin:0}.woocommerce_options_panel fieldset.form-field,.woocommerce_options_panel p.form-field{padding:5px 20px!important}.addons-wcs-banner-block{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.wc_addons_wrap .addons-wcs-banner-block{padding:40px}.wc_addons_wrap .addons-wcs-banner-block-image{padding:1em;text-align:center;width:100%;padding:2em 0;margin:0}.wc_addons_wrap .addons-wcs-banner-block-image .addons-img{margin:0}}.wc-backbone-modal *{box-sizing:border-box}.wc-backbone-modal .wc-backbone-modal-content{position:fixed;background:#fff;z-index:100000;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);max-width:100%;min-width:500px}.wc-backbone-modal .wc-backbone-modal-content article{overflow:auto}.wc-backbone-modal.wc-backbone-modal-shipping-method-settings .wc-backbone-modal-content{width:75%;min-width:500px}.wc-backbone-modal .select2-container{width:100%!important}@media screen and (max-width:782px){.wc-backbone-modal .wc-backbone-modal-content{width:100%;height:100%;min-width:100%}}.wc-backbone-modal-backdrop{position:fixed;top:0;left:0;right:0;bottom:0;min-height:360px;background:#000;opacity:.7;z-index:99900}.wc-backbone-modal-main{padding-bottom:55px}.wc-backbone-modal-main article,.wc-backbone-modal-main header{display:block;position:relative}.wc-backbone-modal-main .wc-backbone-modal-header{height:auto;background:#fcfcfc;padding:1em 1.5em;border-bottom:1px solid #ddd}.wc-backbone-modal-main .wc-backbone-modal-header h1{margin:0;font-size:18px;font-weight:700;line-height:1.5em}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link{cursor:pointer;color:#777;height:54px;width:54px;padding:0;position:absolute;top:0;right:0;text-align:center;border:0;border-left:1px solid #ddd;background-color:transparent;-webkit-transition:color .1s ease-in-out,background .1s ease-in-out;transition:color .1s ease-in-out,background .1s ease-in-out}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link::before{font:normal 22px/50px dashicons!important;color:#666;display:block;content:'\f335';font-weight:300}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link:focus,.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link:hover{background:#ddd;border-color:#ccc;color:#000}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link:focus{outline:0}.wc-backbone-modal-main article{padding:1.5em}.wc-backbone-modal-main article p{margin:1.5em 0}.wc-backbone-modal-main article p:first-child{margin-top:0}.wc-backbone-modal-main article p:last-child{margin-bottom:0}.wc-backbone-modal-main article .pagination{padding:10px 0 0;text-align:center}.wc-backbone-modal-main article table.widefat{margin:0;width:100%;border:0;box-shadow:none}.wc-backbone-modal-main article table.widefat thead th{padding:0 1em 1em 1em;text-align:left}.wc-backbone-modal-main article table.widefat thead th:first-child{padding-left:0}.wc-backbone-modal-main article table.widefat thead th:last-child{padding-right:0;text-align:right}.wc-backbone-modal-main article table.widefat tbody td,.wc-backbone-modal-main article table.widefat tbody th{padding:1em;text-align:left;vertical-align:middle}.wc-backbone-modal-main article table.widefat tbody td:first-child,.wc-backbone-modal-main article table.widefat tbody th:first-child{padding-left:0}.wc-backbone-modal-main article table.widefat tbody td:last-child,.wc-backbone-modal-main article table.widefat tbody th:last-child{padding-right:0;text-align:right}.wc-backbone-modal-main article table.widefat tbody td .select2-container,.wc-backbone-modal-main article table.widefat tbody td select,.wc-backbone-modal-main article table.widefat tbody th .select2-container,.wc-backbone-modal-main article table.widefat tbody th select{width:100%}.wc-backbone-modal-main footer{position:absolute;left:0;right:0;bottom:0;z-index:100;padding:1em 1.5em;background:#fcfcfc;border-top:1px solid #dfdfdf;box-shadow:0 -4px 4px -4px rgba(0,0,0,.1)}.wc-backbone-modal-main footer .inner{text-align:right;line-height:23px}.wc-backbone-modal-main footer .inner .button{margin-bottom:0}.select2-drop,.select2-dropdown{z-index:999999!important}.select2-results{line-height:1.5em}.select2-results .select2-results__group,.select2-results .select2-results__option{margin:0;padding:8px}.select2-results .description{display:block;color:#999;padding-top:4px}.select2-dropdown{border-color:#ddd}.select2-dropdown--below{box-shadow:0 1px 1px rgba(0,0,0,.1)}.select2-dropdown--above{box-shadow:0 -1px 1px rgba(0,0,0,.1)}.select2-container .select2-selection__rendered.ui-sortable li{cursor:move}.select2-container .select2-selection{border-color:#ddd}.select2-container .select2-search__field{min-width:150px}.select2-container .select2-selection--single{height:32px}.select2-container .select2-selection--single .select2-selection__rendered{line-height:32px;padding-right:24px}.select2-container .select2-selection--single .select2-selection__arrow{right:3px;height:30px}.select2-container .select2-selection--multiple{min-height:28px;border-radius:0;line-height:1.5}.select2-container .select2-selection--multiple li{margin:0}.select2-container .select2-selection--multiple .select2-selection__choice{padding:2px 6px}.select2-container .select2-selection--multiple .select2-selection__choice .description{display:none}.select2-container .select2-selection__clear{color:#999;margin-top:-1px}.select2-container .select2-search--inline .select2-search__field{font-family:inherit;font-size:inherit;font-weight:inherit;padding:3px 0}.woocommerce table.form-table .select2-container{min-width:400px!important}.post-type-product .tablenav .actions,.post-type-shop_order .tablenav .actions{overflow:visible}.post-type-product .tablenav input,.post-type-product .tablenav select,.post-type-shop_order .tablenav input,.post-type-shop_order .tablenav select{line-height:1;height:32px}.post-type-product .tablenav .select2-container,.post-type-shop_order .tablenav .select2-container{float:left;width:240px!important;font-size:14px;vertical-align:middle;margin:1px 6px 4px 1px}.woocommerce-exporter-wrapper,.woocommerce-importer-wrapper,.woocommerce-progress-form-wrapper{text-align:center;max-width:700px;margin:40px auto}.woocommerce-exporter-wrapper .error,.woocommerce-importer-wrapper .error,.woocommerce-progress-form-wrapper .error{text-align:left}.woocommerce-exporter-wrapper .wc-progress-steps,.woocommerce-importer-wrapper .wc-progress-steps,.woocommerce-progress-form-wrapper .wc-progress-steps{padding:0 0 24px;margin:0;list-style:none outside;overflow:hidden;color:#ccc;width:100%;display:-ms-inline-flexbox;display:-webkit-inline-box;display:inline-flex}.woocommerce-exporter-wrapper .wc-progress-steps li,.woocommerce-importer-wrapper .wc-progress-steps li,.woocommerce-progress-form-wrapper .wc-progress-steps li{width:25%;float:left;padding:0 0 .8em;margin:0;text-align:center;position:relative;border-bottom:4px solid #ccc;line-height:1.4em}.woocommerce-exporter-wrapper .wc-progress-steps li::before,.woocommerce-importer-wrapper .wc-progress-steps li::before,.woocommerce-progress-form-wrapper .wc-progress-steps li::before{content:'';border:4px solid #ccc;border-radius:100%;width:4px;height:4px;position:absolute;bottom:0;left:50%;margin-left:-6px;margin-bottom:-8px;background:#fff}.woocommerce-exporter-wrapper .wc-progress-steps li.active,.woocommerce-importer-wrapper .wc-progress-steps li.active,.woocommerce-progress-form-wrapper .wc-progress-steps li.active{border-color:#a16696;color:#a16696}.woocommerce-exporter-wrapper .wc-progress-steps li.active::before,.woocommerce-importer-wrapper .wc-progress-steps li.active::before,.woocommerce-progress-form-wrapper .wc-progress-steps li.active::before{border-color:#a16696}.woocommerce-exporter-wrapper .wc-progress-steps li.done,.woocommerce-importer-wrapper .wc-progress-steps li.done,.woocommerce-progress-form-wrapper .wc-progress-steps li.done{border-color:#a16696;color:#a16696}.woocommerce-exporter-wrapper .wc-progress-steps li.done::before,.woocommerce-importer-wrapper .wc-progress-steps li.done::before,.woocommerce-progress-form-wrapper .wc-progress-steps li.done::before{border-color:#a16696;background:#a16696}.woocommerce-exporter-wrapper .button,.woocommerce-importer-wrapper .button,.woocommerce-progress-form-wrapper .button{font-size:1.25em;padding:.5em 1em!important;line-height:1.5em!important;margin-right:.5em;margin-bottom:2px;height:auto!important;border-radius:4px;background-color:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;text-shadow:0 -1px 1px #a36597,1px 0 1px #a36597,0 1px 1px #a36597,-1px 0 1px #a36597;margin:0;opacity:1}.woocommerce-exporter-wrapper .button:active,.woocommerce-exporter-wrapper .button:focus,.woocommerce-exporter-wrapper .button:hover,.woocommerce-importer-wrapper .button:active,.woocommerce-importer-wrapper .button:focus,.woocommerce-importer-wrapper .button:hover,.woocommerce-progress-form-wrapper .button:active,.woocommerce-progress-form-wrapper .button:focus,.woocommerce-progress-form-wrapper .button:hover{background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.woocommerce-exporter-wrapper .error .button,.woocommerce-importer-wrapper .error .button,.woocommerce-progress-form-wrapper .error .button{font-size:1em}.woocommerce-exporter-wrapper .wc-actions,.woocommerce-importer-wrapper .wc-actions,.woocommerce-progress-form-wrapper .wc-actions{overflow:hidden;border-top:1px solid #eee;margin:0;padding:23px 24px 24px;line-height:3em}.woocommerce-exporter-wrapper .wc-actions .button,.woocommerce-importer-wrapper .wc-actions .button,.woocommerce-progress-form-wrapper .wc-actions .button{float:right}.woocommerce-exporter-wrapper .wc-actions .woocommerce-importer-toggle-advanced-options,.woocommerce-importer-wrapper .wc-actions .woocommerce-importer-toggle-advanced-options,.woocommerce-progress-form-wrapper .wc-actions .woocommerce-importer-toggle-advanced-options{color:#999}.woocommerce-exporter-wrapper .wc-progress-form-content,.woocommerce-exporter-wrapper .woocommerce-exporter,.woocommerce-exporter-wrapper .woocommerce-importer,.woocommerce-importer-wrapper .wc-progress-form-content,.woocommerce-importer-wrapper .woocommerce-exporter,.woocommerce-importer-wrapper .woocommerce-importer,.woocommerce-progress-form-wrapper .wc-progress-form-content,.woocommerce-progress-form-wrapper .woocommerce-exporter,.woocommerce-progress-form-wrapper .woocommerce-importer{background:#fff;overflow:hidden;padding:0;margin:0 0 16px;box-shadow:0 1px 3px rgba(0,0,0,.13);color:#555;text-align:left}.woocommerce-exporter-wrapper .wc-progress-form-content header,.woocommerce-exporter-wrapper .woocommerce-exporter header,.woocommerce-exporter-wrapper .woocommerce-importer header,.woocommerce-importer-wrapper .wc-progress-form-content header,.woocommerce-importer-wrapper .woocommerce-exporter header,.woocommerce-importer-wrapper .woocommerce-importer header,.woocommerce-progress-form-wrapper .wc-progress-form-content header,.woocommerce-progress-form-wrapper .woocommerce-exporter header,.woocommerce-progress-form-wrapper .woocommerce-importer header{border-bottom:1px solid #eee;margin:0;padding:24px 24px 0}.woocommerce-exporter-wrapper .wc-progress-form-content section,.woocommerce-exporter-wrapper .woocommerce-exporter section,.woocommerce-exporter-wrapper .woocommerce-importer section,.woocommerce-importer-wrapper .wc-progress-form-content section,.woocommerce-importer-wrapper .woocommerce-exporter section,.woocommerce-importer-wrapper .woocommerce-importer section,.woocommerce-progress-form-wrapper .wc-progress-form-content section,.woocommerce-progress-form-wrapper .woocommerce-exporter section,.woocommerce-progress-form-wrapper .woocommerce-importer section{padding:24px 24px 0}.woocommerce-exporter-wrapper .wc-progress-form-content h2,.woocommerce-exporter-wrapper .woocommerce-exporter h2,.woocommerce-exporter-wrapper .woocommerce-importer h2,.woocommerce-importer-wrapper .wc-progress-form-content h2,.woocommerce-importer-wrapper .woocommerce-exporter h2,.woocommerce-importer-wrapper .woocommerce-importer h2,.woocommerce-progress-form-wrapper .wc-progress-form-content h2,.woocommerce-progress-form-wrapper .woocommerce-exporter h2,.woocommerce-progress-form-wrapper .woocommerce-importer h2{margin:0 0 24px;color:#555;font-size:24px;font-weight:400;line-height:1em}.woocommerce-exporter-wrapper .wc-progress-form-content p,.woocommerce-exporter-wrapper .woocommerce-exporter p,.woocommerce-exporter-wrapper .woocommerce-importer p,.woocommerce-importer-wrapper .wc-progress-form-content p,.woocommerce-importer-wrapper .woocommerce-exporter p,.woocommerce-importer-wrapper .woocommerce-importer p,.woocommerce-progress-form-wrapper .wc-progress-form-content p,.woocommerce-progress-form-wrapper .woocommerce-exporter p,.woocommerce-progress-form-wrapper .woocommerce-importer p{font-size:1em;line-height:1.75em;font-size:16px;color:#555;margin:0 0 24px}.woocommerce-exporter-wrapper .wc-progress-form-content .form-row,.woocommerce-exporter-wrapper .woocommerce-exporter .form-row,.woocommerce-exporter-wrapper .woocommerce-importer .form-row,.woocommerce-importer-wrapper .wc-progress-form-content .form-row,.woocommerce-importer-wrapper .woocommerce-exporter .form-row,.woocommerce-importer-wrapper .woocommerce-importer .form-row,.woocommerce-progress-form-wrapper .wc-progress-form-content .form-row,.woocommerce-progress-form-wrapper .woocommerce-exporter .form-row,.woocommerce-progress-form-wrapper .woocommerce-importer .form-row{margin-top:24px}.woocommerce-exporter-wrapper .wc-progress-form-content .spinner,.woocommerce-exporter-wrapper .woocommerce-exporter .spinner,.woocommerce-exporter-wrapper .woocommerce-importer .spinner,.woocommerce-importer-wrapper .wc-progress-form-content .spinner,.woocommerce-importer-wrapper .woocommerce-exporter .spinner,.woocommerce-importer-wrapper .woocommerce-importer .spinner,.woocommerce-progress-form-wrapper .wc-progress-form-content .spinner,.woocommerce-progress-form-wrapper .woocommerce-exporter .spinner,.woocommerce-progress-form-wrapper .woocommerce-importer .spinner{display:none}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th{vertical-align:top;line-height:1.75em;padding:0 0 24px 0}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td label,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th label,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td label,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th label{color:#555;font-weight:400}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=checkbox],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=checkbox],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=checkbox],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=checkbox]{margin:0 4px 0 0;padding:7px}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=text],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=text],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=text],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=text]{padding:7px;height:auto;margin:0}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper{border:1px solid #ddd;box-shadow:inset 0 1px 2px rgba(0,0,0,.07);background-color:#fff;color:#32373c;outline:0;line-height:1;display:block}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code{background:0 0;font-size:smaller;padding:0;margin:0;color:#999;padding:7px 0 0 7px;display:inline-block}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input{font-family:Consolas,Monaco,monospace;border:0;margin:0;outline:0;box-shadow:none;display:inline-block;min-width:100%}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th{width:35%;padding-right:20px}.woocommerce-exporter-wrapper .wc-progress-form-content progress,.woocommerce-exporter-wrapper .woocommerce-exporter progress,.woocommerce-exporter-wrapper .woocommerce-importer progress,.woocommerce-importer-wrapper .wc-progress-form-content progress,.woocommerce-importer-wrapper .woocommerce-exporter progress,.woocommerce-importer-wrapper .woocommerce-importer progress,.woocommerce-progress-form-wrapper .wc-progress-form-content progress,.woocommerce-progress-form-wrapper .woocommerce-exporter progress,.woocommerce-progress-form-wrapper .woocommerce-importer progress{width:100%;height:42px;margin:0 auto 24px;display:block;-webkit-appearance:none;border:none;display:none;background:#f5f5f5;border:2px solid #eee;border-radius:4px;padding:0;box-shadow:0 1px 0 0 rgba(255,255,255,.2)}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-webkit-progress-bar,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-webkit-progress-bar,.woocommerce-exporter-wrapper .woocommerce-importer progress::-webkit-progress-bar,.woocommerce-importer-wrapper .wc-progress-form-content progress::-webkit-progress-bar,.woocommerce-importer-wrapper .woocommerce-exporter progress::-webkit-progress-bar,.woocommerce-importer-wrapper .woocommerce-importer progress::-webkit-progress-bar,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-webkit-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-webkit-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-webkit-progress-bar{background:transparent none;border:0;border-radius:4px;padding:0;box-shadow:none}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-webkit-progress-value,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-webkit-progress-value,.woocommerce-exporter-wrapper .woocommerce-importer progress::-webkit-progress-value,.woocommerce-importer-wrapper .wc-progress-form-content progress::-webkit-progress-value,.woocommerce-importer-wrapper .woocommerce-exporter progress::-webkit-progress-value,.woocommerce-importer-wrapper .woocommerce-importer progress::-webkit-progress-value,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-webkit-progress-value,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-webkit-progress-value,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-webkit-progress-value{border-radius:3px;box-shadow:inset 0 1px 1px 0 rgba(255,255,255,.4);background:#a46497;background:-webkit-linear-gradient(top,#a46497,#66405f),#a46497;background:linear-gradient(top,#a46497,#66405f),#a46497;-webkit-transition:width 1s ease;transition:width 1s ease}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-moz-progress-bar,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-moz-progress-bar,.woocommerce-exporter-wrapper .woocommerce-importer progress::-moz-progress-bar,.woocommerce-importer-wrapper .wc-progress-form-content progress::-moz-progress-bar,.woocommerce-importer-wrapper .woocommerce-exporter progress::-moz-progress-bar,.woocommerce-importer-wrapper .woocommerce-importer progress::-moz-progress-bar,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-moz-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-moz-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-moz-progress-bar{border-radius:3px;box-shadow:inset 0 1px 1px 0 rgba(255,255,255,.4);background:#a46497;background:linear-gradient(top,#a46497,#66405f),#a46497;-webkit-transition:width 1s ease;transition:width 1s ease}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-ms-fill,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-ms-fill,.woocommerce-exporter-wrapper .woocommerce-importer progress::-ms-fill,.woocommerce-importer-wrapper .wc-progress-form-content progress::-ms-fill,.woocommerce-importer-wrapper .woocommerce-exporter progress::-ms-fill,.woocommerce-importer-wrapper .woocommerce-importer progress::-ms-fill,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-ms-fill,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-ms-fill,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-ms-fill{border-radius:3px;box-shadow:inset 0 1px 1px 0 rgba(255,255,255,.4);background:#a46497;background:linear-gradient(to bottom,#a46497,#66405f),#a46497;-webkit-transition:width 1s ease;transition:width 1s ease}.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .spinner,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing .spinner,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .spinner,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing .spinner,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting .spinner,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing .spinner,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .spinner,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing .spinner,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .spinner,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing .spinner,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting .spinner,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing .spinner,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .spinner,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing .spinner,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .spinner,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing .spinner,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting .spinner,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing .spinner{display:block}.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting progress,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing progress,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting progress,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing progress,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting progress,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing progress,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting progress,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing progress,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting progress,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing progress,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting progress,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing progress,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting progress,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing progress,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting progress,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing progress,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting progress,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing progress{display:block}.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .wc-actions,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing .wc-actions,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .wc-actions,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing .wc-actions,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting .wc-actions,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing .wc-actions,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .wc-actions,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing .wc-actions,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .wc-actions,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing .wc-actions,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting .wc-actions,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing .wc-actions,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .wc-actions,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing .wc-actions,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing .woocommerce-exporter-options{display:none}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table-wrapper{padding:0}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table{margin:0;border:0;box-shadow:none;width:100%;table-layout:fixed}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th{border:0;padding:12px;vertical-align:middle;word-wrap:break-word}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td select,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th select,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td select,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th select{width:100%}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) th{background:#fbfbfb}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th{font-weight:700}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td:first-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th:first-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td:first-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th:first-child{padding-left:24px}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td:last-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th:last-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td:last-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th:last-child{padding-right:24px}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name{width:50%}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description{color:#999;margin-top:4px;display:block}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description code{background:0 0;padding:0;white-space:pre-line;word-wrap:break-word;word-break:break-all}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-done,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-done,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-done,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-done,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-done,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-done,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-done,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-done,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-done{text-align:center;padding:48px 24px;font-size:1.5em;line-height:1.75em}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-done::before,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-done::before,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-done::before,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-done::before,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-done::before,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-done::before,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-done::before,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-done::before,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-done::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#a16696;position:static;font-size:100px;display:block;float:none;margin:0 0 24px}.wc-pointer .wc-pointer-buttons .close{float:left;margin:6px 0 0 15px} \ No newline at end of file diff --git a/assets/css/auth-rtl.css b/assets/css/auth-rtl.css index 85a2a1d124f..8b2575ad54b 100644 --- a/assets/css/auth-rtl.css +++ b/assets/css/auth-rtl.css @@ -1 +1 @@ -body{background:#f1f1f1;-webkit-box-shadow:none;box-shadow:none;margin:100px auto 24px;padding:0}#wc-logo{border:0;margin:0 0 24px;padding:0;text-align:center}#wc-logo img{max-width:50%}.wc-auth-content{background:#fff;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.13);box-shadow:0 1px 3px rgba(0,0,0,.13);overflow:hidden;padding:24px 24px 0;zoom:1}.wc-auth-content h1,.wc-auth-content h2,.wc-auth-content h3,.wc-auth-content table{border:0;clear:none;color:#666;margin:0 0 24px;padding:0}.wc-auth-content p,.wc-auth-content ul{color:#666;font-size:1em;line-height:1.75em;margin:0 0 24px}.wc-auth-content p{padding:0}.wc-auth-content a{color:#a16696}.wc-auth-content a:focus,.wc-auth-content a:hover{color:#111}.wc-auth-content .wc-auth-login label{color:#999;display:block;margin-bottom:.5em}.wc-auth-content .wc-auth-login input{-webkit-box-sizing:border-box;box-sizing:border-box;font-size:1.3em;padding:.5em;width:100%}.wc-auth-content .wc-auth-login .wc-auth-actions{padding:0}.wc-auth-content .wc-auth-login .wc-auth-actions .wc-auth-login-button{float:none;width:100%}.wc-auth-permissions{list-style:disc inside;padding:0}.wc-auth-permissions li{font-size:1em}.wc-auth-logged-in-as{background:#f5f5f5;border-bottom:2px solid #eee;line-height:70px;margin:0 0 24px;padding:0 0 0 1em}.wc-auth-logged-in-as p{margin:0;line-height:70px}.wc-auth-logged-in-as img{float:right;height:70px;margin:0 0 0 1em}.wc-auth-logged-in-as .wc-auth-logout{float:left}.wc-auth .wc-auth-actions{overflow:hidden;padding-right:24px}.wc-auth .wc-auth-actions .button{background:#f7f7f7;border-bottom-width:2px;border:1px solid #d7d7d7;-webkit-box-sizing:border-box;box-sizing:border-box;color:#777;float:left;font-size:1.25em;height:auto;line-height:1em;padding:1em 2em;text-align:center;width:50%}.wc-auth .wc-auth-actions .button:focus,.wc-auth .wc-auth-actions .button:hover{background:#fcfcfc}.wc-auth .wc-auth-actions .button-primary{background:#ad6ea1;border-color:#a16696;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 0 rgba(0,0,0,.15);color:#fff;float:left;opacity:1;text-shadow:0 -1px 1px #8a4f7f,-1px 0 1px #8a4f7f,0 1px 1px #8a4f7f,1px 0 1px #8a4f7f}.wc-auth .wc-auth-actions .button-primary:focus,.wc-auth .wc-auth-actions .button-primary:hover{background:#b472a8;color:#fff}.wc-auth .wc-auth-actions .wc-auth-approve{float:left}.wc-auth .wc-auth-actions .wc-auth-deny{float:right;margin-right:-24px} \ No newline at end of file +body{background:#f1f1f1;box-shadow:none;margin:100px auto 24px;padding:0}#wc-logo{border:0;margin:0 0 24px;padding:0;text-align:center}#wc-logo img{max-width:50%}.wc-auth-content{background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.13);overflow:hidden;padding:24px 24px 0;zoom:1}.wc-auth-content h1,.wc-auth-content h2,.wc-auth-content h3,.wc-auth-content table{border:0;clear:none;color:#666;margin:0 0 24px;padding:0}.wc-auth-content p,.wc-auth-content ul{color:#666;font-size:1em;line-height:1.75em;margin:0 0 24px}.wc-auth-content p{padding:0}.wc-auth-content a{color:#a16696}.wc-auth-content a:focus,.wc-auth-content a:hover{color:#111}.wc-auth-content .wc-auth-login label{color:#999;display:block;margin-bottom:.5em}.wc-auth-content .wc-auth-login input{box-sizing:border-box;font-size:1.3em;padding:.5em;width:100%}.wc-auth-content .wc-auth-login .wc-auth-actions{padding:0}.wc-auth-content .wc-auth-login .wc-auth-actions .wc-auth-login-button{float:none;width:100%}.wc-auth-permissions{list-style:disc inside;padding:0}.wc-auth-permissions li{font-size:1em}.wc-auth-logged-in-as{background:#f5f5f5;border-bottom:2px solid #eee;line-height:70px;margin:0 0 24px;padding:0 0 0 1em}.wc-auth-logged-in-as p{margin:0;line-height:70px}.wc-auth-logged-in-as img{float:right;height:70px;margin:0 0 0 1em}.wc-auth-logged-in-as .wc-auth-logout{float:left}.wc-auth .wc-auth-actions{overflow:hidden;padding-right:24px}.wc-auth .wc-auth-actions .button{background:#f7f7f7;border-bottom-width:2px;border:1px solid #d7d7d7;box-sizing:border-box;color:#777;float:left;font-size:1.25em;height:auto;line-height:1em;padding:1em 2em;text-align:center;width:50%}.wc-auth .wc-auth-actions .button:focus,.wc-auth .wc-auth-actions .button:hover{background:#fcfcfc}.wc-auth .wc-auth-actions .button-primary{background:#ad6ea1;border-color:#a16696;box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 0 rgba(0,0,0,.15);color:#fff;float:left;opacity:1;text-shadow:0 -1px 1px #8a4f7f,-1px 0 1px #8a4f7f,0 1px 1px #8a4f7f,1px 0 1px #8a4f7f}.wc-auth .wc-auth-actions .button-primary:focus,.wc-auth .wc-auth-actions .button-primary:hover{background:#b472a8;color:#fff}.wc-auth .wc-auth-actions .wc-auth-approve{float:left}.wc-auth .wc-auth-actions .wc-auth-deny{float:right;margin-right:-24px} \ No newline at end of file diff --git a/assets/css/auth.css b/assets/css/auth.css index f4e2372390c..d119704d41a 100644 --- a/assets/css/auth.css +++ b/assets/css/auth.css @@ -1 +1 @@ -body{background:#f1f1f1;-webkit-box-shadow:none;box-shadow:none;margin:100px auto 24px;padding:0}#wc-logo{border:0;margin:0 0 24px;padding:0;text-align:center}#wc-logo img{max-width:50%}.wc-auth-content{background:#fff;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.13);box-shadow:0 1px 3px rgba(0,0,0,.13);overflow:hidden;padding:24px 24px 0;zoom:1}.wc-auth-content h1,.wc-auth-content h2,.wc-auth-content h3,.wc-auth-content table{border:0;clear:none;color:#666;margin:0 0 24px;padding:0}.wc-auth-content p,.wc-auth-content ul{color:#666;font-size:1em;line-height:1.75em;margin:0 0 24px}.wc-auth-content p{padding:0}.wc-auth-content a{color:#a16696}.wc-auth-content a:focus,.wc-auth-content a:hover{color:#111}.wc-auth-content .wc-auth-login label{color:#999;display:block;margin-bottom:.5em}.wc-auth-content .wc-auth-login input{-webkit-box-sizing:border-box;box-sizing:border-box;font-size:1.3em;padding:.5em;width:100%}.wc-auth-content .wc-auth-login .wc-auth-actions{padding:0}.wc-auth-content .wc-auth-login .wc-auth-actions .wc-auth-login-button{float:none;width:100%}.wc-auth-permissions{list-style:disc inside;padding:0}.wc-auth-permissions li{font-size:1em}.wc-auth-logged-in-as{background:#f5f5f5;border-bottom:2px solid #eee;line-height:70px;margin:0 0 24px;padding:0 1em 0 0}.wc-auth-logged-in-as p{margin:0;line-height:70px}.wc-auth-logged-in-as img{float:left;height:70px;margin:0 1em 0 0}.wc-auth-logged-in-as .wc-auth-logout{float:right}.wc-auth .wc-auth-actions{overflow:hidden;padding-left:24px}.wc-auth .wc-auth-actions .button{background:#f7f7f7;border-bottom-width:2px;border:1px solid #d7d7d7;-webkit-box-sizing:border-box;box-sizing:border-box;color:#777;float:right;font-size:1.25em;height:auto;line-height:1em;padding:1em 2em;text-align:center;width:50%}.wc-auth .wc-auth-actions .button:focus,.wc-auth .wc-auth-actions .button:hover{background:#fcfcfc}.wc-auth .wc-auth-actions .button-primary{background:#ad6ea1;border-color:#a16696;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 0 rgba(0,0,0,.15);box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 0 rgba(0,0,0,.15);color:#fff;float:right;opacity:1;text-shadow:0 -1px 1px #8a4f7f,1px 0 1px #8a4f7f,0 1px 1px #8a4f7f,-1px 0 1px #8a4f7f}.wc-auth .wc-auth-actions .button-primary:focus,.wc-auth .wc-auth-actions .button-primary:hover{background:#b472a8;color:#fff}.wc-auth .wc-auth-actions .wc-auth-approve{float:right}.wc-auth .wc-auth-actions .wc-auth-deny{float:left;margin-left:-24px} \ No newline at end of file +body{background:#f1f1f1;box-shadow:none;margin:100px auto 24px;padding:0}#wc-logo{border:0;margin:0 0 24px;padding:0;text-align:center}#wc-logo img{max-width:50%}.wc-auth-content{background:#fff;box-shadow:0 1px 3px rgba(0,0,0,.13);overflow:hidden;padding:24px 24px 0;zoom:1}.wc-auth-content h1,.wc-auth-content h2,.wc-auth-content h3,.wc-auth-content table{border:0;clear:none;color:#666;margin:0 0 24px;padding:0}.wc-auth-content p,.wc-auth-content ul{color:#666;font-size:1em;line-height:1.75em;margin:0 0 24px}.wc-auth-content p{padding:0}.wc-auth-content a{color:#a16696}.wc-auth-content a:focus,.wc-auth-content a:hover{color:#111}.wc-auth-content .wc-auth-login label{color:#999;display:block;margin-bottom:.5em}.wc-auth-content .wc-auth-login input{box-sizing:border-box;font-size:1.3em;padding:.5em;width:100%}.wc-auth-content .wc-auth-login .wc-auth-actions{padding:0}.wc-auth-content .wc-auth-login .wc-auth-actions .wc-auth-login-button{float:none;width:100%}.wc-auth-permissions{list-style:disc inside;padding:0}.wc-auth-permissions li{font-size:1em}.wc-auth-logged-in-as{background:#f5f5f5;border-bottom:2px solid #eee;line-height:70px;margin:0 0 24px;padding:0 1em 0 0}.wc-auth-logged-in-as p{margin:0;line-height:70px}.wc-auth-logged-in-as img{float:left;height:70px;margin:0 1em 0 0}.wc-auth-logged-in-as .wc-auth-logout{float:right}.wc-auth .wc-auth-actions{overflow:hidden;padding-left:24px}.wc-auth .wc-auth-actions .button{background:#f7f7f7;border-bottom-width:2px;border:1px solid #d7d7d7;box-sizing:border-box;color:#777;float:right;font-size:1.25em;height:auto;line-height:1em;padding:1em 2em;text-align:center;width:50%}.wc-auth .wc-auth-actions .button:focus,.wc-auth .wc-auth-actions .button:hover{background:#fcfcfc}.wc-auth .wc-auth-actions .button-primary{background:#ad6ea1;border-color:#a16696;box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 0 rgba(0,0,0,.15);color:#fff;float:right;opacity:1;text-shadow:0 -1px 1px #8a4f7f,1px 0 1px #8a4f7f,0 1px 1px #8a4f7f,-1px 0 1px #8a4f7f}.wc-auth .wc-auth-actions .button-primary:focus,.wc-auth .wc-auth-actions .button-primary:hover{background:#b472a8;color:#fff}.wc-auth .wc-auth-actions .wc-auth-approve{float:right}.wc-auth .wc-auth-actions .wc-auth-deny{float:left;margin-left:-24px} \ No newline at end of file diff --git a/assets/css/dashboard-rtl.css b/assets/css/dashboard-rtl.css index a364653ad81..e7b1754e062 100644 --- a/assets/css/dashboard-rtl.css +++ b/assets/css/dashboard-rtl.css @@ -1 +1 @@ -@charset "UTF-8";@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}ul.woocommerce_stats{overflow:hidden;zoom:1}ul.woocommerce_stats li{width:25%;padding:0 1em;text-align:center;float:right;font-size:.8em;border-right:1px solid #fff;border-left:1px solid #ececec;-webkit-box-sizing:border-box;box-sizing:border-box}ul.woocommerce_stats li:first-child{border-right:0}ul.woocommerce_stats li:last-child{border-left:0}ul.woocommerce_stats strong{font-family:Georgia,'Times New Roman','Bitstream Charter',Times,serif;font-size:4em;line-height:1.2em;font-weight:400;text-align:center;display:block}#woocommerce_dashboard_status .inside{padding:0;margin:0}#woocommerce_dashboard_status .wc_status_list{overflow:hidden;margin:0}#woocommerce_dashboard_status .wc_status_list li{width:50%;float:right;padding:0;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;border-top:1px solid #ececec;color:#aaa}#woocommerce_dashboard_status .wc_status_list li a{display:block;color:#aaa;padding:9px 12px;-webkit-transition:all ease .5s;transition:all ease .5s;position:relative;font-size:12px}#woocommerce_dashboard_status .wc_status_list li a .wc_sparkline{width:4em;height:2em;display:block;float:left;position:absolute;left:0;top:50%;margin-left:12px;margin-top:-1.25em}#woocommerce_dashboard_status .wc_status_list li a strong{font-size:18px;line-height:1.2em;font-weight:400;display:block;color:#21759b}#woocommerce_dashboard_status .wc_status_list li a:hover{color:#2ea2cc}#woocommerce_dashboard_status .wc_status_list li a:hover strong,#woocommerce_dashboard_status .wc_status_list li a:hover::before{color:#2ea2cc!important}#woocommerce_dashboard_status .wc_status_list li a::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";font-size:2em;position:relative;width:auto;line-height:1.2em;color:#464646;float:right;margin-left:12px;margin-bottom:12px}#woocommerce_dashboard_status .wc_status_list li:first-child{border-top:0}#woocommerce_dashboard_status .wc_status_list li.sales-this-month{width:100%}#woocommerce_dashboard_status .wc_status_list li.sales-this-month a::before{font-family:Dashicons;content:'\f185'}#woocommerce_dashboard_status .wc_status_list li.best-seller-this-month{width:100%}#woocommerce_dashboard_status .wc_status_list li.best-seller-this-month a::before{content:'\e006'}#woocommerce_dashboard_status .wc_status_list li.processing-orders{border-left:1px solid #ececec}#woocommerce_dashboard_status .wc_status_list li.processing-orders a::before{content:'\e011';color:#7ad03a}#woocommerce_dashboard_status .wc_status_list li.on-hold-orders a::before{content:'\e033';color:#999}#woocommerce_dashboard_status .wc_status_list li.low-in-stock{border-left:1px solid #ececec}#woocommerce_dashboard_status .wc_status_list li.low-in-stock a::before{content:'\e016';color:#ffba00}#woocommerce_dashboard_status .wc_status_list li.out-of-stock a::before{content:'\e013';color:#a00}#woocommerce_dashboard_recent_reviews li{line-height:1.5em;margin-bottom:12px}#woocommerce_dashboard_recent_reviews h4.meta{line-height:1.4;margin:-.2em 0 0 0;font-weight:400;color:#999}#woocommerce_dashboard_recent_reviews blockquote{padding:0;margin:0}#woocommerce_dashboard_recent_reviews .avatar{float:right;margin:0 0 5px 10px}#woocommerce_dashboard_recent_reviews .star-rating{float:left;overflow:hidden;position:relative;height:1.5em;line-height:1.5;margin-right:.5em;width:5.4em;font-family:WooCommerce!important}#woocommerce_dashboard_recent_reviews .star-rating::before{content:'\e021\e021\e021\e021\e021';color:#b3b2b2;float:right;top:0;right:0;position:absolute;letter-spacing:.1em}#woocommerce_dashboard_recent_reviews .star-rating span{overflow:hidden;float:right;top:0;right:0;position:absolute;padding-top:1.5em}#woocommerce_dashboard_recent_reviews .star-rating span::before{content:'\e020\e020\e020\e020\e020';top:0;position:absolute;right:0;letter-spacing:.1em;color:#9c5d90}#dash-right-now li.product-count a::before{font-family:WooCommerce;content:'\e01d'} \ No newline at end of file +@charset "UTF-8";@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}ul.woocommerce_stats{overflow:hidden;zoom:1}ul.woocommerce_stats li{width:25%;padding:0 1em;text-align:center;float:right;font-size:.8em;border-right:1px solid #fff;border-left:1px solid #ececec;box-sizing:border-box}ul.woocommerce_stats li:first-child{border-right:0}ul.woocommerce_stats li:last-child{border-left:0}ul.woocommerce_stats strong{font-family:Georgia,'Times New Roman','Bitstream Charter',Times,serif;font-size:4em;line-height:1.2em;font-weight:400;text-align:center;display:block}#woocommerce_dashboard_status .inside{padding:0;margin:0}#woocommerce_dashboard_status .best-seller-this-month a strong{margin-left:48px}#woocommerce_dashboard_status .wc_status_list{overflow:hidden;margin:0}#woocommerce_dashboard_status .wc_status_list li{width:50%;float:right;padding:0;box-sizing:border-box;margin:0;border-top:1px solid #ececec;color:#aaa}#woocommerce_dashboard_status .wc_status_list li a{display:block;color:#aaa;padding:9px 12px;-webkit-transition:all ease .5s;transition:all ease .5s;position:relative;font-size:12px}#woocommerce_dashboard_status .wc_status_list li a .wc_sparkline{width:4em;height:2em;display:block;float:left;position:absolute;left:0;top:50%;margin-left:12px;margin-top:-1.25em}#woocommerce_dashboard_status .wc_status_list li a strong{font-size:18px;line-height:1.2em;font-weight:400;display:block;color:#21759b}#woocommerce_dashboard_status .wc_status_list li a:hover{color:#2ea2cc}#woocommerce_dashboard_status .wc_status_list li a:hover strong,#woocommerce_dashboard_status .wc_status_list li a:hover::before{color:#2ea2cc!important}#woocommerce_dashboard_status .wc_status_list li a::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";font-size:2em;position:relative;width:auto;line-height:1.2em;color:#464646;float:right;margin-left:12px;margin-bottom:12px}#woocommerce_dashboard_status .wc_status_list li:first-child{border-top:0}#woocommerce_dashboard_status .wc_status_list li.sales-this-month{width:100%}#woocommerce_dashboard_status .wc_status_list li.sales-this-month a::before{font-family:Dashicons;content:'\f185'}#woocommerce_dashboard_status .wc_status_list li.best-seller-this-month{width:100%}#woocommerce_dashboard_status .wc_status_list li.best-seller-this-month a::before{content:'\e006'}#woocommerce_dashboard_status .wc_status_list li.processing-orders{border-left:1px solid #ececec}#woocommerce_dashboard_status .wc_status_list li.processing-orders a::before{content:'\e011';color:#7ad03a}#woocommerce_dashboard_status .wc_status_list li.on-hold-orders a::before{content:'\e033';color:#999}#woocommerce_dashboard_status .wc_status_list li.low-in-stock{border-left:1px solid #ececec}#woocommerce_dashboard_status .wc_status_list li.low-in-stock a::before{content:'\e016';color:#ffba00}#woocommerce_dashboard_status .wc_status_list li.out-of-stock a::before{content:'\e013';color:#a00}#woocommerce_dashboard_recent_reviews li{line-height:1.5em;margin-bottom:12px}#woocommerce_dashboard_recent_reviews h4.meta{line-height:1.4;margin:-.2em 0 0 0;font-weight:400;color:#999}#woocommerce_dashboard_recent_reviews blockquote{padding:0;margin:0}#woocommerce_dashboard_recent_reviews .avatar{float:right;margin:0 0 5px 10px}#woocommerce_dashboard_recent_reviews .star-rating{float:left;overflow:hidden;position:relative;height:1.5em;line-height:1.5;margin-right:.5em;width:5.4em;font-family:WooCommerce!important}#woocommerce_dashboard_recent_reviews .star-rating::before{content:'\e021\e021\e021\e021\e021';color:#b3b2b2;float:right;top:0;right:0;position:absolute;letter-spacing:.1em}#woocommerce_dashboard_recent_reviews .star-rating span{overflow:hidden;float:right;top:0;right:0;position:absolute;padding-top:1.5em}#woocommerce_dashboard_recent_reviews .star-rating span::before{content:'\e020\e020\e020\e020\e020';top:0;position:absolute;right:0;letter-spacing:.1em;color:#9c5d90}#dash-right-now li.product-count a::before{font-family:WooCommerce;content:'\e01d'} \ No newline at end of file diff --git a/assets/css/dashboard.css b/assets/css/dashboard.css index 9fbbf7d55ce..031ac860fc0 100644 --- a/assets/css/dashboard.css +++ b/assets/css/dashboard.css @@ -1 +1 @@ -@charset "UTF-8";@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}ul.woocommerce_stats{overflow:hidden;zoom:1}ul.woocommerce_stats li{width:25%;padding:0 1em;text-align:center;float:left;font-size:.8em;border-left:1px solid #fff;border-right:1px solid #ececec;-webkit-box-sizing:border-box;box-sizing:border-box}ul.woocommerce_stats li:first-child{border-left:0}ul.woocommerce_stats li:last-child{border-right:0}ul.woocommerce_stats strong{font-family:Georgia,'Times New Roman','Bitstream Charter',Times,serif;font-size:4em;line-height:1.2em;font-weight:400;text-align:center;display:block}#woocommerce_dashboard_status .inside{padding:0;margin:0}#woocommerce_dashboard_status .wc_status_list{overflow:hidden;margin:0}#woocommerce_dashboard_status .wc_status_list li{width:50%;float:left;padding:0;-webkit-box-sizing:border-box;box-sizing:border-box;margin:0;border-top:1px solid #ececec;color:#aaa}#woocommerce_dashboard_status .wc_status_list li a{display:block;color:#aaa;padding:9px 12px;-webkit-transition:all ease .5s;transition:all ease .5s;position:relative;font-size:12px}#woocommerce_dashboard_status .wc_status_list li a .wc_sparkline{width:4em;height:2em;display:block;float:right;position:absolute;right:0;top:50%;margin-right:12px;margin-top:-1.25em}#woocommerce_dashboard_status .wc_status_list li a strong{font-size:18px;line-height:1.2em;font-weight:400;display:block;color:#21759b}#woocommerce_dashboard_status .wc_status_list li a:hover{color:#2ea2cc}#woocommerce_dashboard_status .wc_status_list li a:hover strong,#woocommerce_dashboard_status .wc_status_list li a:hover::before{color:#2ea2cc!important}#woocommerce_dashboard_status .wc_status_list li a::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";font-size:2em;position:relative;width:auto;line-height:1.2em;color:#464646;float:left;margin-right:12px;margin-bottom:12px}#woocommerce_dashboard_status .wc_status_list li:first-child{border-top:0}#woocommerce_dashboard_status .wc_status_list li.sales-this-month{width:100%}#woocommerce_dashboard_status .wc_status_list li.sales-this-month a::before{font-family:Dashicons;content:'\f185'}#woocommerce_dashboard_status .wc_status_list li.best-seller-this-month{width:100%}#woocommerce_dashboard_status .wc_status_list li.best-seller-this-month a::before{content:'\e006'}#woocommerce_dashboard_status .wc_status_list li.processing-orders{border-right:1px solid #ececec}#woocommerce_dashboard_status .wc_status_list li.processing-orders a::before{content:'\e011';color:#7ad03a}#woocommerce_dashboard_status .wc_status_list li.on-hold-orders a::before{content:'\e033';color:#999}#woocommerce_dashboard_status .wc_status_list li.low-in-stock{border-right:1px solid #ececec}#woocommerce_dashboard_status .wc_status_list li.low-in-stock a::before{content:'\e016';color:#ffba00}#woocommerce_dashboard_status .wc_status_list li.out-of-stock a::before{content:'\e013';color:#a00}#woocommerce_dashboard_recent_reviews li{line-height:1.5em;margin-bottom:12px}#woocommerce_dashboard_recent_reviews h4.meta{line-height:1.4;margin:-.2em 0 0 0;font-weight:400;color:#999}#woocommerce_dashboard_recent_reviews blockquote{padding:0;margin:0}#woocommerce_dashboard_recent_reviews .avatar{float:left;margin:0 10px 5px 0}#woocommerce_dashboard_recent_reviews .star-rating{float:right;overflow:hidden;position:relative;height:1.5em;line-height:1.5;margin-left:.5em;width:5.4em;font-family:WooCommerce!important}#woocommerce_dashboard_recent_reviews .star-rating::before{content:'\e021\e021\e021\e021\e021';color:#b3b2b2;float:left;top:0;left:0;position:absolute;letter-spacing:.1em}#woocommerce_dashboard_recent_reviews .star-rating span{overflow:hidden;float:left;top:0;left:0;position:absolute;padding-top:1.5em}#woocommerce_dashboard_recent_reviews .star-rating span::before{content:'\e020\e020\e020\e020\e020';top:0;position:absolute;left:0;letter-spacing:.1em;color:#9c5d90}#dash-right-now li.product-count a::before{font-family:WooCommerce;content:'\e01d'} \ No newline at end of file +@charset "UTF-8";@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}ul.woocommerce_stats{overflow:hidden;zoom:1}ul.woocommerce_stats li{width:25%;padding:0 1em;text-align:center;float:left;font-size:.8em;border-left:1px solid #fff;border-right:1px solid #ececec;box-sizing:border-box}ul.woocommerce_stats li:first-child{border-left:0}ul.woocommerce_stats li:last-child{border-right:0}ul.woocommerce_stats strong{font-family:Georgia,'Times New Roman','Bitstream Charter',Times,serif;font-size:4em;line-height:1.2em;font-weight:400;text-align:center;display:block}#woocommerce_dashboard_status .inside{padding:0;margin:0}#woocommerce_dashboard_status .best-seller-this-month a strong{margin-right:48px}#woocommerce_dashboard_status .wc_status_list{overflow:hidden;margin:0}#woocommerce_dashboard_status .wc_status_list li{width:50%;float:left;padding:0;box-sizing:border-box;margin:0;border-top:1px solid #ececec;color:#aaa}#woocommerce_dashboard_status .wc_status_list li a{display:block;color:#aaa;padding:9px 12px;-webkit-transition:all ease .5s;transition:all ease .5s;position:relative;font-size:12px}#woocommerce_dashboard_status .wc_status_list li a .wc_sparkline{width:4em;height:2em;display:block;float:right;position:absolute;right:0;top:50%;margin-right:12px;margin-top:-1.25em}#woocommerce_dashboard_status .wc_status_list li a strong{font-size:18px;line-height:1.2em;font-weight:400;display:block;color:#21759b}#woocommerce_dashboard_status .wc_status_list li a:hover{color:#2ea2cc}#woocommerce_dashboard_status .wc_status_list li a:hover strong,#woocommerce_dashboard_status .wc_status_list li a:hover::before{color:#2ea2cc!important}#woocommerce_dashboard_status .wc_status_list li a::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";font-size:2em;position:relative;width:auto;line-height:1.2em;color:#464646;float:left;margin-right:12px;margin-bottom:12px}#woocommerce_dashboard_status .wc_status_list li:first-child{border-top:0}#woocommerce_dashboard_status .wc_status_list li.sales-this-month{width:100%}#woocommerce_dashboard_status .wc_status_list li.sales-this-month a::before{font-family:Dashicons;content:'\f185'}#woocommerce_dashboard_status .wc_status_list li.best-seller-this-month{width:100%}#woocommerce_dashboard_status .wc_status_list li.best-seller-this-month a::before{content:'\e006'}#woocommerce_dashboard_status .wc_status_list li.processing-orders{border-right:1px solid #ececec}#woocommerce_dashboard_status .wc_status_list li.processing-orders a::before{content:'\e011';color:#7ad03a}#woocommerce_dashboard_status .wc_status_list li.on-hold-orders a::before{content:'\e033';color:#999}#woocommerce_dashboard_status .wc_status_list li.low-in-stock{border-right:1px solid #ececec}#woocommerce_dashboard_status .wc_status_list li.low-in-stock a::before{content:'\e016';color:#ffba00}#woocommerce_dashboard_status .wc_status_list li.out-of-stock a::before{content:'\e013';color:#a00}#woocommerce_dashboard_recent_reviews li{line-height:1.5em;margin-bottom:12px}#woocommerce_dashboard_recent_reviews h4.meta{line-height:1.4;margin:-.2em 0 0 0;font-weight:400;color:#999}#woocommerce_dashboard_recent_reviews blockquote{padding:0;margin:0}#woocommerce_dashboard_recent_reviews .avatar{float:left;margin:0 10px 5px 0}#woocommerce_dashboard_recent_reviews .star-rating{float:right;overflow:hidden;position:relative;height:1.5em;line-height:1.5;margin-left:.5em;width:5.4em;font-family:WooCommerce!important}#woocommerce_dashboard_recent_reviews .star-rating::before{content:'\e021\e021\e021\e021\e021';color:#b3b2b2;float:left;top:0;left:0;position:absolute;letter-spacing:.1em}#woocommerce_dashboard_recent_reviews .star-rating span{overflow:hidden;float:left;top:0;left:0;position:absolute;padding-top:1.5em}#woocommerce_dashboard_recent_reviews .star-rating span::before{content:'\e020\e020\e020\e020\e020';top:0;position:absolute;left:0;letter-spacing:.1em;color:#9c5d90}#dash-right-now li.product-count a::before{font-family:WooCommerce;content:'\e01d'} \ No newline at end of file diff --git a/assets/css/dashboard.scss b/assets/css/dashboard.scss index 4be2093892c..1a3e2192481 100644 --- a/assets/css/dashboard.scss +++ b/assets/css/dashboard.scss @@ -52,6 +52,14 @@ ul.woocommerce_stats { margin: 0; } + .best-seller-this-month { + a { + strong { + margin-right: 48px; + } + } + } + .wc_status_list { overflow: hidden; margin: 0; diff --git a/assets/css/helper-rtl.css b/assets/css/helper-rtl.css index b9d45dfcaf6..4e0a4a99628 100644 --- a/assets/css/helper-rtl.css +++ b/assets/css/helper-rtl.css @@ -1 +1 @@ -.wc-helper .nav-tab-wrapper{margin-bottom:22px}@media only screen and (max-width:784px){.wc-helper .nav-tab{max-width:40%;overflow:hidden;text-overflow:ellipsis}}.wc-helper .button,.wc-helper .button:active,.wc-helper .button:focus,.wc-helper .button:hover{background-color:#955a89;border-width:0;-webkit-box-shadow:none;box-shadow:none;border-radius:3px;color:#fff;height:auto;padding:3px 14px;text-align:center;white-space:normal!important}@media only screen and (max-width:782px){.wc-helper .button,.wc-helper .button:active,.wc-helper .button:focus,.wc-helper .button:hover{line-height:2}}.wc-helper .button.button-secondary,.wc-helper .button:active.button-secondary,.wc-helper .button:focus.button-secondary,.wc-helper .button:hover.button-secondary{background-color:#e6e6e6;color:#3c3c3c;text-shadow:none}.wc-helper .button:hover{opacity:.8}.wc-helper .subscription-filter{color:#2e4453;font-size:13px;line-height:13px;margin:22px 0}.wc-helper .subscription-filter label{display:none;position:relative}.wc-helper .subscription-filter label .chevron{color:#e1e1e1;border-bottom-width:0;line-height:1;padding:0;position:absolute;top:10px;left:14px}.wc-helper .subscription-filter li{color:#0073aa;display:inline-block;padding:0 8px 0 4px;position:relative}.wc-helper .subscription-filter li::before{background-color:#979797;content:" ";position:absolute;top:0;right:0;bottom:0;width:1px}.wc-helper .subscription-filter li:first-of-type::before{display:none}.wc-helper .subscription-filter a{color:#0073aa;text-decoration:none}.wc-helper .subscription-filter a.current{color:#000;font-weight:600}.wc-helper .subscription-filter .count{color:#555d66;font-weight:400}@media only screen and (max-width:600px){.wc-helper .subscription-filter{background-color:#fff;border:1px solid #e1e1e1;border-radius:4px;font-size:14px}.wc-helper .subscription-filter label,.wc-helper .subscription-filter li{line-height:21px;padding:8px 16px;margin:0}.wc-helper .subscription-filter label:last-child,.wc-helper .subscription-filter li:last-child{border-bottom:none}.wc-helper .subscription-filter li{border-bottom:1px solid #e1e1e1}.wc-helper .subscription-filter label,.wc-helper .subscription-filter span.chevron{display:block}.wc-helper .subscription-filter label{text-decoration:none}.wc-helper .subscription-filter li{display:none}.wc-helper .subscription-filter li::before{display:none}.wc-helper .subscription-filter a{cursor:pointer}.wc-helper .subscription-filter span.chevron{color:#555;opacity:.5;-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.wc-helper .subscription-filter:focus,.wc-helper .subscription-filter:hover{-webkit-box-shadow:0 3px 5px rgba(0,0,0,.2);box-shadow:0 3px 5px rgba(0,0,0,.2)}.wc-helper .subscription-filter:focus label,.wc-helper .subscription-filter:hover label{border-bottom:1px solid #e1e1e1}.wc-helper .subscription-filter:focus li,.wc-helper .subscription-filter:hover li{display:block}.wc-helper .subscription-filter:focus span.chevron,.wc-helper .subscription-filter:hover span.chevron{-webkit-transform:rotateX(0);transform:rotateX(0)}}.wc-helper .subscriptions-header{margin:3em 0 0;position:relative;z-index:10}.wc-helper .subscriptions-header h2{display:inline-block;line-height:25px;margin:0 0 1.5em 0}.wc-helper .button-update,.wc-helper .button-update:hover{background-color:#e6e6e6;border-radius:4px;color:#333;font-weight:800;font-size:10px;line-height:20px;margin-right:6px;opacity:.75;padding:3px 7px;text-transform:uppercase}.wc-helper .button-update .dashicons,.wc-helper .button-update:hover .dashicons{font-size:12px;height:12px;width:12px;vertical-align:text-bottom}.wc-helper .button-update:hover{opacity:1}.wc-helper .user-info{background-color:#fff;border:1px solid #e1e1e1;border-radius:4px;font-size:12px;line-height:26px;position:absolute;top:-10px;left:0;-webkit-transition:all .1s ease-in;transition:all .1s ease-in}@media only screen and (max-width:600px){.wc-helper .user-info{position:relative;width:100%}}.wc-helper .user-info p{line-height:26px;margin:0}.wc-helper .user-info:hover{-webkit-box-shadow:0 3px 5px rgba(0,0,0,.2);box-shadow:0 3px 5px rgba(0,0,0,.2)}.wc-helper .user-info header{color:#555;font-weight:600;padding:6px 14px;position:relative}.wc-helper .user-info header p{padding-left:26px}.wc-helper .user-info header .dashicons{opacity:.5;position:absolute;top:9px;left:14px}.wc-helper .user-info header:hover{cursor:pointer}.wc-helper .user-info section{display:none}.wc-helper .user-info section p{border-top:1px solid #e1e1e1;padding:6px 14px;text-align:center}.wc-helper .user-info section .actions{border-top:1px solid #e1e1e1;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wc-helper .user-info section a{color:#a26897;cursor:pointer;font-weight:600;line-height:38px;padding:0 14px;text-align:center;text-decoration:none;white-space:nowrap;width:50%}.wc-helper .user-info section a .dashicons{margin-top:-3px;vertical-align:middle}.wc-helper .user-info section a:first-child{border-left:1px solid #e1e1e1}.wc-helper .user-info section a:hover{background-color:#a26897;color:#fff}.wc-helper .user-info section .avatar{border:1px solid #ece1ea;border-radius:50%;height:auto;margin-left:6px;width:24px;vertical-align:bottom}.wc-helper .user-info:active header .dashicons,.wc-helper .user-info:focus header .dashicons,.wc-helper .user-info:hover header .dashicons{-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.wc-helper .user-info:active section,.wc-helper .user-info:focus section,.wc-helper .user-info:hover section{display:block}.wc-helper .alternate,.wc-helper .striped>tbody>:nth-child(odd),.wc-helper ul.striped>:nth-child(odd){background-color:#fff}.wc-helper .comment-ays,.wc-helper .feature-filter,.wc-helper .imgedit-group,.wc-helper .popular-tags,.wc-helper .stuffbox,.wc-helper .widgets-holder-wrap,.wc-helper .wp-editor-container,.wc-helper p.popular-tags,.wc-helper table.widefat{padding-top:5px}.wc-helper .widefat tfoot tr td,.wc-helper .widefat tfoot tr th,.wc-helper .widefat thead tr td,.wc-helper .widefat thead tr th{color:#32373c;padding-bottom:15px;padding-top:10px}.wc-helper .widefat td{padding-bottom:15px;padding-top:15px}.wc-helper .wp-list-table{border:0;-webkit-box-shadow:none;box-shadow:none;padding-top:0!important;z-index:1}@media only screen and (max-width:782px){.wc-helper .button{font-size:11px}}.wc-helper .wp-list-table__row{background-color:transparent}.wc-helper .wp-list-table__row td{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-color:#fff;border:0;padding:16px 22px;vertical-align:middle}@media only screen and (max-width:782px){.wc-helper .wp-list-table__row td{padding:16px}}.wc-helper .wp-list-table__row td.color-bar{border-right:0}.wc-helper .wp-list-table__row.is-ext-header td{border-top:1px solid #e1e1e1}@media only screen and (max-width:782px){.wc-helper .wp-list-table__row.is-ext-header{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;width:100%}.wc-helper .wp-list-table__row.is-ext-header .wp-list-table__ext-details{display:block;-webkit-box-flex:2;-webkit-flex:2;-ms-flex:2;flex:2}.wc-helper .wp-list-table__row.is-ext-header .wp-list-table__ext-actions{display:block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;min-width:0}}.wc-helper .wp-list-table__row:last-child td{border-bottom:24px solid #f1f1f1;-webkit-box-shadow:inset 0 -1px 0 #e1e1e1;box-shadow:inset 0 -1px 0 #e1e1e1}.wc-helper .wp-list-table__ext-details,.wc-helper .wp-list-table__ext-status,.wc-helper .wp-list-table__licence-container{padding-left:22px;position:relative;width:100%}.wc-helper .wp-list-table__ext-details::before,.wc-helper .wp-list-table__ext-status::before,.wc-helper .wp-list-table__licence-container::before{background-color:#e1e1e1;content:" ";position:absolute;top:0;bottom:0;right:0!important;width:1px!important}.wc-helper .wp-list-table__ext-details{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-details{display:table}}.wc-helper .wp-list-table__ext-title{color:#0073aa;font-size:18px;font-weight:600;width:60%}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-title{margin-bottom:12px;width:100%}}@media only screen and (max-width:320px){.wc-helper .wp-list-table__ext-title{max-width:120px}}.wc-helper .wp-list-table__ext-description{color:#333;padding-right:12px;width:40%}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-description{padding-right:0;width:100%}}.wc-helper .wp-list-table__ext-status{position:relative}.wc-helper .wp-list-table__ext-status.update-available::after{background-color:#ffc322;content:" ";position:absolute;top:0;right:0;bottom:0;width:5px}.wc-helper .wp-list-table__ext-status.expired::after{background-color:#b81c23;content:" ";position:absolute;top:0;right:0;bottom:0;width:5px}.wc-helper .wp-list-table__ext-status .dashicons-update{color:#ffc322}.wc-helper .wp-list-table__ext-status .dashicons-info{color:#b81c23}.wc-helper .wp-list-table__ext-status p{color:#333;margin:0}.wc-helper .wp-list-table__ext-status .dashicons{margin-left:5px}.wc-helper .wp-list-table__ext-actions{min-width:150px;position:relative;width:25%;text-align:left}.wc-helper .wp-list-table__ext-actions::after{background-color:#e1e1e1;content:" ";position:absolute;top:0;bottom:0;left:0;width:1px}.wc-helper .wp-list-table__ext-licence td,.wc-helper .wp-list-table__ext-updates td{position:relative}.wc-helper .wp-list-table__ext-licence td::before,.wc-helper .wp-list-table__ext-updates td::before{background-color:#e1e1e1;content:" ";height:1px;position:absolute;top:0;right:0;left:0}.wc-helper .wp-list-table__ext-licence td.wp-list-table__ext-status::before,.wc-helper .wp-list-table__ext-licence td.wp-list-table__licence-container::before,.wc-helper .wp-list-table__ext-updates td.wp-list-table__ext-status::before,.wc-helper .wp-list-table__ext-updates td.wp-list-table__licence-container::before{right:22px!important;width:auto!important}.wc-helper .wp-list-table__ext-licence td.wp-list-table__ext-actions::before,.wc-helper .wp-list-table__ext-updates td.wp-list-table__ext-actions::before{left:22px}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-licence,.wc-helper .wp-list-table__ext-updates{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-status,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-status{-webkit-box-flex:2;-webkit-flex:2;-ms-flex:2;flex:2}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-status::before,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-status::before{right:0!important;width:100%!important}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-actions,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-actions{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;min-width:0}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-actions::before,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-actions::before{right:0!important;left:0!important;width:100%!important}}.wc-helper .wp-list-table__licence-container{padding:0!important}.wc-helper .wp-list-table__licence-container::after{background-color:#e1e1e1;content:" ";position:absolute;top:0;bottom:0;left:0;width:1px}.wc-helper .wp-list-table__licence-form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:16px 22px}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-form{display:block}}.wc-helper .wp-list-table__licence-form::before{background-color:#e1e1e1;content:" ";height:1px;position:absolute;top:0;left:22px;right:22px}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-form::before{left:0;right:0}}.wc-helper .wp-list-table__licence-form div{padding-left:16px;vertical-align:middle}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-form div{padding:0}}.wc-helper .wp-list-table__licence-form p{margin:0!important}.wc-helper .wp-list-table__licence-label label{color:#23282d;font-weight:600;line-height:30px}.wc-helper .wp-list-table__licence-field input{height:32px}@media only screen and (max-width:480px){.wc-helper .wp-list-table__licence-field input{width:100%}}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-field{padding:8px 0 16px!important}}.wc-helper .wp-list-table__licence-actions{-webkit-box-flex:2;-webkit-flex-grow:2;-ms-flex-positive:2;flex-grow:2;padding-left:0!important}.wc-helper .wp-list-table__licence-actions .button{margin-left:8px}.wc-helper .wp-list-table__licence-actions .button-secondary{float:left;margin:0 8px 0 0}@media only screen and (max-width:480px){.wc-helper .wp-list-table__licence-actions{text-align:left}}.wc-helper td.color-bar{border-right:solid 4px transparent}.wc-helper td.color-bar.expired{border-right-color:#b81c23}.wc-helper td.color-bar.expiring{border-right-color:orange}.wc-helper td.color-bar.update-available{border-right-color:#8fae1b}.wc-helper td.color-bar.expiring.update-available{border-right-color:#8fae1b}.wc-helper .connect-wrapper{background-color:#fff;border:1px solid #e5e5e5;margin-bottom:25px;overflow:auto}.wc-helper .connected{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wc-helper .connected .user-info{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:20px;width:100%;vertical-align:middle}.wc-helper .connected img{border:1px solid #e5e5e5;height:34px;width:34px}.wc-helper .connected .buttons{padding:20px;white-space:nowrap}.wc-helper .connected p{-webkit-box-flex:2;-webkit-flex:2;-ms-flex:2;flex:2;margin:10px 20px 0 0}.wc-helper .connected .chevron{display:none}.wc-helper .connected .chevron:hover{color:#955a89;cursor:pointer}@media only screen and (max-width:784px){.wc-helper .connected{display:block}.wc-helper .connected strong{display:block;overflow:hidden;text-overflow:ellipsis}.wc-helper .connected p{margin:0;overflow:hidden;text-overflow:ellipsis;width:80%}.wc-helper .connected .user-info{padding-left:0;width:auto}.wc-helper .connected .avatar{margin-left:12px}.wc-helper .connected .chevron{color:#e1e1e1;display:block;margin:10px;-webkit-transform:rotateX(0);transform:rotateX(0)}.wc-helper .connected .buttons{display:none;border-top:1px solid #e1e1e1;padding:10px 20px}.wc-helper .connected .buttons.active{display:block}}.wc-helper .start-container{background-color:#fff;border-right:4px solid #cc99c2;padding:45px 30px 20px 20px;position:relative;overflow:hidden}.wc-helper .start-container h2,.wc-helper .start-container p{max-width:800px}.wc-helper .start-container::before{color:#eee2ec;content:"\e01C";display:block;font-family:WooCommerce;font-size:192px;line-height:1;position:absolute;top:65%;left:-3%;text-align:center;width:1em}.wc-helper .start-container h2{font-size:24px;line-height:29px;position:relative}.wc-helper .start-container p{font-size:16px;margin-bottom:30px;position:relative}.wc-helper .button-primary{height:37px;line-height:37px;min-width:124px;padding:0 13px;text-shadow:none}.wc-helper .button-primary:active,.wc-helper .button-primary:focus,.wc-helper .button-primary:hover{padding:0 13px}.form-toggle__wrapper{position:relative}.form-toggle__wrapper label{cursor:default}.form-toggle{cursor:pointer;display:block;position:absolute;top:0;bottom:-1px;right:0;left:0;text-align:right;text-indent:-100000px;z-index:2}.form-toggle:focus{-webkit-box-shadow:none;box-shadow:none}.form-toggle.disabled{cursor:default}.form-toggle__switch{-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start;background:#c8d7e1;border-radius:12px;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;padding:2px;outline:0;position:relative;width:40px;height:24px;-webkit-transition:all .4s ease,-webkit-box-shadow 0s;transition:all .4s ease,-webkit-box-shadow 0s;transition:all .4s ease,box-shadow 0s;transition:all .4s ease,box-shadow 0s,-webkit-box-shadow 0s;vertical-align:middle}.form-toggle__switch::after,.form-toggle__switch::before{content:"";display:block;position:relative;width:20px;height:20px}.form-toggle__switch::after{border-radius:50%;background:#fff;right:0;-webkit-transition:all .2s ease;transition:all .2s ease}.form-toggle__switch::before{display:none}.accessible-focus .form-toggle__switch:focus{-webkit-box-shadow:0 0 0 2px #955a89;box-shadow:0 0 0 2px #955a89}.form-toggle__label{vertical-align:bottom;z-index:1}.form-toggle__label .form-toggle__label-content{color:#87a6bc;-webkit-box-flex:0;-webkit-flex:0 1 100%;-ms-flex:0 1 100%;flex:0 1 100%;font-size:13px;line-height:16px;margin-right:12px;margin-left:8px;vertical-align:top;text-transform:uppercase}@media only screen and (max-width:480px){.form-toggle__label .form-toggle__label-content{display:none}}.accessible-focus .form-toggle:focus+.form-toggle__label .form-toggle__switch{-webkit-box-shadow:0 0 0 2px #955a89;box-shadow:0 0 0 2px #955a89}.accessible-focus .form-toggle:focus:checked+.form-toggle__label .form-toggle__switch{-webkit-box-shadow:0 0 0 2px #bb77ae;box-shadow:0 0 0 2px #bb77ae}.form-toggle+.form-toggle__label .form-toggle__switch{background:#a8bece}.form-toggle:not(:disabled)+.form-toggle__label:hover .form-toggle__switch{background:#c8d7e1}.form-toggle.active+.form-toggle__label .form-toggle__switch{background:#955a89}.form-toggle.active+.form-toggle__label .form-toggle__switch::after{right:8px}.form-toggle.active+.form-toggle__label:hover .form-toggle__switch{background:#bb77ae}.form-toggle.disabled+label.form-toggle__label span.form-toggle__switch{opacity:.25}.form-toggle.is-toggling+.form-toggle__label .form-toggle__switch{background:#955a89}.form-toggle.is-toggling:checked+.form-toggle__label .form-toggle__switch{background:#c8d7e1}.form-toggle.is-compact+.form-toggle__label .form-toggle__switch{border-radius:8px;width:24px;height:16px}.form-toggle.is-compact+.form-toggle__label .form-toggle__switch::after,.form-toggle.is-compact+.form-toggle__label .form-toggle__switch::before{height:12px;width:12px}.form-toggle.is-compact:checked+.form-toggle__label .form-toggle__switch::after{right:8px} \ No newline at end of file +.wc-helper .nav-tab-wrapper{margin-bottom:22px}@media only screen and (max-width:784px){.wc-helper .nav-tab{max-width:40%;overflow:hidden;text-overflow:ellipsis}}.wc-helper .button,.wc-helper .button:active,.wc-helper .button:focus,.wc-helper .button:hover{background-color:#955a89;border-width:0;box-shadow:none;border-radius:3px;color:#fff;height:auto;padding:3px 14px;text-align:center;white-space:normal!important}@media only screen and (max-width:782px){.wc-helper .button,.wc-helper .button:active,.wc-helper .button:focus,.wc-helper .button:hover{line-height:2}}.wc-helper .button.button-secondary,.wc-helper .button:active.button-secondary,.wc-helper .button:focus.button-secondary,.wc-helper .button:hover.button-secondary{background-color:#e6e6e6;color:#3c3c3c;text-shadow:none}.wc-helper .button:hover{opacity:.8}.wc-helper .subscription-filter{color:#2e4453;font-size:13px;line-height:13px;margin:22px 0}.wc-helper .subscription-filter label{display:none;position:relative}.wc-helper .subscription-filter label .chevron{color:#e1e1e1;border-bottom-width:0;line-height:1;padding:0;position:absolute;top:10px;left:14px}.wc-helper .subscription-filter li{color:#0073aa;display:inline-block;padding:0 8px 0 4px;position:relative}.wc-helper .subscription-filter li::before{background-color:#979797;content:" ";position:absolute;top:0;right:0;bottom:0;width:1px}.wc-helper .subscription-filter li:first-of-type::before{display:none}.wc-helper .subscription-filter a{color:#0073aa;text-decoration:none}.wc-helper .subscription-filter a.current{color:#000;font-weight:600}.wc-helper .subscription-filter .count{color:#555d66;font-weight:400}@media only screen and (max-width:600px){.wc-helper .subscription-filter{background-color:#fff;border:1px solid #e1e1e1;border-radius:4px;font-size:14px}.wc-helper .subscription-filter label,.wc-helper .subscription-filter li{line-height:21px;padding:8px 16px;margin:0}.wc-helper .subscription-filter label:last-child,.wc-helper .subscription-filter li:last-child{border-bottom:none}.wc-helper .subscription-filter li{border-bottom:1px solid #e1e1e1}.wc-helper .subscription-filter label,.wc-helper .subscription-filter span.chevron{display:block}.wc-helper .subscription-filter label{text-decoration:none}.wc-helper .subscription-filter li{display:none}.wc-helper .subscription-filter li::before{display:none}.wc-helper .subscription-filter a{cursor:pointer}.wc-helper .subscription-filter span.chevron{color:#555;opacity:.5;-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.wc-helper .subscription-filter:focus,.wc-helper .subscription-filter:hover{box-shadow:0 3px 5px rgba(0,0,0,.2)}.wc-helper .subscription-filter:focus label,.wc-helper .subscription-filter:hover label{border-bottom:1px solid #e1e1e1}.wc-helper .subscription-filter:focus li,.wc-helper .subscription-filter:hover li{display:block}.wc-helper .subscription-filter:focus span.chevron,.wc-helper .subscription-filter:hover span.chevron{-webkit-transform:rotateX(0);transform:rotateX(0)}}.wc-helper .subscriptions-header{margin:3em 0 0;position:relative;z-index:10}.wc-helper .subscriptions-header h2{display:inline-block;line-height:25px;margin:0 0 1.5em 0}.wc-helper .button-update,.wc-helper .button-update:hover{background-color:#e6e6e6;border-radius:4px;color:#333;font-weight:800;font-size:10px;line-height:20px;margin-right:6px;opacity:.75;padding:3px 7px;text-transform:uppercase}.wc-helper .button-update .dashicons,.wc-helper .button-update:hover .dashicons{font-size:12px;height:12px;width:12px;vertical-align:text-bottom}.wc-helper .button-update:hover{opacity:1}.wc-helper .user-info{background-color:#fff;border:1px solid #e1e1e1;border-radius:4px;font-size:12px;line-height:26px;position:absolute;top:-10px;left:0;-webkit-transition:all .1s ease-in;transition:all .1s ease-in}@media only screen and (max-width:600px){.wc-helper .user-info{position:relative;width:100%}}.wc-helper .user-info p{line-height:26px;margin:0}.wc-helper .user-info:hover{box-shadow:0 3px 5px rgba(0,0,0,.2)}.wc-helper .user-info header{color:#555;font-weight:600;padding:6px 14px;position:relative}.wc-helper .user-info header p{padding-left:26px}.wc-helper .user-info header .dashicons{opacity:.5;position:absolute;top:9px;left:14px}.wc-helper .user-info header:hover{cursor:pointer}.wc-helper .user-info section{display:none}.wc-helper .user-info section p{border-top:1px solid #e1e1e1;padding:6px 14px;text-align:center}.wc-helper .user-info section .actions{border-top:1px solid #e1e1e1;display:-webkit-box;display:-ms-flexbox;display:flex}.wc-helper .user-info section a{color:#a26897;cursor:pointer;font-weight:600;line-height:38px;padding:0 14px;text-align:center;text-decoration:none;white-space:nowrap;width:50%}.wc-helper .user-info section a .dashicons{margin-top:-3px;vertical-align:middle}.wc-helper .user-info section a:first-child{border-left:1px solid #e1e1e1}.wc-helper .user-info section a:hover{background-color:#a26897;color:#fff}.wc-helper .user-info section .avatar{border:1px solid #ece1ea;border-radius:50%;height:auto;margin-left:6px;width:24px;vertical-align:bottom}.wc-helper .user-info:active header .dashicons,.wc-helper .user-info:focus header .dashicons,.wc-helper .user-info:hover header .dashicons{-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.wc-helper .user-info:active section,.wc-helper .user-info:focus section,.wc-helper .user-info:hover section{display:block}.wc-helper .alternate,.wc-helper .striped>tbody>:nth-child(odd),.wc-helper ul.striped>:nth-child(odd){background-color:#fff}.wc-helper .comment-ays,.wc-helper .feature-filter,.wc-helper .imgedit-group,.wc-helper .popular-tags,.wc-helper .stuffbox,.wc-helper .widgets-holder-wrap,.wc-helper .wp-editor-container,.wc-helper p.popular-tags,.wc-helper table.widefat{padding-top:5px}.wc-helper .widefat tfoot tr td,.wc-helper .widefat tfoot tr th,.wc-helper .widefat thead tr td,.wc-helper .widefat thead tr th{color:#32373c;padding-bottom:15px;padding-top:10px}.wc-helper .widefat td{padding-bottom:15px;padding-top:15px}.wc-helper .wp-list-table{border:0;box-shadow:none;padding-top:0!important;z-index:1}@media only screen and (max-width:782px){.wc-helper .button{font-size:11px}}.wc-helper .wp-list-table__row{background-color:rgba(0,0,0,0)}.wc-helper .wp-list-table__row td{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#fff;border:0;padding:16px 22px;vertical-align:middle}@media only screen and (max-width:782px){.wc-helper .wp-list-table__row td{padding:16px}}.wc-helper .wp-list-table__row td.color-bar{border-right:0}.wc-helper .wp-list-table__row.is-ext-header td{border-top:1px solid #e1e1e1}@media only screen and (max-width:782px){.wc-helper .wp-list-table__row.is-ext-header{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;width:100%}.wc-helper .wp-list-table__row.is-ext-header .wp-list-table__ext-details{display:block;-webkit-box-flex:2;-ms-flex:2;flex:2}.wc-helper .wp-list-table__row.is-ext-header .wp-list-table__ext-actions{display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;min-width:0}}.wc-helper .wp-list-table__row:last-child td{border-bottom:24px solid #f1f1f1;box-shadow:inset 0 -1px 0 #e1e1e1}.wc-helper .wp-list-table__ext-details,.wc-helper .wp-list-table__ext-status,.wc-helper .wp-list-table__licence-container{padding-left:22px;position:relative;width:100%}.wc-helper .wp-list-table__ext-details::before,.wc-helper .wp-list-table__ext-status::before,.wc-helper .wp-list-table__licence-container::before{background-color:#e1e1e1;content:" ";position:absolute;top:0;bottom:0;right:0!important;width:1px!important}.wc-helper .wp-list-table__ext-details{display:-webkit-box;display:-ms-flexbox;display:flex}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-details{display:table}}.wc-helper .wp-list-table__ext-title{color:#0073aa;font-size:18px;font-weight:600;width:60%}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-title{margin-bottom:12px;width:100%}}@media only screen and (max-width:320px){.wc-helper .wp-list-table__ext-title{max-width:120px}}.wc-helper .wp-list-table__ext-description{color:#333;padding-right:12px;width:40%}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-description{padding-right:0;width:100%}}.wc-helper .wp-list-table__ext-status{position:relative}.wc-helper .wp-list-table__ext-status.update-available::after{background-color:#ffc322;content:" ";position:absolute;top:0;right:0;bottom:0;width:5px}.wc-helper .wp-list-table__ext-status.expired::after{background-color:#b81c23;content:" ";position:absolute;top:0;right:0;bottom:0;width:5px}.wc-helper .wp-list-table__ext-status .dashicons-update{color:#ffc322}.wc-helper .wp-list-table__ext-status .dashicons-info{color:#b81c23}.wc-helper .wp-list-table__ext-status p{color:#333;margin:0}.wc-helper .wp-list-table__ext-status .dashicons{margin-left:5px}.wc-helper .wp-list-table__ext-actions{min-width:150px;position:relative;width:25%;text-align:left}.wc-helper .wp-list-table__ext-actions::after{background-color:#e1e1e1;content:" ";position:absolute;top:0;bottom:0;left:0;width:1px}.wc-helper .wp-list-table__ext-licence td,.wc-helper .wp-list-table__ext-updates td{position:relative}.wc-helper .wp-list-table__ext-licence td::before,.wc-helper .wp-list-table__ext-updates td::before{background-color:#e1e1e1;content:" ";height:1px;position:absolute;top:0;right:0;left:0}.wc-helper .wp-list-table__ext-licence td.wp-list-table__ext-status::before,.wc-helper .wp-list-table__ext-licence td.wp-list-table__licence-container::before,.wc-helper .wp-list-table__ext-updates td.wp-list-table__ext-status::before,.wc-helper .wp-list-table__ext-updates td.wp-list-table__licence-container::before{right:22px!important;width:auto!important}.wc-helper .wp-list-table__ext-licence td.wp-list-table__ext-actions::before,.wc-helper .wp-list-table__ext-updates td.wp-list-table__ext-actions::before{left:22px}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-licence,.wc-helper .wp-list-table__ext-updates{display:-webkit-box;display:-ms-flexbox;display:flex}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-status,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-status{-webkit-box-flex:2;-ms-flex:2;flex:2}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-status::before,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-status::before{right:0!important;width:100%!important}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-actions,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-actions{-webkit-box-flex:1;-ms-flex:1;flex:1;min-width:0}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-actions::before,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-actions::before{right:0!important;left:0!important;width:100%!important}}.wc-helper .wp-list-table__licence-container{padding:0!important}.wc-helper .wp-list-table__licence-container::after{background-color:#e1e1e1;content:" ";position:absolute;top:0;bottom:0;left:0;width:1px}.wc-helper .wp-list-table__licence-form{display:-webkit-box;display:-ms-flexbox;display:flex;padding:16px 22px}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-form{display:block}}.wc-helper .wp-list-table__licence-form::before{background-color:#e1e1e1;content:" ";height:1px;position:absolute;top:0;left:22px;right:22px}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-form::before{left:0;right:0}}.wc-helper .wp-list-table__licence-form div{padding-left:16px;vertical-align:middle}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-form div{padding:0}}.wc-helper .wp-list-table__licence-form p{margin:0!important}.wc-helper .wp-list-table__licence-label label{color:#23282d;font-weight:600;line-height:30px}.wc-helper .wp-list-table__licence-field input{height:32px}@media only screen and (max-width:480px){.wc-helper .wp-list-table__licence-field input{width:100%}}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-field{padding:8px 0 16px!important}}.wc-helper .wp-list-table__licence-actions{-webkit-box-flex:2;-ms-flex-positive:2;flex-grow:2;padding-left:0!important}.wc-helper .wp-list-table__licence-actions .button{margin-left:8px}.wc-helper .wp-list-table__licence-actions .button-secondary{float:left;margin:0 8px 0 0}@media only screen and (max-width:480px){.wc-helper .wp-list-table__licence-actions{text-align:left}}.wc-helper td.color-bar{border-right:solid 4px transparent}.wc-helper td.color-bar.expired{border-right-color:#b81c23}.wc-helper td.color-bar.expiring{border-right-color:orange}.wc-helper td.color-bar.update-available{border-right-color:#8fae1b}.wc-helper td.color-bar.expiring.update-available{border-right-color:#8fae1b}.wc-helper .connect-wrapper{background-color:#fff;border:1px solid #e5e5e5;margin-bottom:25px;overflow:auto}.wc-helper .connected{display:-webkit-box;display:-ms-flexbox;display:flex}.wc-helper .connected .user-info{display:-webkit-box;display:-ms-flexbox;display:flex;padding:20px;width:100%;vertical-align:middle}.wc-helper .connected img{border:1px solid #e5e5e5;height:34px;width:34px}.wc-helper .connected .buttons{padding:20px;white-space:nowrap}.wc-helper .connected p{-webkit-box-flex:2;-ms-flex:2;flex:2;margin:10px 20px 0 0}.wc-helper .connected .chevron{display:none}.wc-helper .connected .chevron:hover{color:#955a89;cursor:pointer}@media only screen and (max-width:784px){.wc-helper .connected{display:block}.wc-helper .connected strong{display:block;overflow:hidden;text-overflow:ellipsis}.wc-helper .connected p{margin:0;overflow:hidden;text-overflow:ellipsis;width:80%}.wc-helper .connected .user-info{padding-left:0;width:auto}.wc-helper .connected .avatar{margin-left:12px}.wc-helper .connected .chevron{color:#e1e1e1;display:block;margin:10px;-webkit-transform:rotateX(0);transform:rotateX(0)}.wc-helper .connected .buttons{display:none;border-top:1px solid #e1e1e1;padding:10px 20px}.wc-helper .connected .buttons.active{display:block}}.wc-helper .start-container{background-color:#fff;border-right:4px solid #cc99c2;padding:45px 30px 20px 20px;position:relative;overflow:hidden}.wc-helper .start-container h2,.wc-helper .start-container p{max-width:800px}.wc-helper .start-container::before{color:#eee2ec;content:"\e01C";display:block;font-family:WooCommerce;font-size:192px;line-height:1;position:absolute;top:65%;left:-3%;text-align:center;width:1em}.wc-helper .start-container h2{font-size:24px;line-height:29px;position:relative}.wc-helper .start-container p{font-size:16px;margin-bottom:30px;position:relative}.wc-helper .button-primary{height:37px;line-height:37px;min-width:124px;padding:0 13px;text-shadow:none}.wc-helper .button-primary:active,.wc-helper .button-primary:focus,.wc-helper .button-primary:hover{padding:0 13px}.form-toggle__wrapper{position:relative}.form-toggle__wrapper label{cursor:default}.form-toggle{cursor:pointer;display:block;position:absolute;top:0;bottom:-1px;right:0;left:0;text-align:right;text-indent:-100000px;z-index:2}.form-toggle:focus{box-shadow:none}.form-toggle.disabled{cursor:default}.form-toggle__switch{-ms-flex-item-align:start;align-self:flex-start;background:#c8d7e1;border-radius:12px;box-sizing:border-box;display:inline-block;padding:2px;outline:0;position:relative;width:40px;height:24px;-webkit-transition:all .4s ease,box-shadow 0s;transition:all .4s ease,box-shadow 0s;vertical-align:middle}.form-toggle__switch::after,.form-toggle__switch::before{content:"";display:block;position:relative;width:20px;height:20px}.form-toggle__switch::after{border-radius:50%;background:#fff;right:0;-webkit-transition:all .2s ease;transition:all .2s ease}.form-toggle__switch::before{display:none}.accessible-focus .form-toggle__switch:focus{box-shadow:0 0 0 2px #955a89}.form-toggle__label{vertical-align:bottom;z-index:1}.form-toggle__label .form-toggle__label-content{color:#87a6bc;-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%;font-size:13px;line-height:16px;margin-right:12px;margin-left:8px;vertical-align:top;text-transform:uppercase}@media only screen and (max-width:480px){.form-toggle__label .form-toggle__label-content{display:none}}.accessible-focus .form-toggle:focus+.form-toggle__label .form-toggle__switch{box-shadow:0 0 0 2px #955a89}.accessible-focus .form-toggle:focus:checked+.form-toggle__label .form-toggle__switch{box-shadow:0 0 0 2px #bb77ae}.form-toggle+.form-toggle__label .form-toggle__switch{background:#a8bece}.form-toggle:not(:disabled)+.form-toggle__label:hover .form-toggle__switch{background:#c8d7e1}.form-toggle.active+.form-toggle__label .form-toggle__switch{background:#955a89}.form-toggle.active+.form-toggle__label .form-toggle__switch::after{right:8px}.form-toggle.active+.form-toggle__label:hover .form-toggle__switch{background:#bb77ae}.form-toggle.disabled+label.form-toggle__label span.form-toggle__switch{opacity:.25}.form-toggle.is-toggling+.form-toggle__label .form-toggle__switch{background:#955a89}.form-toggle.is-toggling:checked+.form-toggle__label .form-toggle__switch{background:#c8d7e1}.form-toggle.is-compact+.form-toggle__label .form-toggle__switch{border-radius:8px;width:24px;height:16px}.form-toggle.is-compact+.form-toggle__label .form-toggle__switch::after,.form-toggle.is-compact+.form-toggle__label .form-toggle__switch::before{height:12px;width:12px}.form-toggle.is-compact:checked+.form-toggle__label .form-toggle__switch::after{right:8px} \ No newline at end of file diff --git a/assets/css/helper.css b/assets/css/helper.css index 443dac1a2fa..a2274d65eb7 100644 --- a/assets/css/helper.css +++ b/assets/css/helper.css @@ -1 +1 @@ -.wc-helper .nav-tab-wrapper{margin-bottom:22px}@media only screen and (max-width:784px){.wc-helper .nav-tab{max-width:40%;overflow:hidden;text-overflow:ellipsis}}.wc-helper .button,.wc-helper .button:active,.wc-helper .button:focus,.wc-helper .button:hover{background-color:#955a89;border-width:0;-webkit-box-shadow:none;box-shadow:none;border-radius:3px;color:#fff;height:auto;padding:3px 14px;text-align:center;white-space:normal!important}@media only screen and (max-width:782px){.wc-helper .button,.wc-helper .button:active,.wc-helper .button:focus,.wc-helper .button:hover{line-height:2}}.wc-helper .button.button-secondary,.wc-helper .button:active.button-secondary,.wc-helper .button:focus.button-secondary,.wc-helper .button:hover.button-secondary{background-color:#e6e6e6;color:#3c3c3c;text-shadow:none}.wc-helper .button:hover{opacity:.8}.wc-helper .subscription-filter{color:#2e4453;font-size:13px;line-height:13px;margin:22px 0}.wc-helper .subscription-filter label{display:none;position:relative}.wc-helper .subscription-filter label .chevron{color:#e1e1e1;border-bottom-width:0;line-height:1;padding:0;position:absolute;top:10px;right:14px}.wc-helper .subscription-filter li{color:#0073aa;display:inline-block;padding:0 4px 0 8px;position:relative}.wc-helper .subscription-filter li::before{background-color:#979797;content:" ";position:absolute;top:0;left:0;bottom:0;width:1px}.wc-helper .subscription-filter li:first-of-type::before{display:none}.wc-helper .subscription-filter a{color:#0073aa;text-decoration:none}.wc-helper .subscription-filter a.current{color:#000;font-weight:600}.wc-helper .subscription-filter .count{color:#555d66;font-weight:400}@media only screen and (max-width:600px){.wc-helper .subscription-filter{background-color:#fff;border:1px solid #e1e1e1;border-radius:4px;font-size:14px}.wc-helper .subscription-filter label,.wc-helper .subscription-filter li{line-height:21px;padding:8px 16px;margin:0}.wc-helper .subscription-filter label:last-child,.wc-helper .subscription-filter li:last-child{border-bottom:none}.wc-helper .subscription-filter li{border-bottom:1px solid #e1e1e1}.wc-helper .subscription-filter label,.wc-helper .subscription-filter span.chevron{display:block}.wc-helper .subscription-filter label{text-decoration:none}.wc-helper .subscription-filter li{display:none}.wc-helper .subscription-filter li::before{display:none}.wc-helper .subscription-filter a{cursor:pointer}.wc-helper .subscription-filter span.chevron{color:#555;opacity:.5;-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.wc-helper .subscription-filter:focus,.wc-helper .subscription-filter:hover{-webkit-box-shadow:0 3px 5px rgba(0,0,0,.2);box-shadow:0 3px 5px rgba(0,0,0,.2)}.wc-helper .subscription-filter:focus label,.wc-helper .subscription-filter:hover label{border-bottom:1px solid #e1e1e1}.wc-helper .subscription-filter:focus li,.wc-helper .subscription-filter:hover li{display:block}.wc-helper .subscription-filter:focus span.chevron,.wc-helper .subscription-filter:hover span.chevron{-webkit-transform:rotateX(0);transform:rotateX(0)}}.wc-helper .subscriptions-header{margin:3em 0 0;position:relative;z-index:10}.wc-helper .subscriptions-header h2{display:inline-block;line-height:25px;margin:0 0 1.5em 0}.wc-helper .button-update,.wc-helper .button-update:hover{background-color:#e6e6e6;border-radius:4px;color:#333;font-weight:800;font-size:10px;line-height:20px;margin-left:6px;opacity:.75;padding:3px 7px;text-transform:uppercase}.wc-helper .button-update .dashicons,.wc-helper .button-update:hover .dashicons{font-size:12px;height:12px;width:12px;vertical-align:text-bottom}.wc-helper .button-update:hover{opacity:1}.wc-helper .user-info{background-color:#fff;border:1px solid #e1e1e1;border-radius:4px;font-size:12px;line-height:26px;position:absolute;top:-10px;right:0;-webkit-transition:all .1s ease-in;transition:all .1s ease-in}@media only screen and (max-width:600px){.wc-helper .user-info{position:relative;width:100%}}.wc-helper .user-info p{line-height:26px;margin:0}.wc-helper .user-info:hover{-webkit-box-shadow:0 3px 5px rgba(0,0,0,.2);box-shadow:0 3px 5px rgba(0,0,0,.2)}.wc-helper .user-info header{color:#555;font-weight:600;padding:6px 14px;position:relative}.wc-helper .user-info header p{padding-right:26px}.wc-helper .user-info header .dashicons{opacity:.5;position:absolute;top:9px;right:14px}.wc-helper .user-info header:hover{cursor:pointer}.wc-helper .user-info section{display:none}.wc-helper .user-info section p{border-top:1px solid #e1e1e1;padding:6px 14px;text-align:center}.wc-helper .user-info section .actions{border-top:1px solid #e1e1e1;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wc-helper .user-info section a{color:#a26897;cursor:pointer;font-weight:600;line-height:38px;padding:0 14px;text-align:center;text-decoration:none;white-space:nowrap;width:50%}.wc-helper .user-info section a .dashicons{margin-top:-3px;vertical-align:middle}.wc-helper .user-info section a:first-child{border-right:1px solid #e1e1e1}.wc-helper .user-info section a:hover{background-color:#a26897;color:#fff}.wc-helper .user-info section .avatar{border:1px solid #ece1ea;border-radius:50%;height:auto;margin-right:6px;width:24px;vertical-align:bottom}.wc-helper .user-info:active header .dashicons,.wc-helper .user-info:focus header .dashicons,.wc-helper .user-info:hover header .dashicons{-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.wc-helper .user-info:active section,.wc-helper .user-info:focus section,.wc-helper .user-info:hover section{display:block}.wc-helper .alternate,.wc-helper .striped>tbody>:nth-child(odd),.wc-helper ul.striped>:nth-child(odd){background-color:#fff}.wc-helper .comment-ays,.wc-helper .feature-filter,.wc-helper .imgedit-group,.wc-helper .popular-tags,.wc-helper .stuffbox,.wc-helper .widgets-holder-wrap,.wc-helper .wp-editor-container,.wc-helper p.popular-tags,.wc-helper table.widefat{padding-top:5px}.wc-helper .widefat tfoot tr td,.wc-helper .widefat tfoot tr th,.wc-helper .widefat thead tr td,.wc-helper .widefat thead tr th{color:#32373c;padding-bottom:15px;padding-top:10px}.wc-helper .widefat td{padding-bottom:15px;padding-top:15px}.wc-helper .wp-list-table{border:0;-webkit-box-shadow:none;box-shadow:none;padding-top:0!important;z-index:1}@media only screen and (max-width:782px){.wc-helper .button{font-size:11px}}.wc-helper .wp-list-table__row{background-color:transparent}.wc-helper .wp-list-table__row td{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-color:#fff;border:0;padding:16px 22px;vertical-align:middle}@media only screen and (max-width:782px){.wc-helper .wp-list-table__row td{padding:16px}}.wc-helper .wp-list-table__row td.color-bar{border-left:0}.wc-helper .wp-list-table__row.is-ext-header td{border-top:1px solid #e1e1e1}@media only screen and (max-width:782px){.wc-helper .wp-list-table__row.is-ext-header{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;width:100%}.wc-helper .wp-list-table__row.is-ext-header .wp-list-table__ext-details{display:block;-webkit-box-flex:2;-webkit-flex:2;-ms-flex:2;flex:2}.wc-helper .wp-list-table__row.is-ext-header .wp-list-table__ext-actions{display:block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;min-width:0}}.wc-helper .wp-list-table__row:last-child td{border-bottom:24px solid #f1f1f1;-webkit-box-shadow:inset 0 -1px 0 #e1e1e1;box-shadow:inset 0 -1px 0 #e1e1e1}.wc-helper .wp-list-table__ext-details,.wc-helper .wp-list-table__ext-status,.wc-helper .wp-list-table__licence-container{padding-right:22px;position:relative;width:100%}.wc-helper .wp-list-table__ext-details::before,.wc-helper .wp-list-table__ext-status::before,.wc-helper .wp-list-table__licence-container::before{background-color:#e1e1e1;content:" ";position:absolute;top:0;bottom:0;left:0!important;width:1px!important}.wc-helper .wp-list-table__ext-details{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-details{display:table}}.wc-helper .wp-list-table__ext-title{color:#0073aa;font-size:18px;font-weight:600;width:60%}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-title{margin-bottom:12px;width:100%}}@media only screen and (max-width:320px){.wc-helper .wp-list-table__ext-title{max-width:120px}}.wc-helper .wp-list-table__ext-description{color:#333;padding-left:12px;width:40%}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-description{padding-left:0;width:100%}}.wc-helper .wp-list-table__ext-status{position:relative}.wc-helper .wp-list-table__ext-status.update-available::after{background-color:#ffc322;content:" ";position:absolute;top:0;left:0;bottom:0;width:5px}.wc-helper .wp-list-table__ext-status.expired::after{background-color:#b81c23;content:" ";position:absolute;top:0;left:0;bottom:0;width:5px}.wc-helper .wp-list-table__ext-status .dashicons-update{color:#ffc322}.wc-helper .wp-list-table__ext-status .dashicons-info{color:#b81c23}.wc-helper .wp-list-table__ext-status p{color:#333;margin:0}.wc-helper .wp-list-table__ext-status .dashicons{margin-right:5px}.wc-helper .wp-list-table__ext-actions{min-width:150px;position:relative;width:25%;text-align:right}.wc-helper .wp-list-table__ext-actions::after{background-color:#e1e1e1;content:" ";position:absolute;top:0;bottom:0;right:0;width:1px}.wc-helper .wp-list-table__ext-licence td,.wc-helper .wp-list-table__ext-updates td{position:relative}.wc-helper .wp-list-table__ext-licence td::before,.wc-helper .wp-list-table__ext-updates td::before{background-color:#e1e1e1;content:" ";height:1px;position:absolute;top:0;left:0;right:0}.wc-helper .wp-list-table__ext-licence td.wp-list-table__ext-status::before,.wc-helper .wp-list-table__ext-licence td.wp-list-table__licence-container::before,.wc-helper .wp-list-table__ext-updates td.wp-list-table__ext-status::before,.wc-helper .wp-list-table__ext-updates td.wp-list-table__licence-container::before{left:22px!important;width:auto!important}.wc-helper .wp-list-table__ext-licence td.wp-list-table__ext-actions::before,.wc-helper .wp-list-table__ext-updates td.wp-list-table__ext-actions::before{right:22px}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-licence,.wc-helper .wp-list-table__ext-updates{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-status,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-status{-webkit-box-flex:2;-webkit-flex:2;-ms-flex:2;flex:2}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-status::before,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-status::before{left:0!important;width:100%!important}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-actions,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-actions{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;min-width:0}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-actions::before,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-actions::before{left:0!important;right:0!important;width:100%!important}}.wc-helper .wp-list-table__licence-container{padding:0!important}.wc-helper .wp-list-table__licence-container::after{background-color:#e1e1e1;content:" ";position:absolute;top:0;bottom:0;right:0;width:1px}.wc-helper .wp-list-table__licence-form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:16px 22px}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-form{display:block}}.wc-helper .wp-list-table__licence-form::before{background-color:#e1e1e1;content:" ";height:1px;position:absolute;top:0;right:22px;left:22px}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-form::before{right:0;left:0}}.wc-helper .wp-list-table__licence-form div{padding-right:16px;vertical-align:middle}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-form div{padding:0}}.wc-helper .wp-list-table__licence-form p{margin:0!important}.wc-helper .wp-list-table__licence-label label{color:#23282d;font-weight:600;line-height:30px}.wc-helper .wp-list-table__licence-field input{height:32px}@media only screen and (max-width:480px){.wc-helper .wp-list-table__licence-field input{width:100%}}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-field{padding:8px 0 16px!important}}.wc-helper .wp-list-table__licence-actions{-webkit-box-flex:2;-webkit-flex-grow:2;-ms-flex-positive:2;flex-grow:2;padding-right:0!important}.wc-helper .wp-list-table__licence-actions .button{margin-right:8px}.wc-helper .wp-list-table__licence-actions .button-secondary{float:right;margin:0 0 0 8px}@media only screen and (max-width:480px){.wc-helper .wp-list-table__licence-actions{text-align:right}}.wc-helper td.color-bar{border-left:solid 4px transparent}.wc-helper td.color-bar.expired{border-left-color:#b81c23}.wc-helper td.color-bar.expiring{border-left-color:orange}.wc-helper td.color-bar.update-available{border-left-color:#8fae1b}.wc-helper td.color-bar.expiring.update-available{border-left-color:#8fae1b}.wc-helper .connect-wrapper{background-color:#fff;border:1px solid #e5e5e5;margin-bottom:25px;overflow:auto}.wc-helper .connected{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wc-helper .connected .user-info{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:20px;width:100%;vertical-align:middle}.wc-helper .connected img{border:1px solid #e5e5e5;height:34px;width:34px}.wc-helper .connected .buttons{padding:20px;white-space:nowrap}.wc-helper .connected p{-webkit-box-flex:2;-webkit-flex:2;-ms-flex:2;flex:2;margin:10px 0 0 20px}.wc-helper .connected .chevron{display:none}.wc-helper .connected .chevron:hover{color:#955a89;cursor:pointer}@media only screen and (max-width:784px){.wc-helper .connected{display:block}.wc-helper .connected strong{display:block;overflow:hidden;text-overflow:ellipsis}.wc-helper .connected p{margin:0;overflow:hidden;text-overflow:ellipsis;width:80%}.wc-helper .connected .user-info{padding-right:0;width:auto}.wc-helper .connected .avatar{margin-right:12px}.wc-helper .connected .chevron{color:#e1e1e1;display:block;margin:10px;-webkit-transform:rotateX(0);transform:rotateX(0)}.wc-helper .connected .buttons{display:none;border-top:1px solid #e1e1e1;padding:10px 20px}.wc-helper .connected .buttons.active{display:block}}.wc-helper .start-container{background-color:#fff;border-left:4px solid #cc99c2;padding:45px 20px 20px 30px;position:relative;overflow:hidden}.wc-helper .start-container h2,.wc-helper .start-container p{max-width:800px}.wc-helper .start-container::before{color:#eee2ec;content:"\e01C";display:block;font-family:WooCommerce;font-size:192px;line-height:1;position:absolute;top:65%;right:-3%;text-align:center;width:1em}.wc-helper .start-container h2{font-size:24px;line-height:29px;position:relative}.wc-helper .start-container p{font-size:16px;margin-bottom:30px;position:relative}.wc-helper .button-primary{height:37px;line-height:37px;min-width:124px;padding:0 13px;text-shadow:none}.wc-helper .button-primary:active,.wc-helper .button-primary:focus,.wc-helper .button-primary:hover{padding:0 13px}.form-toggle__wrapper{position:relative}.form-toggle__wrapper label{cursor:default}.form-toggle{cursor:pointer;display:block;position:absolute;top:0;bottom:-1px;left:0;right:0;text-align:left;text-indent:-100000px;z-index:2}.form-toggle:focus{-webkit-box-shadow:none;box-shadow:none}.form-toggle.disabled{cursor:default}.form-toggle__switch{-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start;background:#c8d7e1;border-radius:12px;-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;padding:2px;outline:0;position:relative;width:40px;height:24px;-webkit-transition:all .4s ease,-webkit-box-shadow 0s;transition:all .4s ease,-webkit-box-shadow 0s;transition:all .4s ease,box-shadow 0s;transition:all .4s ease,box-shadow 0s,-webkit-box-shadow 0s;vertical-align:middle}.form-toggle__switch::after,.form-toggle__switch::before{content:"";display:block;position:relative;width:20px;height:20px}.form-toggle__switch::after{border-radius:50%;background:#fff;left:0;-webkit-transition:all .2s ease;transition:all .2s ease}.form-toggle__switch::before{display:none}.accessible-focus .form-toggle__switch:focus{-webkit-box-shadow:0 0 0 2px #955a89;box-shadow:0 0 0 2px #955a89}.form-toggle__label{vertical-align:bottom;z-index:1}.form-toggle__label .form-toggle__label-content{color:#87a6bc;-webkit-box-flex:0;-webkit-flex:0 1 100%;-ms-flex:0 1 100%;flex:0 1 100%;font-size:13px;line-height:16px;margin-left:12px;margin-right:8px;vertical-align:top;text-transform:uppercase}@media only screen and (max-width:480px){.form-toggle__label .form-toggle__label-content{display:none}}.accessible-focus .form-toggle:focus+.form-toggle__label .form-toggle__switch{-webkit-box-shadow:0 0 0 2px #955a89;box-shadow:0 0 0 2px #955a89}.accessible-focus .form-toggle:focus:checked+.form-toggle__label .form-toggle__switch{-webkit-box-shadow:0 0 0 2px #bb77ae;box-shadow:0 0 0 2px #bb77ae}.form-toggle+.form-toggle__label .form-toggle__switch{background:#a8bece}.form-toggle:not(:disabled)+.form-toggle__label:hover .form-toggle__switch{background:#c8d7e1}.form-toggle.active+.form-toggle__label .form-toggle__switch{background:#955a89}.form-toggle.active+.form-toggle__label .form-toggle__switch::after{left:8px}.form-toggle.active+.form-toggle__label:hover .form-toggle__switch{background:#bb77ae}.form-toggle.disabled+label.form-toggle__label span.form-toggle__switch{opacity:.25}.form-toggle.is-toggling+.form-toggle__label .form-toggle__switch{background:#955a89}.form-toggle.is-toggling:checked+.form-toggle__label .form-toggle__switch{background:#c8d7e1}.form-toggle.is-compact+.form-toggle__label .form-toggle__switch{border-radius:8px;width:24px;height:16px}.form-toggle.is-compact+.form-toggle__label .form-toggle__switch::after,.form-toggle.is-compact+.form-toggle__label .form-toggle__switch::before{height:12px;width:12px}.form-toggle.is-compact:checked+.form-toggle__label .form-toggle__switch::after{left:8px} \ No newline at end of file +.wc-helper .nav-tab-wrapper{margin-bottom:22px}@media only screen and (max-width:784px){.wc-helper .nav-tab{max-width:40%;overflow:hidden;text-overflow:ellipsis}}.wc-helper .button,.wc-helper .button:active,.wc-helper .button:focus,.wc-helper .button:hover{background-color:#955a89;border-width:0;box-shadow:none;border-radius:3px;color:#fff;height:auto;padding:3px 14px;text-align:center;white-space:normal!important}@media only screen and (max-width:782px){.wc-helper .button,.wc-helper .button:active,.wc-helper .button:focus,.wc-helper .button:hover{line-height:2}}.wc-helper .button.button-secondary,.wc-helper .button:active.button-secondary,.wc-helper .button:focus.button-secondary,.wc-helper .button:hover.button-secondary{background-color:#e6e6e6;color:#3c3c3c;text-shadow:none}.wc-helper .button:hover{opacity:.8}.wc-helper .subscription-filter{color:#2e4453;font-size:13px;line-height:13px;margin:22px 0}.wc-helper .subscription-filter label{display:none;position:relative}.wc-helper .subscription-filter label .chevron{color:#e1e1e1;border-bottom-width:0;line-height:1;padding:0;position:absolute;top:10px;right:14px}.wc-helper .subscription-filter li{color:#0073aa;display:inline-block;padding:0 4px 0 8px;position:relative}.wc-helper .subscription-filter li::before{background-color:#979797;content:" ";position:absolute;top:0;left:0;bottom:0;width:1px}.wc-helper .subscription-filter li:first-of-type::before{display:none}.wc-helper .subscription-filter a{color:#0073aa;text-decoration:none}.wc-helper .subscription-filter a.current{color:#000;font-weight:600}.wc-helper .subscription-filter .count{color:#555d66;font-weight:400}@media only screen and (max-width:600px){.wc-helper .subscription-filter{background-color:#fff;border:1px solid #e1e1e1;border-radius:4px;font-size:14px}.wc-helper .subscription-filter label,.wc-helper .subscription-filter li{line-height:21px;padding:8px 16px;margin:0}.wc-helper .subscription-filter label:last-child,.wc-helper .subscription-filter li:last-child{border-bottom:none}.wc-helper .subscription-filter li{border-bottom:1px solid #e1e1e1}.wc-helper .subscription-filter label,.wc-helper .subscription-filter span.chevron{display:block}.wc-helper .subscription-filter label{text-decoration:none}.wc-helper .subscription-filter li{display:none}.wc-helper .subscription-filter li::before{display:none}.wc-helper .subscription-filter a{cursor:pointer}.wc-helper .subscription-filter span.chevron{color:#555;opacity:.5;-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.wc-helper .subscription-filter:focus,.wc-helper .subscription-filter:hover{box-shadow:0 3px 5px rgba(0,0,0,.2)}.wc-helper .subscription-filter:focus label,.wc-helper .subscription-filter:hover label{border-bottom:1px solid #e1e1e1}.wc-helper .subscription-filter:focus li,.wc-helper .subscription-filter:hover li{display:block}.wc-helper .subscription-filter:focus span.chevron,.wc-helper .subscription-filter:hover span.chevron{-webkit-transform:rotateX(0);transform:rotateX(0)}}.wc-helper .subscriptions-header{margin:3em 0 0;position:relative;z-index:10}.wc-helper .subscriptions-header h2{display:inline-block;line-height:25px;margin:0 0 1.5em 0}.wc-helper .button-update,.wc-helper .button-update:hover{background-color:#e6e6e6;border-radius:4px;color:#333;font-weight:800;font-size:10px;line-height:20px;margin-left:6px;opacity:.75;padding:3px 7px;text-transform:uppercase}.wc-helper .button-update .dashicons,.wc-helper .button-update:hover .dashicons{font-size:12px;height:12px;width:12px;vertical-align:text-bottom}.wc-helper .button-update:hover{opacity:1}.wc-helper .user-info{background-color:#fff;border:1px solid #e1e1e1;border-radius:4px;font-size:12px;line-height:26px;position:absolute;top:-10px;right:0;-webkit-transition:all .1s ease-in;transition:all .1s ease-in}@media only screen and (max-width:600px){.wc-helper .user-info{position:relative;width:100%}}.wc-helper .user-info p{line-height:26px;margin:0}.wc-helper .user-info:hover{box-shadow:0 3px 5px rgba(0,0,0,.2)}.wc-helper .user-info header{color:#555;font-weight:600;padding:6px 14px;position:relative}.wc-helper .user-info header p{padding-right:26px}.wc-helper .user-info header .dashicons{opacity:.5;position:absolute;top:9px;right:14px}.wc-helper .user-info header:hover{cursor:pointer}.wc-helper .user-info section{display:none}.wc-helper .user-info section p{border-top:1px solid #e1e1e1;padding:6px 14px;text-align:center}.wc-helper .user-info section .actions{border-top:1px solid #e1e1e1;display:-webkit-box;display:-ms-flexbox;display:flex}.wc-helper .user-info section a{color:#a26897;cursor:pointer;font-weight:600;line-height:38px;padding:0 14px;text-align:center;text-decoration:none;white-space:nowrap;width:50%}.wc-helper .user-info section a .dashicons{margin-top:-3px;vertical-align:middle}.wc-helper .user-info section a:first-child{border-right:1px solid #e1e1e1}.wc-helper .user-info section a:hover{background-color:#a26897;color:#fff}.wc-helper .user-info section .avatar{border:1px solid #ece1ea;border-radius:50%;height:auto;margin-right:6px;width:24px;vertical-align:bottom}.wc-helper .user-info:active header .dashicons,.wc-helper .user-info:focus header .dashicons,.wc-helper .user-info:hover header .dashicons{-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.wc-helper .user-info:active section,.wc-helper .user-info:focus section,.wc-helper .user-info:hover section{display:block}.wc-helper .alternate,.wc-helper .striped>tbody>:nth-child(odd),.wc-helper ul.striped>:nth-child(odd){background-color:#fff}.wc-helper .comment-ays,.wc-helper .feature-filter,.wc-helper .imgedit-group,.wc-helper .popular-tags,.wc-helper .stuffbox,.wc-helper .widgets-holder-wrap,.wc-helper .wp-editor-container,.wc-helper p.popular-tags,.wc-helper table.widefat{padding-top:5px}.wc-helper .widefat tfoot tr td,.wc-helper .widefat tfoot tr th,.wc-helper .widefat thead tr td,.wc-helper .widefat thead tr th{color:#32373c;padding-bottom:15px;padding-top:10px}.wc-helper .widefat td{padding-bottom:15px;padding-top:15px}.wc-helper .wp-list-table{border:0;box-shadow:none;padding-top:0!important;z-index:1}@media only screen and (max-width:782px){.wc-helper .button{font-size:11px}}.wc-helper .wp-list-table__row{background-color:rgba(0,0,0,0)}.wc-helper .wp-list-table__row td{-webkit-box-align:center;-ms-flex-align:center;align-items:center;background-color:#fff;border:0;padding:16px 22px;vertical-align:middle}@media only screen and (max-width:782px){.wc-helper .wp-list-table__row td{padding:16px}}.wc-helper .wp-list-table__row td.color-bar{border-left:0}.wc-helper .wp-list-table__row.is-ext-header td{border-top:1px solid #e1e1e1}@media only screen and (max-width:782px){.wc-helper .wp-list-table__row.is-ext-header{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap;width:100%}.wc-helper .wp-list-table__row.is-ext-header .wp-list-table__ext-details{display:block;-webkit-box-flex:2;-ms-flex:2;flex:2}.wc-helper .wp-list-table__row.is-ext-header .wp-list-table__ext-actions{display:block;-webkit-box-flex:1;-ms-flex:1;flex:1;min-width:0}}.wc-helper .wp-list-table__row:last-child td{border-bottom:24px solid #f1f1f1;box-shadow:inset 0 -1px 0 #e1e1e1}.wc-helper .wp-list-table__ext-details,.wc-helper .wp-list-table__ext-status,.wc-helper .wp-list-table__licence-container{padding-right:22px;position:relative;width:100%}.wc-helper .wp-list-table__ext-details::before,.wc-helper .wp-list-table__ext-status::before,.wc-helper .wp-list-table__licence-container::before{background-color:#e1e1e1;content:" ";position:absolute;top:0;bottom:0;left:0!important;width:1px!important}.wc-helper .wp-list-table__ext-details{display:-webkit-box;display:-ms-flexbox;display:flex}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-details{display:table}}.wc-helper .wp-list-table__ext-title{color:#0073aa;font-size:18px;font-weight:600;width:60%}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-title{margin-bottom:12px;width:100%}}@media only screen and (max-width:320px){.wc-helper .wp-list-table__ext-title{max-width:120px}}.wc-helper .wp-list-table__ext-description{color:#333;padding-left:12px;width:40%}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-description{padding-left:0;width:100%}}.wc-helper .wp-list-table__ext-status{position:relative}.wc-helper .wp-list-table__ext-status.update-available::after{background-color:#ffc322;content:" ";position:absolute;top:0;left:0;bottom:0;width:5px}.wc-helper .wp-list-table__ext-status.expired::after{background-color:#b81c23;content:" ";position:absolute;top:0;left:0;bottom:0;width:5px}.wc-helper .wp-list-table__ext-status .dashicons-update{color:#ffc322}.wc-helper .wp-list-table__ext-status .dashicons-info{color:#b81c23}.wc-helper .wp-list-table__ext-status p{color:#333;margin:0}.wc-helper .wp-list-table__ext-status .dashicons{margin-right:5px}.wc-helper .wp-list-table__ext-actions{min-width:150px;position:relative;width:25%;text-align:right}.wc-helper .wp-list-table__ext-actions::after{background-color:#e1e1e1;content:" ";position:absolute;top:0;bottom:0;right:0;width:1px}.wc-helper .wp-list-table__ext-licence td,.wc-helper .wp-list-table__ext-updates td{position:relative}.wc-helper .wp-list-table__ext-licence td::before,.wc-helper .wp-list-table__ext-updates td::before{background-color:#e1e1e1;content:" ";height:1px;position:absolute;top:0;left:0;right:0}.wc-helper .wp-list-table__ext-licence td.wp-list-table__ext-status::before,.wc-helper .wp-list-table__ext-licence td.wp-list-table__licence-container::before,.wc-helper .wp-list-table__ext-updates td.wp-list-table__ext-status::before,.wc-helper .wp-list-table__ext-updates td.wp-list-table__licence-container::before{left:22px!important;width:auto!important}.wc-helper .wp-list-table__ext-licence td.wp-list-table__ext-actions::before,.wc-helper .wp-list-table__ext-updates td.wp-list-table__ext-actions::before{right:22px}@media only screen and (max-width:782px){.wc-helper .wp-list-table__ext-licence,.wc-helper .wp-list-table__ext-updates{display:-webkit-box;display:-ms-flexbox;display:flex}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-status,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-status{-webkit-box-flex:2;-ms-flex:2;flex:2}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-status::before,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-status::before{left:0!important;width:100%!important}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-actions,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-actions{-webkit-box-flex:1;-ms-flex:1;flex:1;min-width:0}.wc-helper .wp-list-table__ext-licence .wp-list-table__ext-actions::before,.wc-helper .wp-list-table__ext-updates .wp-list-table__ext-actions::before{left:0!important;right:0!important;width:100%!important}}.wc-helper .wp-list-table__licence-container{padding:0!important}.wc-helper .wp-list-table__licence-container::after{background-color:#e1e1e1;content:" ";position:absolute;top:0;bottom:0;right:0;width:1px}.wc-helper .wp-list-table__licence-form{display:-webkit-box;display:-ms-flexbox;display:flex;padding:16px 22px}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-form{display:block}}.wc-helper .wp-list-table__licence-form::before{background-color:#e1e1e1;content:" ";height:1px;position:absolute;top:0;right:22px;left:22px}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-form::before{right:0;left:0}}.wc-helper .wp-list-table__licence-form div{padding-right:16px;vertical-align:middle}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-form div{padding:0}}.wc-helper .wp-list-table__licence-form p{margin:0!important}.wc-helper .wp-list-table__licence-label label{color:#23282d;font-weight:600;line-height:30px}.wc-helper .wp-list-table__licence-field input{height:32px}@media only screen and (max-width:480px){.wc-helper .wp-list-table__licence-field input{width:100%}}@media only screen and (max-width:782px){.wc-helper .wp-list-table__licence-field{padding:8px 0 16px!important}}.wc-helper .wp-list-table__licence-actions{-webkit-box-flex:2;-ms-flex-positive:2;flex-grow:2;padding-right:0!important}.wc-helper .wp-list-table__licence-actions .button{margin-right:8px}.wc-helper .wp-list-table__licence-actions .button-secondary{float:right;margin:0 0 0 8px}@media only screen and (max-width:480px){.wc-helper .wp-list-table__licence-actions{text-align:right}}.wc-helper td.color-bar{border-left:solid 4px transparent}.wc-helper td.color-bar.expired{border-left-color:#b81c23}.wc-helper td.color-bar.expiring{border-left-color:orange}.wc-helper td.color-bar.update-available{border-left-color:#8fae1b}.wc-helper td.color-bar.expiring.update-available{border-left-color:#8fae1b}.wc-helper .connect-wrapper{background-color:#fff;border:1px solid #e5e5e5;margin-bottom:25px;overflow:auto}.wc-helper .connected{display:-webkit-box;display:-ms-flexbox;display:flex}.wc-helper .connected .user-info{display:-webkit-box;display:-ms-flexbox;display:flex;padding:20px;width:100%;vertical-align:middle}.wc-helper .connected img{border:1px solid #e5e5e5;height:34px;width:34px}.wc-helper .connected .buttons{padding:20px;white-space:nowrap}.wc-helper .connected p{-webkit-box-flex:2;-ms-flex:2;flex:2;margin:10px 0 0 20px}.wc-helper .connected .chevron{display:none}.wc-helper .connected .chevron:hover{color:#955a89;cursor:pointer}@media only screen and (max-width:784px){.wc-helper .connected{display:block}.wc-helper .connected strong{display:block;overflow:hidden;text-overflow:ellipsis}.wc-helper .connected p{margin:0;overflow:hidden;text-overflow:ellipsis;width:80%}.wc-helper .connected .user-info{padding-right:0;width:auto}.wc-helper .connected .avatar{margin-right:12px}.wc-helper .connected .chevron{color:#e1e1e1;display:block;margin:10px;-webkit-transform:rotateX(0);transform:rotateX(0)}.wc-helper .connected .buttons{display:none;border-top:1px solid #e1e1e1;padding:10px 20px}.wc-helper .connected .buttons.active{display:block}}.wc-helper .start-container{background-color:#fff;border-left:4px solid #cc99c2;padding:45px 20px 20px 30px;position:relative;overflow:hidden}.wc-helper .start-container h2,.wc-helper .start-container p{max-width:800px}.wc-helper .start-container::before{color:#eee2ec;content:"\e01C";display:block;font-family:WooCommerce;font-size:192px;line-height:1;position:absolute;top:65%;right:-3%;text-align:center;width:1em}.wc-helper .start-container h2{font-size:24px;line-height:29px;position:relative}.wc-helper .start-container p{font-size:16px;margin-bottom:30px;position:relative}.wc-helper .button-primary{height:37px;line-height:37px;min-width:124px;padding:0 13px;text-shadow:none}.wc-helper .button-primary:active,.wc-helper .button-primary:focus,.wc-helper .button-primary:hover{padding:0 13px}.form-toggle__wrapper{position:relative}.form-toggle__wrapper label{cursor:default}.form-toggle{cursor:pointer;display:block;position:absolute;top:0;bottom:-1px;left:0;right:0;text-align:left;text-indent:-100000px;z-index:2}.form-toggle:focus{box-shadow:none}.form-toggle.disabled{cursor:default}.form-toggle__switch{-ms-flex-item-align:start;align-self:flex-start;background:#c8d7e1;border-radius:12px;box-sizing:border-box;display:inline-block;padding:2px;outline:0;position:relative;width:40px;height:24px;-webkit-transition:all .4s ease,box-shadow 0s;transition:all .4s ease,box-shadow 0s;vertical-align:middle}.form-toggle__switch::after,.form-toggle__switch::before{content:"";display:block;position:relative;width:20px;height:20px}.form-toggle__switch::after{border-radius:50%;background:#fff;left:0;-webkit-transition:all .2s ease;transition:all .2s ease}.form-toggle__switch::before{display:none}.accessible-focus .form-toggle__switch:focus{box-shadow:0 0 0 2px #955a89}.form-toggle__label{vertical-align:bottom;z-index:1}.form-toggle__label .form-toggle__label-content{color:#87a6bc;-webkit-box-flex:0;-ms-flex:0 1 100%;flex:0 1 100%;font-size:13px;line-height:16px;margin-left:12px;margin-right:8px;vertical-align:top;text-transform:uppercase}@media only screen and (max-width:480px){.form-toggle__label .form-toggle__label-content{display:none}}.accessible-focus .form-toggle:focus+.form-toggle__label .form-toggle__switch{box-shadow:0 0 0 2px #955a89}.accessible-focus .form-toggle:focus:checked+.form-toggle__label .form-toggle__switch{box-shadow:0 0 0 2px #bb77ae}.form-toggle+.form-toggle__label .form-toggle__switch{background:#a8bece}.form-toggle:not(:disabled)+.form-toggle__label:hover .form-toggle__switch{background:#c8d7e1}.form-toggle.active+.form-toggle__label .form-toggle__switch{background:#955a89}.form-toggle.active+.form-toggle__label .form-toggle__switch::after{left:8px}.form-toggle.active+.form-toggle__label:hover .form-toggle__switch{background:#bb77ae}.form-toggle.disabled+label.form-toggle__label span.form-toggle__switch{opacity:.25}.form-toggle.is-toggling+.form-toggle__label .form-toggle__switch{background:#955a89}.form-toggle.is-toggling:checked+.form-toggle__label .form-toggle__switch{background:#c8d7e1}.form-toggle.is-compact+.form-toggle__label .form-toggle__switch{border-radius:8px;width:24px;height:16px}.form-toggle.is-compact+.form-toggle__label .form-toggle__switch::after,.form-toggle.is-compact+.form-toggle__label .form-toggle__switch::before{height:12px;width:12px}.form-toggle.is-compact:checked+.form-toggle__label .form-toggle__switch::after{left:8px} \ No newline at end of file diff --git a/assets/css/menu-rtl.css b/assets/css/menu-rtl.css index bcf5495e5b9..ec43c21db8f 100644 --- a/assets/css/menu-rtl.css +++ b/assets/css/menu-rtl.css @@ -1 +1 @@ -@charset "UTF-8";@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}#adminmenu #toplevel_page_woocommerce .menu-icon-generic div.wp-menu-image::before{font-family:WooCommerce!important;content:'\e03d'}#adminmenu #menu-posts-product .menu-icon-post div.wp-menu-image::before,#adminmenu #menu-posts-product .menu-icon-product div.wp-menu-image::before{font-family:WooCommerce!important;content:'\e006'}#adminmenu #toplevel_page_wc-reports .menu-icon-generic div.wp-menu-image::before{font-family:WooCommerce!important;content:'\e023';font-size:1.3em!important}span.mce_woocommerce_shortcodes_button{background-image:none!important;display:block;text-indent:-9999px;position:relative;height:1em;width:1em}span.mce_woocommerce_shortcodes_button::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";font-size:.9em;line-height:1.2}#woocommerce-update .updating-message .wc_plugin_upgrade_notice{display:none}#woocommerce-update .dummy{display:none}#woocommerce-update .wc_plugin_upgrade_notice{font-weight:400;background:#fff8e5!important;border-right:4px solid #ffb900;border-top:1px solid #ffb900;padding:9px 12px 9px 0!important;margin:0 -16px 0 -12px!important}#woocommerce-update .wc_plugin_upgrade_notice::before{content:'\f348';display:inline-block;font:400 18px/1 dashicons;speak:none;margin:0 -2px 0 8px;vertical-align:top}#woocommerce-update .wc_plugin_upgrade_notice.major,#woocommerce-update .wc_plugin_upgrade_notice.minor{padding:20px 0!important}#woocommerce-update .wc_plugin_upgrade_notice.major::before,#woocommerce-update .wc_plugin_upgrade_notice.minor::before{display:none}#woocommerce-update .wc_plugin_upgrade_notice.major p,#woocommerce-update .wc_plugin_upgrade_notice.minor p{padding:0 20px;margin:0;max-width:700px;line-height:1.5em}#woocommerce-update .wc_plugin_upgrade_notice.major p::before,#woocommerce-update .wc_plugin_upgrade_notice.minor p::before{content:'';display:none}#woocommerce-update .wc_plugin_upgrade_notice.major table.plugin-details-table,#woocommerce-update .wc_plugin_upgrade_notice.minor table.plugin-details-table{margin:.75em 0 0}#woocommerce-update .wc_plugin_upgrade_notice.major table.plugin-details-table tr,#woocommerce-update .wc_plugin_upgrade_notice.minor table.plugin-details-table tr{background:transparent none!important;border:0!important}#woocommerce-update .wc_plugin_upgrade_notice.major table.plugin-details-table td,#woocommerce-update .wc_plugin_upgrade_notice.major table.plugin-details-table th,#woocommerce-update .wc_plugin_upgrade_notice.minor table.plugin-details-table td,#woocommerce-update .wc_plugin_upgrade_notice.minor table.plugin-details-table th{background:transparent none!important;margin:0;padding:.75em 20px 0;border:0!important;font-size:1em;-webkit-box-shadow:none;box-shadow:none}#woocommerce-update .wc_plugin_upgrade_notice.major table.plugin-details-table th,#woocommerce-update .wc_plugin_upgrade_notice.minor table.plugin-details-table th{font-weight:700}#wc_untested_extensions_modal{display:none}.wc_untested_extensions_modal_container{border-radius:4px;padding:0}.wc_untested_extensions_modal_container #TB_closeAjaxWindow{display:none}.wc_untested_extensions_modal_container #TB_title{display:none}.wc_untested_extensions_modal_container #TB_ajaxContent{height:100%!important;padding:0;margin:0;width:100%!important}.wc_untested_extensions_modal_container #TB_ajaxContent p{margin:0 0 1em}.wc_untested_extensions_modal--content h1{margin:2px 2px .5em;padding:.75em 1em;line-height:1.5em;font-size:2em;border-bottom:1px solid #eee;color:#fff;background:#96578a;border-top-right-radius:4px;border-top-left-radius:4px;text-shadow:none}.wc_untested_extensions_modal--content .extensions_warning{padding:0 2em}.wc_untested_extensions_modal--content .plugin-details-table-container{max-height:40vh;overflow-y:auto}.wc_untested_extensions_modal--content table.plugin-details-table{margin:20px 0}.wc_untested_extensions_modal--content table.plugin-details-table td,.wc_untested_extensions_modal--content table.plugin-details-table th{background:transparent none!important;margin:0;padding:.75em 20px 0;border:0!important;font-size:1em;-webkit-box-shadow:none;box-shadow:none}.wc_untested_extensions_modal--content table.plugin-details-table th{font-weight:700;margin-top:0}.wc_untested_extensions_modal--content .actions{border-top:1px solid #eee;margin:0;padding:1em 0 2em 0;overflow:hidden}.wc_untested_extensions_modal--content .actions .woocommerce-actions{display:inline-block}.wc_untested_extensions_modal--content .actions a.button-primary{float:left;background:#bb77ae;border-color:#a36597;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;color:#fff;text-shadow:0 -1px 1px #a36597,-1px 0 1px #a36597,0 1px 1px #a36597,1px 0 1px #a36597}.wc_untested_extensions_modal--content .actions a.button-primary:active,.wc_untested_extensions_modal--content .actions a.button-primary:focus,.wc_untested_extensions_modal--content .actions a.button-primary:hover{background:#a36597;border-color:#a36597;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597} \ No newline at end of file +@charset "UTF-8";@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}#adminmenu #toplevel_page_woocommerce .menu-icon-generic div.wp-menu-image::before{font-family:WooCommerce!important;content:'\e03d'}#adminmenu #menu-posts-product .menu-icon-post div.wp-menu-image::before,#adminmenu #menu-posts-product .menu-icon-product div.wp-menu-image::before{font-family:WooCommerce!important;content:'\e006'}#adminmenu #toplevel_page_wc-reports .menu-icon-generic div.wp-menu-image::before{font-family:WooCommerce!important;content:'\e023';font-size:1.3em!important}span.mce_woocommerce_shortcodes_button{background-image:none!important;display:block;text-indent:-9999px;position:relative;height:1em;width:1em}span.mce_woocommerce_shortcodes_button::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;right:0;width:100%;height:100%;text-align:center;content:"";font-size:.9em;line-height:1.2}#woocommerce-update .updating-message .wc_plugin_upgrade_notice{display:none}#woocommerce-update .dummy{display:none}#woocommerce-update .wc_plugin_upgrade_notice{font-weight:400;background:#fff8e5!important;border-right:4px solid #ffb900;border-top:1px solid #ffb900;padding:9px 12px 9px 0!important;margin:0 -16px 0 -12px!important}#woocommerce-update .wc_plugin_upgrade_notice::before{content:'\f348';display:inline-block;font:400 18px/1 dashicons;speak:none;margin:0 -2px 0 8px;vertical-align:top}#woocommerce-update .wc_plugin_upgrade_notice.major,#woocommerce-update .wc_plugin_upgrade_notice.minor{padding:20px 0!important}#woocommerce-update .wc_plugin_upgrade_notice.major::before,#woocommerce-update .wc_plugin_upgrade_notice.minor::before{display:none}#woocommerce-update .wc_plugin_upgrade_notice.major p,#woocommerce-update .wc_plugin_upgrade_notice.minor p{padding:0 20px;margin:0;max-width:700px;line-height:1.5em}#woocommerce-update .wc_plugin_upgrade_notice.major p::before,#woocommerce-update .wc_plugin_upgrade_notice.minor p::before{content:'';display:none}#woocommerce-update .wc_plugin_upgrade_notice.major table.plugin-details-table,#woocommerce-update .wc_plugin_upgrade_notice.minor table.plugin-details-table{margin:.75em 0 0}#woocommerce-update .wc_plugin_upgrade_notice.major table.plugin-details-table tr,#woocommerce-update .wc_plugin_upgrade_notice.minor table.plugin-details-table tr{background:transparent none!important;border:0!important}#woocommerce-update .wc_plugin_upgrade_notice.major table.plugin-details-table td,#woocommerce-update .wc_plugin_upgrade_notice.major table.plugin-details-table th,#woocommerce-update .wc_plugin_upgrade_notice.minor table.plugin-details-table td,#woocommerce-update .wc_plugin_upgrade_notice.minor table.plugin-details-table th{background:transparent none!important;margin:0;padding:.75em 20px 0;border:0!important;font-size:1em;box-shadow:none}#woocommerce-update .wc_plugin_upgrade_notice.major table.plugin-details-table th,#woocommerce-update .wc_plugin_upgrade_notice.minor table.plugin-details-table th{font-weight:700}#wc_untested_extensions_modal{display:none}.wc_untested_extensions_modal_container{border-radius:4px;padding:0}.wc_untested_extensions_modal_container #TB_closeAjaxWindow{display:none}.wc_untested_extensions_modal_container #TB_title{display:none}.wc_untested_extensions_modal_container #TB_ajaxContent{height:100%!important;padding:0;margin:0;width:100%!important}.wc_untested_extensions_modal_container #TB_ajaxContent p{margin:0 0 1em}.wc_untested_extensions_modal--content h1{margin:2px 2px .5em;padding:.75em 1em;line-height:1.5em;font-size:2em;border-bottom:1px solid #eee;color:#fff;background:#96578a;border-top-right-radius:4px;border-top-left-radius:4px;text-shadow:none}.wc_untested_extensions_modal--content .extensions_warning{padding:0 2em}.wc_untested_extensions_modal--content .plugin-details-table-container{max-height:40vh;overflow-y:auto}.wc_untested_extensions_modal--content table.plugin-details-table{margin:20px 0}.wc_untested_extensions_modal--content table.plugin-details-table td,.wc_untested_extensions_modal--content table.plugin-details-table th{background:transparent none!important;margin:0;padding:.75em 20px 0;border:0!important;font-size:1em;box-shadow:none}.wc_untested_extensions_modal--content table.plugin-details-table th{font-weight:700;margin-top:0}.wc_untested_extensions_modal--content .actions{border-top:1px solid #eee;margin:0;padding:1em 0 2em 0;overflow:hidden}.wc_untested_extensions_modal--content .actions .woocommerce-actions{display:inline-block}.wc_untested_extensions_modal--content .actions a.button-primary{float:left;background:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;color:#fff;text-shadow:0 -1px 1px #a36597,-1px 0 1px #a36597,0 1px 1px #a36597,1px 0 1px #a36597}.wc_untested_extensions_modal--content .actions a.button-primary:active,.wc_untested_extensions_modal--content .actions a.button-primary:focus,.wc_untested_extensions_modal--content .actions a.button-primary:hover{background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597} \ No newline at end of file diff --git a/assets/css/menu.css b/assets/css/menu.css index dc7dc18b16c..4c8b190d3ab 100644 --- a/assets/css/menu.css +++ b/assets/css/menu.css @@ -1 +1 @@ -@charset "UTF-8";@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}#adminmenu #toplevel_page_woocommerce .menu-icon-generic div.wp-menu-image::before{font-family:WooCommerce!important;content:'\e03d'}#adminmenu #menu-posts-product .menu-icon-post div.wp-menu-image::before,#adminmenu #menu-posts-product .menu-icon-product div.wp-menu-image::before{font-family:WooCommerce!important;content:'\e006'}#adminmenu #toplevel_page_wc-reports .menu-icon-generic div.wp-menu-image::before{font-family:WooCommerce!important;content:'\e023';font-size:1.3em!important}span.mce_woocommerce_shortcodes_button{background-image:none!important;display:block;text-indent:-9999px;position:relative;height:1em;width:1em}span.mce_woocommerce_shortcodes_button::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";font-size:.9em;line-height:1.2}#woocommerce-update .updating-message .wc_plugin_upgrade_notice{display:none}#woocommerce-update .dummy{display:none}#woocommerce-update .wc_plugin_upgrade_notice{font-weight:400;background:#fff8e5!important;border-left:4px solid #ffb900;border-top:1px solid #ffb900;padding:9px 0 9px 12px!important;margin:0 -12px 0 -16px!important}#woocommerce-update .wc_plugin_upgrade_notice::before{content:'\f348';display:inline-block;font:400 18px/1 dashicons;speak:none;margin:0 8px 0 -2px;vertical-align:top}#woocommerce-update .wc_plugin_upgrade_notice.major,#woocommerce-update .wc_plugin_upgrade_notice.minor{padding:20px 0!important}#woocommerce-update .wc_plugin_upgrade_notice.major::before,#woocommerce-update .wc_plugin_upgrade_notice.minor::before{display:none}#woocommerce-update .wc_plugin_upgrade_notice.major p,#woocommerce-update .wc_plugin_upgrade_notice.minor p{padding:0 20px;margin:0;max-width:700px;line-height:1.5em}#woocommerce-update .wc_plugin_upgrade_notice.major p::before,#woocommerce-update .wc_plugin_upgrade_notice.minor p::before{content:'';display:none}#woocommerce-update .wc_plugin_upgrade_notice.major table.plugin-details-table,#woocommerce-update .wc_plugin_upgrade_notice.minor table.plugin-details-table{margin:.75em 0 0}#woocommerce-update .wc_plugin_upgrade_notice.major table.plugin-details-table tr,#woocommerce-update .wc_plugin_upgrade_notice.minor table.plugin-details-table tr{background:transparent none!important;border:0!important}#woocommerce-update .wc_plugin_upgrade_notice.major table.plugin-details-table td,#woocommerce-update .wc_plugin_upgrade_notice.major table.plugin-details-table th,#woocommerce-update .wc_plugin_upgrade_notice.minor table.plugin-details-table td,#woocommerce-update .wc_plugin_upgrade_notice.minor table.plugin-details-table th{background:transparent none!important;margin:0;padding:.75em 20px 0;border:0!important;font-size:1em;-webkit-box-shadow:none;box-shadow:none}#woocommerce-update .wc_plugin_upgrade_notice.major table.plugin-details-table th,#woocommerce-update .wc_plugin_upgrade_notice.minor table.plugin-details-table th{font-weight:700}#wc_untested_extensions_modal{display:none}.wc_untested_extensions_modal_container{border-radius:4px;padding:0}.wc_untested_extensions_modal_container #TB_closeAjaxWindow{display:none}.wc_untested_extensions_modal_container #TB_title{display:none}.wc_untested_extensions_modal_container #TB_ajaxContent{height:100%!important;padding:0;margin:0;width:100%!important}.wc_untested_extensions_modal_container #TB_ajaxContent p{margin:0 0 1em}.wc_untested_extensions_modal--content h1{margin:2px 2px .5em;padding:.75em 1em;line-height:1.5em;font-size:2em;border-bottom:1px solid #eee;color:#fff;background:#96578a;border-top-left-radius:4px;border-top-right-radius:4px;text-shadow:none}.wc_untested_extensions_modal--content .extensions_warning{padding:0 2em}.wc_untested_extensions_modal--content .plugin-details-table-container{max-height:40vh;overflow-y:auto}.wc_untested_extensions_modal--content table.plugin-details-table{margin:20px 0}.wc_untested_extensions_modal--content table.plugin-details-table td,.wc_untested_extensions_modal--content table.plugin-details-table th{background:transparent none!important;margin:0;padding:.75em 20px 0;border:0!important;font-size:1em;-webkit-box-shadow:none;box-shadow:none}.wc_untested_extensions_modal--content table.plugin-details-table th{font-weight:700;margin-top:0}.wc_untested_extensions_modal--content .actions{border-top:1px solid #eee;margin:0;padding:1em 0 2em 0;overflow:hidden}.wc_untested_extensions_modal--content .actions .woocommerce-actions{display:inline-block}.wc_untested_extensions_modal--content .actions a.button-primary{float:right;background:#bb77ae;border-color:#a36597;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;color:#fff;text-shadow:0 -1px 1px #a36597,1px 0 1px #a36597,0 1px 1px #a36597,-1px 0 1px #a36597}.wc_untested_extensions_modal--content .actions a.button-primary:active,.wc_untested_extensions_modal--content .actions a.button-primary:focus,.wc_untested_extensions_modal--content .actions a.button-primary:hover{background:#a36597;border-color:#a36597;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597} \ No newline at end of file +@charset "UTF-8";@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}#adminmenu #toplevel_page_woocommerce .menu-icon-generic div.wp-menu-image::before{font-family:WooCommerce!important;content:'\e03d'}#adminmenu #menu-posts-product .menu-icon-post div.wp-menu-image::before,#adminmenu #menu-posts-product .menu-icon-product div.wp-menu-image::before{font-family:WooCommerce!important;content:'\e006'}#adminmenu #toplevel_page_wc-reports .menu-icon-generic div.wp-menu-image::before{font-family:WooCommerce!important;content:'\e023';font-size:1.3em!important}span.mce_woocommerce_shortcodes_button{background-image:none!important;display:block;text-indent:-9999px;position:relative;height:1em;width:1em}span.mce_woocommerce_shortcodes_button::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";font-size:.9em;line-height:1.2}#woocommerce-update .updating-message .wc_plugin_upgrade_notice{display:none}#woocommerce-update .dummy{display:none}#woocommerce-update .wc_plugin_upgrade_notice{font-weight:400;background:#fff8e5!important;border-left:4px solid #ffb900;border-top:1px solid #ffb900;padding:9px 0 9px 12px!important;margin:0 -12px 0 -16px!important}#woocommerce-update .wc_plugin_upgrade_notice::before{content:'\f348';display:inline-block;font:400 18px/1 dashicons;speak:none;margin:0 8px 0 -2px;vertical-align:top}#woocommerce-update .wc_plugin_upgrade_notice.major,#woocommerce-update .wc_plugin_upgrade_notice.minor{padding:20px 0!important}#woocommerce-update .wc_plugin_upgrade_notice.major::before,#woocommerce-update .wc_plugin_upgrade_notice.minor::before{display:none}#woocommerce-update .wc_plugin_upgrade_notice.major p,#woocommerce-update .wc_plugin_upgrade_notice.minor p{padding:0 20px;margin:0;max-width:700px;line-height:1.5em}#woocommerce-update .wc_plugin_upgrade_notice.major p::before,#woocommerce-update .wc_plugin_upgrade_notice.minor p::before{content:'';display:none}#woocommerce-update .wc_plugin_upgrade_notice.major table.plugin-details-table,#woocommerce-update .wc_plugin_upgrade_notice.minor table.plugin-details-table{margin:.75em 0 0}#woocommerce-update .wc_plugin_upgrade_notice.major table.plugin-details-table tr,#woocommerce-update .wc_plugin_upgrade_notice.minor table.plugin-details-table tr{background:transparent none!important;border:0!important}#woocommerce-update .wc_plugin_upgrade_notice.major table.plugin-details-table td,#woocommerce-update .wc_plugin_upgrade_notice.major table.plugin-details-table th,#woocommerce-update .wc_plugin_upgrade_notice.minor table.plugin-details-table td,#woocommerce-update .wc_plugin_upgrade_notice.minor table.plugin-details-table th{background:transparent none!important;margin:0;padding:.75em 20px 0;border:0!important;font-size:1em;box-shadow:none}#woocommerce-update .wc_plugin_upgrade_notice.major table.plugin-details-table th,#woocommerce-update .wc_plugin_upgrade_notice.minor table.plugin-details-table th{font-weight:700}#wc_untested_extensions_modal{display:none}.wc_untested_extensions_modal_container{border-radius:4px;padding:0}.wc_untested_extensions_modal_container #TB_closeAjaxWindow{display:none}.wc_untested_extensions_modal_container #TB_title{display:none}.wc_untested_extensions_modal_container #TB_ajaxContent{height:100%!important;padding:0;margin:0;width:100%!important}.wc_untested_extensions_modal_container #TB_ajaxContent p{margin:0 0 1em}.wc_untested_extensions_modal--content h1{margin:2px 2px .5em;padding:.75em 1em;line-height:1.5em;font-size:2em;border-bottom:1px solid #eee;color:#fff;background:#96578a;border-top-left-radius:4px;border-top-right-radius:4px;text-shadow:none}.wc_untested_extensions_modal--content .extensions_warning{padding:0 2em}.wc_untested_extensions_modal--content .plugin-details-table-container{max-height:40vh;overflow-y:auto}.wc_untested_extensions_modal--content table.plugin-details-table{margin:20px 0}.wc_untested_extensions_modal--content table.plugin-details-table td,.wc_untested_extensions_modal--content table.plugin-details-table th{background:transparent none!important;margin:0;padding:.75em 20px 0;border:0!important;font-size:1em;box-shadow:none}.wc_untested_extensions_modal--content table.plugin-details-table th{font-weight:700;margin-top:0}.wc_untested_extensions_modal--content .actions{border-top:1px solid #eee;margin:0;padding:1em 0 2em 0;overflow:hidden}.wc_untested_extensions_modal--content .actions .woocommerce-actions{display:inline-block}.wc_untested_extensions_modal--content .actions a.button-primary{float:right;background:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;color:#fff;text-shadow:0 -1px 1px #a36597,1px 0 1px #a36597,0 1px 1px #a36597,-1px 0 1px #a36597}.wc_untested_extensions_modal--content .actions a.button-primary:active,.wc_untested_extensions_modal--content .actions a.button-primary:focus,.wc_untested_extensions_modal--content .actions a.button-primary:hover{background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597} \ No newline at end of file diff --git a/assets/css/network-order-widget-rtl.css b/assets/css/network-order-widget-rtl.css index 1b43d9e8ddc..6d633da273d 100644 --- a/assets/css/network-order-widget-rtl.css +++ b/assets/css/network-order-widget-rtl.css @@ -1 +1 @@ -#woocommerce_network_orders .inside{margin:0;padding:0}#woocommerce_network_orders .woocommerce-network-order-table,#woocommerce_network_orders .woocommerce-network-order-table-loading,#woocommerce_network_orders .woocommerce-network-orders-no-orders{width:100%;display:none}#woocommerce_network_orders .woocommerce-network-order-table-loading.is-active,#woocommerce_network_orders .woocommerce-network-order-table.is-active,#woocommerce_network_orders .woocommerce-network-orders-no-orders.is-active{display:block}#woocommerce_network_orders .woocommerce-network-order-table-loading p,#woocommerce_network_orders .woocommerce-network-orders-no-orders p{text-align:center}#woocommerce_network_orders .woocommerce-network-order-table{margin-top:0}#woocommerce_network_orders .woocommerce-network-order-table.is-active{display:table}#woocommerce_network_orders .woocommerce-network-order-table thead td{padding:.5em 1em}#woocommerce_network_orders .spinner{margin-top:0;float:none}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td,#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody th{border-top:1px solid #f5f5f5}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td{vertical-align:middle;padding:1em}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td .order-status{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;padding:0 1em;line-height:2.5em;color:#777;background:#e5e5e5;border-radius:4px;border-bottom:1px solid rgba(0,0,0,.05);margin:-.5em 0;cursor:inherit!important}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td .order-status.status-completed{background:#c8d7e1;color:#2e4453}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td .order-status.status-on-hold{background:#f8dda7;color:#94660c}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td .order-status.status-failed{background:#eba3a3;color:#761919}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td .order-status.status-processing{background:#c6e1c6;color:#5b841b}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td .order-status.status-trash{background:#eba3a3;color:#761919} \ No newline at end of file +#woocommerce_network_orders .inside{margin:0;padding:0}#woocommerce_network_orders .woocommerce-network-order-table,#woocommerce_network_orders .woocommerce-network-order-table-loading,#woocommerce_network_orders .woocommerce-network-orders-no-orders{width:100%;display:none}#woocommerce_network_orders .woocommerce-network-order-table-loading.is-active,#woocommerce_network_orders .woocommerce-network-order-table.is-active,#woocommerce_network_orders .woocommerce-network-orders-no-orders.is-active{display:block}#woocommerce_network_orders .woocommerce-network-order-table-loading p,#woocommerce_network_orders .woocommerce-network-orders-no-orders p{text-align:center}#woocommerce_network_orders .woocommerce-network-order-table{margin-top:0}#woocommerce_network_orders .woocommerce-network-order-table.is-active{display:table}#woocommerce_network_orders .woocommerce-network-order-table thead td{padding:.5em 1em}#woocommerce_network_orders .spinner{margin-top:0;float:none}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td,#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody th{border-top:1px solid #f5f5f5}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td{vertical-align:middle;padding:1em}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td .order-status{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;padding:0 1em;line-height:2.5em;color:#777;background:#e5e5e5;border-radius:4px;border-bottom:1px solid rgba(0,0,0,.05);margin:-.5em 0;cursor:inherit!important}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td .order-status.status-completed{background:#c8d7e1;color:#2e4453}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td .order-status.status-on-hold{background:#f8dda7;color:#94660c}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td .order-status.status-failed{background:#eba3a3;color:#761919}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td .order-status.status-processing{background:#c6e1c6;color:#5b841b}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td .order-status.status-trash{background:#eba3a3;color:#761919} \ No newline at end of file diff --git a/assets/css/network-order-widget.css b/assets/css/network-order-widget.css index 1b43d9e8ddc..6d633da273d 100644 --- a/assets/css/network-order-widget.css +++ b/assets/css/network-order-widget.css @@ -1 +1 @@ -#woocommerce_network_orders .inside{margin:0;padding:0}#woocommerce_network_orders .woocommerce-network-order-table,#woocommerce_network_orders .woocommerce-network-order-table-loading,#woocommerce_network_orders .woocommerce-network-orders-no-orders{width:100%;display:none}#woocommerce_network_orders .woocommerce-network-order-table-loading.is-active,#woocommerce_network_orders .woocommerce-network-order-table.is-active,#woocommerce_network_orders .woocommerce-network-orders-no-orders.is-active{display:block}#woocommerce_network_orders .woocommerce-network-order-table-loading p,#woocommerce_network_orders .woocommerce-network-orders-no-orders p{text-align:center}#woocommerce_network_orders .woocommerce-network-order-table{margin-top:0}#woocommerce_network_orders .woocommerce-network-order-table.is-active{display:table}#woocommerce_network_orders .woocommerce-network-order-table thead td{padding:.5em 1em}#woocommerce_network_orders .spinner{margin-top:0;float:none}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td,#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody th{border-top:1px solid #f5f5f5}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td{vertical-align:middle;padding:1em}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td .order-status{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;padding:0 1em;line-height:2.5em;color:#777;background:#e5e5e5;border-radius:4px;border-bottom:1px solid rgba(0,0,0,.05);margin:-.5em 0;cursor:inherit!important}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td .order-status.status-completed{background:#c8d7e1;color:#2e4453}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td .order-status.status-on-hold{background:#f8dda7;color:#94660c}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td .order-status.status-failed{background:#eba3a3;color:#761919}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td .order-status.status-processing{background:#c6e1c6;color:#5b841b}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td .order-status.status-trash{background:#eba3a3;color:#761919} \ No newline at end of file +#woocommerce_network_orders .inside{margin:0;padding:0}#woocommerce_network_orders .woocommerce-network-order-table,#woocommerce_network_orders .woocommerce-network-order-table-loading,#woocommerce_network_orders .woocommerce-network-orders-no-orders{width:100%;display:none}#woocommerce_network_orders .woocommerce-network-order-table-loading.is-active,#woocommerce_network_orders .woocommerce-network-order-table.is-active,#woocommerce_network_orders .woocommerce-network-orders-no-orders.is-active{display:block}#woocommerce_network_orders .woocommerce-network-order-table-loading p,#woocommerce_network_orders .woocommerce-network-orders-no-orders p{text-align:center}#woocommerce_network_orders .woocommerce-network-order-table{margin-top:0}#woocommerce_network_orders .woocommerce-network-order-table.is-active{display:table}#woocommerce_network_orders .woocommerce-network-order-table thead td{padding:.5em 1em}#woocommerce_network_orders .spinner{margin-top:0;float:none}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td,#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody th{border-top:1px solid #f5f5f5}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td{vertical-align:middle;padding:1em}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td .order-status{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;padding:0 1em;line-height:2.5em;color:#777;background:#e5e5e5;border-radius:4px;border-bottom:1px solid rgba(0,0,0,.05);margin:-.5em 0;cursor:inherit!important}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td .order-status.status-completed{background:#c8d7e1;color:#2e4453}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td .order-status.status-on-hold{background:#f8dda7;color:#94660c}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td .order-status.status-failed{background:#eba3a3;color:#761919}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td .order-status.status-processing{background:#c6e1c6;color:#5b841b}#woocommerce_network_orders .post-type-shop_order .woocommerce-network-order-table tbody td .order-status.status-trash{background:#eba3a3;color:#761919} \ No newline at end of file diff --git a/assets/css/prettyPhoto-rtl.css b/assets/css/prettyPhoto-rtl.css index 507e985acf1..78b9635ba37 100644 --- a/assets/css/prettyPhoto-rtl.css +++ b/assets/css/prettyPhoto-rtl.css @@ -1 +1 @@ -@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}div.pp_woocommerce .pp_content_container{background:#fff;border-radius:3px;-webkit-box-shadow:0 1px 30px rgba(0,0,0,.25);box-shadow:0 1px 30px rgba(0,0,0,.25);padding:20px 0}div.pp_woocommerce .pp_content_container::after,div.pp_woocommerce .pp_content_container::before{content:' ';display:table}div.pp_woocommerce .pp_content_container::after{clear:both}div.pp_woocommerce .pp_loaderIcon::before{height:1em;width:1em;display:block;position:absolute;top:50%;right:50%;margin-right:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}div.pp_woocommerce div.ppt{color:#000}div.pp_woocommerce .pp_gallery ul li a{border:1px solid rgba(0,0,0,.5);background:#fff;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.2);box-shadow:0 1px 2px rgba(0,0,0,.2);border-radius:2px;display:block}div.pp_woocommerce .pp_gallery ul li a:hover{border-color:#000}div.pp_woocommerce .pp_gallery ul li.selected a{border-color:#000}div.pp_woocommerce .pp_next::before,div.pp_woocommerce .pp_previous::before{border-radius:100%;height:1em;width:1em;text-shadow:0 1px 2px rgba(0,0,0,.5);background-color:#444;color:#fff!important;font-size:16px!important;line-height:1em;-webkit-transition:all ease-in-out .2s;transition:all ease-in-out .2s;font-family:WooCommerce;content:'\e00b';text-indent:0;display:none;position:absolute;top:50%;margin-top:-10px;text-align:center}div.pp_woocommerce .pp_next::before:hover,div.pp_woocommerce .pp_previous::before:hover{background-color:#000}div.pp_woocommerce .pp_next:hover::before,div.pp_woocommerce .pp_previous:hover::before{display:block}div.pp_woocommerce .pp_previous::before{right:1em}div.pp_woocommerce .pp_next::before{left:1em;font-family:WooCommerce;content:'\e008'}div.pp_woocommerce .pp_details{margin:0;padding-top:1em}div.pp_woocommerce .pp_description,div.pp_woocommerce .pp_nav{font-size:14px}div.pp_woocommerce .pp_arrow_next,div.pp_woocommerce .pp_arrow_previous,div.pp_woocommerce .pp_nav,div.pp_woocommerce .pp_nav .pp_pause,div.pp_woocommerce .pp_nav p,div.pp_woocommerce .pp_play{margin:0}div.pp_woocommerce .pp_nav{margin-left:1em;position:relative}div.pp_woocommerce .pp_close{border-radius:100%;height:1em;width:1em;text-shadow:0 1px 2px rgba(0,0,0,.5);background-color:#444;color:#fff!important;font-size:16px!important;line-height:1em;-webkit-transition:all ease-in-out .2s;transition:all ease-in-out .2s;top:-.5em;left:-.5em;font-size:1.618em!important}div.pp_woocommerce .pp_close:hover{background-color:#000}div.pp_woocommerce .pp_close::before{font-family:WooCommerce;content:'\e013';display:block;position:absolute;top:0;right:0;left:0;bottom:0;text-align:center;text-indent:0}div.pp_woocommerce .pp_arrow_next,div.pp_woocommerce .pp_arrow_previous{border-radius:100%;height:1em;width:1em;text-shadow:0 1px 2px rgba(0,0,0,.5);background-color:#444;color:#fff!important;font-size:16px!important;line-height:1em;-webkit-transition:all ease-in-out .2s;transition:all ease-in-out .2s;position:relative;margin-top:-1px}div.pp_woocommerce .pp_arrow_next:hover,div.pp_woocommerce .pp_arrow_previous:hover{background-color:#000}div.pp_woocommerce .pp_arrow_next::before,div.pp_woocommerce .pp_arrow_previous::before{font-family:WooCommerce;content:'\e00b';display:block;position:absolute;top:0;right:0;left:0;bottom:0;text-align:center;text-indent:0}div.pp_woocommerce .pp_arrow_previous{margin-left:.5em}div.pp_woocommerce .pp_arrow_next{margin-right:.5em}div.pp_woocommerce .pp_arrow_next::before{content:'\e008'}div.pp_woocommerce a.pp_contract,div.pp_woocommerce a.pp_expand{border-radius:100%;height:1em;width:1em;text-shadow:0 1px 2px rgba(0,0,0,.5);background-color:#444;color:#fff!important;font-size:16px!important;line-height:1em;-webkit-transition:all ease-in-out .2s;transition:all ease-in-out .2s;left:auto;right:-.5em;top:-.5em;font-size:1.618em!important}div.pp_woocommerce a.pp_contract:hover,div.pp_woocommerce a.pp_expand:hover{background-color:#000}div.pp_woocommerce a.pp_contract::before,div.pp_woocommerce a.pp_expand::before{font-family:WooCommerce;content:'\e005';display:block;position:absolute;top:0;right:0;left:0;bottom:0;text-align:center;text-indent:0}div.pp_woocommerce a.pp_contract::before{content:'\e004'}div.pp_woocommerce #respond{margin:0;width:100%;background:0 0;border:none;padding:0}div.pp_woocommerce #respond .form-submit{margin-top:0;float:none}div.pp_woocommerce .pp_inline{padding:0!important}.rtl div.pp_woocommerce .pp_content_container{text-align:left}@media only screen and (max-width:768px){div.pp_woocommerce{right:5%!important;left:5%!important;-webkit-box-sizing:border-box;box-sizing:border-box;width:90%!important}div.pp_woocommerce .pp_contract,div.pp_woocommerce .pp_expand,div.pp_woocommerce .pp_gallery,div.pp_woocommerce .pp_next,div.pp_woocommerce .pp_previous{display:none!important}div.pp_woocommerce .pp_arrow_next,div.pp_woocommerce .pp_arrow_previous,div.pp_woocommerce .pp_close{height:44px;width:44px;font-size:44px;line-height:44px}div.pp_woocommerce .pp_arrow_next::before,div.pp_woocommerce .pp_arrow_previous::before,div.pp_woocommerce .pp_close::before{font-size:44px}div.pp_woocommerce .pp_description{display:none!important}div.pp_woocommerce .pp_details{width:100%!important}.pp_content{width:100%!important}.pp_content #pp_full_res>img{width:100%!important;height:auto!important}.currentTextHolder{line-height:3}}div.pp_pic_holder a:focus{outline:0}div.pp_overlay{background:#000;display:none;right:0;position:absolute;top:0;width:100%;z-index:9999}div.pp_pic_holder{display:none;position:absolute;width:100px;z-index:10000}.pp_top{height:20px;position:relative}* html .pp_top{padding:0 20px}.pp_top .pp_left{height:20px;right:0;position:absolute;width:20px}.pp_top .pp_middle{height:20px;right:20px;position:absolute;left:20px}* html .pp_top .pp_middle{right:0;position:static}.pp_top .pp_right{height:20px;right:auto;position:absolute;left:0;top:0;width:20px}.pp_content{height:40px;min-width:40px}* html .pp_content{width:40px}.pp_fade{display:none}.pp_content_container{position:relative;text-align:right;width:100%}.pp_content_container .pp_left{padding-right:20px}.pp_content_container .pp_right{padding-left:20px}.pp_content_container .pp_details{float:right;margin:10px 0 2px}.pp_description{display:none;margin:0}.pp_social{float:right;margin:0}.pp_social .facebook{float:right;margin-right:5px;width:55px;overflow:hidden}.pp_social .twitter{float:right}.pp_nav{clear:left;float:right;margin:3px 0 0 10px}.pp_nav p{float:right;margin:2px 4px;white-space:nowrap}.pp_nav .pp_pause,.pp_nav .pp_play{float:right;margin-left:4px;text-indent:-10000px}a.pp_arrow_next,a.pp_arrow_previous{display:block;float:right;height:15px;margin-top:3px;text-indent:-100000px;width:14px}.pp_hoverContainer{position:absolute;top:0;width:100%;z-index:2000}.pp_gallery{display:none;right:50%;margin-top:-50px;position:absolute;z-index:10000}.pp_gallery div{float:right;overflow:hidden;position:relative}.pp_gallery ul{float:right;height:35px;margin:0 5px 0 0;padding:0;position:relative;white-space:nowrap}.pp_gallery ul a{border:1px #000 solid;border:1px rgba(0,0,0,.5) solid;display:block;float:right;height:33px;overflow:hidden}.pp_gallery li.selected a,.pp_gallery ul a:hover{border-color:#fff}.pp_gallery ul a img{border:0}.pp_gallery li{display:block;float:right;margin:0 0 0 5px;padding:0}.pp_gallery li.default a{display:block;height:33px;width:50px}.pp_gallery li.default a img{display:none}.pp_gallery .pp_arrow_next,.pp_gallery .pp_arrow_previous{margin-top:7px!important}a.pp_next{display:block;float:left;height:100%;text-indent:-10000px;width:49%}a.pp_previous{display:block;float:right;height:100%;text-indent:-10000px;width:49%}a.pp_contract,a.pp_expand{cursor:pointer;display:none;height:20px;position:absolute;left:30px;text-indent:-10000px;top:10px;width:20px;z-index:20000}a.pp_close{position:absolute;left:0;top:0;display:block;text-indent:-10000px}.pp_bottom{height:20px;position:relative}* html .pp_bottom{padding:0 20px}.pp_bottom .pp_left{height:20px;right:0;position:absolute;width:20px}.pp_bottom .pp_middle{height:20px;right:20px;position:absolute;left:20px}* html .pp_bottom .pp_middle{right:0;position:static}.pp_bottom .pp_right{height:20px;right:auto;position:absolute;left:0;top:0;width:20px}.pp_loaderIcon{display:block;height:24px;right:50%;margin:-12px -12px 0 0;position:absolute;top:50%;width:24px}#pp_full_res .pp_inline{text-align:right}div.ppt{color:#fff!important;font-weight:700;display:none;font-size:17px;margin:0 15px 5px 0;z-index:9999} \ No newline at end of file +@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}div.pp_woocommerce .pp_content_container{background:#fff;border-radius:3px;box-shadow:0 1px 30px rgba(0,0,0,.25);padding:20px 0}div.pp_woocommerce .pp_content_container::after,div.pp_woocommerce .pp_content_container::before{content:' ';display:table}div.pp_woocommerce .pp_content_container::after{clear:both}div.pp_woocommerce .pp_loaderIcon::before{height:1em;width:1em;display:block;position:absolute;top:50%;right:50%;margin-right:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}div.pp_woocommerce div.ppt{color:#000}div.pp_woocommerce .pp_gallery ul li a{border:1px solid rgba(0,0,0,.5);background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.2);border-radius:2px;display:block}div.pp_woocommerce .pp_gallery ul li a:hover{border-color:#000}div.pp_woocommerce .pp_gallery ul li.selected a{border-color:#000}div.pp_woocommerce .pp_next::before,div.pp_woocommerce .pp_previous::before{border-radius:100%;height:1em;width:1em;text-shadow:0 1px 2px rgba(0,0,0,.5);background-color:#444;color:#fff!important;font-size:16px!important;line-height:1em;-webkit-transition:all ease-in-out .2s;transition:all ease-in-out .2s;font-family:WooCommerce;content:'\e00b';text-indent:0;display:none;position:absolute;top:50%;margin-top:-10px;text-align:center}div.pp_woocommerce .pp_next::before:hover,div.pp_woocommerce .pp_previous::before:hover{background-color:#000}div.pp_woocommerce .pp_next:hover::before,div.pp_woocommerce .pp_previous:hover::before{display:block}div.pp_woocommerce .pp_previous::before{right:1em}div.pp_woocommerce .pp_next::before{left:1em;font-family:WooCommerce;content:'\e008'}div.pp_woocommerce .pp_details{margin:0;padding-top:1em}div.pp_woocommerce .pp_description,div.pp_woocommerce .pp_nav{font-size:14px}div.pp_woocommerce .pp_arrow_next,div.pp_woocommerce .pp_arrow_previous,div.pp_woocommerce .pp_nav,div.pp_woocommerce .pp_nav .pp_pause,div.pp_woocommerce .pp_nav p,div.pp_woocommerce .pp_play{margin:0}div.pp_woocommerce .pp_nav{margin-left:1em;position:relative}div.pp_woocommerce .pp_close{border-radius:100%;height:1em;width:1em;text-shadow:0 1px 2px rgba(0,0,0,.5);background-color:#444;color:#fff!important;font-size:16px!important;line-height:1em;-webkit-transition:all ease-in-out .2s;transition:all ease-in-out .2s;top:-.5em;left:-.5em;font-size:1.618em!important}div.pp_woocommerce .pp_close:hover{background-color:#000}div.pp_woocommerce .pp_close::before{font-family:WooCommerce;content:'\e013';display:block;position:absolute;top:0;right:0;left:0;bottom:0;text-align:center;text-indent:0}div.pp_woocommerce .pp_arrow_next,div.pp_woocommerce .pp_arrow_previous{border-radius:100%;height:1em;width:1em;text-shadow:0 1px 2px rgba(0,0,0,.5);background-color:#444;color:#fff!important;font-size:16px!important;line-height:1em;-webkit-transition:all ease-in-out .2s;transition:all ease-in-out .2s;position:relative;margin-top:-1px}div.pp_woocommerce .pp_arrow_next:hover,div.pp_woocommerce .pp_arrow_previous:hover{background-color:#000}div.pp_woocommerce .pp_arrow_next::before,div.pp_woocommerce .pp_arrow_previous::before{font-family:WooCommerce;content:'\e00b';display:block;position:absolute;top:0;right:0;left:0;bottom:0;text-align:center;text-indent:0}div.pp_woocommerce .pp_arrow_previous{margin-left:.5em}div.pp_woocommerce .pp_arrow_next{margin-right:.5em}div.pp_woocommerce .pp_arrow_next::before{content:'\e008'}div.pp_woocommerce a.pp_contract,div.pp_woocommerce a.pp_expand{border-radius:100%;height:1em;width:1em;text-shadow:0 1px 2px rgba(0,0,0,.5);background-color:#444;color:#fff!important;font-size:16px!important;line-height:1em;-webkit-transition:all ease-in-out .2s;transition:all ease-in-out .2s;left:auto;right:-.5em;top:-.5em;font-size:1.618em!important}div.pp_woocommerce a.pp_contract:hover,div.pp_woocommerce a.pp_expand:hover{background-color:#000}div.pp_woocommerce a.pp_contract::before,div.pp_woocommerce a.pp_expand::before{font-family:WooCommerce;content:'\e005';display:block;position:absolute;top:0;right:0;left:0;bottom:0;text-align:center;text-indent:0}div.pp_woocommerce a.pp_contract::before{content:'\e004'}div.pp_woocommerce #respond{margin:0;width:100%;background:0 0;border:none;padding:0}div.pp_woocommerce #respond .form-submit{margin-top:0;float:none}div.pp_woocommerce .pp_inline{padding:0!important}.rtl div.pp_woocommerce .pp_content_container{text-align:left}@media only screen and (max-width:768px){div.pp_woocommerce{right:5%!important;left:5%!important;box-sizing:border-box;width:90%!important}div.pp_woocommerce .pp_contract,div.pp_woocommerce .pp_expand,div.pp_woocommerce .pp_gallery,div.pp_woocommerce .pp_next,div.pp_woocommerce .pp_previous{display:none!important}div.pp_woocommerce .pp_arrow_next,div.pp_woocommerce .pp_arrow_previous,div.pp_woocommerce .pp_close{height:44px;width:44px;font-size:44px;line-height:44px}div.pp_woocommerce .pp_arrow_next::before,div.pp_woocommerce .pp_arrow_previous::before,div.pp_woocommerce .pp_close::before{font-size:44px}div.pp_woocommerce .pp_description{display:none!important}div.pp_woocommerce .pp_details{width:100%!important}.pp_content{width:100%!important}.pp_content #pp_full_res>img{width:100%!important;height:auto!important}.currentTextHolder{line-height:3}}div.pp_pic_holder a:focus{outline:0}div.pp_overlay{background:#000;display:none;right:0;position:absolute;top:0;width:100%;z-index:9999}div.pp_pic_holder{display:none;position:absolute;width:100px;z-index:10000}.pp_top{height:20px;position:relative}* html .pp_top{padding:0 20px}.pp_top .pp_left{height:20px;right:0;position:absolute;width:20px}.pp_top .pp_middle{height:20px;right:20px;position:absolute;left:20px}* html .pp_top .pp_middle{right:0;position:static}.pp_top .pp_right{height:20px;right:auto;position:absolute;left:0;top:0;width:20px}.pp_content{height:40px;min-width:40px}* html .pp_content{width:40px}.pp_fade{display:none}.pp_content_container{position:relative;text-align:right;width:100%}.pp_content_container .pp_left{padding-right:20px}.pp_content_container .pp_right{padding-left:20px}.pp_content_container .pp_details{float:right;margin:10px 0 2px}.pp_description{display:none;margin:0}.pp_social{float:right;margin:0}.pp_social .facebook{float:right;margin-right:5px;width:55px;overflow:hidden}.pp_social .twitter{float:right}.pp_nav{clear:left;float:right;margin:3px 0 0 10px}.pp_nav p{float:right;margin:2px 4px;white-space:nowrap}.pp_nav .pp_pause,.pp_nav .pp_play{float:right;margin-left:4px;text-indent:-10000px}a.pp_arrow_next,a.pp_arrow_previous{display:block;float:right;height:15px;margin-top:3px;text-indent:-100000px;width:14px}.pp_hoverContainer{position:absolute;top:0;width:100%;z-index:2000}.pp_gallery{display:none;right:50%;margin-top:-50px;position:absolute;z-index:10000}.pp_gallery div{float:right;overflow:hidden;position:relative}.pp_gallery ul{float:right;height:35px;margin:0 5px 0 0;padding:0;position:relative;white-space:nowrap}.pp_gallery ul a{border:1px #000 solid;border:1px rgba(0,0,0,.5) solid;display:block;float:right;height:33px;overflow:hidden}.pp_gallery li.selected a,.pp_gallery ul a:hover{border-color:#fff}.pp_gallery ul a img{border:0}.pp_gallery li{display:block;float:right;margin:0 0 0 5px;padding:0}.pp_gallery li.default a{display:block;height:33px;width:50px}.pp_gallery li.default a img{display:none}.pp_gallery .pp_arrow_next,.pp_gallery .pp_arrow_previous{margin-top:7px!important}a.pp_next{display:block;float:left;height:100%;text-indent:-10000px;width:49%}a.pp_previous{display:block;float:right;height:100%;text-indent:-10000px;width:49%}a.pp_contract,a.pp_expand{cursor:pointer;display:none;height:20px;position:absolute;left:30px;text-indent:-10000px;top:10px;width:20px;z-index:20000}a.pp_close{position:absolute;left:0;top:0;display:block;text-indent:-10000px}.pp_bottom{height:20px;position:relative}* html .pp_bottom{padding:0 20px}.pp_bottom .pp_left{height:20px;right:0;position:absolute;width:20px}.pp_bottom .pp_middle{height:20px;right:20px;position:absolute;left:20px}* html .pp_bottom .pp_middle{right:0;position:static}.pp_bottom .pp_right{height:20px;right:auto;position:absolute;left:0;top:0;width:20px}.pp_loaderIcon{display:block;height:24px;right:50%;margin:-12px -12px 0 0;position:absolute;top:50%;width:24px}#pp_full_res .pp_inline{text-align:right}div.ppt{color:#fff!important;font-weight:700;display:none;font-size:17px;margin:0 15px 5px 0;z-index:9999} \ No newline at end of file diff --git a/assets/css/prettyPhoto.css b/assets/css/prettyPhoto.css index 1e62176c847..15a7f6d4875 100644 --- a/assets/css/prettyPhoto.css +++ b/assets/css/prettyPhoto.css @@ -1 +1 @@ -@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}div.pp_woocommerce .pp_content_container{background:#fff;border-radius:3px;-webkit-box-shadow:0 1px 30px rgba(0,0,0,.25);box-shadow:0 1px 30px rgba(0,0,0,.25);padding:20px 0}div.pp_woocommerce .pp_content_container::after,div.pp_woocommerce .pp_content_container::before{content:' ';display:table}div.pp_woocommerce .pp_content_container::after{clear:both}div.pp_woocommerce .pp_loaderIcon::before{height:1em;width:1em;display:block;position:absolute;top:50%;left:50%;margin-left:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}div.pp_woocommerce div.ppt{color:#000}div.pp_woocommerce .pp_gallery ul li a{border:1px solid rgba(0,0,0,.5);background:#fff;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.2);box-shadow:0 1px 2px rgba(0,0,0,.2);border-radius:2px;display:block}div.pp_woocommerce .pp_gallery ul li a:hover{border-color:#000}div.pp_woocommerce .pp_gallery ul li.selected a{border-color:#000}div.pp_woocommerce .pp_next::before,div.pp_woocommerce .pp_previous::before{border-radius:100%;height:1em;width:1em;text-shadow:0 1px 2px rgba(0,0,0,.5);background-color:#444;color:#fff!important;font-size:16px!important;line-height:1em;-webkit-transition:all ease-in-out .2s;transition:all ease-in-out .2s;font-family:WooCommerce;content:'\e00b';text-indent:0;display:none;position:absolute;top:50%;margin-top:-10px;text-align:center}div.pp_woocommerce .pp_next::before:hover,div.pp_woocommerce .pp_previous::before:hover{background-color:#000}div.pp_woocommerce .pp_next:hover::before,div.pp_woocommerce .pp_previous:hover::before{display:block}div.pp_woocommerce .pp_previous::before{left:1em}div.pp_woocommerce .pp_next::before{right:1em;font-family:WooCommerce;content:'\e008'}div.pp_woocommerce .pp_details{margin:0;padding-top:1em}div.pp_woocommerce .pp_description,div.pp_woocommerce .pp_nav{font-size:14px}div.pp_woocommerce .pp_arrow_next,div.pp_woocommerce .pp_arrow_previous,div.pp_woocommerce .pp_nav,div.pp_woocommerce .pp_nav .pp_pause,div.pp_woocommerce .pp_nav p,div.pp_woocommerce .pp_play{margin:0}div.pp_woocommerce .pp_nav{margin-right:1em;position:relative}div.pp_woocommerce .pp_close{border-radius:100%;height:1em;width:1em;text-shadow:0 1px 2px rgba(0,0,0,.5);background-color:#444;color:#fff!important;font-size:16px!important;line-height:1em;-webkit-transition:all ease-in-out .2s;transition:all ease-in-out .2s;top:-.5em;right:-.5em;font-size:1.618em!important}div.pp_woocommerce .pp_close:hover{background-color:#000}div.pp_woocommerce .pp_close::before{font-family:WooCommerce;content:'\e013';display:block;position:absolute;top:0;left:0;right:0;bottom:0;text-align:center;text-indent:0}div.pp_woocommerce .pp_arrow_next,div.pp_woocommerce .pp_arrow_previous{border-radius:100%;height:1em;width:1em;text-shadow:0 1px 2px rgba(0,0,0,.5);background-color:#444;color:#fff!important;font-size:16px!important;line-height:1em;-webkit-transition:all ease-in-out .2s;transition:all ease-in-out .2s;position:relative;margin-top:-1px}div.pp_woocommerce .pp_arrow_next:hover,div.pp_woocommerce .pp_arrow_previous:hover{background-color:#000}div.pp_woocommerce .pp_arrow_next::before,div.pp_woocommerce .pp_arrow_previous::before{font-family:WooCommerce;content:'\e00b';display:block;position:absolute;top:0;left:0;right:0;bottom:0;text-align:center;text-indent:0}div.pp_woocommerce .pp_arrow_previous{margin-right:.5em}div.pp_woocommerce .pp_arrow_next{margin-left:.5em}div.pp_woocommerce .pp_arrow_next::before{content:'\e008'}div.pp_woocommerce a.pp_contract,div.pp_woocommerce a.pp_expand{border-radius:100%;height:1em;width:1em;text-shadow:0 1px 2px rgba(0,0,0,.5);background-color:#444;color:#fff!important;font-size:16px!important;line-height:1em;-webkit-transition:all ease-in-out .2s;transition:all ease-in-out .2s;right:auto;left:-.5em;top:-.5em;font-size:1.618em!important}div.pp_woocommerce a.pp_contract:hover,div.pp_woocommerce a.pp_expand:hover{background-color:#000}div.pp_woocommerce a.pp_contract::before,div.pp_woocommerce a.pp_expand::before{font-family:WooCommerce;content:'\e005';display:block;position:absolute;top:0;left:0;right:0;bottom:0;text-align:center;text-indent:0}div.pp_woocommerce a.pp_contract::before{content:'\e004'}div.pp_woocommerce #respond{margin:0;width:100%;background:0 0;border:none;padding:0}div.pp_woocommerce #respond .form-submit{margin-top:0;float:none}div.pp_woocommerce .pp_inline{padding:0!important}.rtl div.pp_woocommerce .pp_content_container{text-align:right}@media only screen and (max-width:768px){div.pp_woocommerce{left:5%!important;right:5%!important;-webkit-box-sizing:border-box;box-sizing:border-box;width:90%!important}div.pp_woocommerce .pp_contract,div.pp_woocommerce .pp_expand,div.pp_woocommerce .pp_gallery,div.pp_woocommerce .pp_next,div.pp_woocommerce .pp_previous{display:none!important}div.pp_woocommerce .pp_arrow_next,div.pp_woocommerce .pp_arrow_previous,div.pp_woocommerce .pp_close{height:44px;width:44px;font-size:44px;line-height:44px}div.pp_woocommerce .pp_arrow_next::before,div.pp_woocommerce .pp_arrow_previous::before,div.pp_woocommerce .pp_close::before{font-size:44px}div.pp_woocommerce .pp_description{display:none!important}div.pp_woocommerce .pp_details{width:100%!important}.pp_content{width:100%!important}.pp_content #pp_full_res>img{width:100%!important;height:auto!important}.currentTextHolder{line-height:3}}div.pp_pic_holder a:focus{outline:0}div.pp_overlay{background:#000;display:none;left:0;position:absolute;top:0;width:100%;z-index:9999}div.pp_pic_holder{display:none;position:absolute;width:100px;z-index:10000}.pp_top{height:20px;position:relative}* html .pp_top{padding:0 20px}.pp_top .pp_left{height:20px;left:0;position:absolute;width:20px}.pp_top .pp_middle{height:20px;left:20px;position:absolute;right:20px}* html .pp_top .pp_middle{left:0;position:static}.pp_top .pp_right{height:20px;left:auto;position:absolute;right:0;top:0;width:20px}.pp_content{height:40px;min-width:40px}* html .pp_content{width:40px}.pp_fade{display:none}.pp_content_container{position:relative;text-align:left;width:100%}.pp_content_container .pp_left{padding-left:20px}.pp_content_container .pp_right{padding-right:20px}.pp_content_container .pp_details{float:left;margin:10px 0 2px}.pp_description{display:none;margin:0}.pp_social{float:left;margin:0}.pp_social .facebook{float:left;margin-left:5px;width:55px;overflow:hidden}.pp_social .twitter{float:left}.pp_nav{clear:right;float:left;margin:3px 10px 0 0}.pp_nav p{float:left;margin:2px 4px;white-space:nowrap}.pp_nav .pp_pause,.pp_nav .pp_play{float:left;margin-right:4px;text-indent:-10000px}a.pp_arrow_next,a.pp_arrow_previous{display:block;float:left;height:15px;margin-top:3px;text-indent:-100000px;width:14px}.pp_hoverContainer{position:absolute;top:0;width:100%;z-index:2000}.pp_gallery{display:none;left:50%;margin-top:-50px;position:absolute;z-index:10000}.pp_gallery div{float:left;overflow:hidden;position:relative}.pp_gallery ul{float:left;height:35px;margin:0 0 0 5px;padding:0;position:relative;white-space:nowrap}.pp_gallery ul a{border:1px #000 solid;border:1px rgba(0,0,0,.5) solid;display:block;float:left;height:33px;overflow:hidden}.pp_gallery li.selected a,.pp_gallery ul a:hover{border-color:#fff}.pp_gallery ul a img{border:0}.pp_gallery li{display:block;float:left;margin:0 5px 0 0;padding:0}.pp_gallery li.default a{display:block;height:33px;width:50px}.pp_gallery li.default a img{display:none}.pp_gallery .pp_arrow_next,.pp_gallery .pp_arrow_previous{margin-top:7px!important}a.pp_next{display:block;float:right;height:100%;text-indent:-10000px;width:49%}a.pp_previous{display:block;float:left;height:100%;text-indent:-10000px;width:49%}a.pp_contract,a.pp_expand{cursor:pointer;display:none;height:20px;position:absolute;right:30px;text-indent:-10000px;top:10px;width:20px;z-index:20000}a.pp_close{position:absolute;right:0;top:0;display:block;text-indent:-10000px}.pp_bottom{height:20px;position:relative}* html .pp_bottom{padding:0 20px}.pp_bottom .pp_left{height:20px;left:0;position:absolute;width:20px}.pp_bottom .pp_middle{height:20px;left:20px;position:absolute;right:20px}* html .pp_bottom .pp_middle{left:0;position:static}.pp_bottom .pp_right{height:20px;left:auto;position:absolute;right:0;top:0;width:20px}.pp_loaderIcon{display:block;height:24px;left:50%;margin:-12px 0 0 -12px;position:absolute;top:50%;width:24px}#pp_full_res .pp_inline{text-align:left}div.ppt{color:#fff!important;font-weight:700;display:none;font-size:17px;margin:0 0 5px 15px;z-index:9999} \ No newline at end of file +@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}div.pp_woocommerce .pp_content_container{background:#fff;border-radius:3px;box-shadow:0 1px 30px rgba(0,0,0,.25);padding:20px 0}div.pp_woocommerce .pp_content_container::after,div.pp_woocommerce .pp_content_container::before{content:' ';display:table}div.pp_woocommerce .pp_content_container::after{clear:both}div.pp_woocommerce .pp_loaderIcon::before{height:1em;width:1em;display:block;position:absolute;top:50%;left:50%;margin-left:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}div.pp_woocommerce div.ppt{color:#000}div.pp_woocommerce .pp_gallery ul li a{border:1px solid rgba(0,0,0,.5);background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.2);border-radius:2px;display:block}div.pp_woocommerce .pp_gallery ul li a:hover{border-color:#000}div.pp_woocommerce .pp_gallery ul li.selected a{border-color:#000}div.pp_woocommerce .pp_next::before,div.pp_woocommerce .pp_previous::before{border-radius:100%;height:1em;width:1em;text-shadow:0 1px 2px rgba(0,0,0,.5);background-color:#444;color:#fff!important;font-size:16px!important;line-height:1em;-webkit-transition:all ease-in-out .2s;transition:all ease-in-out .2s;font-family:WooCommerce;content:'\e00b';text-indent:0;display:none;position:absolute;top:50%;margin-top:-10px;text-align:center}div.pp_woocommerce .pp_next::before:hover,div.pp_woocommerce .pp_previous::before:hover{background-color:#000}div.pp_woocommerce .pp_next:hover::before,div.pp_woocommerce .pp_previous:hover::before{display:block}div.pp_woocommerce .pp_previous::before{left:1em}div.pp_woocommerce .pp_next::before{right:1em;font-family:WooCommerce;content:'\e008'}div.pp_woocommerce .pp_details{margin:0;padding-top:1em}div.pp_woocommerce .pp_description,div.pp_woocommerce .pp_nav{font-size:14px}div.pp_woocommerce .pp_arrow_next,div.pp_woocommerce .pp_arrow_previous,div.pp_woocommerce .pp_nav,div.pp_woocommerce .pp_nav .pp_pause,div.pp_woocommerce .pp_nav p,div.pp_woocommerce .pp_play{margin:0}div.pp_woocommerce .pp_nav{margin-right:1em;position:relative}div.pp_woocommerce .pp_close{border-radius:100%;height:1em;width:1em;text-shadow:0 1px 2px rgba(0,0,0,.5);background-color:#444;color:#fff!important;font-size:16px!important;line-height:1em;-webkit-transition:all ease-in-out .2s;transition:all ease-in-out .2s;top:-.5em;right:-.5em;font-size:1.618em!important}div.pp_woocommerce .pp_close:hover{background-color:#000}div.pp_woocommerce .pp_close::before{font-family:WooCommerce;content:'\e013';display:block;position:absolute;top:0;left:0;right:0;bottom:0;text-align:center;text-indent:0}div.pp_woocommerce .pp_arrow_next,div.pp_woocommerce .pp_arrow_previous{border-radius:100%;height:1em;width:1em;text-shadow:0 1px 2px rgba(0,0,0,.5);background-color:#444;color:#fff!important;font-size:16px!important;line-height:1em;-webkit-transition:all ease-in-out .2s;transition:all ease-in-out .2s;position:relative;margin-top:-1px}div.pp_woocommerce .pp_arrow_next:hover,div.pp_woocommerce .pp_arrow_previous:hover{background-color:#000}div.pp_woocommerce .pp_arrow_next::before,div.pp_woocommerce .pp_arrow_previous::before{font-family:WooCommerce;content:'\e00b';display:block;position:absolute;top:0;left:0;right:0;bottom:0;text-align:center;text-indent:0}div.pp_woocommerce .pp_arrow_previous{margin-right:.5em}div.pp_woocommerce .pp_arrow_next{margin-left:.5em}div.pp_woocommerce .pp_arrow_next::before{content:'\e008'}div.pp_woocommerce a.pp_contract,div.pp_woocommerce a.pp_expand{border-radius:100%;height:1em;width:1em;text-shadow:0 1px 2px rgba(0,0,0,.5);background-color:#444;color:#fff!important;font-size:16px!important;line-height:1em;-webkit-transition:all ease-in-out .2s;transition:all ease-in-out .2s;right:auto;left:-.5em;top:-.5em;font-size:1.618em!important}div.pp_woocommerce a.pp_contract:hover,div.pp_woocommerce a.pp_expand:hover{background-color:#000}div.pp_woocommerce a.pp_contract::before,div.pp_woocommerce a.pp_expand::before{font-family:WooCommerce;content:'\e005';display:block;position:absolute;top:0;left:0;right:0;bottom:0;text-align:center;text-indent:0}div.pp_woocommerce a.pp_contract::before{content:'\e004'}div.pp_woocommerce #respond{margin:0;width:100%;background:0 0;border:none;padding:0}div.pp_woocommerce #respond .form-submit{margin-top:0;float:none}div.pp_woocommerce .pp_inline{padding:0!important}.rtl div.pp_woocommerce .pp_content_container{text-align:right}@media only screen and (max-width:768px){div.pp_woocommerce{left:5%!important;right:5%!important;box-sizing:border-box;width:90%!important}div.pp_woocommerce .pp_contract,div.pp_woocommerce .pp_expand,div.pp_woocommerce .pp_gallery,div.pp_woocommerce .pp_next,div.pp_woocommerce .pp_previous{display:none!important}div.pp_woocommerce .pp_arrow_next,div.pp_woocommerce .pp_arrow_previous,div.pp_woocommerce .pp_close{height:44px;width:44px;font-size:44px;line-height:44px}div.pp_woocommerce .pp_arrow_next::before,div.pp_woocommerce .pp_arrow_previous::before,div.pp_woocommerce .pp_close::before{font-size:44px}div.pp_woocommerce .pp_description{display:none!important}div.pp_woocommerce .pp_details{width:100%!important}.pp_content{width:100%!important}.pp_content #pp_full_res>img{width:100%!important;height:auto!important}.currentTextHolder{line-height:3}}div.pp_pic_holder a:focus{outline:0}div.pp_overlay{background:#000;display:none;left:0;position:absolute;top:0;width:100%;z-index:9999}div.pp_pic_holder{display:none;position:absolute;width:100px;z-index:10000}.pp_top{height:20px;position:relative}* html .pp_top{padding:0 20px}.pp_top .pp_left{height:20px;left:0;position:absolute;width:20px}.pp_top .pp_middle{height:20px;left:20px;position:absolute;right:20px}* html .pp_top .pp_middle{left:0;position:static}.pp_top .pp_right{height:20px;left:auto;position:absolute;right:0;top:0;width:20px}.pp_content{height:40px;min-width:40px}* html .pp_content{width:40px}.pp_fade{display:none}.pp_content_container{position:relative;text-align:left;width:100%}.pp_content_container .pp_left{padding-left:20px}.pp_content_container .pp_right{padding-right:20px}.pp_content_container .pp_details{float:left;margin:10px 0 2px}.pp_description{display:none;margin:0}.pp_social{float:left;margin:0}.pp_social .facebook{float:left;margin-left:5px;width:55px;overflow:hidden}.pp_social .twitter{float:left}.pp_nav{clear:right;float:left;margin:3px 10px 0 0}.pp_nav p{float:left;margin:2px 4px;white-space:nowrap}.pp_nav .pp_pause,.pp_nav .pp_play{float:left;margin-right:4px;text-indent:-10000px}a.pp_arrow_next,a.pp_arrow_previous{display:block;float:left;height:15px;margin-top:3px;text-indent:-100000px;width:14px}.pp_hoverContainer{position:absolute;top:0;width:100%;z-index:2000}.pp_gallery{display:none;left:50%;margin-top:-50px;position:absolute;z-index:10000}.pp_gallery div{float:left;overflow:hidden;position:relative}.pp_gallery ul{float:left;height:35px;margin:0 0 0 5px;padding:0;position:relative;white-space:nowrap}.pp_gallery ul a{border:1px #000 solid;border:1px rgba(0,0,0,.5) solid;display:block;float:left;height:33px;overflow:hidden}.pp_gallery li.selected a,.pp_gallery ul a:hover{border-color:#fff}.pp_gallery ul a img{border:0}.pp_gallery li{display:block;float:left;margin:0 5px 0 0;padding:0}.pp_gallery li.default a{display:block;height:33px;width:50px}.pp_gallery li.default a img{display:none}.pp_gallery .pp_arrow_next,.pp_gallery .pp_arrow_previous{margin-top:7px!important}a.pp_next{display:block;float:right;height:100%;text-indent:-10000px;width:49%}a.pp_previous{display:block;float:left;height:100%;text-indent:-10000px;width:49%}a.pp_contract,a.pp_expand{cursor:pointer;display:none;height:20px;position:absolute;right:30px;text-indent:-10000px;top:10px;width:20px;z-index:20000}a.pp_close{position:absolute;right:0;top:0;display:block;text-indent:-10000px}.pp_bottom{height:20px;position:relative}* html .pp_bottom{padding:0 20px}.pp_bottom .pp_left{height:20px;left:0;position:absolute;width:20px}.pp_bottom .pp_middle{height:20px;left:20px;position:absolute;right:20px}* html .pp_bottom .pp_middle{left:0;position:static}.pp_bottom .pp_right{height:20px;left:auto;position:absolute;right:0;top:0;width:20px}.pp_loaderIcon{display:block;height:24px;left:50%;margin:-12px 0 0 -12px;position:absolute;top:50%;width:24px}#pp_full_res .pp_inline{text-align:left}div.ppt{color:#fff!important;font-weight:700;display:none;font-size:17px;margin:0 0 5px 15px;z-index:9999} \ No newline at end of file diff --git a/assets/css/reports-print-rtl.css b/assets/css/reports-print-rtl.css index 3c8f99f3321..ea509ae6a2e 100644 --- a/assets/css/reports-print-rtl.css +++ b/assets/css/reports-print-rtl.css @@ -1 +1 @@ -*{background:0 0!important;color:#000!important;text-shadow:none!important;-webkit-filter:none!important;filter:none!important;-ms-filter:none!important;font-size:9pt!important;opacity:1;-webkit-transition:none!important;transition:none!important}@page{margin:.5cm}#adminmenuback,#adminmenuwrap,#screen-meta-links,#wpadminbar,#wpfooter,.update-nag,.updated,.woo-nav-tab-wrapper,.woocommerce-reports-wide .button,.woocommerce-reports-wide .postbox h3.stats_range .export_csv,.woocommerce-reports-wrap .postbox h3.stats_range .export_csv{display:none}h2 .nav-tab{line-height:14px}.woocommerce-reports-wide .postbox h3.stats_range ul li a,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom,.woocommerce-reports-wrap .postbox h3.stats_range ul li a,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom{padding:5px;line-height:14px}#wpcontent{margin-right:0}.woocommerce-reports-wide .postbox .chart-with-sidebar .chart-sidebar,.woocommerce-reports-wrap .postbox .chart-with-sidebar .chart-sidebar{margin-right:-130px;width:130px;display:block}.woocommerce-reports-wide .postbox .chart-with-sidebar,.woocommerce-reports-wrap .postbox .chart-with-sidebar{padding-right:130px}.chart-legend{overflow:hidden;zoom:1}.chart-legend li{padding:.25em .5em!important;-webkit-box-shadow:none!important;box-shadow:none!important;border-bottom:1px solid gray!important} \ No newline at end of file +*{background:0 0!important;color:#000!important;text-shadow:none!important;-webkit-filter:none!important;filter:none!important;-ms-filter:none!important;font-size:9pt!important;opacity:1;-webkit-transition:none!important;transition:none!important}@page{margin:.5cm}#adminmenuback,#adminmenuwrap,#screen-meta-links,#wpadminbar,#wpfooter,.update-nag,.updated,.woo-nav-tab-wrapper,.woocommerce-reports-wide .button,.woocommerce-reports-wide .postbox h3.stats_range .export_csv,.woocommerce-reports-wrap .postbox h3.stats_range .export_csv{display:none}h2 .nav-tab{line-height:14px}.woocommerce-reports-wide .postbox h3.stats_range ul li a,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom,.woocommerce-reports-wrap .postbox h3.stats_range ul li a,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom{padding:5px;line-height:14px}#wpcontent{margin-right:0}.woocommerce-reports-wide .postbox .chart-with-sidebar .chart-sidebar,.woocommerce-reports-wrap .postbox .chart-with-sidebar .chart-sidebar{margin-right:-130px;width:130px;display:block}.woocommerce-reports-wide .postbox .chart-with-sidebar,.woocommerce-reports-wrap .postbox .chart-with-sidebar{padding-right:130px}.chart-legend{overflow:hidden;zoom:1}.chart-legend li{padding:.25em .5em!important;box-shadow:none!important;border-bottom:1px solid gray!important} \ No newline at end of file diff --git a/assets/css/reports-print.css b/assets/css/reports-print.css index da9ed33ce10..afc9abe8b55 100644 --- a/assets/css/reports-print.css +++ b/assets/css/reports-print.css @@ -1 +1 @@ -*{background:0 0!important;color:#000!important;text-shadow:none!important;-webkit-filter:none!important;filter:none!important;-ms-filter:none!important;font-size:9pt!important;opacity:1;-webkit-transition:none!important;transition:none!important}@page{margin:.5cm}#adminmenuback,#adminmenuwrap,#screen-meta-links,#wpadminbar,#wpfooter,.update-nag,.updated,.woo-nav-tab-wrapper,.woocommerce-reports-wide .button,.woocommerce-reports-wide .postbox h3.stats_range .export_csv,.woocommerce-reports-wrap .postbox h3.stats_range .export_csv{display:none}h2 .nav-tab{line-height:14px}.woocommerce-reports-wide .postbox h3.stats_range ul li a,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom,.woocommerce-reports-wrap .postbox h3.stats_range ul li a,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom{padding:5px;line-height:14px}#wpcontent{margin-left:0}.woocommerce-reports-wide .postbox .chart-with-sidebar .chart-sidebar,.woocommerce-reports-wrap .postbox .chart-with-sidebar .chart-sidebar{margin-left:-130px;width:130px;display:block}.woocommerce-reports-wide .postbox .chart-with-sidebar,.woocommerce-reports-wrap .postbox .chart-with-sidebar{padding-left:130px}.chart-legend{overflow:hidden;zoom:1}.chart-legend li{padding:.25em .5em!important;-webkit-box-shadow:none!important;box-shadow:none!important;border-bottom:1px solid gray!important} \ No newline at end of file +*{background:0 0!important;color:#000!important;text-shadow:none!important;-webkit-filter:none!important;filter:none!important;-ms-filter:none!important;font-size:9pt!important;opacity:1;-webkit-transition:none!important;transition:none!important}@page{margin:.5cm}#adminmenuback,#adminmenuwrap,#screen-meta-links,#wpadminbar,#wpfooter,.update-nag,.updated,.woo-nav-tab-wrapper,.woocommerce-reports-wide .button,.woocommerce-reports-wide .postbox h3.stats_range .export_csv,.woocommerce-reports-wrap .postbox h3.stats_range .export_csv{display:none}h2 .nav-tab{line-height:14px}.woocommerce-reports-wide .postbox h3.stats_range ul li a,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom,.woocommerce-reports-wrap .postbox h3.stats_range ul li a,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom{padding:5px;line-height:14px}#wpcontent{margin-left:0}.woocommerce-reports-wide .postbox .chart-with-sidebar .chart-sidebar,.woocommerce-reports-wrap .postbox .chart-with-sidebar .chart-sidebar{margin-left:-130px;width:130px;display:block}.woocommerce-reports-wide .postbox .chart-with-sidebar,.woocommerce-reports-wrap .postbox .chart-with-sidebar{padding-left:130px}.chart-legend{overflow:hidden;zoom:1}.chart-legend li{padding:.25em .5em!important;box-shadow:none!important;border-bottom:1px solid gray!important} \ No newline at end of file diff --git a/assets/css/select2.css b/assets/css/select2.css index c0add7a646e..1df4ad686e9 100644 --- a/assets/css/select2.css +++ b/assets/css/select2.css @@ -1 +1 @@ -.select2-container{-webkit-box-sizing:border-box;box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer;display:block;height:28px;margin:0 0 -4px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer;display:block;min-height:32px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left;padding:0}.select2-container .select2-search--inline .select2-search__field{-webkit-box-sizing:border-box;box-sizing:border-box;border:none;font-size:100%;margin:0;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border:1px solid #aaa;border-radius:4px;-webkit-box-sizing:border-box;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected],.select2-results__option[data-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{-webkit-box-sizing:border-box;box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none;margin:5px 5px 0 0}.select2-container--default .select2-selection--multiple .select2-selection__rendered li:before{content:'';display:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid #000 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:0 0;border:none;outline:0;-webkit-box-shadow:none;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true],.select2-container--default .select2-results__option[data-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected],.select2-container--default .select2-results__option--highlighted[data-selected]{background-color:#0073aa;color:#fff}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(50%,#fff),to(#eee));background-image:-webkit-linear-gradient(top,#fff 50%,#eee 100%);background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single:focus{border:1px solid #0073aa}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(50%,#eee),to(#ccc));background-image:-webkit-linear-gradient(top,#eee 50%,#ccc 100%);background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #0073aa}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:0 0;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-gradient(linear,left top,left bottom,from(white),color-stop(50%,#eee));background-image:-webkit-linear-gradient(top,#fff 0,#eee 50%);background-image:linear-gradient(to bottom,#fff 0,#eee 50%);background-repeat:repeat-x}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(50%,#eee),to(white));background-image:-webkit-linear-gradient(top,#eee 50%,#fff 100%);background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #0073aa}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #0073aa}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;-webkit-box-shadow:none;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected],.select2-container--classic .select2-results__option--highlighted[data-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#0073aa} \ No newline at end of file +.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;margin:0 0 -4px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left;padding:0}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin:0;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected],.select2-results__option[data-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none;margin:5px 5px 0 0}.select2-container--default .select2-selection--multiple .select2-selection__rendered li:before{content:'';display:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid #000 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:0 0;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true],.select2-container--default .select2-results__option[data-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected],.select2-container--default .select2-results__option--highlighted[data-selected]{background-color:#0073aa;color:#fff}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top,#fff 50%,#eee 100%);background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single:focus{border:1px solid #0073aa}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top,#eee 50%,#ccc 100%);background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #0073aa}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:0 0;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top,#fff 0,#eee 50%);background-image:linear-gradient(to bottom,#fff 0,#eee 50%);background-repeat:repeat-x}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top,#eee 50%,#fff 100%);background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #0073aa}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #0073aa}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected],.select2-container--classic .select2-results__option--highlighted[data-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#0073aa} \ No newline at end of file diff --git a/assets/css/twenty-seventeen-rtl.css b/assets/css/twenty-seventeen-rtl.css index d1c7b3b2d85..2efbe340f22 100644 --- a/assets/css/twenty-seventeen-rtl.css +++ b/assets/css/twenty-seventeen-rtl.css @@ -1 +1 @@ -@charset "UTF-8";@-webkit-keyframes spin{100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}@keyframes spin{100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}.woocommerce .blockUI.blockOverlay{position:relative}.woocommerce .blockUI.blockOverlay::before{height:1em;width:1em;display:block;position:absolute;top:50%;right:50%;margin-right:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.woocommerce .loader::before{height:1em;width:1em;display:block;position:absolute;top:50%;right:50%;margin-right:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.woocommerce form .form-row .required{color:#b22222;text-decoration:none;visibility:hidden}.woocommerce form .form-row .required[title]{border:0!important}.woocommerce form .form-row .optional{visibility:visible}.woocommerce-breadcrumb{padding-bottom:2em;margin-bottom:4em;border-bottom:1px solid #eee;font-size:13px;font-size:.8125rem}.woocommerce-breadcrumb a{-webkit-box-shadow:0 1px 0 #0f0f0f;box-shadow:0 1px 0 #0f0f0f;-webkit-transition:-webkit-box-shadow ease-in-out 130ms;transition:-webkit-box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms,-webkit-box-shadow ease-in-out 130ms}.woocommerce-breadcrumb a:hover{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.woocommerce-pagination{padding-top:2em;margin-top:4em;border-top:1px solid #eee;font-size:13px;font-size:.8125rem}.woocommerce-pagination ul.page-numbers{padding:0;display:block}.woocommerce-pagination .next.page-numbers,.woocommerce-pagination .prev.page-numbers,.woocommerce-pagination a.page-numbers,.woocommerce-pagination span.page-numbers{padding:.5em 1em;background:#ddd;display:inline-block;font-size:1em;float:none;line-height:1.5;border-radius:2px;-webkit-transition:background-color ease-in-out .3s;transition:background-color ease-in-out .3s}.woocommerce-pagination span.page-numbers{background-color:#fff}.woocommerce-pagination a.page-numbers:hover{background-color:#767676;color:#fff}.onsale{background-color:#fff;position:absolute;top:0;right:0;display:inline-block;padding:.5em 1em;font-size:13px;font-size:.8125rem;text-transform:uppercase;font-weight:800}.price del{opacity:.5;display:inline-block}.price ins{display:inline-block}.woocommerce-error,.woocommerce-info,.woocommerce-message{margin-bottom:1.5em;padding:2em;background:#eee}.woocommerce-message{background:teal;color:#fff}.woocommerce-error{background:#b22222;color:#fff}.woocommerce-info{background:#4169e1;color:#fff}.woocommerce-error a,.woocommerce-info a,.woocommerce-message a{color:#fff;-webkit-box-shadow:0 1px 0 #fff!important;box-shadow:0 1px 0 #fff!important;-webkit-transition:-webkit-box-shadow ease-in-out 130ms;transition:-webkit-box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms,-webkit-box-shadow ease-in-out 130ms}.woocommerce-error a:hover,.woocommerce-info a:hover,.woocommerce-message a:hover{color:#fff!important;-webkit-box-shadow:0 3px 0 #fff!important;box-shadow:0 3px 0 #fff!important}.woocommerce-store-notice{background:#4169e1;color:#fff;padding:1em;position:absolute;top:0;right:0;width:100%;z-index:999}.admin-bar .woocommerce-store-notice{top:32px}.woocommerce-store-notice__dismiss-link{float:left;color:#fff}.woocommerce-store-notice__dismiss-link:hover{text-decoration:underline;color:#fff}.woocommerce-result-count{padding:.75em 0}ul.products li.product{list-style:none}ul.products li.product .price,ul.products li.product .star-rating{display:block;margin-bottom:.75em}ul.products li.product .woocommerce-placeholder{border:1px solid #f2f2f2}ul.products li.product .button{-webkit-box-shadow:0 1px 0 #0f0f0f;box-shadow:0 1px 0 #0f0f0f;-webkit-transition:-webkit-box-shadow ease-in-out 130ms;transition:-webkit-box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms,-webkit-box-shadow ease-in-out 130ms}ul.products li.product .button:hover{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}ul.products li.product .button.loading{opacity:.5}ul.products li.product .added_to_cart{-webkit-box-shadow:0 1px 0 #0f0f0f;box-shadow:0 1px 0 #0f0f0f;-webkit-transition:-webkit-box-shadow ease-in-out 130ms;transition:-webkit-box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms,-webkit-box-shadow ease-in-out 130ms;margin-right:.5em}ul.products li.product .added_to_cart:hover{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.star-rating{overflow:hidden;position:relative;height:1em;line-height:1;font-size:1em;width:5.4em;font-family:star}.star-rating::before{content:'\73\73\73\73\73';float:right;top:0;right:0;position:absolute}.star-rating span{overflow:hidden;float:right;top:0;right:0;position:absolute;padding-top:1.5em}.star-rating span::before{content:'\53\53\53\53\53';top:0;position:absolute;right:0}.woocommerce-loop-product__title{font-size:13px;font-size:.8125rem;text-transform:uppercase;font-weight:800;letter-spacing:.15em}a.remove{display:inline-block;width:16px;height:16px;line-height:16px;font-size:16px;text-align:center;border-radius:100%;-webkit-box-shadow:none!important;box-shadow:none!important;border:1px solid #000}a.remove:hover{background:#000;color:#fff!important}.wc-item-meta,dl.variation{list-style:none outside}.wc-item-meta .wc-item-meta-label,.wc-item-meta dt,dl.variation .wc-item-meta-label,dl.variation dt{float:right;clear:both;margin-left:.25em;display:inline-block;list-style:none outside}.wc-item-meta dd,dl.variation dd{margin:0}.wc-item-meta p,.wc-item-meta:last-child,dl.variation p,dl.variation:last-child{margin-bottom:0}.single-product div.product{position:relative}.single-product .single-featured-image-header{display:none}.single-product .summary{margin-bottom:3em}.single-product .summary p.price{margin-bottom:2em}.single-product .woocommerce-product-rating{margin-bottom:2em;line-height:1}.single-product .woocommerce-product-rating .star-rating{float:right;margin-left:.25em}.single-product form.cart .quantity{float:right;margin-left:.5em}.single-product form.cart input{width:5em}.single-product .woocommerce-variation-add-to-cart .button{padding-top:.72em;padding-bottom:.72em}.single-product .woocommerce-variation-add-to-cart .button.disabled{opacity:.2}table.variations label{margin:0}table.variations select{margin-left:.5em}.woocommerce-product-gallery{position:relative;margin-bottom:3em}.woocommerce-product-gallery figure{margin:0;padding:0}.woocommerce-product-gallery .woocommerce-product-gallery__wrapper{margin:0;padding:0}.woocommerce-product-gallery .zoomImg{background-color:#fff;opacity:0}.woocommerce-product-gallery .woocommerce-product-gallery__image--placeholder{border:1px solid #f2f2f2}.woocommerce-product-gallery .woocommerce-product-gallery__image:nth-child(n+2){width:25%;display:inline-block}.woocommerce-product-gallery .flex-control-thumbs li{list-style:none;cursor:pointer;float:right}.woocommerce-product-gallery .flex-control-thumbs img{opacity:.5}.woocommerce-product-gallery .flex-control-thumbs img.flex-active,.woocommerce-product-gallery .flex-control-thumbs img:hover{opacity:1}.woocommerce-product-gallery img{display:block;width:100%;height:auto}.woocommerce-product-gallery--columns-3 .flex-control-thumbs li{width:33.3333%}.woocommerce-product-gallery--columns-3 .flex-control-thumbs li:nth-child(3n+1){clear:right}.woocommerce-product-gallery--columns-4 .flex-control-thumbs li{width:25%}.woocommerce-product-gallery--columns-4 .flex-control-thumbs li:nth-child(4n+1){clear:right}.woocommerce-product-gallery--columns-5 .flex-control-thumbs li{width:20%}.woocommerce-product-gallery--columns-5 .flex-control-thumbs li:nth-child(5n+1){clear:right}.woocommerce-product-gallery__trigger{position:absolute;top:1em;left:1em;z-index:99}.woocommerce-tabs{margin-bottom:2em}.woocommerce-tabs li{margin-left:1em}.woocommerce-tabs li.active a{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.woocommerce-tabs a{-webkit-box-shadow:0 1px 0 #0f0f0f;box-shadow:0 1px 0 #0f0f0f;-webkit-transition:-webkit-box-shadow ease-in-out 130ms;transition:-webkit-box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms,-webkit-box-shadow ease-in-out 130ms}.woocommerce-tabs a:hover{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.woocommerce-tabs #comments{padding-top:0}.woocommerce-tabs .comment-reply-title{font-size:22px;font-size:1.375rem;font-weight:300;line-height:1.4;margin:0 0 .75em;display:block}.woocommerce-tabs #reviews li.comment,.woocommerce-tabs #reviews li.review{list-style:none;margin-left:0;margin-bottom:2.5em}.woocommerce-tabs #reviews li.comment .avatar,.woocommerce-tabs #reviews li.review .avatar{max-height:36px;width:auto;float:left}.woocommerce-tabs #reviews li.comment p.meta,.woocommerce-tabs #reviews li.review p.meta{margin-bottom:.5em}.woocommerce-tabs #reviews p.stars a{position:relative;height:1em;width:1em;text-indent:-999em;display:inline-block;text-decoration:none;-webkit-box-shadow:none;box-shadow:none}.woocommerce-tabs #reviews p.stars a::before{display:block;position:absolute;top:0;right:0;width:1em;height:1em;line-height:1;font-family:WooCommerce;content:'\e021';text-indent:0}.woocommerce-tabs #reviews p.stars a:hover~a::before{content:'\e021'}.woocommerce-tabs #reviews p.stars:hover a::before{content:'\e020'}.woocommerce-tabs #reviews p.stars.selected a.active::before{content:'\e020'}.woocommerce-tabs #reviews p.stars.selected a.active~a::before{content:'\e021'}.woocommerce-tabs #reviews p.stars.selected a:not(.active)::before{content:'\e020'}.site-footer .widget .product_list_widget,.widget .product_list_widget{margin-bottom:1.5em}.site-footer .widget .product_list_widget a,.widget .product_list_widget a{display:block;-webkit-box-shadow:none;box-shadow:none}.site-footer .widget .product_list_widget a:hover,.widget .product_list_widget a:hover{-webkit-box-shadow:none;box-shadow:none}.site-footer .widget .product_list_widget li,.widget .product_list_widget li{padding:1.5em 0}.site-footer .widget .product_list_widget li a.remove,.widget .product_list_widget li a.remove{float:left;margin-top:2px}.site-footer .widget .product_list_widget img,.widget .product_list_widget img{display:none}.widget_shopping_cart .buttons a{display:inline-block;margin:0 0 0 .5em}.widget_layered_nav .chosen:before{content:"×";display:inline-block;width:16px;height:16px;line-height:16px;font-size:16px;text-align:center;border-radius:100%;border:1px solid #000;margin-left:.25em}.widget_price_filter .price_slider{margin-bottom:1em}.widget_price_filter .price_slider_amount{text-align:left;line-height:2.4;font-size:.8751em}.widget_price_filter .price_slider_amount .button{float:right;padding:.4em 1em}.widget_price_filter .ui-slider{position:relative;text-align:right;margin-right:.5em;margin-left:.5em}.widget_price_filter .ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1em;height:1em;background-color:#000;border-radius:1em;cursor:ew-resize;outline:0;top:-.3em;margin-right:-.5em}.widget_price_filter .ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;border-radius:1em;background-color:#000}.widget_price_filter .price_slider_wrapper .ui-widget-content{border-radius:1em;background-color:#666;border:0}.widget_price_filter .ui-slider-horizontal{height:.5em}.widget_price_filter .ui-slider-horizontal .ui-slider-range{top:0;height:100%}.widget_price_filter .ui-slider-horizontal .ui-slider-range-min{right:-1px}.widget_price_filter .ui-slider-horizontal .ui-slider-range-max{left:-1px}.widget_rating_filter li{text-align:left}.widget_rating_filter li .star-rating{float:right;margin-top:.3em}.widget_product_search form{position:relative}.widget_product_search .search-field{padding-left:100px}.widget_product_search input[type=submit]{position:absolute;top:.5em;left:.5em;padding-right:1em;padding-left:1em}.woocommerce-account .woocommerce-MyAccount-navigation{float:left;width:25%;border-top:1px solid #ddd}.woocommerce-account .woocommerce-MyAccount-navigation li{list-style:none;padding:.5em 0;border-bottom:1px solid #ddd}.woocommerce-account .woocommerce-MyAccount-navigation li a{-webkit-box-shadow:none;box-shadow:none}.woocommerce-account .woocommerce-MyAccount-navigation li a:hover{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.woocommerce-account .woocommerce-MyAccount-navigation li:before{content:"→";display:inline-block;margin-left:.25em;color:#ddd}.woocommerce-account .woocommerce-MyAccount-navigation li.is-active a{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.woocommerce-account .woocommerce-MyAccount-content{float:right}.woocommerce-cart-form td{padding:1em .5em}.woocommerce-cart-form img{max-width:42px;height:auto;display:block}.woocommerce-cart-form dl.variation{margin-top:0}.woocommerce-cart-form dl.variation p,.woocommerce-cart-form dl.variation:last-child{margin-bottom:0}.woocommerce-cart-form .button{padding:1.2em 2em}.woocommerce-cart-form .actions .input-text{width:130px!important;float:right;margin-left:.25em}.woocommerce-cart-form .quantity input{width:4em}.cart_totals td,.cart_totals th{vertical-align:top;padding:1em 0;line-height:1.5em}.cart_totals th{padding-left:1em}.cart_totals .woocommerce-shipping-destination{margin-bottom:0}.shipping-calculator-button{margin-top:.5em;display:inline-block}.shipping-calculator-form{margin:1em 0 0 0}#shipping_method{list-style:none;margin:0}#shipping_method li{margin-bottom:.5em}#shipping_method li input{float:right;margin-top:.17em}#shipping_method li label{line-height:1.5em}.checkout-button{display:block;padding:1em 2em;border:2px solid #000;text-align:center;font-weight:800;-webkit-box-shadow:none!important;box-shadow:none!important}.checkout-button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;border-color:#999}.checkout-button:after{content:"→"}#ship-to-different-address label{font-weight:300;cursor:pointer}#ship-to-different-address label span{position:relative;display:block}#ship-to-different-address label span:before{content:"";display:block;height:16px;width:30px;border:2px solid #bbb;background:#bbb;border-radius:13em;-webkit-box-sizing:content-box;box-sizing:content-box;-webkit-transition:all ease-in-out .3s;transition:all ease-in-out .3s;position:absolute;top:4px;left:0}#ship-to-different-address label span:after{content:"";display:block;width:14px;height:14px;background:#fff;position:absolute;top:7px;left:17px;border-radius:13em;-webkit-transition:all ease-in-out .3s;transition:all ease-in-out .3s}#ship-to-different-address label input[type=checkbox]{display:none}#ship-to-different-address label input[type=checkbox]:checked+span:after{left:3px}#ship-to-different-address label input[type=checkbox]:checked+span:before{border-color:#000;background:#000}.woocommerce-no-js form.woocommerce-form-coupon,.woocommerce-no-js form.woocommerce-form-login{display:block!important}.woocommerce-no-js .showcoupon,.woocommerce-no-js .woocommerce-form-coupon-toggle,.woocommerce-no-js .woocommerce-form-login-toggle{display:none!important}.woocommerce-terms-and-conditions{border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background:rgba(0,0,0,.05)}.woocommerce-terms-and-conditions-link{display:inline-block}.woocommerce-terms-and-conditions-link:after{content:"";display:inline-block;border-style:solid;margin-bottom:2px;margin-right:.25em;border-width:6px 6px 0 6px;border-color:#111 transparent transparent transparent}.woocommerce-terms-and-conditions-link.woocommerce-terms-and-conditions-link--open:after{border-width:0 6px 6px 6px;border-color:transparent transparent #111 transparent}.woocommerce-checkout .woocommerce-input-wrapper .description{background:#4169e1;color:#fff;border-radius:3px;padding:1em;margin:.5em 0 0;clear:both;display:none;position:relative}.woocommerce-checkout .woocommerce-input-wrapper .description a{color:#fff;text-decoration:underline;border:0;-webkit-box-shadow:none;box-shadow:none}.woocommerce-checkout .woocommerce-input-wrapper .description:before{right:50%;top:0;margin-top:-4px;-webkit-transform:translatex(50%) rotate(-180deg);-ms-transform:translatex(50%) rotate(-180deg);transform:translatex(50%) rotate(-180deg);content:"";position:absolute;border-width:4px 6px 0 6px;border-style:solid;border-color:#4169e1 transparent transparent transparent;z-index:100;display:block}.woocommerce-checkout .select2-choice,.woocommerce-checkout .select2-choice:hover{-webkit-box-shadow:none!important;box-shadow:none!important}.woocommerce-checkout .select2-choice{padding:.7em .7em .7em 0}.woocommerce-checkout .select2-container .select2-selection--single{height:48px}.woocommerce-checkout .select2-container .select2-selection--single .select2-selection__rendered{line-height:48px}.woocommerce-checkout .select2-container--default .select2-selection--single .select2-selection__arrow{height:46px}.woocommerce-checkout .select2-container--focus .select2-selection{border-color:#000}.woocommerce-checkout-review-order-table td{padding:1em .5em}.woocommerce-checkout-review-order-table dl.variation{margin:0}.woocommerce-checkout-review-order-table dl.variation p{margin:0}.wc_payment_method{list-style:none;border-bottom:1px solid #ddd}.wc_payment_method .payment_box{padding:2em;background:#eee}.wc_payment_method .payment_box ol:last-of-type,.wc_payment_method .payment_box ul:last-of-type{margin-bottom:0}.wc_payment_method .payment_box fieldset{padding:1.5em;padding-bottom:0;border:0;background:#f6f6f6}.wc_payment_method .payment_box li{list-style:none}.wc_payment_method .payment_box p:last-child{margin-bottom:0}.wc_payment_method>label:first-of-type{margin:1em 0}.wc_payment_method>label:first-of-type img{max-height:24px;max-width:200px;float:left}.wc_payment_method label{cursor:pointer}.wc_payment_method input.input-radio[name=payment_method]{display:none}.wc_payment_method input.input-radio[name=payment_method]+label:before{content:"";display:inline-block;width:16px;height:16px;border:2px solid #fff;-webkit-box-shadow:0 0 0 2px #000;box-shadow:0 0 0 2px #000;background:#fff;margin-right:4px;margin-left:.5em;border-radius:100%;-webkit-transform:translateY(2px);-ms-transform:translateY(2px);transform:translateY(2px)}.wc_payment_method input.input-radio[name=payment_method]:checked+label:before{background:#000}.colors-dark .page-numbers{color:#444}.colors-dark .page-numbers.next,.colors-dark .page-numbers.prev{color:#ddd}.colors-dark .checkout-button{border:2px solid #555}.colors-dark .checkout-button:hover{border-color:#fff}.colors-dark .wc_payment_method .payment_box{background:#333}.colors-dark .select2-container--default .select2-results .select2-results__options{background:#333}.colors-dark .select2-container--default .select2-results .select2-results__option[data-selected=true]{color:#333}.colors-dark .select2-container--default .select2-selection--single{background-color:#333;border:1px solid #555}.colors-dark .select2-container--default .select2-selection--single .select2-selection__rendered{color:#ccc}.colors-dark .select2-container--focus .select2-selection{border-color:#fff}@media screen and (min-width:48em){.has-sidebar.woocommerce-page:not(.error404) #primary{width:74%}.has-sidebar.woocommerce-page:not(.error404) #secondary{width:20%}body.page-two-column.woocommerce-account:not(.archive) #primary .entry-header,body.page-two-column.woocommerce-cart:not(.archive) #primary .entry-header,body.page-two-column.woocommerce-checkout:not(.archive) #primary .entry-header{width:16%}body.page-two-column.woocommerce-account:not(.archive) #primary .entry-content,body.page-two-column.woocommerce-cart:not(.archive) #primary .entry-content,body.page-two-column.woocommerce-checkout:not(.archive) #primary .entry-content{width:78%}} \ No newline at end of file +@charset "UTF-8";@-webkit-keyframes spin{100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}@keyframes spin{100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}.woocommerce .blockUI.blockOverlay{position:relative}.woocommerce .blockUI.blockOverlay::before{height:1em;width:1em;display:block;position:absolute;top:50%;right:50%;margin-right:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.woocommerce .loader::before{height:1em;width:1em;display:block;position:absolute;top:50%;right:50%;margin-right:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.woocommerce form .form-row .required{color:#b22222;text-decoration:none;visibility:hidden}.woocommerce form .form-row .required[title]{border:0!important}.woocommerce form .form-row .optional{visibility:visible}.woocommerce-breadcrumb{padding-bottom:2em;margin-bottom:4em;border-bottom:1px solid #eee;font-size:13px;font-size:.8125rem}.woocommerce-breadcrumb a{box-shadow:0 1px 0 #0f0f0f;-webkit-transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms}.woocommerce-breadcrumb a:hover{box-shadow:0 3px 0 #0f0f0f}.woocommerce-pagination{padding-top:2em;margin-top:4em;border-top:1px solid #eee;font-size:13px;font-size:.8125rem}.woocommerce-pagination ul.page-numbers{padding:0;display:block}.woocommerce-pagination .next.page-numbers,.woocommerce-pagination .prev.page-numbers,.woocommerce-pagination a.page-numbers,.woocommerce-pagination span.page-numbers{padding:.5em 1em;background:#ddd;display:inline-block;font-size:1em;float:none;line-height:1.5;border-radius:2px;-webkit-transition:background-color ease-in-out .3s;transition:background-color ease-in-out .3s}.woocommerce-pagination span.page-numbers{background-color:#fff}.woocommerce-pagination a.page-numbers:hover{background-color:#767676;color:#fff}.onsale{background-color:#fff;position:absolute;top:0;right:0;display:inline-block;padding:.5em 1em;font-size:13px;font-size:.8125rem;text-transform:uppercase;font-weight:800}.price del{opacity:.5;display:inline-block}.price ins{display:inline-block}.woocommerce-error,.woocommerce-info,.woocommerce-message{margin-bottom:1.5em;padding:2em;background:#eee}.woocommerce-message{background:teal;color:#fff}.woocommerce-error{background:#b22222;color:#fff}.woocommerce-info{background:#4169e1;color:#fff}.woocommerce-error a,.woocommerce-info a,.woocommerce-message a{color:#fff;box-shadow:0 1px 0 #fff!important;-webkit-transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms}.woocommerce-error a:hover,.woocommerce-info a:hover,.woocommerce-message a:hover{color:#fff!important;box-shadow:0 3px 0 #fff!important}.woocommerce-store-notice{background:#4169e1;color:#fff;padding:1em;position:absolute;top:0;right:0;width:100%;z-index:999}.admin-bar .woocommerce-store-notice{top:32px}.woocommerce-store-notice__dismiss-link{float:left;color:#fff}.woocommerce-store-notice__dismiss-link:hover{text-decoration:underline;color:#fff}.woocommerce-result-count{padding:.75em 0}ul.products li.product{list-style:none}ul.products li.product .price,ul.products li.product .star-rating{display:block;margin-bottom:.75em}ul.products li.product .woocommerce-placeholder{border:1px solid #f2f2f2}ul.products li.product .button{box-shadow:0 1px 0 #0f0f0f;-webkit-transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms}ul.products li.product .button:hover{box-shadow:0 3px 0 #0f0f0f}ul.products li.product .button.loading{opacity:.5}ul.products li.product .added_to_cart{box-shadow:0 1px 0 #0f0f0f;-webkit-transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;margin-right:.5em}ul.products li.product .added_to_cart:hover{box-shadow:0 3px 0 #0f0f0f}.star-rating{overflow:hidden;position:relative;height:1em;line-height:1;font-size:1em;width:5.4em;font-family:star}.star-rating::before{content:'\73\73\73\73\73';float:right;top:0;right:0;position:absolute}.star-rating span{overflow:hidden;float:right;top:0;right:0;position:absolute;padding-top:1.5em}.star-rating span::before{content:'\53\53\53\53\53';top:0;position:absolute;right:0}.woocommerce-loop-product__title{font-size:13px;font-size:.8125rem;text-transform:uppercase;font-weight:800;letter-spacing:.15em}a.remove{display:inline-block;width:16px;height:16px;line-height:16px;font-size:16px;text-align:center;border-radius:100%;box-shadow:none!important;border:1px solid #000}a.remove:hover{background:#000;color:#fff!important}.wc-item-meta,dl.variation{list-style:none outside}.wc-item-meta .wc-item-meta-label,.wc-item-meta dt,dl.variation .wc-item-meta-label,dl.variation dt{float:right;clear:both;margin-left:.25em;display:inline-block;list-style:none outside}.wc-item-meta dd,dl.variation dd{margin:0}.wc-item-meta p,.wc-item-meta:last-child,dl.variation p,dl.variation:last-child{margin-bottom:0}.single-product div.product{position:relative}.single-product .single-featured-image-header{display:none}.single-product .summary{margin-bottom:3em}.single-product .summary p.price{margin-bottom:2em}.single-product .woocommerce-product-rating{margin-bottom:2em;line-height:1}.single-product .woocommerce-product-rating .star-rating{float:right;margin-left:.25em}.single-product form.cart .quantity{float:right;margin-left:.5em}.single-product form.cart input{width:5em}.single-product .woocommerce-variation-add-to-cart .button{padding-top:.72em;padding-bottom:.72em}.single-product .woocommerce-variation-add-to-cart .button.disabled{opacity:.2}table.variations label{margin:0}table.variations select{margin-left:.5em}.woocommerce-product-gallery{position:relative;margin-bottom:3em}.woocommerce-product-gallery figure{margin:0;padding:0}.woocommerce-product-gallery .woocommerce-product-gallery__wrapper{margin:0;padding:0}.woocommerce-product-gallery .zoomImg{background-color:#fff;opacity:0}.woocommerce-product-gallery .woocommerce-product-gallery__image--placeholder{border:1px solid #f2f2f2}.woocommerce-product-gallery .woocommerce-product-gallery__image:nth-child(n+2){width:25%;display:inline-block}.woocommerce-product-gallery .flex-control-thumbs li{list-style:none;cursor:pointer;float:right}.woocommerce-product-gallery .flex-control-thumbs img{opacity:.5}.woocommerce-product-gallery .flex-control-thumbs img.flex-active,.woocommerce-product-gallery .flex-control-thumbs img:hover{opacity:1}.woocommerce-product-gallery img{display:block;width:100%;height:auto}.woocommerce-product-gallery--columns-3 .flex-control-thumbs li{width:33.3333%}.woocommerce-product-gallery--columns-3 .flex-control-thumbs li:nth-child(3n+1){clear:right}.woocommerce-product-gallery--columns-4 .flex-control-thumbs li{width:25%}.woocommerce-product-gallery--columns-4 .flex-control-thumbs li:nth-child(4n+1){clear:right}.woocommerce-product-gallery--columns-5 .flex-control-thumbs li{width:20%}.woocommerce-product-gallery--columns-5 .flex-control-thumbs li:nth-child(5n+1){clear:right}.woocommerce-product-gallery__trigger{position:absolute;top:1em;left:1em;z-index:99}.woocommerce-tabs{margin-bottom:2em}.woocommerce-tabs li{margin-left:1em}.woocommerce-tabs li.active a{box-shadow:0 3px 0 #0f0f0f}.woocommerce-tabs a{box-shadow:0 1px 0 #0f0f0f;-webkit-transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms}.woocommerce-tabs a:hover{box-shadow:0 3px 0 #0f0f0f}.woocommerce-tabs #comments{padding-top:0}.woocommerce-tabs .comment-reply-title{font-size:22px;font-size:1.375rem;font-weight:300;line-height:1.4;margin:0 0 .75em;display:block}.woocommerce-tabs #reviews li.comment,.woocommerce-tabs #reviews li.review{list-style:none;margin-left:0;margin-bottom:2.5em}.woocommerce-tabs #reviews li.comment .avatar,.woocommerce-tabs #reviews li.review .avatar{max-height:36px;width:auto;float:left}.woocommerce-tabs #reviews li.comment p.meta,.woocommerce-tabs #reviews li.review p.meta{margin-bottom:.5em}.woocommerce-tabs #reviews p.stars a{position:relative;height:1em;width:1em;text-indent:-999em;display:inline-block;text-decoration:none;box-shadow:none}.woocommerce-tabs #reviews p.stars a::before{display:block;position:absolute;top:0;right:0;width:1em;height:1em;line-height:1;font-family:WooCommerce;content:'\e021';text-indent:0}.woocommerce-tabs #reviews p.stars a:hover~a::before{content:'\e021'}.woocommerce-tabs #reviews p.stars:hover a::before{content:'\e020'}.woocommerce-tabs #reviews p.stars.selected a.active::before{content:'\e020'}.woocommerce-tabs #reviews p.stars.selected a.active~a::before{content:'\e021'}.woocommerce-tabs #reviews p.stars.selected a:not(.active)::before{content:'\e020'}.site-footer .widget .product_list_widget,.widget .product_list_widget{margin-bottom:1.5em}.site-footer .widget .product_list_widget a,.widget .product_list_widget a{display:block;box-shadow:none}.site-footer .widget .product_list_widget a:hover,.widget .product_list_widget a:hover{box-shadow:none}.site-footer .widget .product_list_widget li,.widget .product_list_widget li{padding:1.5em 0}.site-footer .widget .product_list_widget li a.remove,.widget .product_list_widget li a.remove{float:left;margin-top:2px}.site-footer .widget .product_list_widget img,.widget .product_list_widget img{display:none}.widget_shopping_cart .buttons a{display:inline-block;margin:0 0 0 .5em}.widget_layered_nav .chosen:before{content:"×";display:inline-block;width:16px;height:16px;line-height:16px;font-size:16px;text-align:center;border-radius:100%;border:1px solid #000;margin-left:.25em}.widget_price_filter .price_slider{margin-bottom:1em}.widget_price_filter .price_slider_amount{text-align:left;line-height:2.4;font-size:.8751em}.widget_price_filter .price_slider_amount .button{float:right;padding:.4em 1em}.widget_price_filter .ui-slider{position:relative;text-align:right;margin-right:.5em;margin-left:.5em}.widget_price_filter .ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1em;height:1em;background-color:#000;border-radius:1em;cursor:ew-resize;outline:0;top:-.3em;margin-right:-.5em}.widget_price_filter .ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;border-radius:1em;background-color:#000}.widget_price_filter .price_slider_wrapper .ui-widget-content{border-radius:1em;background-color:#666;border:0}.widget_price_filter .ui-slider-horizontal{height:.5em}.widget_price_filter .ui-slider-horizontal .ui-slider-range{top:0;height:100%}.widget_price_filter .ui-slider-horizontal .ui-slider-range-min{right:-1px}.widget_price_filter .ui-slider-horizontal .ui-slider-range-max{left:-1px}.widget_rating_filter li{text-align:left}.widget_rating_filter li .star-rating{float:right;margin-top:.3em}.widget_product_search form{position:relative}.widget_product_search .search-field{padding-left:100px}.widget_product_search input[type=submit]{position:absolute;top:.5em;left:.5em;padding-right:1em;padding-left:1em}.woocommerce-account .woocommerce-MyAccount-navigation{float:left;width:25%;border-top:1px solid #ddd}.woocommerce-account .woocommerce-MyAccount-navigation li{list-style:none;padding:.5em 0;border-bottom:1px solid #ddd}.woocommerce-account .woocommerce-MyAccount-navigation li a{box-shadow:none}.woocommerce-account .woocommerce-MyAccount-navigation li a:hover{box-shadow:0 3px 0 #0f0f0f}.woocommerce-account .woocommerce-MyAccount-navigation li:before{content:"→";display:inline-block;margin-left:.25em;color:#ddd}.woocommerce-account .woocommerce-MyAccount-navigation li.is-active a{box-shadow:0 3px 0 #0f0f0f}.woocommerce-account .woocommerce-MyAccount-content{float:right}.woocommerce-cart-form td{padding:1em .5em}.woocommerce-cart-form img{max-width:42px;height:auto;display:block}.woocommerce-cart-form dl.variation{margin-top:0}.woocommerce-cart-form dl.variation p,.woocommerce-cart-form dl.variation:last-child{margin-bottom:0}.woocommerce-cart-form .button{padding:1.2em 2em}.woocommerce-cart-form .actions .input-text{width:130px!important;float:right;margin-left:.25em}.woocommerce-cart-form .quantity input{width:4em}.cart_totals td,.cart_totals th{vertical-align:top;padding:1em 0;line-height:1.5em}.cart_totals th{padding-left:1em}.cart_totals .woocommerce-shipping-destination{margin-bottom:0}.shipping-calculator-button{margin-top:.5em;display:inline-block}.shipping-calculator-form{margin:1em 0 0 0}#shipping_method{list-style:none;margin:0}#shipping_method li{margin-bottom:.5em}#shipping_method li input{float:right;margin-top:.17em}#shipping_method li label{line-height:1.5em}.checkout-button{display:block;padding:1em 2em;border:2px solid #000;text-align:center;font-weight:800;box-shadow:none!important}.checkout-button:hover{box-shadow:none!important;border-color:#999}.checkout-button:after{content:"→"}#ship-to-different-address label{font-weight:300;cursor:pointer}#ship-to-different-address label span{position:relative;display:block}#ship-to-different-address label span:before{content:"";display:block;height:16px;width:30px;border:2px solid #bbb;background:#bbb;border-radius:13em;box-sizing:content-box;-webkit-transition:all ease-in-out .3s;transition:all ease-in-out .3s;position:absolute;top:4px;left:0}#ship-to-different-address label span:after{content:"";display:block;width:14px;height:14px;background:#fff;position:absolute;top:7px;left:17px;border-radius:13em;-webkit-transition:all ease-in-out .3s;transition:all ease-in-out .3s}#ship-to-different-address label input[type=checkbox]{display:none}#ship-to-different-address label input[type=checkbox]:checked+span:after{left:3px}#ship-to-different-address label input[type=checkbox]:checked+span:before{border-color:#000;background:#000}.woocommerce-no-js form.woocommerce-form-coupon,.woocommerce-no-js form.woocommerce-form-login{display:block!important}.woocommerce-no-js .showcoupon,.woocommerce-no-js .woocommerce-form-coupon-toggle,.woocommerce-no-js .woocommerce-form-login-toggle{display:none!important}.woocommerce-terms-and-conditions{border:1px solid rgba(0,0,0,.2);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background:rgba(0,0,0,.05)}.woocommerce-terms-and-conditions-link{display:inline-block}.woocommerce-terms-and-conditions-link:after{content:"";display:inline-block;border-style:solid;margin-bottom:2px;margin-right:.25em;border-width:6px 6px 0 6px;border-color:#111 transparent transparent transparent}.woocommerce-terms-and-conditions-link.woocommerce-terms-and-conditions-link--open:after{border-width:0 6px 6px 6px;border-color:transparent transparent #111 transparent}.woocommerce-checkout .woocommerce-input-wrapper .description{background:#4169e1;color:#fff;border-radius:3px;padding:1em;margin:.5em 0 0;clear:both;display:none;position:relative}.woocommerce-checkout .woocommerce-input-wrapper .description a{color:#fff;text-decoration:underline;border:0;box-shadow:none}.woocommerce-checkout .woocommerce-input-wrapper .description:before{right:50%;top:0;margin-top:-4px;-webkit-transform:translatex(50%) rotate(-180deg);-ms-transform:translatex(50%) rotate(-180deg);transform:translatex(50%) rotate(-180deg);content:"";position:absolute;border-width:4px 6px 0 6px;border-style:solid;border-color:#4169e1 transparent transparent transparent;z-index:100;display:block}.woocommerce-checkout .select2-choice,.woocommerce-checkout .select2-choice:hover{box-shadow:none!important}.woocommerce-checkout .select2-choice{padding:.7em .7em .7em 0}.woocommerce-checkout .select2-container .select2-selection--single{height:48px}.woocommerce-checkout .select2-container .select2-selection--single .select2-selection__rendered{line-height:48px}.woocommerce-checkout .select2-container--default .select2-selection--single .select2-selection__arrow{height:46px}.woocommerce-checkout .select2-container--focus .select2-selection{border-color:#000}.woocommerce-checkout-review-order-table td{padding:1em .5em}.woocommerce-checkout-review-order-table dl.variation{margin:0}.woocommerce-checkout-review-order-table dl.variation p{margin:0}.wc_payment_method{list-style:none;border-bottom:1px solid #ddd}.wc_payment_method .payment_box{padding:2em;background:#eee}.wc_payment_method .payment_box ol:last-of-type,.wc_payment_method .payment_box ul:last-of-type{margin-bottom:0}.wc_payment_method .payment_box fieldset{padding:1.5em;padding-bottom:0;border:0;background:#f6f6f6}.wc_payment_method .payment_box li{list-style:none}.wc_payment_method .payment_box p:last-child{margin-bottom:0}.wc_payment_method>label:first-of-type{margin:1em 0}.wc_payment_method>label:first-of-type img{max-height:24px;max-width:200px;float:left}.wc_payment_method label{cursor:pointer}.wc_payment_method input.input-radio[name=payment_method]{display:none}.wc_payment_method input.input-radio[name=payment_method]+label:before{content:"";display:inline-block;width:16px;height:16px;border:2px solid #fff;box-shadow:0 0 0 2px #000;background:#fff;margin-right:4px;margin-left:.5em;border-radius:100%;-webkit-transform:translateY(2px);-ms-transform:translateY(2px);transform:translateY(2px)}.wc_payment_method input.input-radio[name=payment_method]:checked+label:before{background:#000}.colors-dark .page-numbers{color:#444}.colors-dark .page-numbers.next,.colors-dark .page-numbers.prev{color:#ddd}.colors-dark .checkout-button{border:2px solid #555}.colors-dark .checkout-button:hover{border-color:#fff}.colors-dark .wc_payment_method .payment_box{background:#333}.colors-dark .select2-container--default .select2-results .select2-results__options{background:#333}.colors-dark .select2-container--default .select2-results .select2-results__option[data-selected=true]{color:#333}.colors-dark .select2-container--default .select2-selection--single{background-color:#333;border:1px solid #555}.colors-dark .select2-container--default .select2-selection--single .select2-selection__rendered{color:#ccc}.colors-dark .select2-container--focus .select2-selection{border-color:#fff}@media screen and (min-width:48em){.has-sidebar.woocommerce-page:not(.error404) #primary{width:74%}.has-sidebar.woocommerce-page:not(.error404) #secondary{width:20%}body.page-two-column.woocommerce-account:not(.archive) #primary .entry-header,body.page-two-column.woocommerce-cart:not(.archive) #primary .entry-header,body.page-two-column.woocommerce-checkout:not(.archive) #primary .entry-header{width:16%}body.page-two-column.woocommerce-account:not(.archive) #primary .entry-content,body.page-two-column.woocommerce-cart:not(.archive) #primary .entry-content,body.page-two-column.woocommerce-checkout:not(.archive) #primary .entry-content{width:78%}} \ No newline at end of file diff --git a/assets/css/twenty-seventeen.css b/assets/css/twenty-seventeen.css index 3ccd859fe61..2068ac12af1 100644 --- a/assets/css/twenty-seventeen.css +++ b/assets/css/twenty-seventeen.css @@ -1 +1 @@ -@charset "UTF-8";@-webkit-keyframes spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}.woocommerce .blockUI.blockOverlay{position:relative}.woocommerce .blockUI.blockOverlay::before{height:1em;width:1em;display:block;position:absolute;top:50%;left:50%;margin-left:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.woocommerce .loader::before{height:1em;width:1em;display:block;position:absolute;top:50%;left:50%;margin-left:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.woocommerce form .form-row .required{color:#b22222;text-decoration:none;visibility:hidden}.woocommerce form .form-row .required[title]{border:0!important}.woocommerce form .form-row .optional{visibility:visible}.woocommerce-breadcrumb{padding-bottom:2em;margin-bottom:4em;border-bottom:1px solid #eee;font-size:13px;font-size:.8125rem}.woocommerce-breadcrumb a{-webkit-box-shadow:0 1px 0 #0f0f0f;box-shadow:0 1px 0 #0f0f0f;-webkit-transition:-webkit-box-shadow ease-in-out 130ms;transition:-webkit-box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms,-webkit-box-shadow ease-in-out 130ms}.woocommerce-breadcrumb a:hover{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.woocommerce-pagination{padding-top:2em;margin-top:4em;border-top:1px solid #eee;font-size:13px;font-size:.8125rem}.woocommerce-pagination ul.page-numbers{padding:0;display:block}.woocommerce-pagination .next.page-numbers,.woocommerce-pagination .prev.page-numbers,.woocommerce-pagination a.page-numbers,.woocommerce-pagination span.page-numbers{padding:.5em 1em;background:#ddd;display:inline-block;font-size:1em;float:none;line-height:1.5;border-radius:2px;-webkit-transition:background-color ease-in-out .3s;transition:background-color ease-in-out .3s}.woocommerce-pagination span.page-numbers{background-color:#fff}.woocommerce-pagination a.page-numbers:hover{background-color:#767676;color:#fff}.onsale{background-color:#fff;position:absolute;top:0;left:0;display:inline-block;padding:.5em 1em;font-size:13px;font-size:.8125rem;text-transform:uppercase;font-weight:800}.price del{opacity:.5;display:inline-block}.price ins{display:inline-block}.woocommerce-error,.woocommerce-info,.woocommerce-message{margin-bottom:1.5em;padding:2em;background:#eee}.woocommerce-message{background:teal;color:#fff}.woocommerce-error{background:#b22222;color:#fff}.woocommerce-info{background:#4169e1;color:#fff}.woocommerce-error a,.woocommerce-info a,.woocommerce-message a{color:#fff;-webkit-box-shadow:0 1px 0 #fff!important;box-shadow:0 1px 0 #fff!important;-webkit-transition:-webkit-box-shadow ease-in-out 130ms;transition:-webkit-box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms,-webkit-box-shadow ease-in-out 130ms}.woocommerce-error a:hover,.woocommerce-info a:hover,.woocommerce-message a:hover{color:#fff!important;-webkit-box-shadow:0 3px 0 #fff!important;box-shadow:0 3px 0 #fff!important}.woocommerce-store-notice{background:#4169e1;color:#fff;padding:1em;position:absolute;top:0;left:0;width:100%;z-index:999}.admin-bar .woocommerce-store-notice{top:32px}.woocommerce-store-notice__dismiss-link{float:right;color:#fff}.woocommerce-store-notice__dismiss-link:hover{text-decoration:underline;color:#fff}.woocommerce-result-count{padding:.75em 0}ul.products li.product{list-style:none}ul.products li.product .price,ul.products li.product .star-rating{display:block;margin-bottom:.75em}ul.products li.product .woocommerce-placeholder{border:1px solid #f2f2f2}ul.products li.product .button{-webkit-box-shadow:0 1px 0 #0f0f0f;box-shadow:0 1px 0 #0f0f0f;-webkit-transition:-webkit-box-shadow ease-in-out 130ms;transition:-webkit-box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms,-webkit-box-shadow ease-in-out 130ms}ul.products li.product .button:hover{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}ul.products li.product .button.loading{opacity:.5}ul.products li.product .added_to_cart{-webkit-box-shadow:0 1px 0 #0f0f0f;box-shadow:0 1px 0 #0f0f0f;-webkit-transition:-webkit-box-shadow ease-in-out 130ms;transition:-webkit-box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms,-webkit-box-shadow ease-in-out 130ms;margin-left:.5em}ul.products li.product .added_to_cart:hover{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.star-rating{overflow:hidden;position:relative;height:1em;line-height:1;font-size:1em;width:5.4em;font-family:star}.star-rating::before{content:'\73\73\73\73\73';float:left;top:0;left:0;position:absolute}.star-rating span{overflow:hidden;float:left;top:0;left:0;position:absolute;padding-top:1.5em}.star-rating span::before{content:'\53\53\53\53\53';top:0;position:absolute;left:0}.woocommerce-loop-product__title{font-size:13px;font-size:.8125rem;text-transform:uppercase;font-weight:800;letter-spacing:.15em}a.remove{display:inline-block;width:16px;height:16px;line-height:16px;font-size:16px;text-align:center;border-radius:100%;-webkit-box-shadow:none!important;box-shadow:none!important;border:1px solid #000}a.remove:hover{background:#000;color:#fff!important}.wc-item-meta,dl.variation{list-style:none outside}.wc-item-meta .wc-item-meta-label,.wc-item-meta dt,dl.variation .wc-item-meta-label,dl.variation dt{float:left;clear:both;margin-right:.25em;display:inline-block;list-style:none outside}.wc-item-meta dd,dl.variation dd{margin:0}.wc-item-meta p,.wc-item-meta:last-child,dl.variation p,dl.variation:last-child{margin-bottom:0}.single-product div.product{position:relative}.single-product .single-featured-image-header{display:none}.single-product .summary{margin-bottom:3em}.single-product .summary p.price{margin-bottom:2em}.single-product .woocommerce-product-rating{margin-bottom:2em;line-height:1}.single-product .woocommerce-product-rating .star-rating{float:left;margin-right:.25em}.single-product form.cart .quantity{float:left;margin-right:.5em}.single-product form.cart input{width:5em}.single-product .woocommerce-variation-add-to-cart .button{padding-top:.72em;padding-bottom:.72em}.single-product .woocommerce-variation-add-to-cart .button.disabled{opacity:.2}table.variations label{margin:0}table.variations select{margin-right:.5em}.woocommerce-product-gallery{position:relative;margin-bottom:3em}.woocommerce-product-gallery figure{margin:0;padding:0}.woocommerce-product-gallery .woocommerce-product-gallery__wrapper{margin:0;padding:0}.woocommerce-product-gallery .zoomImg{background-color:#fff;opacity:0}.woocommerce-product-gallery .woocommerce-product-gallery__image--placeholder{border:1px solid #f2f2f2}.woocommerce-product-gallery .woocommerce-product-gallery__image:nth-child(n+2){width:25%;display:inline-block}.woocommerce-product-gallery .flex-control-thumbs li{list-style:none;cursor:pointer;float:left}.woocommerce-product-gallery .flex-control-thumbs img{opacity:.5}.woocommerce-product-gallery .flex-control-thumbs img.flex-active,.woocommerce-product-gallery .flex-control-thumbs img:hover{opacity:1}.woocommerce-product-gallery img{display:block;width:100%;height:auto}.woocommerce-product-gallery--columns-3 .flex-control-thumbs li{width:33.3333%}.woocommerce-product-gallery--columns-3 .flex-control-thumbs li:nth-child(3n+1){clear:left}.woocommerce-product-gallery--columns-4 .flex-control-thumbs li{width:25%}.woocommerce-product-gallery--columns-4 .flex-control-thumbs li:nth-child(4n+1){clear:left}.woocommerce-product-gallery--columns-5 .flex-control-thumbs li{width:20%}.woocommerce-product-gallery--columns-5 .flex-control-thumbs li:nth-child(5n+1){clear:left}.woocommerce-product-gallery__trigger{position:absolute;top:1em;right:1em;z-index:99}.woocommerce-tabs{margin-bottom:2em}.woocommerce-tabs li{margin-right:1em}.woocommerce-tabs li.active a{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.woocommerce-tabs a{-webkit-box-shadow:0 1px 0 #0f0f0f;box-shadow:0 1px 0 #0f0f0f;-webkit-transition:-webkit-box-shadow ease-in-out 130ms;transition:-webkit-box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms,-webkit-box-shadow ease-in-out 130ms}.woocommerce-tabs a:hover{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.woocommerce-tabs #comments{padding-top:0}.woocommerce-tabs .comment-reply-title{font-size:22px;font-size:1.375rem;font-weight:300;line-height:1.4;margin:0 0 .75em;display:block}.woocommerce-tabs #reviews li.comment,.woocommerce-tabs #reviews li.review{list-style:none;margin-right:0;margin-bottom:2.5em}.woocommerce-tabs #reviews li.comment .avatar,.woocommerce-tabs #reviews li.review .avatar{max-height:36px;width:auto;float:right}.woocommerce-tabs #reviews li.comment p.meta,.woocommerce-tabs #reviews li.review p.meta{margin-bottom:.5em}.woocommerce-tabs #reviews p.stars a{position:relative;height:1em;width:1em;text-indent:-999em;display:inline-block;text-decoration:none;-webkit-box-shadow:none;box-shadow:none}.woocommerce-tabs #reviews p.stars a::before{display:block;position:absolute;top:0;left:0;width:1em;height:1em;line-height:1;font-family:WooCommerce;content:'\e021';text-indent:0}.woocommerce-tabs #reviews p.stars a:hover~a::before{content:'\e021'}.woocommerce-tabs #reviews p.stars:hover a::before{content:'\e020'}.woocommerce-tabs #reviews p.stars.selected a.active::before{content:'\e020'}.woocommerce-tabs #reviews p.stars.selected a.active~a::before{content:'\e021'}.woocommerce-tabs #reviews p.stars.selected a:not(.active)::before{content:'\e020'}.site-footer .widget .product_list_widget,.widget .product_list_widget{margin-bottom:1.5em}.site-footer .widget .product_list_widget a,.widget .product_list_widget a{display:block;-webkit-box-shadow:none;box-shadow:none}.site-footer .widget .product_list_widget a:hover,.widget .product_list_widget a:hover{-webkit-box-shadow:none;box-shadow:none}.site-footer .widget .product_list_widget li,.widget .product_list_widget li{padding:1.5em 0}.site-footer .widget .product_list_widget li a.remove,.widget .product_list_widget li a.remove{float:right;margin-top:2px}.site-footer .widget .product_list_widget img,.widget .product_list_widget img{display:none}.widget_shopping_cart .buttons a{display:inline-block;margin:0 .5em 0 0}.widget_layered_nav .chosen:before{content:"×";display:inline-block;width:16px;height:16px;line-height:16px;font-size:16px;text-align:center;border-radius:100%;border:1px solid #000;margin-right:.25em}.widget_price_filter .price_slider{margin-bottom:1em}.widget_price_filter .price_slider_amount{text-align:right;line-height:2.4;font-size:.8751em}.widget_price_filter .price_slider_amount .button{float:left;padding:.4em 1em}.widget_price_filter .ui-slider{position:relative;text-align:left;margin-left:.5em;margin-right:.5em}.widget_price_filter .ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1em;height:1em;background-color:#000;border-radius:1em;cursor:ew-resize;outline:0;top:-.3em;margin-left:-.5em}.widget_price_filter .ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;border-radius:1em;background-color:#000}.widget_price_filter .price_slider_wrapper .ui-widget-content{border-radius:1em;background-color:#666;border:0}.widget_price_filter .ui-slider-horizontal{height:.5em}.widget_price_filter .ui-slider-horizontal .ui-slider-range{top:0;height:100%}.widget_price_filter .ui-slider-horizontal .ui-slider-range-min{left:-1px}.widget_price_filter .ui-slider-horizontal .ui-slider-range-max{right:-1px}.widget_rating_filter li{text-align:right}.widget_rating_filter li .star-rating{float:left;margin-top:.3em}.widget_product_search form{position:relative}.widget_product_search .search-field{padding-right:100px}.widget_product_search input[type=submit]{position:absolute;top:.5em;right:.5em;padding-left:1em;padding-right:1em}.woocommerce-account .woocommerce-MyAccount-navigation{float:right;width:25%;border-top:1px solid #ddd}.woocommerce-account .woocommerce-MyAccount-navigation li{list-style:none;padding:.5em 0;border-bottom:1px solid #ddd}.woocommerce-account .woocommerce-MyAccount-navigation li a{-webkit-box-shadow:none;box-shadow:none}.woocommerce-account .woocommerce-MyAccount-navigation li a:hover{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.woocommerce-account .woocommerce-MyAccount-navigation li:before{content:"→";display:inline-block;margin-right:.25em;color:#ddd}.woocommerce-account .woocommerce-MyAccount-navigation li.is-active a{-webkit-box-shadow:0 3px 0 #0f0f0f;box-shadow:0 3px 0 #0f0f0f}.woocommerce-account .woocommerce-MyAccount-content{float:left}.woocommerce-cart-form td{padding:1em .5em}.woocommerce-cart-form img{max-width:42px;height:auto;display:block}.woocommerce-cart-form dl.variation{margin-top:0}.woocommerce-cart-form dl.variation p,.woocommerce-cart-form dl.variation:last-child{margin-bottom:0}.woocommerce-cart-form .button{padding:1.2em 2em}.woocommerce-cart-form .actions .input-text{width:130px!important;float:left;margin-right:.25em}.woocommerce-cart-form .quantity input{width:4em}.cart_totals td,.cart_totals th{vertical-align:top;padding:1em 0;line-height:1.5em}.cart_totals th{padding-right:1em}.cart_totals .woocommerce-shipping-destination{margin-bottom:0}.shipping-calculator-button{margin-top:.5em;display:inline-block}.shipping-calculator-form{margin:1em 0 0 0}#shipping_method{list-style:none;margin:0}#shipping_method li{margin-bottom:.5em}#shipping_method li input{float:left;margin-top:.17em}#shipping_method li label{line-height:1.5em}.checkout-button{display:block;padding:1em 2em;border:2px solid #000;text-align:center;font-weight:800;-webkit-box-shadow:none!important;box-shadow:none!important}.checkout-button:hover{-webkit-box-shadow:none!important;box-shadow:none!important;border-color:#999}.checkout-button:after{content:"→"}#ship-to-different-address label{font-weight:300;cursor:pointer}#ship-to-different-address label span{position:relative;display:block}#ship-to-different-address label span:before{content:"";display:block;height:16px;width:30px;border:2px solid #bbb;background:#bbb;border-radius:13em;-webkit-box-sizing:content-box;box-sizing:content-box;-webkit-transition:all ease-in-out .3s;transition:all ease-in-out .3s;position:absolute;top:4px;right:0}#ship-to-different-address label span:after{content:"";display:block;width:14px;height:14px;background:#fff;position:absolute;top:7px;right:17px;border-radius:13em;-webkit-transition:all ease-in-out .3s;transition:all ease-in-out .3s}#ship-to-different-address label input[type=checkbox]{display:none}#ship-to-different-address label input[type=checkbox]:checked+span:after{right:3px}#ship-to-different-address label input[type=checkbox]:checked+span:before{border-color:#000;background:#000}.woocommerce-no-js form.woocommerce-form-coupon,.woocommerce-no-js form.woocommerce-form-login{display:block!important}.woocommerce-no-js .showcoupon,.woocommerce-no-js .woocommerce-form-coupon-toggle,.woocommerce-no-js .woocommerce-form-login-toggle{display:none!important}.woocommerce-terms-and-conditions{border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background:rgba(0,0,0,.05)}.woocommerce-terms-and-conditions-link{display:inline-block}.woocommerce-terms-and-conditions-link:after{content:"";display:inline-block;border-style:solid;margin-bottom:2px;margin-left:.25em;border-width:6px 6px 0 6px;border-color:#111 transparent transparent transparent}.woocommerce-terms-and-conditions-link.woocommerce-terms-and-conditions-link--open:after{border-width:0 6px 6px 6px;border-color:transparent transparent #111 transparent}.woocommerce-checkout .woocommerce-input-wrapper .description{background:#4169e1;color:#fff;border-radius:3px;padding:1em;margin:.5em 0 0;clear:both;display:none;position:relative}.woocommerce-checkout .woocommerce-input-wrapper .description a{color:#fff;text-decoration:underline;border:0;-webkit-box-shadow:none;box-shadow:none}.woocommerce-checkout .woocommerce-input-wrapper .description:before{left:50%;top:0;margin-top:-4px;-webkit-transform:translatex(-50%) rotate(180deg);-ms-transform:translatex(-50%) rotate(180deg);transform:translatex(-50%) rotate(180deg);content:"";position:absolute;border-width:4px 6px 0 6px;border-style:solid;border-color:#4169e1 transparent transparent transparent;z-index:100;display:block}.woocommerce-checkout .select2-choice,.woocommerce-checkout .select2-choice:hover{-webkit-box-shadow:none!important;box-shadow:none!important}.woocommerce-checkout .select2-choice{padding:.7em 0 .7em .7em}.woocommerce-checkout .select2-container .select2-selection--single{height:48px}.woocommerce-checkout .select2-container .select2-selection--single .select2-selection__rendered{line-height:48px}.woocommerce-checkout .select2-container--default .select2-selection--single .select2-selection__arrow{height:46px}.woocommerce-checkout .select2-container--focus .select2-selection{border-color:#000}.woocommerce-checkout-review-order-table td{padding:1em .5em}.woocommerce-checkout-review-order-table dl.variation{margin:0}.woocommerce-checkout-review-order-table dl.variation p{margin:0}.wc_payment_method{list-style:none;border-bottom:1px solid #ddd}.wc_payment_method .payment_box{padding:2em;background:#eee}.wc_payment_method .payment_box ol:last-of-type,.wc_payment_method .payment_box ul:last-of-type{margin-bottom:0}.wc_payment_method .payment_box fieldset{padding:1.5em;padding-bottom:0;border:0;background:#f6f6f6}.wc_payment_method .payment_box li{list-style:none}.wc_payment_method .payment_box p:last-child{margin-bottom:0}.wc_payment_method>label:first-of-type{margin:1em 0}.wc_payment_method>label:first-of-type img{max-height:24px;max-width:200px;float:right}.wc_payment_method label{cursor:pointer}.wc_payment_method input.input-radio[name=payment_method]{display:none}.wc_payment_method input.input-radio[name=payment_method]+label:before{content:"";display:inline-block;width:16px;height:16px;border:2px solid #fff;-webkit-box-shadow:0 0 0 2px #000;box-shadow:0 0 0 2px #000;background:#fff;margin-left:4px;margin-right:.5em;border-radius:100%;-webkit-transform:translateY(2px);-ms-transform:translateY(2px);transform:translateY(2px)}.wc_payment_method input.input-radio[name=payment_method]:checked+label:before{background:#000}.colors-dark .page-numbers{color:#444}.colors-dark .page-numbers.next,.colors-dark .page-numbers.prev{color:#ddd}.colors-dark .checkout-button{border:2px solid #555}.colors-dark .checkout-button:hover{border-color:#fff}.colors-dark .wc_payment_method .payment_box{background:#333}.colors-dark .select2-container--default .select2-results .select2-results__options{background:#333}.colors-dark .select2-container--default .select2-results .select2-results__option[data-selected=true]{color:#333}.colors-dark .select2-container--default .select2-selection--single{background-color:#333;border:1px solid #555}.colors-dark .select2-container--default .select2-selection--single .select2-selection__rendered{color:#ccc}.colors-dark .select2-container--focus .select2-selection{border-color:#fff}@media screen and (min-width:48em){.has-sidebar.woocommerce-page:not(.error404) #primary{width:74%}.has-sidebar.woocommerce-page:not(.error404) #secondary{width:20%}body.page-two-column.woocommerce-account:not(.archive) #primary .entry-header,body.page-two-column.woocommerce-cart:not(.archive) #primary .entry-header,body.page-two-column.woocommerce-checkout:not(.archive) #primary .entry-header{width:16%}body.page-two-column.woocommerce-account:not(.archive) #primary .entry-content,body.page-two-column.woocommerce-cart:not(.archive) #primary .entry-content,body.page-two-column.woocommerce-checkout:not(.archive) #primary .entry-content{width:78%}} \ No newline at end of file +@charset "UTF-8";@-webkit-keyframes spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}.woocommerce .blockUI.blockOverlay{position:relative}.woocommerce .blockUI.blockOverlay::before{height:1em;width:1em;display:block;position:absolute;top:50%;left:50%;margin-left:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.woocommerce .loader::before{height:1em;width:1em;display:block;position:absolute;top:50%;left:50%;margin-left:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.woocommerce form .form-row .required{color:#b22222;text-decoration:none;visibility:hidden}.woocommerce form .form-row .required[title]{border:0!important}.woocommerce form .form-row .optional{visibility:visible}.woocommerce-breadcrumb{padding-bottom:2em;margin-bottom:4em;border-bottom:1px solid #eee;font-size:13px;font-size:.8125rem}.woocommerce-breadcrumb a{box-shadow:0 1px 0 #0f0f0f;-webkit-transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms}.woocommerce-breadcrumb a:hover{box-shadow:0 3px 0 #0f0f0f}.woocommerce-pagination{padding-top:2em;margin-top:4em;border-top:1px solid #eee;font-size:13px;font-size:.8125rem}.woocommerce-pagination ul.page-numbers{padding:0;display:block}.woocommerce-pagination .next.page-numbers,.woocommerce-pagination .prev.page-numbers,.woocommerce-pagination a.page-numbers,.woocommerce-pagination span.page-numbers{padding:.5em 1em;background:#ddd;display:inline-block;font-size:1em;float:none;line-height:1.5;border-radius:2px;-webkit-transition:background-color ease-in-out .3s;transition:background-color ease-in-out .3s}.woocommerce-pagination span.page-numbers{background-color:#fff}.woocommerce-pagination a.page-numbers:hover{background-color:#767676;color:#fff}.onsale{background-color:#fff;position:absolute;top:0;left:0;display:inline-block;padding:.5em 1em;font-size:13px;font-size:.8125rem;text-transform:uppercase;font-weight:800}.price del{opacity:.5;display:inline-block}.price ins{display:inline-block}.woocommerce-error,.woocommerce-info,.woocommerce-message{margin-bottom:1.5em;padding:2em;background:#eee}.woocommerce-message{background:teal;color:#fff}.woocommerce-error{background:#b22222;color:#fff}.woocommerce-info{background:#4169e1;color:#fff}.woocommerce-error a,.woocommerce-info a,.woocommerce-message a{color:#fff;box-shadow:0 1px 0 #fff!important;-webkit-transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms}.woocommerce-error a:hover,.woocommerce-info a:hover,.woocommerce-message a:hover{color:#fff!important;box-shadow:0 3px 0 #fff!important}.woocommerce-store-notice{background:#4169e1;color:#fff;padding:1em;position:absolute;top:0;left:0;width:100%;z-index:999}.admin-bar .woocommerce-store-notice{top:32px}.woocommerce-store-notice__dismiss-link{float:right;color:#fff}.woocommerce-store-notice__dismiss-link:hover{text-decoration:underline;color:#fff}.woocommerce-result-count{padding:.75em 0}ul.products li.product{list-style:none}ul.products li.product .price,ul.products li.product .star-rating{display:block;margin-bottom:.75em}ul.products li.product .woocommerce-placeholder{border:1px solid #f2f2f2}ul.products li.product .button{box-shadow:0 1px 0 #0f0f0f;-webkit-transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms}ul.products li.product .button:hover{box-shadow:0 3px 0 #0f0f0f}ul.products li.product .button.loading{opacity:.5}ul.products li.product .added_to_cart{box-shadow:0 1px 0 #0f0f0f;-webkit-transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms;margin-left:.5em}ul.products li.product .added_to_cart:hover{box-shadow:0 3px 0 #0f0f0f}.star-rating{overflow:hidden;position:relative;height:1em;line-height:1;font-size:1em;width:5.4em;font-family:star}.star-rating::before{content:'\73\73\73\73\73';float:left;top:0;left:0;position:absolute}.star-rating span{overflow:hidden;float:left;top:0;left:0;position:absolute;padding-top:1.5em}.star-rating span::before{content:'\53\53\53\53\53';top:0;position:absolute;left:0}.woocommerce-loop-product__title{font-size:13px;font-size:.8125rem;text-transform:uppercase;font-weight:800;letter-spacing:.15em}a.remove{display:inline-block;width:16px;height:16px;line-height:16px;font-size:16px;text-align:center;border-radius:100%;box-shadow:none!important;border:1px solid #000}a.remove:hover{background:#000;color:#fff!important}.wc-item-meta,dl.variation{list-style:none outside}.wc-item-meta .wc-item-meta-label,.wc-item-meta dt,dl.variation .wc-item-meta-label,dl.variation dt{float:left;clear:both;margin-right:.25em;display:inline-block;list-style:none outside}.wc-item-meta dd,dl.variation dd{margin:0}.wc-item-meta p,.wc-item-meta:last-child,dl.variation p,dl.variation:last-child{margin-bottom:0}.single-product div.product{position:relative}.single-product .single-featured-image-header{display:none}.single-product .summary{margin-bottom:3em}.single-product .summary p.price{margin-bottom:2em}.single-product .woocommerce-product-rating{margin-bottom:2em;line-height:1}.single-product .woocommerce-product-rating .star-rating{float:left;margin-right:.25em}.single-product form.cart .quantity{float:left;margin-right:.5em}.single-product form.cart input{width:5em}.single-product .woocommerce-variation-add-to-cart .button{padding-top:.72em;padding-bottom:.72em}.single-product .woocommerce-variation-add-to-cart .button.disabled{opacity:.2}table.variations label{margin:0}table.variations select{margin-right:.5em}.woocommerce-product-gallery{position:relative;margin-bottom:3em}.woocommerce-product-gallery figure{margin:0;padding:0}.woocommerce-product-gallery .woocommerce-product-gallery__wrapper{margin:0;padding:0}.woocommerce-product-gallery .zoomImg{background-color:#fff;opacity:0}.woocommerce-product-gallery .woocommerce-product-gallery__image--placeholder{border:1px solid #f2f2f2}.woocommerce-product-gallery .woocommerce-product-gallery__image:nth-child(n+2){width:25%;display:inline-block}.woocommerce-product-gallery .flex-control-thumbs li{list-style:none;cursor:pointer;float:left}.woocommerce-product-gallery .flex-control-thumbs img{opacity:.5}.woocommerce-product-gallery .flex-control-thumbs img.flex-active,.woocommerce-product-gallery .flex-control-thumbs img:hover{opacity:1}.woocommerce-product-gallery img{display:block;width:100%;height:auto}.woocommerce-product-gallery--columns-3 .flex-control-thumbs li{width:33.3333%}.woocommerce-product-gallery--columns-3 .flex-control-thumbs li:nth-child(3n+1){clear:left}.woocommerce-product-gallery--columns-4 .flex-control-thumbs li{width:25%}.woocommerce-product-gallery--columns-4 .flex-control-thumbs li:nth-child(4n+1){clear:left}.woocommerce-product-gallery--columns-5 .flex-control-thumbs li{width:20%}.woocommerce-product-gallery--columns-5 .flex-control-thumbs li:nth-child(5n+1){clear:left}.woocommerce-product-gallery__trigger{position:absolute;top:1em;right:1em;z-index:99}.woocommerce-tabs{margin-bottom:2em}.woocommerce-tabs li{margin-right:1em}.woocommerce-tabs li.active a{box-shadow:0 3px 0 #0f0f0f}.woocommerce-tabs a{box-shadow:0 1px 0 #0f0f0f;-webkit-transition:box-shadow ease-in-out 130ms;transition:box-shadow ease-in-out 130ms}.woocommerce-tabs a:hover{box-shadow:0 3px 0 #0f0f0f}.woocommerce-tabs #comments{padding-top:0}.woocommerce-tabs .comment-reply-title{font-size:22px;font-size:1.375rem;font-weight:300;line-height:1.4;margin:0 0 .75em;display:block}.woocommerce-tabs #reviews li.comment,.woocommerce-tabs #reviews li.review{list-style:none;margin-right:0;margin-bottom:2.5em}.woocommerce-tabs #reviews li.comment .avatar,.woocommerce-tabs #reviews li.review .avatar{max-height:36px;width:auto;float:right}.woocommerce-tabs #reviews li.comment p.meta,.woocommerce-tabs #reviews li.review p.meta{margin-bottom:.5em}.woocommerce-tabs #reviews p.stars a{position:relative;height:1em;width:1em;text-indent:-999em;display:inline-block;text-decoration:none;box-shadow:none}.woocommerce-tabs #reviews p.stars a::before{display:block;position:absolute;top:0;left:0;width:1em;height:1em;line-height:1;font-family:WooCommerce;content:'\e021';text-indent:0}.woocommerce-tabs #reviews p.stars a:hover~a::before{content:'\e021'}.woocommerce-tabs #reviews p.stars:hover a::before{content:'\e020'}.woocommerce-tabs #reviews p.stars.selected a.active::before{content:'\e020'}.woocommerce-tabs #reviews p.stars.selected a.active~a::before{content:'\e021'}.woocommerce-tabs #reviews p.stars.selected a:not(.active)::before{content:'\e020'}.site-footer .widget .product_list_widget,.widget .product_list_widget{margin-bottom:1.5em}.site-footer .widget .product_list_widget a,.widget .product_list_widget a{display:block;box-shadow:none}.site-footer .widget .product_list_widget a:hover,.widget .product_list_widget a:hover{box-shadow:none}.site-footer .widget .product_list_widget li,.widget .product_list_widget li{padding:1.5em 0}.site-footer .widget .product_list_widget li a.remove,.widget .product_list_widget li a.remove{float:right;margin-top:2px}.site-footer .widget .product_list_widget img,.widget .product_list_widget img{display:none}.widget_shopping_cart .buttons a{display:inline-block;margin:0 .5em 0 0}.widget_layered_nav .chosen:before{content:"×";display:inline-block;width:16px;height:16px;line-height:16px;font-size:16px;text-align:center;border-radius:100%;border:1px solid #000;margin-right:.25em}.widget_price_filter .price_slider{margin-bottom:1em}.widget_price_filter .price_slider_amount{text-align:right;line-height:2.4;font-size:.8751em}.widget_price_filter .price_slider_amount .button{float:left;padding:.4em 1em}.widget_price_filter .ui-slider{position:relative;text-align:left;margin-left:.5em;margin-right:.5em}.widget_price_filter .ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1em;height:1em;background-color:#000;border-radius:1em;cursor:ew-resize;outline:0;top:-.3em;margin-left:-.5em}.widget_price_filter .ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;border-radius:1em;background-color:#000}.widget_price_filter .price_slider_wrapper .ui-widget-content{border-radius:1em;background-color:#666;border:0}.widget_price_filter .ui-slider-horizontal{height:.5em}.widget_price_filter .ui-slider-horizontal .ui-slider-range{top:0;height:100%}.widget_price_filter .ui-slider-horizontal .ui-slider-range-min{left:-1px}.widget_price_filter .ui-slider-horizontal .ui-slider-range-max{right:-1px}.widget_rating_filter li{text-align:right}.widget_rating_filter li .star-rating{float:left;margin-top:.3em}.widget_product_search form{position:relative}.widget_product_search .search-field{padding-right:100px}.widget_product_search input[type=submit]{position:absolute;top:.5em;right:.5em;padding-left:1em;padding-right:1em}.woocommerce-account .woocommerce-MyAccount-navigation{float:right;width:25%;border-top:1px solid #ddd}.woocommerce-account .woocommerce-MyAccount-navigation li{list-style:none;padding:.5em 0;border-bottom:1px solid #ddd}.woocommerce-account .woocommerce-MyAccount-navigation li a{box-shadow:none}.woocommerce-account .woocommerce-MyAccount-navigation li a:hover{box-shadow:0 3px 0 #0f0f0f}.woocommerce-account .woocommerce-MyAccount-navigation li:before{content:"→";display:inline-block;margin-right:.25em;color:#ddd}.woocommerce-account .woocommerce-MyAccount-navigation li.is-active a{box-shadow:0 3px 0 #0f0f0f}.woocommerce-account .woocommerce-MyAccount-content{float:left}.woocommerce-cart-form td{padding:1em .5em}.woocommerce-cart-form img{max-width:42px;height:auto;display:block}.woocommerce-cart-form dl.variation{margin-top:0}.woocommerce-cart-form dl.variation p,.woocommerce-cart-form dl.variation:last-child{margin-bottom:0}.woocommerce-cart-form .button{padding:1.2em 2em}.woocommerce-cart-form .actions .input-text{width:130px!important;float:left;margin-right:.25em}.woocommerce-cart-form .quantity input{width:4em}.cart_totals td,.cart_totals th{vertical-align:top;padding:1em 0;line-height:1.5em}.cart_totals th{padding-right:1em}.cart_totals .woocommerce-shipping-destination{margin-bottom:0}.shipping-calculator-button{margin-top:.5em;display:inline-block}.shipping-calculator-form{margin:1em 0 0 0}#shipping_method{list-style:none;margin:0}#shipping_method li{margin-bottom:.5em}#shipping_method li input{float:left;margin-top:.17em}#shipping_method li label{line-height:1.5em}.checkout-button{display:block;padding:1em 2em;border:2px solid #000;text-align:center;font-weight:800;box-shadow:none!important}.checkout-button:hover{box-shadow:none!important;border-color:#999}.checkout-button:after{content:"→"}#ship-to-different-address label{font-weight:300;cursor:pointer}#ship-to-different-address label span{position:relative;display:block}#ship-to-different-address label span:before{content:"";display:block;height:16px;width:30px;border:2px solid #bbb;background:#bbb;border-radius:13em;box-sizing:content-box;-webkit-transition:all ease-in-out .3s;transition:all ease-in-out .3s;position:absolute;top:4px;right:0}#ship-to-different-address label span:after{content:"";display:block;width:14px;height:14px;background:#fff;position:absolute;top:7px;right:17px;border-radius:13em;-webkit-transition:all ease-in-out .3s;transition:all ease-in-out .3s}#ship-to-different-address label input[type=checkbox]{display:none}#ship-to-different-address label input[type=checkbox]:checked+span:after{right:3px}#ship-to-different-address label input[type=checkbox]:checked+span:before{border-color:#000;background:#000}.woocommerce-no-js form.woocommerce-form-coupon,.woocommerce-no-js form.woocommerce-form-login{display:block!important}.woocommerce-no-js .showcoupon,.woocommerce-no-js .woocommerce-form-coupon-toggle,.woocommerce-no-js .woocommerce-form-login-toggle{display:none!important}.woocommerce-terms-and-conditions{border:1px solid rgba(0,0,0,.2);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background:rgba(0,0,0,.05)}.woocommerce-terms-and-conditions-link{display:inline-block}.woocommerce-terms-and-conditions-link:after{content:"";display:inline-block;border-style:solid;margin-bottom:2px;margin-left:.25em;border-width:6px 6px 0 6px;border-color:#111 transparent transparent transparent}.woocommerce-terms-and-conditions-link.woocommerce-terms-and-conditions-link--open:after{border-width:0 6px 6px 6px;border-color:transparent transparent #111 transparent}.woocommerce-checkout .woocommerce-input-wrapper .description{background:#4169e1;color:#fff;border-radius:3px;padding:1em;margin:.5em 0 0;clear:both;display:none;position:relative}.woocommerce-checkout .woocommerce-input-wrapper .description a{color:#fff;text-decoration:underline;border:0;box-shadow:none}.woocommerce-checkout .woocommerce-input-wrapper .description:before{left:50%;top:0;margin-top:-4px;-webkit-transform:translatex(-50%) rotate(180deg);-ms-transform:translatex(-50%) rotate(180deg);transform:translatex(-50%) rotate(180deg);content:"";position:absolute;border-width:4px 6px 0 6px;border-style:solid;border-color:#4169e1 transparent transparent transparent;z-index:100;display:block}.woocommerce-checkout .select2-choice,.woocommerce-checkout .select2-choice:hover{box-shadow:none!important}.woocommerce-checkout .select2-choice{padding:.7em 0 .7em .7em}.woocommerce-checkout .select2-container .select2-selection--single{height:48px}.woocommerce-checkout .select2-container .select2-selection--single .select2-selection__rendered{line-height:48px}.woocommerce-checkout .select2-container--default .select2-selection--single .select2-selection__arrow{height:46px}.woocommerce-checkout .select2-container--focus .select2-selection{border-color:#000}.woocommerce-checkout-review-order-table td{padding:1em .5em}.woocommerce-checkout-review-order-table dl.variation{margin:0}.woocommerce-checkout-review-order-table dl.variation p{margin:0}.wc_payment_method{list-style:none;border-bottom:1px solid #ddd}.wc_payment_method .payment_box{padding:2em;background:#eee}.wc_payment_method .payment_box ol:last-of-type,.wc_payment_method .payment_box ul:last-of-type{margin-bottom:0}.wc_payment_method .payment_box fieldset{padding:1.5em;padding-bottom:0;border:0;background:#f6f6f6}.wc_payment_method .payment_box li{list-style:none}.wc_payment_method .payment_box p:last-child{margin-bottom:0}.wc_payment_method>label:first-of-type{margin:1em 0}.wc_payment_method>label:first-of-type img{max-height:24px;max-width:200px;float:right}.wc_payment_method label{cursor:pointer}.wc_payment_method input.input-radio[name=payment_method]{display:none}.wc_payment_method input.input-radio[name=payment_method]+label:before{content:"";display:inline-block;width:16px;height:16px;border:2px solid #fff;box-shadow:0 0 0 2px #000;background:#fff;margin-left:4px;margin-right:.5em;border-radius:100%;-webkit-transform:translateY(2px);-ms-transform:translateY(2px);transform:translateY(2px)}.wc_payment_method input.input-radio[name=payment_method]:checked+label:before{background:#000}.colors-dark .page-numbers{color:#444}.colors-dark .page-numbers.next,.colors-dark .page-numbers.prev{color:#ddd}.colors-dark .checkout-button{border:2px solid #555}.colors-dark .checkout-button:hover{border-color:#fff}.colors-dark .wc_payment_method .payment_box{background:#333}.colors-dark .select2-container--default .select2-results .select2-results__options{background:#333}.colors-dark .select2-container--default .select2-results .select2-results__option[data-selected=true]{color:#333}.colors-dark .select2-container--default .select2-selection--single{background-color:#333;border:1px solid #555}.colors-dark .select2-container--default .select2-selection--single .select2-selection__rendered{color:#ccc}.colors-dark .select2-container--focus .select2-selection{border-color:#fff}@media screen and (min-width:48em){.has-sidebar.woocommerce-page:not(.error404) #primary{width:74%}.has-sidebar.woocommerce-page:not(.error404) #secondary{width:20%}body.page-two-column.woocommerce-account:not(.archive) #primary .entry-header,body.page-two-column.woocommerce-cart:not(.archive) #primary .entry-header,body.page-two-column.woocommerce-checkout:not(.archive) #primary .entry-header{width:16%}body.page-two-column.woocommerce-account:not(.archive) #primary .entry-content,body.page-two-column.woocommerce-cart:not(.archive) #primary .entry-content,body.page-two-column.woocommerce-checkout:not(.archive) #primary .entry-content{width:78%}} \ No newline at end of file diff --git a/assets/css/wc-setup-rtl.css b/assets/css/wc-setup-rtl.css index 299766e4e06..56e1b36b972 100644 --- a/assets/css/wc-setup-rtl.css +++ b/assets/css/wc-setup-rtl.css @@ -1 +1 @@ -@charset "UTF-8";body{margin:65px auto 24px;-webkit-box-shadow:none;box-shadow:none;background:#f1f1f1;padding:0}#wc-logo{border:0;margin:0 0 24px;padding:0;text-align:center}#wc-logo img{max-width:30%}.wc-setup{text-align:center}.wc-setup .select2-container{text-align:right}.wc-setup .hidden{display:none}.wc-setup-content{-webkit-box-shadow:0 1px 3px rgba(0,0,0,.13);box-shadow:0 1px 3px rgba(0,0,0,.13);padding:2em;margin:0 0 20px;background:#fff;overflow:hidden;zoom:1;text-align:right}.wc-setup-content h1,.wc-setup-content h2,.wc-setup-content h3,.wc-setup-content table{margin:0 0 20px;border:0;padding:0;color:#666;clear:none;font-weight:500}.wc-setup-content p{margin:20px 0;font-size:1em;line-height:1.75em;color:#666}.wc-setup-content table{font-size:1em;line-height:1.75em;color:#666}.wc-setup-content a{color:#a16696}.wc-setup-content a:focus,.wc-setup-content a:hover{color:#111}.wc-setup-content .form-table th{width:35%;vertical-align:top;font-weight:400}.wc-setup-content .form-table td{vertical-align:top}.wc-setup-content .form-table td input,.wc-setup-content .form-table td select{width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.wc-setup-content .form-table td input[size]{width:auto}.wc-setup-content .form-table td .description{line-height:1.5em;display:block;margin-top:.25em;color:#999;font-style:italic}.wc-setup-content .form-table td .input-checkbox,.wc-setup-content .form-table td .input-radio{width:auto;-webkit-box-sizing:inherit;box-sizing:inherit;padding:inherit;margin:0 0 0 .5em;-webkit-box-shadow:none;box-shadow:none}.wc-setup-content .form-table .section_title td{padding:0}.wc-setup-content .form-table .section_title td h2,.wc-setup-content .form-table .section_title td p{margin:12px 0 0}.wc-setup-content .form-table td,.wc-setup-content .form-table th{padding:12px 0;margin:0;border:0}.wc-setup-content .form-table td:first-child,.wc-setup-content .form-table th:first-child{padding-left:1em}.wc-setup-content table.tax-rates{width:100%;font-size:.92em}.wc-setup-content table.tax-rates th{padding:0;text-align:center;width:auto;vertical-align:middle}.wc-setup-content table.tax-rates td{border:1px solid #f5f5f5;padding:6px;text-align:center;vertical-align:middle}.wc-setup-content table.tax-rates td input{outline:0;border:0;padding:0;-webkit-box-shadow:none;box-shadow:none;text-align:center;width:100%}.wc-setup-content table.tax-rates td.sort{cursor:move;color:#ccc}.wc-setup-content table.tax-rates td.sort::before{content:'\f333';font-family:dashicons}.wc-setup-content table.tax-rates td.readonly{background:#f5f5f5}.wc-setup-content table.tax-rates .add{padding:1em 1em 0 0;line-height:1em;font-size:1em;width:0;margin:6px 0 0;height:0;overflow:hidden;position:relative;display:inline-block}.wc-setup-content table.tax-rates .add::before{content:'\f502';font-family:dashicons;position:absolute;right:0;top:0}.wc-setup-content table.tax-rates .remove{padding:1em 1em 0 0;line-height:1em;font-size:1em;width:0;margin:0;height:0;overflow:hidden;position:relative;display:inline-block}.wc-setup-content table.tax-rates .remove::before{content:'\f182';font-family:dashicons;position:absolute;right:0;top:0}.wc-setup-content .wc-setup-pages{width:100%;border-top:1px solid #eee}.wc-setup-content .wc-setup-pages thead th{display:none}.wc-setup-content .wc-setup-pages .page-name{width:30%;font-weight:700}.wc-setup-content .wc-setup-pages td,.wc-setup-content .wc-setup-pages th{padding:14px 0;border-bottom:1px solid #eee}.wc-setup-content .wc-setup-pages td:first-child,.wc-setup-content .wc-setup-pages th:first-child{padding-left:9px}.wc-setup-content .wc-setup-pages th{padding-top:0}.wc-setup-content .wc-setup-pages .page-options p{color:#777;margin:6px 24px 0 0;line-height:1.75em}.wc-setup-content .wc-setup-pages .page-options p input{vertical-align:middle;margin:1px 0 0;height:1.75em;width:1.75em;line-height:1.75em}.wc-setup-content .wc-setup-pages .page-options p label{line-height:1}@media screen and (max-width:782px){.wc-setup-content .form-table tbody th{width:auto}}.wc-setup-content .twitter-share-button{float:left}.wc-setup-content .wc-setup-next-steps{overflow:hidden;margin:0 0 24px;padding-bottom:2px}.wc-setup-content .wc-setup-next-steps h2{margin-bottom:12px}.wc-setup-content .wc-setup-next-steps .wc-setup-next-steps-first{float:right;width:50%;-webkit-box-sizing:border-box;box-sizing:border-box}.wc-setup-content .wc-setup-next-steps .wc-setup-next-steps-last{float:left;width:50%;-webkit-box-sizing:border-box;box-sizing:border-box}.wc-setup-content .wc-setup-next-steps ul{padding:0 0 0 2em;list-style:none outside;margin:0}.wc-setup-content .wc-setup-next-steps ul li a{display:block;padding:0 0 .75em}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button{background-color:#f7f7f7;border-color:#ccc;color:#23282d;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #ccc;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #ccc;text-shadow:-1px 0 1px #eee,0 1px 1px #eee;font-size:1em;height:auto;line-height:1.75em;margin:0 0 .75em;opacity:1;padding:1em;text-align:center}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button:active,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button:focus,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button:hover{background:#f5f5f5;border-color:#aaa}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary{color:#fff;background-color:#bb77ae;border-color:#a36597;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;text-shadow:0 -1px 1px #a36597,-1px 0 1px #a36597,0 1px 1px #a36597,1px 0 1px #a36597}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary:active,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary:focus,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary:hover{color:#fff;background:#a36597;border-color:#a36597;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.wc-setup-content .wc-setup-next-steps ul li a::before{color:#82878c;font:normal 20px/1 dashicons;speak:none;display:inline-block;padding:0 0 0 10px;top:1px;position:relative;text-decoration:none!important;vertical-align:top}.wc-setup-content .wc-setup-next-steps ul .learn-more a::before{content:'\f105'}.wc-setup-content .wc-setup-next-steps ul .video-walkthrough a::before{content:'\f126'}.wc-setup-content .wc-setup-next-steps ul .newsletter a::before{content:'\f465'}.wc-setup-content .updated,.wc-setup-content .woocommerce-newsletter{padding:24px 24px 0;margin:0 0 24px;overflow:hidden;background:#f5f5f5}.wc-setup-content .updated p,.wc-setup-content .woocommerce-newsletter p{padding:0;margin:0 0 12px}.wc-setup-content .updated form,.wc-setup-content .updated p:last-child,.wc-setup-content .woocommerce-newsletter form,.wc-setup-content .woocommerce-newsletter p:last-child{margin:0 0 24px}.wc-setup-content .woocommerce-tracker{margin:24px 0;border:1px solid #eee;padding:20px;border-radius:4px;overflow:hidden}.wc-setup-content .woocommerce-tracker p{font-size:14px;line-height:1.5em}.wc-setup-content .woocommerce-tracker .checkbox{line-height:24px;font-weight:500;font-size:1em;margin-top:0;margin-bottom:20px}.wc-setup-content .checkbox input[type=checkbox]{opacity:0;position:absolute;right:-9999px}.wc-setup-content .checkbox label{position:relative;display:inline-block;padding-right:28px}.wc-setup-content .checkbox label:after,.wc-setup-content .checkbox label:before{position:absolute;content:"";display:inline-block}.wc-setup-content .checkbox label:before{height:16px;width:16px;right:0;top:3px;border:1px solid #aaa;background-color:#fff;border-radius:3px}.wc-setup-content .checkbox label:after{height:5px;width:9px;border-right:2px solid;border-bottom:2px solid;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);right:4px;top:7px;color:#fff}.wc-setup-content .checkbox input[type=checkbox]+label::after{content:none}.wc-setup-content .checkbox input[type=checkbox]:checked+label::after{content:""}.wc-setup-content .checkbox input[type=checkbox]:focus+label::before{outline:#3b99fc auto 5px}.wc-setup-content .checkbox input[type=checkbox]:checked+label::before{background:#935687;border-color:#935687}.wc-setup-steps{padding:0 0 24px;margin:0;list-style:none outside;overflow:hidden;color:#ccc;width:100%;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex}.wc-setup-steps li{width:100%;float:right;padding:0 0 .8em;margin:0;text-align:center;position:relative;border-bottom:4px solid #ccc;line-height:1.4em}.wc-setup-steps li a{color:#a16696;text-decoration:none;padding:1.5em;margin:-1.5em;position:relative;z-index:1}.wc-setup-steps li a:focus,.wc-setup-steps li a:hover{color:#111;text-decoration:underline}.wc-setup-steps li::before{content:'';border:4px solid #ccc;border-radius:100%;width:4px;height:4px;position:absolute;bottom:0;right:50%;margin-right:-6px;margin-bottom:-8px;background:#fff}.wc-setup-steps li.active{border-color:#a16696;color:#a16696;font-weight:700}.wc-setup-steps li.active::before{border-color:#a16696}.wc-setup-steps li.done{border-color:#a16696;color:#a16696}.wc-setup-steps li.done::before{border-color:#a16696;background:#a16696}.wc-setup .wc-setup-actions{overflow:hidden;margin:20px 0 0;position:relative}.wc-setup .wc-setup-actions .button{font-size:1.25em;padding:.5em 1em;line-height:1em;margin-left:.5em;margin-bottom:2px;height:auto;border-radius:4px}.wc-setup .wc-setup-actions .button-primary{background-color:#bb77ae;border-color:#a36597;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;text-shadow:0 -1px 1px #a36597,-1px 0 1px #a36597,0 1px 1px #a36597,1px 0 1px #a36597;margin:0;opacity:1}.wc-setup .wc-setup-actions .button-primary:active,.wc-setup .wc-setup-actions .button-primary:focus,.wc-setup .wc-setup-actions .button-primary:hover{background:#a36597;border-color:#a36597;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.wc-setup-content p:last-child{margin-bottom:0}.wc-setup-content p.store-setup{margin-top:0}.wc-setup-footer-links{font-size:.85em;color:#7b7b7b;margin:1.18em auto;display:inline-block;text-align:center}.wc-wizard-storefront .wc-wizard-storefront-intro{padding:40px 40px 0;background:#f5f5f5;text-align:center}.wc-wizard-storefront .wc-wizard-storefront-intro img{margin:40px 0 0 0;width:100%;display:block}.wc-wizard-storefront .wc-wizard-storefront-features{list-style:none outside;margin:0 0 20px;padding:0 30px 0 0;overflow:hidden}.wc-wizard-storefront .wc-wizard-storefront-feature{margin:0;padding:20px 2em 20px 30px;width:50%;-webkit-box-sizing:border-box;box-sizing:border-box}.wc-wizard-storefront .wc-wizard-storefront-feature::before{margin-right:-2em;position:absolute}.wc-wizard-storefront .wc-wizard-storefront-feature.first{clear:both;float:right}.wc-wizard-storefront .wc-wizard-storefront-feature.last{float:left}.wc-wizard-storefront .wc-wizard-storefront-feature__bulletproof::before{content:'🔒'}.wc-wizard-storefront .wc-wizard-storefront-feature__mobile::before{content:'📱'}.wc-wizard-storefront .wc-wizard-storefront-feature__accessibility::before{content:'👓'}.wc-wizard-storefront .wc-wizard-storefront-feature__search::before{content:'🔍'}.wc-wizard-storefront .wc-wizard-storefront-feature__compatibility::before{content:'🔧'}.wc-wizard-storefront .wc-wizard-storefront-feature__extendable::before{content:'🎨'}.wc-wizard-services{border:1px solid #eee;padding:0;margin:0 0 1em;list-style:none outside;border-radius:4px;overflow:hidden}.wc-wizard-services p{margin:0 0 1em 0;padding:0;font-size:1em;line-height:1.5em}.wc-wizard-service-item,.wc-wizard-services-list-toggle{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:0;border-bottom:1px solid #eee;color:#666;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.wc-wizard-service-item:last-child,.wc-wizard-services-list-toggle:last-child{border-bottom:0}.wc-wizard-service-item .payment-gateway-fee,.wc-wizard-services-list-toggle .payment-gateway-fee{color:#a6a6a6}.wc-wizard-service-item .wc-wizard-service-name,.wc-wizard-services-list-toggle .wc-wizard-service-name{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;min-width:160px;text-align:center;font-weight:700;padding:2em 0;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:baseline;-webkit-align-items:baseline;-ms-flex-align:baseline;align-items:baseline}.wc-wizard-payment-gateway-form .wc-wizard-service-item .wc-wizard-service-name,.wc-wizard-payment-gateway-form .wc-wizard-services-list-toggle .wc-wizard-service-name{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.wc-wizard-service-item .wc-wizard-service-name img,.wc-wizard-services-list-toggle .wc-wizard-service-name img{max-width:75px}.wc-wizard-service-item.stripe-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.stripe-logo .wc-wizard-service-name img{padding:8px 0}.wc-wizard-service-item.paypal-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.paypal-logo .wc-wizard-service-name img{max-width:87px;padding:2px 0}.wc-wizard-service-item.klarna-logo .wc-wizard-service-name,.wc-wizard-services-list-toggle.klarna-logo .wc-wizard-service-name{background:#000}.wc-wizard-service-item.klarna-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.klarna-logo .wc-wizard-service-name img{max-width:87px;padding:12px 0}.wc-wizard-service-item.square-logo .wc-wizard-service-name,.wc-wizard-services-list-toggle.square-logo .wc-wizard-service-name{background:#000}.wc-wizard-service-item.square-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.square-logo .wc-wizard-service-name img{max-width:95px;padding:12px 0}.wc-wizard-service-item.eway-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.eway-logo .wc-wizard-service-name img{max-width:87px}.wc-wizard-service-item.payfast-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.payfast-logo .wc-wizard-service-name img{max-width:140px}.wc-wizard-service-item .wc-wizard-service-description,.wc-wizard-services-list-toggle .wc-wizard-service-description{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:20px}.wc-wizard-service-item .wc-wizard-service-description p,.wc-wizard-services-list-toggle .wc-wizard-service-description p{margin-bottom:1em}.wc-wizard-service-item .wc-wizard-service-description p:last-child,.wc-wizard-services-list-toggle .wc-wizard-service-description p:last-child{margin-bottom:0}.wc-wizard-service-item .wc-wizard-service-description .wc-wizard-service-settings-description,.wc-wizard-services-list-toggle .wc-wizard-service-description .wc-wizard-service-settings-description{display:block;font-style:italic;color:#999}.wc-wizard-service-item .wc-wizard-service-enable,.wc-wizard-services-list-toggle .wc-wizard-service-enable{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;min-width:75px;text-align:center;cursor:pointer;padding:2em 0;position:relative;max-height:1.5em;-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.wc-wizard-service-item .wc-wizard-service-toggle,.wc-wizard-services-list-toggle .wc-wizard-service-toggle{height:16px;width:32px;border:2px solid #935687;background-color:#935687;display:inline-block;text-indent:-9999px;border-radius:10em;position:relative}.wc-wizard-service-item .wc-wizard-service-toggle input[type=checkbox],.wc-wizard-services-list-toggle .wc-wizard-service-toggle input[type=checkbox]{display:none}.wc-wizard-service-item .wc-wizard-service-toggle:before,.wc-wizard-services-list-toggle .wc-wizard-service-toggle:before{content:"";display:block;width:16px;height:16px;background:#fff;position:absolute;top:0;left:0;border-radius:100%}.wc-wizard-service-item .wc-wizard-service-toggle.disabled,.wc-wizard-services-list-toggle .wc-wizard-service-toggle.disabled{border-color:#999;background-color:#999}.wc-wizard-service-item .wc-wizard-service-toggle.disabled:before,.wc-wizard-services-list-toggle .wc-wizard-service-toggle.disabled:before{left:auto;right:0}.wc-wizard-service-item .wc-wizard-service-settings,.wc-wizard-services-list-toggle .wc-wizard-service-settings{display:none;margin-top:.75em;margin-bottom:0;cursor:default}.wc-wizard-service-item .wc-wizard-service-settings.hide,.wc-wizard-services-list-toggle .wc-wizard-service-settings.hide{display:none}.wc-wizard-service-item.checked .wc-wizard-service-settings,.wc-wizard-services-list-toggle.checked .wc-wizard-service-settings{display:inline-block}.wc-wizard-service-item.checked .wc-wizard-service-settings.hide,.wc-wizard-services-list-toggle.checked .wc-wizard-service-settings.hide{display:none}.wc-wizard-service-item.closed,.wc-wizard-services-list-toggle.closed{border-bottom:0}.wc-wizard-services-list-toggle{cursor:pointer}.wc-wizard-services-list-toggle .wc-wizard-service-enable::before{content:"\f343";font-family:dashicons;visibility:initial;color:#666;font-size:25px;margin-top:-7px;margin-right:-5px;position:absolute;visibility:visible}.wc-wizard-services-list-toggle.closed .wc-wizard-service-enable::before{content:"\f347"}.wc-wizard-services-list-toggle .wc-wizard-service-enable input{visibility:hidden;position:relative}.wc-wizard-services.manual .wc-wizard-service-item{display:none}.wc-wizard-services.shipping .wc-wizard-service-name{font-weight:400;text-align:right;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;max-height:5em;padding:0}.wc-wizard-services.shipping .wc-wizard-service-item{padding-right:2em;padding-top:.67em}.wc-wizard-services.shipping .wc-wizard-service-item:first-child{border-bottom:0;padding-bottom:0;font-weight:700}.wc-wizard-services.shipping .wc-wizard-service-item:first-child .wc-wizard-service-name{font-weight:700}.wc-wizard-services.shipping .shipping-method-setting,.wc-wizard-services.shipping .wc-wizard-shipping-method-select{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wc-wizard-services.shipping .shipping-method-setting.hide,.wc-wizard-services.shipping .wc-wizard-shipping-method-select.hide{display:none}.wc-wizard-services.shipping .shipping-method-setting input,.wc-wizard-services.shipping .wc-wizard-shipping-method-dropdown{margin-left:2em;margin-bottom:1em}.wc-wizard-services.shipping .shipping-method-setting input .select2,.wc-wizard-services.shipping .wc-wizard-shipping-method-dropdown .select2{min-width:130px}.wc-wizard-services.shipping .wc-wizard-service-description{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;color:#a6a6a6}.wc-wizard-services.shipping .wc-wizard-service-item:not(:first-child) .wc-wizard-service-description{font-size:.92em;padding-bottom:10px}.wc-wizard-services.shipping .shipping-method-setting input{width:95px;border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:28px;padding-right:8px;padding-left:24px;font-size:14px;color:#444;background-color:#fff;display:inline-block}.wc-wizard-services.shipping .shipping-method-description,.wc-wizard-services.shipping .shipping-method-setting .description{color:#7e7e7e;font-size:.9em}.wc-wizard-services.shipping .shipping-method-setting input::-webkit-input-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input::-moz-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input:-ms-input-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input::-ms-input-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input::placeholder{color:#e1e1e1}.wc-setup-shipping-units p{line-height:1.5em;font-size:13px;margin-bottom:.25em}.wc-setup-shipping-units .wc-setup-shipping-unit{margin-bottom:1.75em}.wc-setup-shipping-units .wc-setup-shipping-unit .select2{min-width:100%}.hide{display:none}.wc-wizard-features{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;padding:0}.wc-wizard-features .wc-wizard-feature-item{-webkit-flex-basis:calc(50% - 4em - 3px);-ms-flex-preferred-size:calc(50% - 4em - 3px);flex-basis:calc(50% - 4em - 3px);border:1px solid #eee;padding:2em}.wc-wizard-features .wc-wizard-feature-item:nth-child(1){border-radius:0 4px 0 0}.wc-wizard-features .wc-wizard-feature-item:nth-child(2){border-right:0;border-radius:4px 0 0 0}.wc-wizard-features .wc-wizard-feature-item:nth-child(3){border-top:0;border-radius:0 0 4px 0}.wc-wizard-features .wc-wizard-feature-item:nth-child(4){border-top:0;border-right:0;border-radius:0 0 0 4px}.wc-wizard-features p.wc-wizard-feature-description,.wc-wizard-features p.wc-wizard-feature-name{margin:0;line-height:1.5em}h3.jetpack-reasons{text-align:center;margin:3em 0 1em 0;font-size:14px}.jetpack-logo,.wcs-notice{display:block;margin:1.75em auto 2em auto;max-height:175px}.activate-splash .jetpack-logo{width:170px;margin-bottom:0}.activate-splash .wcs-notice{margin-top:1em;padding-right:57px}.step{text-align:center}.wc-setup .wc-setup-actions .button{font-weight:300;font-size:16px;padding:1em 2em;-webkit-box-shadow:none;box-shadow:none;min-width:12em;min-width:auto;margin-top:10px}.wc-setup .wc-setup-actions .button:active,.wc-setup .wc-setup-actions .button:focus,.wc-setup .wc-setup-actions .button:hover{-webkit-box-shadow:none;box-shadow:none}.wc-setup .wc-setup-actions .plugin-install-info{display:block;font-style:italic;color:#999;font-size:14px;line-height:1.5em;margin:5px 0}.wc-setup .wc-setup-actions .plugin-install-info>*{display:block}.wc-setup .wc-setup-actions .plugin-install-info .plugin-install-info-list-item:not(:last-child)::after{content:', '}.wc-setup .wc-setup-actions .plugin-install-info a{white-space:nowrap}.wc-setup .wc-setup-actions .plugin-install-info a:not(:hover):not(:focus){color:inherit}.plugin-install-source{background:rgba(187,119,174,.15)}.plugin-install-source:not(.wc-wizard-service-item){-webkit-box-shadow:0 0 0 10px rgba(187,119,174,.15);box-shadow:0 0 0 10px rgba(187,119,174,.15)}.location-prompt{color:#666;font-size:13px;font-weight:500;margin-bottom:.5em;margin-top:.85em;display:inline-block}.location-input{border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:30px;width:calc(100% - 8px - 24px - 2px);padding-right:8px;padding-left:24px;font-size:16px;color:#444;background-color:#fff;display:inline-block}.location-input.dropdown{width:100%}.address-step .select2{min-width:100%}.store-address-container .city-and-postcode{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.store-address-container .city-and-postcode div{-webkit-flex-basis:50%;-ms-flex-preferred-size:50%;flex-basis:50%;margin-left:1em}.store-address-container .city-and-postcode div:last-of-type{margin-left:0}.store-address-container .select2-container,.store-address-container input[type=text],.store-address-container select{margin-bottom:10px}.product-type-container{margin-top:14px;margin-bottom:1px}#woocommerce_sell_in_person{margin-right:0}.wc-wizard-service-settings .payment-email-input{border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:30px;padding:0 8px;font-size:14px;color:#444;background-color:#fff;display:inline-block}.newsletter-form-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.newsletter-form-container .newsletter-form-email{border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:42px;padding:0 8px;font-size:16px;color:#666;background-color:#fff;display:inline-block;margin-left:6px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.newsletter-form-container .newsletter-form-button-container{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.wc-setup .wc-setup-actions .button.newsletter-form-button{height:42px;padding:0 1em;margin:0}.wc-wizard-next-steps{border:1px solid #eee;border-radius:4px;list-style:none;padding:0}.wc-wizard-next-steps li{padding:0}.wc-wizard-next-steps .wc-wizard-next-step-item{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;border-top:1px solid #eee}.wc-wizard-next-steps .wc-wizard-next-step-item:first-child{border-top:0}.wc-wizard-next-steps .wc-wizard-next-step-description{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin:1.5em}.wc-wizard-next-steps .wc-wizard-next-step-action{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.wc-wizard-next-steps .wc-wizard-next-step-action .button{margin:1em 1.5em}.wc-wizard-next-steps p.next-step-heading{margin:0;font-size:.95em;font-weight:400;font-variant:all-petite-caps}.wc-wizard-next-steps p.next-step-extra-info{margin:0}.wc-wizard-next-steps h3.next-step-description{margin:0;font-size:16px;font-weight:600}.wc-wizard-next-steps .wc-wizard-additional-steps{border-top:1px solid #eee}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-wizard-next-step-description{margin-bottom:0}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-setup-actions{margin:0 0 1.5em 0}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-setup-actions .button{font-size:15px;margin:1em 1.5em 1em 0}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-setup-actions .button::last-child{margin-left:1.5em}p.next-steps-help-text{color:#9f9f9f;padding:0 2em;text-align:center;font-size:.9em}p.jetpack-terms{font-size:.8em;text-align:center;max-width:480px;margin:0 auto;line-height:1.5em}.woocommerce-error{background:#ffe6e5;border-color:#ffc5c2;padding:1em;margin-bottom:1em}.woocommerce-error p{margin-top:0;margin-bottom:.5em;color:#444}.woocommerce-error a{color:#ff645c}.woocommerce-error .reconnect-reminder{font-size:.85em}.woocommerce-error .wc-setup-actions .button{font-size:14px}.wc-wizard-service-setting-ppec_paypal_reroute_requests,.wc-wizard-service-setting-stripe_create_account{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}.wc-wizard-service-setting-ppec_paypal_reroute_requests .payment-checkbox-input,.wc-wizard-service-setting-stripe_create_account .payment-checkbox-input{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1;margin-top:5px;margin-right:0;margin-left:0;width:1.5em}.wc-wizard-service-setting-ppec_paypal_reroute_requests .ppec_paypal_reroute_requests,.wc-wizard-service-setting-ppec_paypal_reroute_requests .stripe_create_account,.wc-wizard-service-setting-stripe_create_account .ppec_paypal_reroute_requests,.wc-wizard-service-setting-stripe_create_account .stripe_create_account{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2;margin-right:.3em}.wc-wizard-service-setting-ppec_paypal_email,.wc-wizard-service-setting-stripe_email{margin-top:.75em;margin-right:1.5em}.wc-wizard-service-setting-ppec_paypal_email label.ppec_paypal_email,.wc-wizard-service-setting-ppec_paypal_email label.stripe_email,.wc-wizard-service-setting-stripe_email label.ppec_paypal_email,.wc-wizard-service-setting-stripe_email label.stripe_email{position:absolute;margin:-1px;padding:0;height:1px;width:1px;overflow:hidden;clip:rect(0 0 0 0);border:0}.wc-wizard-service-setting-ppec_paypal_email input.payment-email-input,.wc-wizard-service-setting-stripe_email input.payment-email-input{-webkit-box-sizing:border-box;box-sizing:border-box;margin-bottom:.5em;width:100%;height:32px}.wc-setup-content .recommended-step{border:1px solid #ebebeb;border-radius:4px;padding:2.5em}.wc-setup-content .recommended-step li{list-style:none}.wc-setup-content .recommended-step li:last-child label{margin-bottom:0}.wc-setup-content .recommended-step label{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-bottom:1.5em}.wc-setup-content .recommended-step label:after,.wc-setup-content .recommended-step label:before{top:auto}.wc-setup-content .recommended-step label:after{margin-top:-1.5px}.wc-setup-content .recommended-step .recommended-item-icon{border:1px solid #fff;border-radius:7px;height:3.5em;margin-left:1em;margin-right:4px}.wc-setup-content .recommended-step .recommended-item-icon.recommended-item-icon-storefront_theme{background-color:#f4a224;max-height:3em;max-width:3em;padding:.25em}.wc-setup-content .recommended-step .recommended-item-icon.recommended-item-icon-automated_taxes{background-color:#d0011b;max-height:1.75em;padding:.875em}.wc-setup-content .recommended-step .recommended-item-icon.recommended-item-icon-mailchimp{background-color:#209bbb;height:2em;padding:.75em}.wc-setup-content .recommended-step .recommended-item-description-container h3{font-size:15px;font-weight:700;letter-spacing:.5px;margin-bottom:0}.wc-setup-content .recommended-step .recommended-item-description-container p{margin-top:0;line-height:1.5em} \ No newline at end of file +@charset "UTF-8";body{margin:65px auto 24px;box-shadow:none;background:#f1f1f1;padding:0}#wc-logo{border:0;margin:0 0 24px;padding:0;text-align:center}#wc-logo img{max-width:30%}.wc-setup{text-align:center}.wc-setup .select2-container{text-align:right}.wc-setup .hidden{display:none}.wc-setup-content{box-shadow:0 1px 3px rgba(0,0,0,.13);padding:2em;margin:0 0 20px;background:#fff;overflow:hidden;zoom:1;text-align:right}.wc-setup-content h1,.wc-setup-content h2,.wc-setup-content h3,.wc-setup-content table{margin:0 0 20px;border:0;padding:0;color:#666;clear:none;font-weight:500}.wc-setup-content p{margin:20px 0;font-size:1em;line-height:1.75em;color:#666}.wc-setup-content table{font-size:1em;line-height:1.75em;color:#666}.wc-setup-content a{color:#a16696}.wc-setup-content a:focus,.wc-setup-content a:hover{color:#111}.wc-setup-content .form-table th{width:35%;vertical-align:top;font-weight:400}.wc-setup-content .form-table td{vertical-align:top}.wc-setup-content .form-table td input,.wc-setup-content .form-table td select{width:100%;box-sizing:border-box}.wc-setup-content .form-table td input[size]{width:auto}.wc-setup-content .form-table td .description{line-height:1.5em;display:block;margin-top:.25em;color:#999;font-style:italic}.wc-setup-content .form-table td .input-checkbox,.wc-setup-content .form-table td .input-radio{width:auto;box-sizing:inherit;padding:inherit;margin:0 0 0 .5em;box-shadow:none}.wc-setup-content .form-table .section_title td{padding:0}.wc-setup-content .form-table .section_title td h2,.wc-setup-content .form-table .section_title td p{margin:12px 0 0}.wc-setup-content .form-table td,.wc-setup-content .form-table th{padding:12px 0;margin:0;border:0}.wc-setup-content .form-table td:first-child,.wc-setup-content .form-table th:first-child{padding-left:1em}.wc-setup-content table.tax-rates{width:100%;font-size:.92em}.wc-setup-content table.tax-rates th{padding:0;text-align:center;width:auto;vertical-align:middle}.wc-setup-content table.tax-rates td{border:1px solid #f5f5f5;padding:6px;text-align:center;vertical-align:middle}.wc-setup-content table.tax-rates td input{outline:0;border:0;padding:0;box-shadow:none;text-align:center;width:100%}.wc-setup-content table.tax-rates td.sort{cursor:move;color:#ccc}.wc-setup-content table.tax-rates td.sort::before{content:'\f333';font-family:dashicons}.wc-setup-content table.tax-rates td.readonly{background:#f5f5f5}.wc-setup-content table.tax-rates .add{padding:1em 1em 0 0;line-height:1em;font-size:1em;width:0;margin:6px 0 0;height:0;overflow:hidden;position:relative;display:inline-block}.wc-setup-content table.tax-rates .add::before{content:'\f502';font-family:dashicons;position:absolute;right:0;top:0}.wc-setup-content table.tax-rates .remove{padding:1em 1em 0 0;line-height:1em;font-size:1em;width:0;margin:0;height:0;overflow:hidden;position:relative;display:inline-block}.wc-setup-content table.tax-rates .remove::before{content:'\f182';font-family:dashicons;position:absolute;right:0;top:0}.wc-setup-content .wc-setup-pages{width:100%;border-top:1px solid #eee}.wc-setup-content .wc-setup-pages thead th{display:none}.wc-setup-content .wc-setup-pages .page-name{width:30%;font-weight:700}.wc-setup-content .wc-setup-pages td,.wc-setup-content .wc-setup-pages th{padding:14px 0;border-bottom:1px solid #eee}.wc-setup-content .wc-setup-pages td:first-child,.wc-setup-content .wc-setup-pages th:first-child{padding-left:9px}.wc-setup-content .wc-setup-pages th{padding-top:0}.wc-setup-content .wc-setup-pages .page-options p{color:#777;margin:6px 24px 0 0;line-height:1.75em}.wc-setup-content .wc-setup-pages .page-options p input{vertical-align:middle;margin:1px 0 0;height:1.75em;width:1.75em;line-height:1.75em}.wc-setup-content .wc-setup-pages .page-options p label{line-height:1}@media screen and (max-width:782px){.wc-setup-content .form-table tbody th{width:auto}}.wc-setup-content .twitter-share-button{float:left}.wc-setup-content .wc-setup-next-steps{overflow:hidden;margin:0 0 24px;padding-bottom:2px}.wc-setup-content .wc-setup-next-steps h2{margin-bottom:12px}.wc-setup-content .wc-setup-next-steps .wc-setup-next-steps-first{float:right;width:50%;box-sizing:border-box}.wc-setup-content .wc-setup-next-steps .wc-setup-next-steps-last{float:left;width:50%;box-sizing:border-box}.wc-setup-content .wc-setup-next-steps ul{padding:0 0 0 2em;list-style:none outside;margin:0}.wc-setup-content .wc-setup-next-steps ul li a{display:block;padding:0 0 .75em}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button{background-color:#f7f7f7;border-color:#ccc;color:#23282d;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #ccc;text-shadow:-1px 0 1px #eee,0 1px 1px #eee;font-size:1em;height:auto;line-height:1.75em;margin:0 0 .75em;opacity:1;padding:1em;text-align:center}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button:active,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button:focus,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button:hover{background:#f5f5f5;border-color:#aaa}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary{color:#fff;background-color:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;text-shadow:0 -1px 1px #a36597,-1px 0 1px #a36597,0 1px 1px #a36597,1px 0 1px #a36597}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary:active,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary:focus,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary:hover{color:#fff;background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.wc-setup-content .wc-setup-next-steps ul li a::before{color:#82878c;font:normal 20px/1 dashicons;speak:none;display:inline-block;padding:0 0 0 10px;top:1px;position:relative;text-decoration:none!important;vertical-align:top}.wc-setup-content .wc-setup-next-steps ul .learn-more a::before{content:'\f105'}.wc-setup-content .wc-setup-next-steps ul .video-walkthrough a::before{content:'\f126'}.wc-setup-content .wc-setup-next-steps ul .newsletter a::before{content:'\f465'}.wc-setup-content .updated,.wc-setup-content .woocommerce-newsletter{padding:24px 24px 0;margin:0 0 24px;overflow:hidden;background:#f5f5f5}.wc-setup-content .updated p,.wc-setup-content .woocommerce-newsletter p{padding:0;margin:0 0 12px}.wc-setup-content .updated form,.wc-setup-content .updated p:last-child,.wc-setup-content .woocommerce-newsletter form,.wc-setup-content .woocommerce-newsletter p:last-child{margin:0 0 24px}.wc-setup-content .woocommerce-tracker{margin:24px 0;border:1px solid #eee;padding:20px;border-radius:4px;overflow:hidden}.wc-setup-content .woocommerce-tracker p{font-size:14px;line-height:1.5em}.wc-setup-content .woocommerce-tracker .checkbox{line-height:24px;font-weight:500;font-size:1em;margin-top:0;margin-bottom:20px}.wc-setup-content .checkbox input[type=checkbox]{opacity:0;position:absolute;right:-9999px}.wc-setup-content .checkbox label{position:relative;display:inline-block;padding-right:28px}.wc-setup-content .checkbox label:after,.wc-setup-content .checkbox label:before{position:absolute;content:"";display:inline-block}.wc-setup-content .checkbox label:before{height:16px;width:16px;right:0;top:3px;border:1px solid #aaa;background-color:#fff;border-radius:3px}.wc-setup-content .checkbox label:after{height:5px;width:9px;border-right:2px solid;border-bottom:2px solid;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);right:4px;top:7px;color:#fff}.wc-setup-content .checkbox input[type=checkbox]+label::after{content:none}.wc-setup-content .checkbox input[type=checkbox]:checked+label::after{content:""}.wc-setup-content .checkbox input[type=checkbox]:focus+label::before{outline:#3b99fc auto 5px}.wc-setup-content .checkbox input[type=checkbox]:checked+label::before{background:#935687;border-color:#935687}.wc-setup-steps{padding:0 0 24px;margin:0;list-style:none outside;overflow:hidden;color:#ccc;width:100%;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.wc-setup-steps li{width:100%;float:right;padding:0 0 .8em;margin:0;text-align:center;position:relative;border-bottom:4px solid #ccc;line-height:1.4em}.wc-setup-steps li a{color:#a16696;text-decoration:none;padding:1.5em;margin:-1.5em;position:relative;z-index:1}.wc-setup-steps li a:focus,.wc-setup-steps li a:hover{color:#111;text-decoration:underline}.wc-setup-steps li::before{content:'';border:4px solid #ccc;border-radius:100%;width:4px;height:4px;position:absolute;bottom:0;right:50%;margin-right:-6px;margin-bottom:-8px;background:#fff}.wc-setup-steps li.active{border-color:#a16696;color:#a16696;font-weight:700}.wc-setup-steps li.active::before{border-color:#a16696}.wc-setup-steps li.done{border-color:#a16696;color:#a16696}.wc-setup-steps li.done::before{border-color:#a16696;background:#a16696}.wc-setup .wc-setup-actions{overflow:hidden;margin:20px 0 0;position:relative}.wc-setup .wc-setup-actions .button{font-size:1.25em;padding:.5em 1em;line-height:1em;margin-left:.5em;margin-bottom:2px;height:auto;border-radius:4px}.wc-setup .wc-setup-actions .button-primary{background-color:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;text-shadow:0 -1px 1px #a36597,-1px 0 1px #a36597,0 1px 1px #a36597,1px 0 1px #a36597;margin:0;opacity:1}.wc-setup .wc-setup-actions .button-primary:active,.wc-setup .wc-setup-actions .button-primary:focus,.wc-setup .wc-setup-actions .button-primary:hover{background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.wc-setup-content p:last-child{margin-bottom:0}.wc-setup-content p.store-setup{margin-top:0}.wc-setup-footer-links{font-size:.85em;color:#7b7b7b;margin:1.18em auto;display:inline-block;text-align:center}.wc-wizard-storefront .wc-wizard-storefront-intro{padding:40px 40px 0;background:#f5f5f5;text-align:center}.wc-wizard-storefront .wc-wizard-storefront-intro img{margin:40px 0 0 0;width:100%;display:block}.wc-wizard-storefront .wc-wizard-storefront-features{list-style:none outside;margin:0 0 20px;padding:0 30px 0 0;overflow:hidden}.wc-wizard-storefront .wc-wizard-storefront-feature{margin:0;padding:20px 2em 20px 30px;width:50%;box-sizing:border-box}.wc-wizard-storefront .wc-wizard-storefront-feature::before{margin-right:-2em;position:absolute}.wc-wizard-storefront .wc-wizard-storefront-feature.first{clear:both;float:right}.wc-wizard-storefront .wc-wizard-storefront-feature.last{float:left}.wc-wizard-storefront .wc-wizard-storefront-feature__bulletproof::before{content:'🔒'}.wc-wizard-storefront .wc-wizard-storefront-feature__mobile::before{content:'📱'}.wc-wizard-storefront .wc-wizard-storefront-feature__accessibility::before{content:'👓'}.wc-wizard-storefront .wc-wizard-storefront-feature__search::before{content:'🔍'}.wc-wizard-storefront .wc-wizard-storefront-feature__compatibility::before{content:'🔧'}.wc-wizard-storefront .wc-wizard-storefront-feature__extendable::before{content:'🎨'}.wc-wizard-services{border:1px solid #eee;padding:0;margin:0 0 1em;list-style:none outside;border-radius:4px;overflow:hidden}.wc-wizard-services p{margin:0 0 1em 0;padding:0;font-size:1em;line-height:1.5em}.wc-wizard-service-item,.wc-wizard-services-list-toggle{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:0;border-bottom:1px solid #eee;color:#666;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.wc-wizard-service-item:last-child,.wc-wizard-services-list-toggle:last-child{border-bottom:0}.wc-wizard-service-item .payment-gateway-fee,.wc-wizard-services-list-toggle .payment-gateway-fee{color:#a6a6a6}.wc-wizard-service-item .wc-wizard-service-name,.wc-wizard-services-list-toggle .wc-wizard-service-name{-ms-flex-preferred-size:0;flex-basis:0;min-width:160px;text-align:center;font-weight:700;padding:2em 0;-ms-flex-item-align:stretch;align-self:stretch;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.wc-wizard-payment-gateway-form .wc-wizard-service-item .wc-wizard-service-name,.wc-wizard-payment-gateway-form .wc-wizard-services-list-toggle .wc-wizard-service-name{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.wc-wizard-service-item .wc-wizard-service-name img,.wc-wizard-services-list-toggle .wc-wizard-service-name img{max-width:75px}.wc-wizard-service-item.stripe-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.stripe-logo .wc-wizard-service-name img{padding:8px 0}.wc-wizard-service-item.paypal-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.paypal-logo .wc-wizard-service-name img{max-width:87px;padding:2px 0}.wc-wizard-service-item.klarna-logo .wc-wizard-service-name,.wc-wizard-services-list-toggle.klarna-logo .wc-wizard-service-name{background:#000}.wc-wizard-service-item.klarna-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.klarna-logo .wc-wizard-service-name img{max-width:87px;padding:12px 0}.wc-wizard-service-item.square-logo .wc-wizard-service-name,.wc-wizard-services-list-toggle.square-logo .wc-wizard-service-name{background:#000}.wc-wizard-service-item.square-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.square-logo .wc-wizard-service-name img{max-width:95px;padding:12px 0}.wc-wizard-service-item.eway-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.eway-logo .wc-wizard-service-name img{max-width:87px}.wc-wizard-service-item.payfast-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.payfast-logo .wc-wizard-service-name img{max-width:140px}.wc-wizard-service-item .wc-wizard-service-description,.wc-wizard-services-list-toggle .wc-wizard-service-description{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;padding:20px}.wc-wizard-service-item .wc-wizard-service-description p,.wc-wizard-services-list-toggle .wc-wizard-service-description p{margin-bottom:1em}.wc-wizard-service-item .wc-wizard-service-description p:last-child,.wc-wizard-services-list-toggle .wc-wizard-service-description p:last-child{margin-bottom:0}.wc-wizard-service-item .wc-wizard-service-description .wc-wizard-service-settings-description,.wc-wizard-services-list-toggle .wc-wizard-service-description .wc-wizard-service-settings-description{display:block;font-style:italic;color:#999}.wc-wizard-service-item .wc-wizard-service-enable,.wc-wizard-services-list-toggle .wc-wizard-service-enable{-ms-flex-preferred-size:0;flex-basis:0;min-width:75px;text-align:center;cursor:pointer;padding:2em 0;position:relative;max-height:1.5em;-ms-flex-item-align:start;align-self:flex-start}.wc-wizard-service-item .wc-wizard-service-toggle,.wc-wizard-services-list-toggle .wc-wizard-service-toggle{height:16px;width:32px;border:2px solid #935687;background-color:#935687;display:inline-block;text-indent:-9999px;border-radius:10em;position:relative}.wc-wizard-service-item .wc-wizard-service-toggle input[type=checkbox],.wc-wizard-services-list-toggle .wc-wizard-service-toggle input[type=checkbox]{display:none}.wc-wizard-service-item .wc-wizard-service-toggle:before,.wc-wizard-services-list-toggle .wc-wizard-service-toggle:before{content:"";display:block;width:16px;height:16px;background:#fff;position:absolute;top:0;left:0;border-radius:100%}.wc-wizard-service-item .wc-wizard-service-toggle.disabled,.wc-wizard-services-list-toggle .wc-wizard-service-toggle.disabled{border-color:#999;background-color:#999}.wc-wizard-service-item .wc-wizard-service-toggle.disabled:before,.wc-wizard-services-list-toggle .wc-wizard-service-toggle.disabled:before{left:auto;right:0}.wc-wizard-service-item .wc-wizard-service-settings,.wc-wizard-services-list-toggle .wc-wizard-service-settings{display:none;margin-top:.75em;margin-bottom:0;cursor:default}.wc-wizard-service-item .wc-wizard-service-settings.hide,.wc-wizard-services-list-toggle .wc-wizard-service-settings.hide{display:none}.wc-wizard-service-item.checked .wc-wizard-service-settings,.wc-wizard-services-list-toggle.checked .wc-wizard-service-settings{display:inline-block}.wc-wizard-service-item.checked .wc-wizard-service-settings.hide,.wc-wizard-services-list-toggle.checked .wc-wizard-service-settings.hide{display:none}.wc-wizard-service-item.closed,.wc-wizard-services-list-toggle.closed{border-bottom:0}.wc-wizard-services-list-toggle{cursor:pointer}.wc-wizard-services-list-toggle .wc-wizard-service-enable::before{content:"\f343";font-family:dashicons;visibility:initial;color:#666;font-size:25px;margin-top:-7px;margin-right:-5px;position:absolute;visibility:visible}.wc-wizard-services-list-toggle.closed .wc-wizard-service-enable::before{content:"\f347"}.wc-wizard-services-list-toggle .wc-wizard-service-enable input{visibility:hidden;position:relative}.wc-wizard-services.manual .wc-wizard-service-item{display:none}.wc-wizard-services.shipping .wc-wizard-service-name{font-weight:400;text-align:right;-webkit-box-align:center;-ms-flex-align:center;align-items:center;max-height:5em;padding:0}.wc-wizard-services.shipping .wc-wizard-service-item{padding-right:2em;padding-top:.67em}.wc-wizard-services.shipping .wc-wizard-service-item:first-child{border-bottom:0;padding-bottom:0;font-weight:700}.wc-wizard-services.shipping .wc-wizard-service-item:first-child .wc-wizard-service-name{font-weight:700}.wc-wizard-services.shipping .shipping-method-setting,.wc-wizard-services.shipping .wc-wizard-shipping-method-select{display:-webkit-box;display:-ms-flexbox;display:flex}.wc-wizard-services.shipping .shipping-method-setting.hide,.wc-wizard-services.shipping .wc-wizard-shipping-method-select.hide{display:none}.wc-wizard-services.shipping .shipping-method-setting input,.wc-wizard-services.shipping .wc-wizard-shipping-method-dropdown{margin-left:2em;margin-bottom:1em}.wc-wizard-services.shipping .shipping-method-setting input .select2,.wc-wizard-services.shipping .wc-wizard-shipping-method-dropdown .select2{min-width:130px}.wc-wizard-services.shipping .wc-wizard-service-description{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;color:#a6a6a6}.wc-wizard-services.shipping .wc-wizard-service-item:not(:first-child) .wc-wizard-service-description{font-size:.92em;padding-bottom:10px}.wc-wizard-services.shipping .shipping-method-setting input{width:95px;border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:28px;padding-right:8px;padding-left:24px;font-size:14px;color:#444;background-color:#fff;display:inline-block}.wc-wizard-services.shipping .shipping-method-description,.wc-wizard-services.shipping .shipping-method-setting .description{color:#7e7e7e;font-size:.9em}.wc-wizard-services.shipping .shipping-method-setting input::-webkit-input-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input::-moz-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input:-ms-input-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input::-ms-input-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input::placeholder{color:#e1e1e1}.wc-setup-shipping-units p{line-height:1.5em;font-size:13px;margin-bottom:.25em}.wc-setup-shipping-units .wc-setup-shipping-unit{margin-bottom:1.75em}.wc-setup-shipping-units .wc-setup-shipping-unit .select2{min-width:100%}.hide{display:none}.wc-wizard-features{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;padding:0}.wc-wizard-features .wc-wizard-feature-item{-ms-flex-preferred-size:calc(50% - 4em - 3px);flex-basis:calc(50% - 4em - 3px);border:1px solid #eee;padding:2em}.wc-wizard-features .wc-wizard-feature-item:nth-child(1){border-radius:0 4px 0 0}.wc-wizard-features .wc-wizard-feature-item:nth-child(2){border-right:0;border-radius:4px 0 0 0}.wc-wizard-features .wc-wizard-feature-item:nth-child(3){border-top:0;border-radius:0 0 4px 0}.wc-wizard-features .wc-wizard-feature-item:nth-child(4){border-top:0;border-right:0;border-radius:0 0 0 4px}.wc-wizard-features p.wc-wizard-feature-description,.wc-wizard-features p.wc-wizard-feature-name{margin:0;line-height:1.5em}h3.jetpack-reasons{text-align:center;margin:3em 0 1em 0;font-size:14px}.jetpack-logo,.wcs-notice{display:block;margin:1.75em auto 2em auto;max-height:175px}.activate-splash .jetpack-logo{width:170px;margin-bottom:0}.activate-splash .wcs-notice{margin-top:1em;padding-right:57px}.step{text-align:center}.wc-setup .wc-setup-actions .button{font-weight:300;font-size:16px;padding:1em 2em;box-shadow:none;min-width:12em;min-width:auto;margin-top:10px}.wc-setup .wc-setup-actions .button:active,.wc-setup .wc-setup-actions .button:focus,.wc-setup .wc-setup-actions .button:hover{box-shadow:none}.wc-setup .wc-setup-actions .plugin-install-info{display:block;font-style:italic;color:#999;font-size:14px;line-height:1.5em;margin:5px 0}.wc-setup .wc-setup-actions .plugin-install-info>*{display:block}.wc-setup .wc-setup-actions .plugin-install-info .plugin-install-info-list-item:not(:last-child)::after{content:', '}.wc-setup .wc-setup-actions .plugin-install-info a{white-space:nowrap}.wc-setup .wc-setup-actions .plugin-install-info a:not(:hover):not(:focus){color:inherit}.plugin-install-source{background:rgba(187,119,174,.15)}.plugin-install-source:not(.wc-wizard-service-item){box-shadow:0 0 0 10px rgba(187,119,174,.15)}.location-prompt{color:#666;font-size:13px;font-weight:500;margin-bottom:.5em;margin-top:.85em;display:inline-block}.location-input{border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:30px;width:calc(100% - 8px - 24px - 2px);padding-right:8px;padding-left:24px;font-size:16px;color:#444;background-color:#fff;display:inline-block}.location-input.dropdown{width:100%}.address-step .select2{min-width:100%}.store-address-container .city-and-postcode{display:-webkit-box;display:-ms-flexbox;display:flex}.store-address-container .city-and-postcode div{-ms-flex-preferred-size:50%;flex-basis:50%;margin-left:1em}.store-address-container .city-and-postcode div:last-of-type{margin-left:0}.store-address-container .select2-container,.store-address-container input[type=text],.store-address-container select{margin-bottom:10px}.product-type-container{margin-top:14px;margin-bottom:1px}#woocommerce_sell_in_person{margin-right:0}.wc-wizard-service-settings .payment-email-input{border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:30px;padding:0 8px;font-size:14px;color:#444;background-color:#fff;display:inline-block}.newsletter-form-container{display:-webkit-box;display:-ms-flexbox;display:flex}.newsletter-form-container .newsletter-form-email{border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:42px;padding:0 8px;font-size:16px;color:#666;background-color:#fff;display:inline-block;margin-left:6px;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.newsletter-form-container .newsletter-form-button-container{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0}.wc-setup .wc-setup-actions .button.newsletter-form-button{height:42px;padding:0 1em;margin:0}.wc-wizard-next-steps{border:1px solid #eee;border-radius:4px;list-style:none;padding:0}.wc-wizard-next-steps li{padding:0}.wc-wizard-next-steps .wc-wizard-next-step-item{display:-webkit-box;display:-ms-flexbox;display:flex;border-top:1px solid #eee}.wc-wizard-next-steps .wc-wizard-next-step-item:first-child{border-top:0}.wc-wizard-next-steps .wc-wizard-next-step-description{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;margin:1.5em}.wc-wizard-next-steps .wc-wizard-next-step-action{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.wc-wizard-next-steps .wc-wizard-next-step-action .button{margin:1em 1.5em}.wc-wizard-next-steps p.next-step-heading{margin:0;font-size:.95em;font-weight:400;font-variant:all-petite-caps}.wc-wizard-next-steps p.next-step-extra-info{margin:0}.wc-wizard-next-steps h3.next-step-description{margin:0;font-size:16px;font-weight:600}.wc-wizard-next-steps .wc-wizard-additional-steps{border-top:1px solid #eee}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-wizard-next-step-description{margin-bottom:0}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-setup-actions{margin:0 0 1.5em 0}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-setup-actions .button{font-size:15px;margin:1em 1.5em 1em 0}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-setup-actions .button::last-child{margin-left:1.5em}p.next-steps-help-text{color:#9f9f9f;padding:0 2em;text-align:center;font-size:.9em}p.jetpack-terms{font-size:.8em;text-align:center;max-width:480px;margin:0 auto;line-height:1.5em}.woocommerce-error{background:#ffe6e5;border-color:#ffc5c2;padding:1em;margin-bottom:1em}.woocommerce-error p{margin-top:0;margin-bottom:.5em;color:#444}.woocommerce-error a{color:#ff645c}.woocommerce-error .reconnect-reminder{font-size:.85em}.woocommerce-error .wc-setup-actions .button{font-size:14px}.wc-wizard-service-setting-ppec_paypal_reroute_requests,.wc-wizard-service-setting-stripe_create_account{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.wc-wizard-service-setting-ppec_paypal_reroute_requests .payment-checkbox-input,.wc-wizard-service-setting-stripe_create_account .payment-checkbox-input{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1;margin-top:5px;margin-right:0;margin-left:0;width:1.5em}.wc-wizard-service-setting-ppec_paypal_reroute_requests .ppec_paypal_reroute_requests,.wc-wizard-service-setting-ppec_paypal_reroute_requests .stripe_create_account,.wc-wizard-service-setting-stripe_create_account .ppec_paypal_reroute_requests,.wc-wizard-service-setting-stripe_create_account .stripe_create_account{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;margin-right:.3em}.wc-wizard-service-setting-ppec_paypal_email,.wc-wizard-service-setting-stripe_email{margin-top:.75em;margin-right:1.5em}.wc-wizard-service-setting-ppec_paypal_email label.ppec_paypal_email,.wc-wizard-service-setting-ppec_paypal_email label.stripe_email,.wc-wizard-service-setting-stripe_email label.ppec_paypal_email,.wc-wizard-service-setting-stripe_email label.stripe_email{position:absolute;margin:-1px;padding:0;height:1px;width:1px;overflow:hidden;clip:rect(0 0 0 0);border:0}.wc-wizard-service-setting-ppec_paypal_email input.payment-email-input,.wc-wizard-service-setting-stripe_email input.payment-email-input{box-sizing:border-box;margin-bottom:.5em;width:100%;height:32px}.wc-setup-content .recommended-step{border:1px solid #ebebeb;border-radius:4px;padding:2.5em}.wc-setup-content .recommended-step li{list-style:none}.wc-setup-content .recommended-step li:last-child label{margin-bottom:0}.wc-setup-content .recommended-step label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:1.5em}.wc-setup-content .recommended-step label:after,.wc-setup-content .recommended-step label:before{top:auto}.wc-setup-content .recommended-step label:after{margin-top:-1.5px}.wc-setup-content .recommended-step .recommended-item-icon{border:1px solid #fff;border-radius:7px;height:3.5em;margin-left:1em;margin-right:4px}.wc-setup-content .recommended-step .recommended-item-icon.recommended-item-icon-storefront_theme{background-color:#f4a224;max-height:3em;max-width:3em;padding:.25em}.wc-setup-content .recommended-step .recommended-item-icon.recommended-item-icon-automated_taxes{background-color:#d0011b;max-height:1.75em;padding:.875em}.wc-setup-content .recommended-step .recommended-item-icon.recommended-item-icon-mailchimp{background-color:#209bbb;height:2em;padding:.75em}.wc-setup-content .recommended-step .recommended-item-description-container h3{font-size:15px;font-weight:700;letter-spacing:.5px;margin-bottom:0}.wc-setup-content .recommended-step .recommended-item-description-container p{margin-top:0;line-height:1.5em} \ No newline at end of file diff --git a/assets/css/wc-setup.css b/assets/css/wc-setup.css index ecf20a2ee18..b5277b9f892 100644 --- a/assets/css/wc-setup.css +++ b/assets/css/wc-setup.css @@ -1 +1 @@ -@charset "UTF-8";body{margin:65px auto 24px;-webkit-box-shadow:none;box-shadow:none;background:#f1f1f1;padding:0}#wc-logo{border:0;margin:0 0 24px;padding:0;text-align:center}#wc-logo img{max-width:30%}.wc-setup{text-align:center}.wc-setup .select2-container{text-align:left}.wc-setup .hidden{display:none}.wc-setup-content{-webkit-box-shadow:0 1px 3px rgba(0,0,0,.13);box-shadow:0 1px 3px rgba(0,0,0,.13);padding:2em;margin:0 0 20px;background:#fff;overflow:hidden;zoom:1;text-align:left}.wc-setup-content h1,.wc-setup-content h2,.wc-setup-content h3,.wc-setup-content table{margin:0 0 20px;border:0;padding:0;color:#666;clear:none;font-weight:500}.wc-setup-content p{margin:20px 0;font-size:1em;line-height:1.75em;color:#666}.wc-setup-content table{font-size:1em;line-height:1.75em;color:#666}.wc-setup-content a{color:#a16696}.wc-setup-content a:focus,.wc-setup-content a:hover{color:#111}.wc-setup-content .form-table th{width:35%;vertical-align:top;font-weight:400}.wc-setup-content .form-table td{vertical-align:top}.wc-setup-content .form-table td input,.wc-setup-content .form-table td select{width:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.wc-setup-content .form-table td input[size]{width:auto}.wc-setup-content .form-table td .description{line-height:1.5em;display:block;margin-top:.25em;color:#999;font-style:italic}.wc-setup-content .form-table td .input-checkbox,.wc-setup-content .form-table td .input-radio{width:auto;-webkit-box-sizing:inherit;box-sizing:inherit;padding:inherit;margin:0 .5em 0 0;-webkit-box-shadow:none;box-shadow:none}.wc-setup-content .form-table .section_title td{padding:0}.wc-setup-content .form-table .section_title td h2,.wc-setup-content .form-table .section_title td p{margin:12px 0 0}.wc-setup-content .form-table td,.wc-setup-content .form-table th{padding:12px 0;margin:0;border:0}.wc-setup-content .form-table td:first-child,.wc-setup-content .form-table th:first-child{padding-right:1em}.wc-setup-content table.tax-rates{width:100%;font-size:.92em}.wc-setup-content table.tax-rates th{padding:0;text-align:center;width:auto;vertical-align:middle}.wc-setup-content table.tax-rates td{border:1px solid #f5f5f5;padding:6px;text-align:center;vertical-align:middle}.wc-setup-content table.tax-rates td input{outline:0;border:0;padding:0;-webkit-box-shadow:none;box-shadow:none;text-align:center;width:100%}.wc-setup-content table.tax-rates td.sort{cursor:move;color:#ccc}.wc-setup-content table.tax-rates td.sort::before{content:'\f333';font-family:dashicons}.wc-setup-content table.tax-rates td.readonly{background:#f5f5f5}.wc-setup-content table.tax-rates .add{padding:1em 0 0 1em;line-height:1em;font-size:1em;width:0;margin:6px 0 0;height:0;overflow:hidden;position:relative;display:inline-block}.wc-setup-content table.tax-rates .add::before{content:'\f502';font-family:dashicons;position:absolute;left:0;top:0}.wc-setup-content table.tax-rates .remove{padding:1em 0 0 1em;line-height:1em;font-size:1em;width:0;margin:0;height:0;overflow:hidden;position:relative;display:inline-block}.wc-setup-content table.tax-rates .remove::before{content:'\f182';font-family:dashicons;position:absolute;left:0;top:0}.wc-setup-content .wc-setup-pages{width:100%;border-top:1px solid #eee}.wc-setup-content .wc-setup-pages thead th{display:none}.wc-setup-content .wc-setup-pages .page-name{width:30%;font-weight:700}.wc-setup-content .wc-setup-pages td,.wc-setup-content .wc-setup-pages th{padding:14px 0;border-bottom:1px solid #eee}.wc-setup-content .wc-setup-pages td:first-child,.wc-setup-content .wc-setup-pages th:first-child{padding-right:9px}.wc-setup-content .wc-setup-pages th{padding-top:0}.wc-setup-content .wc-setup-pages .page-options p{color:#777;margin:6px 0 0 24px;line-height:1.75em}.wc-setup-content .wc-setup-pages .page-options p input{vertical-align:middle;margin:1px 0 0;height:1.75em;width:1.75em;line-height:1.75em}.wc-setup-content .wc-setup-pages .page-options p label{line-height:1}@media screen and (max-width:782px){.wc-setup-content .form-table tbody th{width:auto}}.wc-setup-content .twitter-share-button{float:right}.wc-setup-content .wc-setup-next-steps{overflow:hidden;margin:0 0 24px;padding-bottom:2px}.wc-setup-content .wc-setup-next-steps h2{margin-bottom:12px}.wc-setup-content .wc-setup-next-steps .wc-setup-next-steps-first{float:left;width:50%;-webkit-box-sizing:border-box;box-sizing:border-box}.wc-setup-content .wc-setup-next-steps .wc-setup-next-steps-last{float:right;width:50%;-webkit-box-sizing:border-box;box-sizing:border-box}.wc-setup-content .wc-setup-next-steps ul{padding:0 2em 0 0;list-style:none outside;margin:0}.wc-setup-content .wc-setup-next-steps ul li a{display:block;padding:0 0 .75em}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button{background-color:#f7f7f7;border-color:#ccc;color:#23282d;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #ccc;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #ccc;text-shadow:1px 0 1px #eee,0 1px 1px #eee;font-size:1em;height:auto;line-height:1.75em;margin:0 0 .75em;opacity:1;padding:1em;text-align:center}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button:active,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button:focus,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button:hover{background:#f5f5f5;border-color:#aaa}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary{color:#fff;background-color:#bb77ae;border-color:#a36597;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;text-shadow:0 -1px 1px #a36597,1px 0 1px #a36597,0 1px 1px #a36597,-1px 0 1px #a36597}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary:active,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary:focus,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary:hover{color:#fff;background:#a36597;border-color:#a36597;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.wc-setup-content .wc-setup-next-steps ul li a::before{color:#82878c;font:normal 20px/1 dashicons;speak:none;display:inline-block;padding:0 10px 0 0;top:1px;position:relative;text-decoration:none!important;vertical-align:top}.wc-setup-content .wc-setup-next-steps ul .learn-more a::before{content:'\f105'}.wc-setup-content .wc-setup-next-steps ul .video-walkthrough a::before{content:'\f126'}.wc-setup-content .wc-setup-next-steps ul .newsletter a::before{content:'\f465'}.wc-setup-content .updated,.wc-setup-content .woocommerce-newsletter{padding:24px 24px 0;margin:0 0 24px;overflow:hidden;background:#f5f5f5}.wc-setup-content .updated p,.wc-setup-content .woocommerce-newsletter p{padding:0;margin:0 0 12px}.wc-setup-content .updated form,.wc-setup-content .updated p:last-child,.wc-setup-content .woocommerce-newsletter form,.wc-setup-content .woocommerce-newsletter p:last-child{margin:0 0 24px}.wc-setup-content .woocommerce-tracker{margin:24px 0;border:1px solid #eee;padding:20px;border-radius:4px;overflow:hidden}.wc-setup-content .woocommerce-tracker p{font-size:14px;line-height:1.5em}.wc-setup-content .woocommerce-tracker .checkbox{line-height:24px;font-weight:500;font-size:1em;margin-top:0;margin-bottom:20px}.wc-setup-content .checkbox input[type=checkbox]{opacity:0;position:absolute;left:-9999px}.wc-setup-content .checkbox label{position:relative;display:inline-block;padding-left:28px}.wc-setup-content .checkbox label:after,.wc-setup-content .checkbox label:before{position:absolute;content:"";display:inline-block}.wc-setup-content .checkbox label:before{height:16px;width:16px;left:0;top:3px;border:1px solid #aaa;background-color:#fff;border-radius:3px}.wc-setup-content .checkbox label:after{height:5px;width:9px;border-left:2px solid;border-bottom:2px solid;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg);left:4px;top:7px;color:#fff}.wc-setup-content .checkbox input[type=checkbox]+label::after{content:none}.wc-setup-content .checkbox input[type=checkbox]:checked+label::after{content:""}.wc-setup-content .checkbox input[type=checkbox]:focus+label::before{outline:#3b99fc auto 5px}.wc-setup-content .checkbox input[type=checkbox]:checked+label::before{background:#935687;border-color:#935687}.wc-setup-steps{padding:0 0 24px;margin:0;list-style:none outside;overflow:hidden;color:#ccc;width:100%;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex}.wc-setup-steps li{width:100%;float:left;padding:0 0 .8em;margin:0;text-align:center;position:relative;border-bottom:4px solid #ccc;line-height:1.4em}.wc-setup-steps li a{color:#a16696;text-decoration:none;padding:1.5em;margin:-1.5em;position:relative;z-index:1}.wc-setup-steps li a:focus,.wc-setup-steps li a:hover{color:#111;text-decoration:underline}.wc-setup-steps li::before{content:'';border:4px solid #ccc;border-radius:100%;width:4px;height:4px;position:absolute;bottom:0;left:50%;margin-left:-6px;margin-bottom:-8px;background:#fff}.wc-setup-steps li.active{border-color:#a16696;color:#a16696;font-weight:700}.wc-setup-steps li.active::before{border-color:#a16696}.wc-setup-steps li.done{border-color:#a16696;color:#a16696}.wc-setup-steps li.done::before{border-color:#a16696;background:#a16696}.wc-setup .wc-setup-actions{overflow:hidden;margin:20px 0 0;position:relative}.wc-setup .wc-setup-actions .button{font-size:1.25em;padding:.5em 1em;line-height:1em;margin-right:.5em;margin-bottom:2px;height:auto;border-radius:4px}.wc-setup .wc-setup-actions .button-primary{background-color:#bb77ae;border-color:#a36597;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;text-shadow:0 -1px 1px #a36597,1px 0 1px #a36597,0 1px 1px #a36597,-1px 0 1px #a36597;margin:0;opacity:1}.wc-setup .wc-setup-actions .button-primary:active,.wc-setup .wc-setup-actions .button-primary:focus,.wc-setup .wc-setup-actions .button-primary:hover{background:#a36597;border-color:#a36597;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.wc-setup-content p:last-child{margin-bottom:0}.wc-setup-content p.store-setup{margin-top:0}.wc-setup-footer-links{font-size:.85em;color:#7b7b7b;margin:1.18em auto;display:inline-block;text-align:center}.wc-wizard-storefront .wc-wizard-storefront-intro{padding:40px 40px 0;background:#f5f5f5;text-align:center}.wc-wizard-storefront .wc-wizard-storefront-intro img{margin:40px 0 0 0;width:100%;display:block}.wc-wizard-storefront .wc-wizard-storefront-features{list-style:none outside;margin:0 0 20px;padding:0 0 0 30px;overflow:hidden}.wc-wizard-storefront .wc-wizard-storefront-feature{margin:0;padding:20px 30px 20px 2em;width:50%;-webkit-box-sizing:border-box;box-sizing:border-box}.wc-wizard-storefront .wc-wizard-storefront-feature::before{margin-left:-2em;position:absolute}.wc-wizard-storefront .wc-wizard-storefront-feature.first{clear:both;float:left}.wc-wizard-storefront .wc-wizard-storefront-feature.last{float:right}.wc-wizard-storefront .wc-wizard-storefront-feature__bulletproof::before{content:'🔒'}.wc-wizard-storefront .wc-wizard-storefront-feature__mobile::before{content:'📱'}.wc-wizard-storefront .wc-wizard-storefront-feature__accessibility::before{content:'👓'}.wc-wizard-storefront .wc-wizard-storefront-feature__search::before{content:'🔍'}.wc-wizard-storefront .wc-wizard-storefront-feature__compatibility::before{content:'🔧'}.wc-wizard-storefront .wc-wizard-storefront-feature__extendable::before{content:'🎨'}.wc-wizard-services{border:1px solid #eee;padding:0;margin:0 0 1em;list-style:none outside;border-radius:4px;overflow:hidden}.wc-wizard-services p{margin:0 0 1em 0;padding:0;font-size:1em;line-height:1.5em}.wc-wizard-service-item,.wc-wizard-services-list-toggle{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:0;border-bottom:1px solid #eee;color:#666;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.wc-wizard-service-item:last-child,.wc-wizard-services-list-toggle:last-child{border-bottom:0}.wc-wizard-service-item .payment-gateway-fee,.wc-wizard-services-list-toggle .payment-gateway-fee{color:#a6a6a6}.wc-wizard-service-item .wc-wizard-service-name,.wc-wizard-services-list-toggle .wc-wizard-service-name{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;min-width:160px;text-align:center;font-weight:700;padding:2em 0;-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:baseline;-webkit-align-items:baseline;-ms-flex-align:baseline;align-items:baseline}.wc-wizard-payment-gateway-form .wc-wizard-service-item .wc-wizard-service-name,.wc-wizard-payment-gateway-form .wc-wizard-services-list-toggle .wc-wizard-service-name{-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.wc-wizard-service-item .wc-wizard-service-name img,.wc-wizard-services-list-toggle .wc-wizard-service-name img{max-width:75px}.wc-wizard-service-item.stripe-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.stripe-logo .wc-wizard-service-name img{padding:8px 0}.wc-wizard-service-item.paypal-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.paypal-logo .wc-wizard-service-name img{max-width:87px;padding:2px 0}.wc-wizard-service-item.klarna-logo .wc-wizard-service-name,.wc-wizard-services-list-toggle.klarna-logo .wc-wizard-service-name{background:#000}.wc-wizard-service-item.klarna-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.klarna-logo .wc-wizard-service-name img{max-width:87px;padding:12px 0}.wc-wizard-service-item.square-logo .wc-wizard-service-name,.wc-wizard-services-list-toggle.square-logo .wc-wizard-service-name{background:#000}.wc-wizard-service-item.square-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.square-logo .wc-wizard-service-name img{max-width:95px;padding:12px 0}.wc-wizard-service-item.eway-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.eway-logo .wc-wizard-service-name img{max-width:87px}.wc-wizard-service-item.payfast-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.payfast-logo .wc-wizard-service-name img{max-width:140px}.wc-wizard-service-item .wc-wizard-service-description,.wc-wizard-services-list-toggle .wc-wizard-service-description{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:20px}.wc-wizard-service-item .wc-wizard-service-description p,.wc-wizard-services-list-toggle .wc-wizard-service-description p{margin-bottom:1em}.wc-wizard-service-item .wc-wizard-service-description p:last-child,.wc-wizard-services-list-toggle .wc-wizard-service-description p:last-child{margin-bottom:0}.wc-wizard-service-item .wc-wizard-service-description .wc-wizard-service-settings-description,.wc-wizard-services-list-toggle .wc-wizard-service-description .wc-wizard-service-settings-description{display:block;font-style:italic;color:#999}.wc-wizard-service-item .wc-wizard-service-enable,.wc-wizard-services-list-toggle .wc-wizard-service-enable{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;min-width:75px;text-align:center;cursor:pointer;padding:2em 0;position:relative;max-height:1.5em;-webkit-align-self:flex-start;-ms-flex-item-align:start;align-self:flex-start}.wc-wizard-service-item .wc-wizard-service-toggle,.wc-wizard-services-list-toggle .wc-wizard-service-toggle{height:16px;width:32px;border:2px solid #935687;background-color:#935687;display:inline-block;text-indent:-9999px;border-radius:10em;position:relative}.wc-wizard-service-item .wc-wizard-service-toggle input[type=checkbox],.wc-wizard-services-list-toggle .wc-wizard-service-toggle input[type=checkbox]{display:none}.wc-wizard-service-item .wc-wizard-service-toggle:before,.wc-wizard-services-list-toggle .wc-wizard-service-toggle:before{content:"";display:block;width:16px;height:16px;background:#fff;position:absolute;top:0;right:0;border-radius:100%}.wc-wizard-service-item .wc-wizard-service-toggle.disabled,.wc-wizard-services-list-toggle .wc-wizard-service-toggle.disabled{border-color:#999;background-color:#999}.wc-wizard-service-item .wc-wizard-service-toggle.disabled:before,.wc-wizard-services-list-toggle .wc-wizard-service-toggle.disabled:before{right:auto;left:0}.wc-wizard-service-item .wc-wizard-service-settings,.wc-wizard-services-list-toggle .wc-wizard-service-settings{display:none;margin-top:.75em;margin-bottom:0;cursor:default}.wc-wizard-service-item .wc-wizard-service-settings.hide,.wc-wizard-services-list-toggle .wc-wizard-service-settings.hide{display:none}.wc-wizard-service-item.checked .wc-wizard-service-settings,.wc-wizard-services-list-toggle.checked .wc-wizard-service-settings{display:inline-block}.wc-wizard-service-item.checked .wc-wizard-service-settings.hide,.wc-wizard-services-list-toggle.checked .wc-wizard-service-settings.hide{display:none}.wc-wizard-service-item.closed,.wc-wizard-services-list-toggle.closed{border-bottom:0}.wc-wizard-services-list-toggle{cursor:pointer}.wc-wizard-services-list-toggle .wc-wizard-service-enable::before{content:"\f343";font-family:dashicons;visibility:initial;color:#666;font-size:25px;margin-top:-7px;margin-left:-5px;position:absolute;visibility:visible}.wc-wizard-services-list-toggle.closed .wc-wizard-service-enable::before{content:"\f347"}.wc-wizard-services-list-toggle .wc-wizard-service-enable input{visibility:hidden;position:relative}.wc-wizard-services.manual .wc-wizard-service-item{display:none}.wc-wizard-services.shipping .wc-wizard-service-name{font-weight:400;text-align:left;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;max-height:5em;padding:0}.wc-wizard-services.shipping .wc-wizard-service-item{padding-left:2em;padding-top:.67em}.wc-wizard-services.shipping .wc-wizard-service-item:first-child{border-bottom:0;padding-bottom:0;font-weight:700}.wc-wizard-services.shipping .wc-wizard-service-item:first-child .wc-wizard-service-name{font-weight:700}.wc-wizard-services.shipping .shipping-method-setting,.wc-wizard-services.shipping .wc-wizard-shipping-method-select{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wc-wizard-services.shipping .shipping-method-setting.hide,.wc-wizard-services.shipping .wc-wizard-shipping-method-select.hide{display:none}.wc-wizard-services.shipping .shipping-method-setting input,.wc-wizard-services.shipping .wc-wizard-shipping-method-dropdown{margin-right:2em;margin-bottom:1em}.wc-wizard-services.shipping .shipping-method-setting input .select2,.wc-wizard-services.shipping .wc-wizard-shipping-method-dropdown .select2{min-width:130px}.wc-wizard-services.shipping .wc-wizard-service-description{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;color:#a6a6a6}.wc-wizard-services.shipping .wc-wizard-service-item:not(:first-child) .wc-wizard-service-description{font-size:.92em;padding-bottom:10px}.wc-wizard-services.shipping .shipping-method-setting input{width:95px;border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:28px;padding-left:8px;padding-right:24px;font-size:14px;color:#444;background-color:#fff;display:inline-block}.wc-wizard-services.shipping .shipping-method-description,.wc-wizard-services.shipping .shipping-method-setting .description{color:#7e7e7e;font-size:.9em}.wc-wizard-services.shipping .shipping-method-setting input::-webkit-input-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input::-moz-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input:-ms-input-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input::-ms-input-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input::placeholder{color:#e1e1e1}.wc-setup-shipping-units p{line-height:1.5em;font-size:13px;margin-bottom:.25em}.wc-setup-shipping-units .wc-setup-shipping-unit{margin-bottom:1.75em}.wc-setup-shipping-units .wc-setup-shipping-unit .select2{min-width:100%}.hide{display:none}.wc-wizard-features{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;padding:0}.wc-wizard-features .wc-wizard-feature-item{-webkit-flex-basis:calc(50% - 4em - 3px);-ms-flex-preferred-size:calc(50% - 4em - 3px);flex-basis:calc(50% - 4em - 3px);border:1px solid #eee;padding:2em}.wc-wizard-features .wc-wizard-feature-item:nth-child(1){border-radius:4px 0 0 0}.wc-wizard-features .wc-wizard-feature-item:nth-child(2){border-left:0;border-radius:0 4px 0 0}.wc-wizard-features .wc-wizard-feature-item:nth-child(3){border-top:0;border-radius:0 0 0 4px}.wc-wizard-features .wc-wizard-feature-item:nth-child(4){border-top:0;border-left:0;border-radius:0 0 4px 0}.wc-wizard-features p.wc-wizard-feature-description,.wc-wizard-features p.wc-wizard-feature-name{margin:0;line-height:1.5em}h3.jetpack-reasons{text-align:center;margin:3em 0 1em 0;font-size:14px}.jetpack-logo,.wcs-notice{display:block;margin:1.75em auto 2em auto;max-height:175px}.activate-splash .jetpack-logo{width:170px;margin-bottom:0}.activate-splash .wcs-notice{margin-top:1em;padding-left:57px}.step{text-align:center}.wc-setup .wc-setup-actions .button{font-weight:300;font-size:16px;padding:1em 2em;-webkit-box-shadow:none;box-shadow:none;min-width:12em;min-width:auto;margin-top:10px}.wc-setup .wc-setup-actions .button:active,.wc-setup .wc-setup-actions .button:focus,.wc-setup .wc-setup-actions .button:hover{-webkit-box-shadow:none;box-shadow:none}.wc-setup .wc-setup-actions .plugin-install-info{display:block;font-style:italic;color:#999;font-size:14px;line-height:1.5em;margin:5px 0}.wc-setup .wc-setup-actions .plugin-install-info>*{display:block}.wc-setup .wc-setup-actions .plugin-install-info .plugin-install-info-list-item:not(:last-child)::after{content:', '}.wc-setup .wc-setup-actions .plugin-install-info a{white-space:nowrap}.wc-setup .wc-setup-actions .plugin-install-info a:not(:hover):not(:focus){color:inherit}.plugin-install-source{background:rgba(187,119,174,.15)}.plugin-install-source:not(.wc-wizard-service-item){-webkit-box-shadow:0 0 0 10px rgba(187,119,174,.15);box-shadow:0 0 0 10px rgba(187,119,174,.15)}.location-prompt{color:#666;font-size:13px;font-weight:500;margin-bottom:.5em;margin-top:.85em;display:inline-block}.location-input{border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:30px;width:calc(100% - 8px - 24px - 2px);padding-left:8px;padding-right:24px;font-size:16px;color:#444;background-color:#fff;display:inline-block}.location-input.dropdown{width:100%}.address-step .select2{min-width:100%}.store-address-container .city-and-postcode{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.store-address-container .city-and-postcode div{-webkit-flex-basis:50%;-ms-flex-preferred-size:50%;flex-basis:50%;margin-right:1em}.store-address-container .city-and-postcode div:last-of-type{margin-right:0}.store-address-container .select2-container,.store-address-container input[type=text],.store-address-container select{margin-bottom:10px}.product-type-container{margin-top:14px;margin-bottom:1px}#woocommerce_sell_in_person{margin-left:0}.wc-wizard-service-settings .payment-email-input{border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:30px;padding:0 8px;font-size:14px;color:#444;background-color:#fff;display:inline-block}.newsletter-form-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.newsletter-form-container .newsletter-form-email{border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:42px;padding:0 8px;font-size:16px;color:#666;background-color:#fff;display:inline-block;margin-right:6px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.newsletter-form-container .newsletter-form-button-container{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.wc-setup .wc-setup-actions .button.newsletter-form-button{height:42px;padding:0 1em;margin:0}.wc-wizard-next-steps{border:1px solid #eee;border-radius:4px;list-style:none;padding:0}.wc-wizard-next-steps li{padding:0}.wc-wizard-next-steps .wc-wizard-next-step-item{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;border-top:1px solid #eee}.wc-wizard-next-steps .wc-wizard-next-step-item:first-child{border-top:0}.wc-wizard-next-steps .wc-wizard-next-step-description{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin:1.5em}.wc-wizard-next-steps .wc-wizard-next-step-action{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center}.wc-wizard-next-steps .wc-wizard-next-step-action .button{margin:1em 1.5em}.wc-wizard-next-steps p.next-step-heading{margin:0;font-size:.95em;font-weight:400;font-variant:all-petite-caps}.wc-wizard-next-steps p.next-step-extra-info{margin:0}.wc-wizard-next-steps h3.next-step-description{margin:0;font-size:16px;font-weight:600}.wc-wizard-next-steps .wc-wizard-additional-steps{border-top:1px solid #eee}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-wizard-next-step-description{margin-bottom:0}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-setup-actions{margin:0 0 1.5em 0}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-setup-actions .button{font-size:15px;margin:1em 0 1em 1.5em}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-setup-actions .button::last-child{margin-right:1.5em}p.next-steps-help-text{color:#9f9f9f;padding:0 2em;text-align:center;font-size:.9em}p.jetpack-terms{font-size:.8em;text-align:center;max-width:480px;margin:0 auto;line-height:1.5em}.woocommerce-error{background:#ffe6e5;border-color:#ffc5c2;padding:1em;margin-bottom:1em}.woocommerce-error p{margin-top:0;margin-bottom:.5em;color:#444}.woocommerce-error a{color:#ff645c}.woocommerce-error .reconnect-reminder{font-size:.85em}.woocommerce-error .wc-setup-actions .button{font-size:14px}.wc-wizard-service-setting-ppec_paypal_reroute_requests,.wc-wizard-service-setting-stripe_create_account{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start}.wc-wizard-service-setting-ppec_paypal_reroute_requests .payment-checkbox-input,.wc-wizard-service-setting-stripe_create_account .payment-checkbox-input{-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1;margin-top:5px;margin-left:0;margin-right:0;width:1.5em}.wc-wizard-service-setting-ppec_paypal_reroute_requests .ppec_paypal_reroute_requests,.wc-wizard-service-setting-ppec_paypal_reroute_requests .stripe_create_account,.wc-wizard-service-setting-stripe_create_account .ppec_paypal_reroute_requests,.wc-wizard-service-setting-stripe_create_account .stripe_create_account{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2;margin-left:.3em}.wc-wizard-service-setting-ppec_paypal_email,.wc-wizard-service-setting-stripe_email{margin-top:.75em;margin-left:1.5em}.wc-wizard-service-setting-ppec_paypal_email label.ppec_paypal_email,.wc-wizard-service-setting-ppec_paypal_email label.stripe_email,.wc-wizard-service-setting-stripe_email label.ppec_paypal_email,.wc-wizard-service-setting-stripe_email label.stripe_email{position:absolute;margin:-1px;padding:0;height:1px;width:1px;overflow:hidden;clip:rect(0 0 0 0);border:0}.wc-wizard-service-setting-ppec_paypal_email input.payment-email-input,.wc-wizard-service-setting-stripe_email input.payment-email-input{-webkit-box-sizing:border-box;box-sizing:border-box;margin-bottom:.5em;width:100%;height:32px}.wc-setup-content .recommended-step{border:1px solid #ebebeb;border-radius:4px;padding:2.5em}.wc-setup-content .recommended-step li{list-style:none}.wc-setup-content .recommended-step li:last-child label{margin-bottom:0}.wc-setup-content .recommended-step label{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;margin-bottom:1.5em}.wc-setup-content .recommended-step label:after,.wc-setup-content .recommended-step label:before{top:auto}.wc-setup-content .recommended-step label:after{margin-top:-1.5px}.wc-setup-content .recommended-step .recommended-item-icon{border:1px solid #fff;border-radius:7px;height:3.5em;margin-right:1em;margin-left:4px}.wc-setup-content .recommended-step .recommended-item-icon.recommended-item-icon-storefront_theme{background-color:#f4a224;max-height:3em;max-width:3em;padding:.25em}.wc-setup-content .recommended-step .recommended-item-icon.recommended-item-icon-automated_taxes{background-color:#d0011b;max-height:1.75em;padding:.875em}.wc-setup-content .recommended-step .recommended-item-icon.recommended-item-icon-mailchimp{background-color:#209bbb;height:2em;padding:.75em}.wc-setup-content .recommended-step .recommended-item-description-container h3{font-size:15px;font-weight:700;letter-spacing:.5px;margin-bottom:0}.wc-setup-content .recommended-step .recommended-item-description-container p{margin-top:0;line-height:1.5em} \ No newline at end of file +@charset "UTF-8";body{margin:65px auto 24px;box-shadow:none;background:#f1f1f1;padding:0}#wc-logo{border:0;margin:0 0 24px;padding:0;text-align:center}#wc-logo img{max-width:30%}.wc-setup{text-align:center}.wc-setup .select2-container{text-align:left}.wc-setup .hidden{display:none}.wc-setup-content{box-shadow:0 1px 3px rgba(0,0,0,.13);padding:2em;margin:0 0 20px;background:#fff;overflow:hidden;zoom:1;text-align:left}.wc-setup-content h1,.wc-setup-content h2,.wc-setup-content h3,.wc-setup-content table{margin:0 0 20px;border:0;padding:0;color:#666;clear:none;font-weight:500}.wc-setup-content p{margin:20px 0;font-size:1em;line-height:1.75em;color:#666}.wc-setup-content table{font-size:1em;line-height:1.75em;color:#666}.wc-setup-content a{color:#a16696}.wc-setup-content a:focus,.wc-setup-content a:hover{color:#111}.wc-setup-content .form-table th{width:35%;vertical-align:top;font-weight:400}.wc-setup-content .form-table td{vertical-align:top}.wc-setup-content .form-table td input,.wc-setup-content .form-table td select{width:100%;box-sizing:border-box}.wc-setup-content .form-table td input[size]{width:auto}.wc-setup-content .form-table td .description{line-height:1.5em;display:block;margin-top:.25em;color:#999;font-style:italic}.wc-setup-content .form-table td .input-checkbox,.wc-setup-content .form-table td .input-radio{width:auto;box-sizing:inherit;padding:inherit;margin:0 .5em 0 0;box-shadow:none}.wc-setup-content .form-table .section_title td{padding:0}.wc-setup-content .form-table .section_title td h2,.wc-setup-content .form-table .section_title td p{margin:12px 0 0}.wc-setup-content .form-table td,.wc-setup-content .form-table th{padding:12px 0;margin:0;border:0}.wc-setup-content .form-table td:first-child,.wc-setup-content .form-table th:first-child{padding-right:1em}.wc-setup-content table.tax-rates{width:100%;font-size:.92em}.wc-setup-content table.tax-rates th{padding:0;text-align:center;width:auto;vertical-align:middle}.wc-setup-content table.tax-rates td{border:1px solid #f5f5f5;padding:6px;text-align:center;vertical-align:middle}.wc-setup-content table.tax-rates td input{outline:0;border:0;padding:0;box-shadow:none;text-align:center;width:100%}.wc-setup-content table.tax-rates td.sort{cursor:move;color:#ccc}.wc-setup-content table.tax-rates td.sort::before{content:'\f333';font-family:dashicons}.wc-setup-content table.tax-rates td.readonly{background:#f5f5f5}.wc-setup-content table.tax-rates .add{padding:1em 0 0 1em;line-height:1em;font-size:1em;width:0;margin:6px 0 0;height:0;overflow:hidden;position:relative;display:inline-block}.wc-setup-content table.tax-rates .add::before{content:'\f502';font-family:dashicons;position:absolute;left:0;top:0}.wc-setup-content table.tax-rates .remove{padding:1em 0 0 1em;line-height:1em;font-size:1em;width:0;margin:0;height:0;overflow:hidden;position:relative;display:inline-block}.wc-setup-content table.tax-rates .remove::before{content:'\f182';font-family:dashicons;position:absolute;left:0;top:0}.wc-setup-content .wc-setup-pages{width:100%;border-top:1px solid #eee}.wc-setup-content .wc-setup-pages thead th{display:none}.wc-setup-content .wc-setup-pages .page-name{width:30%;font-weight:700}.wc-setup-content .wc-setup-pages td,.wc-setup-content .wc-setup-pages th{padding:14px 0;border-bottom:1px solid #eee}.wc-setup-content .wc-setup-pages td:first-child,.wc-setup-content .wc-setup-pages th:first-child{padding-right:9px}.wc-setup-content .wc-setup-pages th{padding-top:0}.wc-setup-content .wc-setup-pages .page-options p{color:#777;margin:6px 0 0 24px;line-height:1.75em}.wc-setup-content .wc-setup-pages .page-options p input{vertical-align:middle;margin:1px 0 0;height:1.75em;width:1.75em;line-height:1.75em}.wc-setup-content .wc-setup-pages .page-options p label{line-height:1}@media screen and (max-width:782px){.wc-setup-content .form-table tbody th{width:auto}}.wc-setup-content .twitter-share-button{float:right}.wc-setup-content .wc-setup-next-steps{overflow:hidden;margin:0 0 24px;padding-bottom:2px}.wc-setup-content .wc-setup-next-steps h2{margin-bottom:12px}.wc-setup-content .wc-setup-next-steps .wc-setup-next-steps-first{float:left;width:50%;box-sizing:border-box}.wc-setup-content .wc-setup-next-steps .wc-setup-next-steps-last{float:right;width:50%;box-sizing:border-box}.wc-setup-content .wc-setup-next-steps ul{padding:0 2em 0 0;list-style:none outside;margin:0}.wc-setup-content .wc-setup-next-steps ul li a{display:block;padding:0 0 .75em}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button{background-color:#f7f7f7;border-color:#ccc;color:#23282d;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #ccc;text-shadow:1px 0 1px #eee,0 1px 1px #eee;font-size:1em;height:auto;line-height:1.75em;margin:0 0 .75em;opacity:1;padding:1em;text-align:center}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button:active,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button:focus,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button:hover{background:#f5f5f5;border-color:#aaa}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary{color:#fff;background-color:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;text-shadow:0 -1px 1px #a36597,1px 0 1px #a36597,0 1px 1px #a36597,-1px 0 1px #a36597}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary:active,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary:focus,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary:hover{color:#fff;background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.wc-setup-content .wc-setup-next-steps ul li a::before{color:#82878c;font:normal 20px/1 dashicons;speak:none;display:inline-block;padding:0 10px 0 0;top:1px;position:relative;text-decoration:none!important;vertical-align:top}.wc-setup-content .wc-setup-next-steps ul .learn-more a::before{content:'\f105'}.wc-setup-content .wc-setup-next-steps ul .video-walkthrough a::before{content:'\f126'}.wc-setup-content .wc-setup-next-steps ul .newsletter a::before{content:'\f465'}.wc-setup-content .updated,.wc-setup-content .woocommerce-newsletter{padding:24px 24px 0;margin:0 0 24px;overflow:hidden;background:#f5f5f5}.wc-setup-content .updated p,.wc-setup-content .woocommerce-newsletter p{padding:0;margin:0 0 12px}.wc-setup-content .updated form,.wc-setup-content .updated p:last-child,.wc-setup-content .woocommerce-newsletter form,.wc-setup-content .woocommerce-newsletter p:last-child{margin:0 0 24px}.wc-setup-content .woocommerce-tracker{margin:24px 0;border:1px solid #eee;padding:20px;border-radius:4px;overflow:hidden}.wc-setup-content .woocommerce-tracker p{font-size:14px;line-height:1.5em}.wc-setup-content .woocommerce-tracker .checkbox{line-height:24px;font-weight:500;font-size:1em;margin-top:0;margin-bottom:20px}.wc-setup-content .checkbox input[type=checkbox]{opacity:0;position:absolute;left:-9999px}.wc-setup-content .checkbox label{position:relative;display:inline-block;padding-left:28px}.wc-setup-content .checkbox label:after,.wc-setup-content .checkbox label:before{position:absolute;content:"";display:inline-block}.wc-setup-content .checkbox label:before{height:16px;width:16px;left:0;top:3px;border:1px solid #aaa;background-color:#fff;border-radius:3px}.wc-setup-content .checkbox label:after{height:5px;width:9px;border-left:2px solid;border-bottom:2px solid;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg);left:4px;top:7px;color:#fff}.wc-setup-content .checkbox input[type=checkbox]+label::after{content:none}.wc-setup-content .checkbox input[type=checkbox]:checked+label::after{content:""}.wc-setup-content .checkbox input[type=checkbox]:focus+label::before{outline:#3b99fc auto 5px}.wc-setup-content .checkbox input[type=checkbox]:checked+label::before{background:#935687;border-color:#935687}.wc-setup-steps{padding:0 0 24px;margin:0;list-style:none outside;overflow:hidden;color:#ccc;width:100%;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.wc-setup-steps li{width:100%;float:left;padding:0 0 .8em;margin:0;text-align:center;position:relative;border-bottom:4px solid #ccc;line-height:1.4em}.wc-setup-steps li a{color:#a16696;text-decoration:none;padding:1.5em;margin:-1.5em;position:relative;z-index:1}.wc-setup-steps li a:focus,.wc-setup-steps li a:hover{color:#111;text-decoration:underline}.wc-setup-steps li::before{content:'';border:4px solid #ccc;border-radius:100%;width:4px;height:4px;position:absolute;bottom:0;left:50%;margin-left:-6px;margin-bottom:-8px;background:#fff}.wc-setup-steps li.active{border-color:#a16696;color:#a16696;font-weight:700}.wc-setup-steps li.active::before{border-color:#a16696}.wc-setup-steps li.done{border-color:#a16696;color:#a16696}.wc-setup-steps li.done::before{border-color:#a16696;background:#a16696}.wc-setup .wc-setup-actions{overflow:hidden;margin:20px 0 0;position:relative}.wc-setup .wc-setup-actions .button{font-size:1.25em;padding:.5em 1em;line-height:1em;margin-right:.5em;margin-bottom:2px;height:auto;border-radius:4px}.wc-setup .wc-setup-actions .button-primary{background-color:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;text-shadow:0 -1px 1px #a36597,1px 0 1px #a36597,0 1px 1px #a36597,-1px 0 1px #a36597;margin:0;opacity:1}.wc-setup .wc-setup-actions .button-primary:active,.wc-setup .wc-setup-actions .button-primary:focus,.wc-setup .wc-setup-actions .button-primary:hover{background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.wc-setup-content p:last-child{margin-bottom:0}.wc-setup-content p.store-setup{margin-top:0}.wc-setup-footer-links{font-size:.85em;color:#7b7b7b;margin:1.18em auto;display:inline-block;text-align:center}.wc-wizard-storefront .wc-wizard-storefront-intro{padding:40px 40px 0;background:#f5f5f5;text-align:center}.wc-wizard-storefront .wc-wizard-storefront-intro img{margin:40px 0 0 0;width:100%;display:block}.wc-wizard-storefront .wc-wizard-storefront-features{list-style:none outside;margin:0 0 20px;padding:0 0 0 30px;overflow:hidden}.wc-wizard-storefront .wc-wizard-storefront-feature{margin:0;padding:20px 30px 20px 2em;width:50%;box-sizing:border-box}.wc-wizard-storefront .wc-wizard-storefront-feature::before{margin-left:-2em;position:absolute}.wc-wizard-storefront .wc-wizard-storefront-feature.first{clear:both;float:left}.wc-wizard-storefront .wc-wizard-storefront-feature.last{float:right}.wc-wizard-storefront .wc-wizard-storefront-feature__bulletproof::before{content:'🔒'}.wc-wizard-storefront .wc-wizard-storefront-feature__mobile::before{content:'📱'}.wc-wizard-storefront .wc-wizard-storefront-feature__accessibility::before{content:'👓'}.wc-wizard-storefront .wc-wizard-storefront-feature__search::before{content:'🔍'}.wc-wizard-storefront .wc-wizard-storefront-feature__compatibility::before{content:'🔧'}.wc-wizard-storefront .wc-wizard-storefront-feature__extendable::before{content:'🎨'}.wc-wizard-services{border:1px solid #eee;padding:0;margin:0 0 1em;list-style:none outside;border-radius:4px;overflow:hidden}.wc-wizard-services p{margin:0 0 1em 0;padding:0;font-size:1em;line-height:1.5em}.wc-wizard-service-item,.wc-wizard-services-list-toggle{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:0;border-bottom:1px solid #eee;color:#666;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.wc-wizard-service-item:last-child,.wc-wizard-services-list-toggle:last-child{border-bottom:0}.wc-wizard-service-item .payment-gateway-fee,.wc-wizard-services-list-toggle .payment-gateway-fee{color:#a6a6a6}.wc-wizard-service-item .wc-wizard-service-name,.wc-wizard-services-list-toggle .wc-wizard-service-name{-ms-flex-preferred-size:0;flex-basis:0;min-width:160px;text-align:center;font-weight:700;padding:2em 0;-ms-flex-item-align:stretch;align-self:stretch;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:baseline;-ms-flex-align:baseline;align-items:baseline}.wc-wizard-payment-gateway-form .wc-wizard-service-item .wc-wizard-service-name,.wc-wizard-payment-gateway-form .wc-wizard-services-list-toggle .wc-wizard-service-name{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.wc-wizard-service-item .wc-wizard-service-name img,.wc-wizard-services-list-toggle .wc-wizard-service-name img{max-width:75px}.wc-wizard-service-item.stripe-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.stripe-logo .wc-wizard-service-name img{padding:8px 0}.wc-wizard-service-item.paypal-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.paypal-logo .wc-wizard-service-name img{max-width:87px;padding:2px 0}.wc-wizard-service-item.klarna-logo .wc-wizard-service-name,.wc-wizard-services-list-toggle.klarna-logo .wc-wizard-service-name{background:#000}.wc-wizard-service-item.klarna-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.klarna-logo .wc-wizard-service-name img{max-width:87px;padding:12px 0}.wc-wizard-service-item.square-logo .wc-wizard-service-name,.wc-wizard-services-list-toggle.square-logo .wc-wizard-service-name{background:#000}.wc-wizard-service-item.square-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.square-logo .wc-wizard-service-name img{max-width:95px;padding:12px 0}.wc-wizard-service-item.eway-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.eway-logo .wc-wizard-service-name img{max-width:87px}.wc-wizard-service-item.payfast-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.payfast-logo .wc-wizard-service-name img{max-width:140px}.wc-wizard-service-item .wc-wizard-service-description,.wc-wizard-services-list-toggle .wc-wizard-service-description{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;padding:20px}.wc-wizard-service-item .wc-wizard-service-description p,.wc-wizard-services-list-toggle .wc-wizard-service-description p{margin-bottom:1em}.wc-wizard-service-item .wc-wizard-service-description p:last-child,.wc-wizard-services-list-toggle .wc-wizard-service-description p:last-child{margin-bottom:0}.wc-wizard-service-item .wc-wizard-service-description .wc-wizard-service-settings-description,.wc-wizard-services-list-toggle .wc-wizard-service-description .wc-wizard-service-settings-description{display:block;font-style:italic;color:#999}.wc-wizard-service-item .wc-wizard-service-enable,.wc-wizard-services-list-toggle .wc-wizard-service-enable{-ms-flex-preferred-size:0;flex-basis:0;min-width:75px;text-align:center;cursor:pointer;padding:2em 0;position:relative;max-height:1.5em;-ms-flex-item-align:start;align-self:flex-start}.wc-wizard-service-item .wc-wizard-service-toggle,.wc-wizard-services-list-toggle .wc-wizard-service-toggle{height:16px;width:32px;border:2px solid #935687;background-color:#935687;display:inline-block;text-indent:-9999px;border-radius:10em;position:relative}.wc-wizard-service-item .wc-wizard-service-toggle input[type=checkbox],.wc-wizard-services-list-toggle .wc-wizard-service-toggle input[type=checkbox]{display:none}.wc-wizard-service-item .wc-wizard-service-toggle:before,.wc-wizard-services-list-toggle .wc-wizard-service-toggle:before{content:"";display:block;width:16px;height:16px;background:#fff;position:absolute;top:0;right:0;border-radius:100%}.wc-wizard-service-item .wc-wizard-service-toggle.disabled,.wc-wizard-services-list-toggle .wc-wizard-service-toggle.disabled{border-color:#999;background-color:#999}.wc-wizard-service-item .wc-wizard-service-toggle.disabled:before,.wc-wizard-services-list-toggle .wc-wizard-service-toggle.disabled:before{right:auto;left:0}.wc-wizard-service-item .wc-wizard-service-settings,.wc-wizard-services-list-toggle .wc-wizard-service-settings{display:none;margin-top:.75em;margin-bottom:0;cursor:default}.wc-wizard-service-item .wc-wizard-service-settings.hide,.wc-wizard-services-list-toggle .wc-wizard-service-settings.hide{display:none}.wc-wizard-service-item.checked .wc-wizard-service-settings,.wc-wizard-services-list-toggle.checked .wc-wizard-service-settings{display:inline-block}.wc-wizard-service-item.checked .wc-wizard-service-settings.hide,.wc-wizard-services-list-toggle.checked .wc-wizard-service-settings.hide{display:none}.wc-wizard-service-item.closed,.wc-wizard-services-list-toggle.closed{border-bottom:0}.wc-wizard-services-list-toggle{cursor:pointer}.wc-wizard-services-list-toggle .wc-wizard-service-enable::before{content:"\f343";font-family:dashicons;visibility:initial;color:#666;font-size:25px;margin-top:-7px;margin-left:-5px;position:absolute;visibility:visible}.wc-wizard-services-list-toggle.closed .wc-wizard-service-enable::before{content:"\f347"}.wc-wizard-services-list-toggle .wc-wizard-service-enable input{visibility:hidden;position:relative}.wc-wizard-services.manual .wc-wizard-service-item{display:none}.wc-wizard-services.shipping .wc-wizard-service-name{font-weight:400;text-align:left;-webkit-box-align:center;-ms-flex-align:center;align-items:center;max-height:5em;padding:0}.wc-wizard-services.shipping .wc-wizard-service-item{padding-left:2em;padding-top:.67em}.wc-wizard-services.shipping .wc-wizard-service-item:first-child{border-bottom:0;padding-bottom:0;font-weight:700}.wc-wizard-services.shipping .wc-wizard-service-item:first-child .wc-wizard-service-name{font-weight:700}.wc-wizard-services.shipping .shipping-method-setting,.wc-wizard-services.shipping .wc-wizard-shipping-method-select{display:-webkit-box;display:-ms-flexbox;display:flex}.wc-wizard-services.shipping .shipping-method-setting.hide,.wc-wizard-services.shipping .wc-wizard-shipping-method-select.hide{display:none}.wc-wizard-services.shipping .shipping-method-setting input,.wc-wizard-services.shipping .wc-wizard-shipping-method-dropdown{margin-right:2em;margin-bottom:1em}.wc-wizard-services.shipping .shipping-method-setting input .select2,.wc-wizard-services.shipping .wc-wizard-shipping-method-dropdown .select2{min-width:130px}.wc-wizard-services.shipping .wc-wizard-service-description{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;color:#a6a6a6}.wc-wizard-services.shipping .wc-wizard-service-item:not(:first-child) .wc-wizard-service-description{font-size:.92em;padding-bottom:10px}.wc-wizard-services.shipping .shipping-method-setting input{width:95px;border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:28px;padding-left:8px;padding-right:24px;font-size:14px;color:#444;background-color:#fff;display:inline-block}.wc-wizard-services.shipping .shipping-method-description,.wc-wizard-services.shipping .shipping-method-setting .description{color:#7e7e7e;font-size:.9em}.wc-wizard-services.shipping .shipping-method-setting input::-webkit-input-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input::-moz-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input:-ms-input-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input::-ms-input-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input::placeholder{color:#e1e1e1}.wc-setup-shipping-units p{line-height:1.5em;font-size:13px;margin-bottom:.25em}.wc-setup-shipping-units .wc-setup-shipping-unit{margin-bottom:1.75em}.wc-setup-shipping-units .wc-setup-shipping-unit .select2{min-width:100%}.hide{display:none}.wc-wizard-features{display:-webkit-box;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;list-style:none;padding:0}.wc-wizard-features .wc-wizard-feature-item{-ms-flex-preferred-size:calc(50% - 4em - 3px);flex-basis:calc(50% - 4em - 3px);border:1px solid #eee;padding:2em}.wc-wizard-features .wc-wizard-feature-item:nth-child(1){border-radius:4px 0 0 0}.wc-wizard-features .wc-wizard-feature-item:nth-child(2){border-left:0;border-radius:0 4px 0 0}.wc-wizard-features .wc-wizard-feature-item:nth-child(3){border-top:0;border-radius:0 0 0 4px}.wc-wizard-features .wc-wizard-feature-item:nth-child(4){border-top:0;border-left:0;border-radius:0 0 4px 0}.wc-wizard-features p.wc-wizard-feature-description,.wc-wizard-features p.wc-wizard-feature-name{margin:0;line-height:1.5em}h3.jetpack-reasons{text-align:center;margin:3em 0 1em 0;font-size:14px}.jetpack-logo,.wcs-notice{display:block;margin:1.75em auto 2em auto;max-height:175px}.activate-splash .jetpack-logo{width:170px;margin-bottom:0}.activate-splash .wcs-notice{margin-top:1em;padding-left:57px}.step{text-align:center}.wc-setup .wc-setup-actions .button{font-weight:300;font-size:16px;padding:1em 2em;box-shadow:none;min-width:12em;min-width:auto;margin-top:10px}.wc-setup .wc-setup-actions .button:active,.wc-setup .wc-setup-actions .button:focus,.wc-setup .wc-setup-actions .button:hover{box-shadow:none}.wc-setup .wc-setup-actions .plugin-install-info{display:block;font-style:italic;color:#999;font-size:14px;line-height:1.5em;margin:5px 0}.wc-setup .wc-setup-actions .plugin-install-info>*{display:block}.wc-setup .wc-setup-actions .plugin-install-info .plugin-install-info-list-item:not(:last-child)::after{content:', '}.wc-setup .wc-setup-actions .plugin-install-info a{white-space:nowrap}.wc-setup .wc-setup-actions .plugin-install-info a:not(:hover):not(:focus){color:inherit}.plugin-install-source{background:rgba(187,119,174,.15)}.plugin-install-source:not(.wc-wizard-service-item){box-shadow:0 0 0 10px rgba(187,119,174,.15)}.location-prompt{color:#666;font-size:13px;font-weight:500;margin-bottom:.5em;margin-top:.85em;display:inline-block}.location-input{border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:30px;width:calc(100% - 8px - 24px - 2px);padding-left:8px;padding-right:24px;font-size:16px;color:#444;background-color:#fff;display:inline-block}.location-input.dropdown{width:100%}.address-step .select2{min-width:100%}.store-address-container .city-and-postcode{display:-webkit-box;display:-ms-flexbox;display:flex}.store-address-container .city-and-postcode div{-ms-flex-preferred-size:50%;flex-basis:50%;margin-right:1em}.store-address-container .city-and-postcode div:last-of-type{margin-right:0}.store-address-container .select2-container,.store-address-container input[type=text],.store-address-container select{margin-bottom:10px}.product-type-container{margin-top:14px;margin-bottom:1px}#woocommerce_sell_in_person{margin-left:0}.wc-wizard-service-settings .payment-email-input{border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:30px;padding:0 8px;font-size:14px;color:#444;background-color:#fff;display:inline-block}.newsletter-form-container{display:-webkit-box;display:-ms-flexbox;display:flex}.newsletter-form-container .newsletter-form-email{border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:42px;padding:0 8px;font-size:16px;color:#666;background-color:#fff;display:inline-block;margin-right:6px;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1}.newsletter-form-container .newsletter-form-button-container{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0}.wc-setup .wc-setup-actions .button.newsletter-form-button{height:42px;padding:0 1em;margin:0}.wc-wizard-next-steps{border:1px solid #eee;border-radius:4px;list-style:none;padding:0}.wc-wizard-next-steps li{padding:0}.wc-wizard-next-steps .wc-wizard-next-step-item{display:-webkit-box;display:-ms-flexbox;display:flex;border-top:1px solid #eee}.wc-wizard-next-steps .wc-wizard-next-step-item:first-child{border-top:0}.wc-wizard-next-steps .wc-wizard-next-step-description{-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;margin:1.5em}.wc-wizard-next-steps .wc-wizard-next-step-action{-webkit-box-flex:0;-ms-flex-positive:0;flex-grow:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.wc-wizard-next-steps .wc-wizard-next-step-action .button{margin:1em 1.5em}.wc-wizard-next-steps p.next-step-heading{margin:0;font-size:.95em;font-weight:400;font-variant:all-petite-caps}.wc-wizard-next-steps p.next-step-extra-info{margin:0}.wc-wizard-next-steps h3.next-step-description{margin:0;font-size:16px;font-weight:600}.wc-wizard-next-steps .wc-wizard-additional-steps{border-top:1px solid #eee}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-wizard-next-step-description{margin-bottom:0}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-setup-actions{margin:0 0 1.5em 0}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-setup-actions .button{font-size:15px;margin:1em 0 1em 1.5em}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-setup-actions .button::last-child{margin-right:1.5em}p.next-steps-help-text{color:#9f9f9f;padding:0 2em;text-align:center;font-size:.9em}p.jetpack-terms{font-size:.8em;text-align:center;max-width:480px;margin:0 auto;line-height:1.5em}.woocommerce-error{background:#ffe6e5;border-color:#ffc5c2;padding:1em;margin-bottom:1em}.woocommerce-error p{margin-top:0;margin-bottom:.5em;color:#444}.woocommerce-error a{color:#ff645c}.woocommerce-error .reconnect-reminder{font-size:.85em}.woocommerce-error .wc-setup-actions .button{font-size:14px}.wc-wizard-service-setting-ppec_paypal_reroute_requests,.wc-wizard-service-setting-stripe_create_account{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.wc-wizard-service-setting-ppec_paypal_reroute_requests .payment-checkbox-input,.wc-wizard-service-setting-stripe_create_account .payment-checkbox-input{-webkit-box-ordinal-group:2;-ms-flex-order:1;order:1;margin-top:5px;margin-left:0;margin-right:0;width:1.5em}.wc-wizard-service-setting-ppec_paypal_reroute_requests .ppec_paypal_reroute_requests,.wc-wizard-service-setting-ppec_paypal_reroute_requests .stripe_create_account,.wc-wizard-service-setting-stripe_create_account .ppec_paypal_reroute_requests,.wc-wizard-service-setting-stripe_create_account .stripe_create_account{-webkit-box-ordinal-group:3;-ms-flex-order:2;order:2;margin-left:.3em}.wc-wizard-service-setting-ppec_paypal_email,.wc-wizard-service-setting-stripe_email{margin-top:.75em;margin-left:1.5em}.wc-wizard-service-setting-ppec_paypal_email label.ppec_paypal_email,.wc-wizard-service-setting-ppec_paypal_email label.stripe_email,.wc-wizard-service-setting-stripe_email label.ppec_paypal_email,.wc-wizard-service-setting-stripe_email label.stripe_email{position:absolute;margin:-1px;padding:0;height:1px;width:1px;overflow:hidden;clip:rect(0 0 0 0);border:0}.wc-wizard-service-setting-ppec_paypal_email input.payment-email-input,.wc-wizard-service-setting-stripe_email input.payment-email-input{box-sizing:border-box;margin-bottom:.5em;width:100%;height:32px}.wc-setup-content .recommended-step{border:1px solid #ebebeb;border-radius:4px;padding:2.5em}.wc-setup-content .recommended-step li{list-style:none}.wc-setup-content .recommended-step li:last-child label{margin-bottom:0}.wc-setup-content .recommended-step label{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin-bottom:1.5em}.wc-setup-content .recommended-step label:after,.wc-setup-content .recommended-step label:before{top:auto}.wc-setup-content .recommended-step label:after{margin-top:-1.5px}.wc-setup-content .recommended-step .recommended-item-icon{border:1px solid #fff;border-radius:7px;height:3.5em;margin-right:1em;margin-left:4px}.wc-setup-content .recommended-step .recommended-item-icon.recommended-item-icon-storefront_theme{background-color:#f4a224;max-height:3em;max-width:3em;padding:.25em}.wc-setup-content .recommended-step .recommended-item-icon.recommended-item-icon-automated_taxes{background-color:#d0011b;max-height:1.75em;padding:.875em}.wc-setup-content .recommended-step .recommended-item-icon.recommended-item-icon-mailchimp{background-color:#209bbb;height:2em;padding:.75em}.wc-setup-content .recommended-step .recommended-item-description-container h3{font-size:15px;font-weight:700;letter-spacing:.5px;margin-bottom:0}.wc-setup-content .recommended-step .recommended-item-description-container p{margin-top:0;line-height:1.5em} \ No newline at end of file diff --git a/assets/css/woocommerce-layout-rtl.css b/assets/css/woocommerce-layout-rtl.css index d04c866a83c..0e6c533f00a 100644 --- a/assets/css/woocommerce-layout-rtl.css +++ b/assets/css/woocommerce-layout-rtl.css @@ -1 +1 @@ -.woocommerce .woocommerce-error .button,.woocommerce .woocommerce-info .button,.woocommerce .woocommerce-message .button,.woocommerce-page .woocommerce-error .button,.woocommerce-page .woocommerce-info .button,.woocommerce-page .woocommerce-message .button{float:left}.woocommerce .col2-set,.woocommerce-page .col2-set{width:100%}.woocommerce .col2-set::after,.woocommerce .col2-set::before,.woocommerce-page .col2-set::after,.woocommerce-page .col2-set::before{content:' ';display:table}.woocommerce .col2-set::after,.woocommerce-page .col2-set::after{clear:both}.woocommerce .col2-set .col-1,.woocommerce-page .col2-set .col-1{float:right;width:48%}.woocommerce .col2-set .col-2,.woocommerce-page .col2-set .col-2{float:left;width:48%}.woocommerce img,.woocommerce-page img{height:auto;max-width:100%}.woocommerce #content div.product div.images,.woocommerce div.product div.images,.woocommerce-page #content div.product div.images,.woocommerce-page div.product div.images{float:right;width:48%}.woocommerce #content div.product div.thumbnails::after,.woocommerce #content div.product div.thumbnails::before,.woocommerce div.product div.thumbnails::after,.woocommerce div.product div.thumbnails::before,.woocommerce-page #content div.product div.thumbnails::after,.woocommerce-page #content div.product div.thumbnails::before,.woocommerce-page div.product div.thumbnails::after,.woocommerce-page div.product div.thumbnails::before{content:' ';display:table}.woocommerce #content div.product div.thumbnails::after,.woocommerce div.product div.thumbnails::after,.woocommerce-page #content div.product div.thumbnails::after,.woocommerce-page div.product div.thumbnails::after{clear:both}.woocommerce #content div.product div.thumbnails a,.woocommerce div.product div.thumbnails a,.woocommerce-page #content div.product div.thumbnails a,.woocommerce-page div.product div.thumbnails a{float:right;width:30.75%;margin-left:3.8%;margin-bottom:1em}.woocommerce #content div.product div.thumbnails a.last,.woocommerce div.product div.thumbnails a.last,.woocommerce-page #content div.product div.thumbnails a.last,.woocommerce-page div.product div.thumbnails a.last{margin-left:0}.woocommerce #content div.product div.thumbnails a.first,.woocommerce div.product div.thumbnails a.first,.woocommerce-page #content div.product div.thumbnails a.first,.woocommerce-page div.product div.thumbnails a.first{clear:both}.woocommerce #content div.product div.thumbnails.columns-1 a,.woocommerce div.product div.thumbnails.columns-1 a,.woocommerce-page #content div.product div.thumbnails.columns-1 a,.woocommerce-page div.product div.thumbnails.columns-1 a{width:100%;margin-left:0;float:none}.woocommerce #content div.product div.thumbnails.columns-2 a,.woocommerce div.product div.thumbnails.columns-2 a,.woocommerce-page #content div.product div.thumbnails.columns-2 a,.woocommerce-page div.product div.thumbnails.columns-2 a{width:48%}.woocommerce #content div.product div.thumbnails.columns-4 a,.woocommerce div.product div.thumbnails.columns-4 a,.woocommerce-page #content div.product div.thumbnails.columns-4 a,.woocommerce-page div.product div.thumbnails.columns-4 a{width:22.05%}.woocommerce #content div.product div.thumbnails.columns-5 a,.woocommerce div.product div.thumbnails.columns-5 a,.woocommerce-page #content div.product div.thumbnails.columns-5 a,.woocommerce-page div.product div.thumbnails.columns-5 a{width:16.9%}.woocommerce #content div.product div.summary,.woocommerce div.product div.summary,.woocommerce-page #content div.product div.summary,.woocommerce-page div.product div.summary{float:left;width:48%;clear:none}.woocommerce #content div.product .woocommerce-tabs,.woocommerce div.product .woocommerce-tabs,.woocommerce-page #content div.product .woocommerce-tabs,.woocommerce-page div.product .woocommerce-tabs{clear:both}.woocommerce #content div.product .woocommerce-tabs ul.tabs::after,.woocommerce #content div.product .woocommerce-tabs ul.tabs::before,.woocommerce div.product .woocommerce-tabs ul.tabs::after,.woocommerce div.product .woocommerce-tabs ul.tabs::before,.woocommerce-page #content div.product .woocommerce-tabs ul.tabs::after,.woocommerce-page #content div.product .woocommerce-tabs ul.tabs::before,.woocommerce-page div.product .woocommerce-tabs ul.tabs::after,.woocommerce-page div.product .woocommerce-tabs ul.tabs::before{content:' ';display:table}.woocommerce #content div.product .woocommerce-tabs ul.tabs::after,.woocommerce div.product .woocommerce-tabs ul.tabs::after,.woocommerce-page #content div.product .woocommerce-tabs ul.tabs::after,.woocommerce-page div.product .woocommerce-tabs ul.tabs::after{clear:both}.woocommerce #content div.product .woocommerce-tabs ul.tabs li,.woocommerce div.product .woocommerce-tabs ul.tabs li,.woocommerce-page #content div.product .woocommerce-tabs ul.tabs li,.woocommerce-page div.product .woocommerce-tabs ul.tabs li{display:inline-block}.woocommerce #content div.product #reviews .comment::after,.woocommerce #content div.product #reviews .comment::before,.woocommerce div.product #reviews .comment::after,.woocommerce div.product #reviews .comment::before,.woocommerce-page #content div.product #reviews .comment::after,.woocommerce-page #content div.product #reviews .comment::before,.woocommerce-page div.product #reviews .comment::after,.woocommerce-page div.product #reviews .comment::before{content:' ';display:table}.woocommerce #content div.product #reviews .comment::after,.woocommerce div.product #reviews .comment::after,.woocommerce-page #content div.product #reviews .comment::after,.woocommerce-page div.product #reviews .comment::after{clear:both}.woocommerce #content div.product #reviews .comment img,.woocommerce div.product #reviews .comment img,.woocommerce-page #content div.product #reviews .comment img,.woocommerce-page div.product #reviews .comment img{float:left;height:auto}.woocommerce ul.products,.woocommerce-page ul.products{clear:both}.woocommerce ul.products::after,.woocommerce ul.products::before,.woocommerce-page ul.products::after,.woocommerce-page ul.products::before{content:' ';display:table}.woocommerce ul.products::after,.woocommerce-page ul.products::after{clear:both}.woocommerce ul.products li.product,.woocommerce-page ul.products li.product{float:right;margin:0 0 2.992em 3.8%;padding:0;position:relative;width:22.05%;margin-right:0}.woocommerce ul.products li.first,.woocommerce-page ul.products li.first{clear:both}.woocommerce ul.products li.last,.woocommerce-page ul.products li.last{margin-left:0}.woocommerce ul.products.columns-1 li.product,.woocommerce-page ul.products.columns-1 li.product{width:100%;margin-left:0}.woocommerce ul.products.columns-2 li.product,.woocommerce-page ul.products.columns-2 li.product{width:48%}.woocommerce ul.products.columns-3 li.product,.woocommerce-page ul.products.columns-3 li.product{width:30.75%}.woocommerce ul.products.columns-5 li.product,.woocommerce-page ul.products.columns-5 li.product{width:16.95%}.woocommerce ul.products.columns-6 li.product,.woocommerce-page ul.products.columns-6 li.product{width:13.5%}.woocommerce-page.columns-1 ul.products li.product,.woocommerce.columns-1 ul.products li.product{width:100%;margin-left:0}.woocommerce-page.columns-2 ul.products li.product,.woocommerce.columns-2 ul.products li.product{width:48%}.woocommerce-page.columns-3 ul.products li.product,.woocommerce.columns-3 ul.products li.product{width:30.75%}.woocommerce-page.columns-5 ul.products li.product,.woocommerce.columns-5 ul.products li.product{width:16.95%}.woocommerce-page.columns-6 ul.products li.product,.woocommerce.columns-6 ul.products li.product{width:13.5%}.woocommerce .woocommerce-result-count,.woocommerce-page .woocommerce-result-count{float:right}.woocommerce .woocommerce-ordering,.woocommerce-page .woocommerce-ordering{float:left}.woocommerce .woocommerce-pagination ul.page-numbers::after,.woocommerce .woocommerce-pagination ul.page-numbers::before,.woocommerce-page .woocommerce-pagination ul.page-numbers::after,.woocommerce-page .woocommerce-pagination ul.page-numbers::before{content:' ';display:table}.woocommerce .woocommerce-pagination ul.page-numbers::after,.woocommerce-page .woocommerce-pagination ul.page-numbers::after{clear:both}.woocommerce .woocommerce-pagination ul.page-numbers li,.woocommerce-page .woocommerce-pagination ul.page-numbers li{display:inline-block}.woocommerce #content table.cart img,.woocommerce table.cart img,.woocommerce-page #content table.cart img,.woocommerce-page table.cart img{height:auto}.woocommerce #content table.cart td.actions,.woocommerce table.cart td.actions,.woocommerce-page #content table.cart td.actions,.woocommerce-page table.cart td.actions{text-align:left}.woocommerce #content table.cart td.actions .input-text,.woocommerce table.cart td.actions .input-text,.woocommerce-page #content table.cart td.actions .input-text,.woocommerce-page table.cart td.actions .input-text{width:80px}.woocommerce #content table.cart td.actions .coupon,.woocommerce table.cart td.actions .coupon,.woocommerce-page #content table.cart td.actions .coupon,.woocommerce-page table.cart td.actions .coupon{float:right}.woocommerce #content table.cart td.actions .coupon label,.woocommerce table.cart td.actions .coupon label,.woocommerce-page #content table.cart td.actions .coupon label,.woocommerce-page table.cart td.actions .coupon label{display:none}.woocommerce .cart-collaterals,.woocommerce-page .cart-collaterals{width:100%}.woocommerce .cart-collaterals::after,.woocommerce .cart-collaterals::before,.woocommerce-page .cart-collaterals::after,.woocommerce-page .cart-collaterals::before{content:' ';display:table}.woocommerce .cart-collaterals::after,.woocommerce-page .cart-collaterals::after{clear:both}.woocommerce .cart-collaterals .related,.woocommerce-page .cart-collaterals .related{width:30.75%;float:right}.woocommerce .cart-collaterals .cross-sells,.woocommerce-page .cart-collaterals .cross-sells{width:48%;float:right}.woocommerce .cart-collaterals .cross-sells ul.products,.woocommerce-page .cart-collaterals .cross-sells ul.products{float:none}.woocommerce .cart-collaterals .cross-sells ul.products li,.woocommerce-page .cart-collaterals .cross-sells ul.products li{width:48%}.woocommerce .cart-collaterals .shipping_calculator,.woocommerce-page .cart-collaterals .shipping_calculator{width:48%;clear:left;float:left}.woocommerce .cart-collaterals .shipping_calculator::after,.woocommerce .cart-collaterals .shipping_calculator::before,.woocommerce-page .cart-collaterals .shipping_calculator::after,.woocommerce-page .cart-collaterals .shipping_calculator::before{content:' ';display:table}.woocommerce .cart-collaterals .shipping_calculator::after,.woocommerce-page .cart-collaterals .shipping_calculator::after{clear:both}.woocommerce .cart-collaterals .shipping_calculator .col2-set .col-1,.woocommerce .cart-collaterals .shipping_calculator .col2-set .col-2,.woocommerce-page .cart-collaterals .shipping_calculator .col2-set .col-1,.woocommerce-page .cart-collaterals .shipping_calculator .col2-set .col-2{width:47%}.woocommerce .cart-collaterals .cart_totals,.woocommerce-page .cart-collaterals .cart_totals{float:left;width:48%}.woocommerce ul.cart_list li::after,.woocommerce ul.cart_list li::before,.woocommerce ul.product_list_widget li::after,.woocommerce ul.product_list_widget li::before,.woocommerce-page ul.cart_list li::after,.woocommerce-page ul.cart_list li::before,.woocommerce-page ul.product_list_widget li::after,.woocommerce-page ul.product_list_widget li::before{content:' ';display:table}.woocommerce ul.cart_list li::after,.woocommerce ul.product_list_widget li::after,.woocommerce-page ul.cart_list li::after,.woocommerce-page ul.product_list_widget li::after{clear:both}.woocommerce ul.cart_list li img,.woocommerce ul.product_list_widget li img,.woocommerce-page ul.cart_list li img,.woocommerce-page ul.product_list_widget li img{float:left;height:auto}.woocommerce form .form-row::after,.woocommerce form .form-row::before,.woocommerce-page form .form-row::after,.woocommerce-page form .form-row::before{content:' ';display:table}.woocommerce form .form-row::after,.woocommerce-page form .form-row::after{clear:both}.woocommerce form .form-row label,.woocommerce-page form .form-row label{display:block}.woocommerce form .form-row label.checkbox,.woocommerce-page form .form-row label.checkbox{display:inline}.woocommerce form .form-row select,.woocommerce-page form .form-row select{width:100%}.woocommerce form .form-row .input-text,.woocommerce-page form .form-row .input-text{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.woocommerce form .form-row-first,.woocommerce form .form-row-last,.woocommerce-page form .form-row-first,.woocommerce-page form .form-row-last{width:47%;overflow:visible}.woocommerce form .form-row-first,.woocommerce-page form .form-row-first{float:right;float:right}.woocommerce form .form-row-last,.woocommerce-page form .form-row-last{float:left}.woocommerce form .form-row-wide,.woocommerce-page form .form-row-wide{clear:both}.woocommerce #payment .form-row select,.woocommerce-page #payment .form-row select{width:auto}.woocommerce #payment .terms,.woocommerce #payment .wc-terms-and-conditions,.woocommerce-page #payment .terms,.woocommerce-page #payment .wc-terms-and-conditions{text-align:right;padding:0 0 0 1em;float:right}.woocommerce #payment #place_order,.woocommerce-page #payment #place_order{float:left}.woocommerce .woocommerce-billing-fields::after,.woocommerce .woocommerce-billing-fields::before,.woocommerce .woocommerce-shipping-fields::after,.woocommerce .woocommerce-shipping-fields::before,.woocommerce-page .woocommerce-billing-fields::after,.woocommerce-page .woocommerce-billing-fields::before,.woocommerce-page .woocommerce-shipping-fields::after,.woocommerce-page .woocommerce-shipping-fields::before{content:' ';display:table}.woocommerce .woocommerce-billing-fields::after,.woocommerce .woocommerce-shipping-fields::after,.woocommerce-page .woocommerce-billing-fields::after,.woocommerce-page .woocommerce-shipping-fields::after{clear:both}.woocommerce .woocommerce-terms-and-conditions,.woocommerce-page .woocommerce-terms-and-conditions{margin-bottom:1.618em;padding:1.618em}.woocommerce .woocommerce-oembed,.woocommerce-page .woocommerce-oembed{position:relative}.woocommerce-account .woocommerce-MyAccount-navigation{float:right;width:30%}.woocommerce-account .woocommerce-MyAccount-content{float:left;width:68%}.woocommerce-page.left-sidebar #content.twentyeleven{width:58.4%;margin:0 7.6%;float:left}.woocommerce-page.right-sidebar #content.twentyeleven{margin:0 7.6%;width:58.4%;float:right}.twentyfourteen .tfwc{padding:12px 10px 0;max-width:474px;margin:0 auto}.twentyfourteen .tfwc .product .entry-summary{padding:0!important;margin:0 0 1.618em!important}.twentyfourteen .tfwc div.product.hentry.has-post-thumbnail{margin-top:0}@media screen and (min-width:673px){.twentyfourteen .tfwc{padding-left:30px;padding-right:30px}}@media screen and (min-width:1040px){.twentyfourteen .tfwc{padding-left:15px;padding-right:15px}}@media screen and (min-width:1110px){.twentyfourteen .tfwc{padding-left:30px;padding-right:30px}}@media screen and (min-width:1218px){.twentyfourteen .tfwc{margin-left:54px}.full-width .twentyfourteen .tfwc{margin-left:auto}}.twentyfifteen .t15wc{padding-right:7.6923%;padding-left:7.6923%;padding-top:7.6923%;margin-bottom:7.6923%;background:#fff;-webkit-box-shadow:0 0 1px rgba(0,0,0,.15);box-shadow:0 0 1px rgba(0,0,0,.15)}.twentyfifteen .t15wc .page-title{margin-right:0}@media screen and (min-width:38.75em){.twentyfifteen .t15wc{margin-left:7.6923%;margin-right:7.6923%;margin-top:8.3333%}}@media screen and (min-width:59.6875em){.twentyfifteen .t15wc{margin-right:8.3333%;margin-left:8.3333%;padding:10%}.single-product .twentyfifteen .entry-summary{padding:0!important}}.twentysixteen .site-main{margin-left:7.6923%;margin-right:7.6923%}.twentysixteen .entry-summary{margin-left:0;margin-right:0}#content .twentysixteen div.product div.images,#content .twentysixteen div.product div.summary{width:46.42857%}@media screen and (min-width:44.375em){.twentysixteen .site-main{margin-left:23.0769%}}@media screen and (min-width:56.875em){.twentysixteen .site-main{margin-left:0;margin-right:0}.no-sidebar .twentysixteen .site-main{margin-left:15%;margin-right:15%}.no-sidebar .twentysixteen .entry-summary{margin-left:0;margin-right:0}}.rtl .woocommerce .col2-set .col-1,.rtl .woocommerce-page .col2-set .col-1{float:left}.rtl .woocommerce .col2-set .col-2,.rtl .woocommerce-page .col2-set .col-2{float:right} \ No newline at end of file +.woocommerce .woocommerce-error .button,.woocommerce .woocommerce-info .button,.woocommerce .woocommerce-message .button,.woocommerce-page .woocommerce-error .button,.woocommerce-page .woocommerce-info .button,.woocommerce-page .woocommerce-message .button{float:left}.woocommerce .col2-set,.woocommerce-page .col2-set{width:100%}.woocommerce .col2-set::after,.woocommerce .col2-set::before,.woocommerce-page .col2-set::after,.woocommerce-page .col2-set::before{content:' ';display:table}.woocommerce .col2-set::after,.woocommerce-page .col2-set::after{clear:both}.woocommerce .col2-set .col-1,.woocommerce-page .col2-set .col-1{float:right;width:48%}.woocommerce .col2-set .col-2,.woocommerce-page .col2-set .col-2{float:left;width:48%}.woocommerce img,.woocommerce-page img{height:auto;max-width:100%}.woocommerce #content div.product div.images,.woocommerce div.product div.images,.woocommerce-page #content div.product div.images,.woocommerce-page div.product div.images{float:right;width:48%}.woocommerce #content div.product div.thumbnails::after,.woocommerce #content div.product div.thumbnails::before,.woocommerce div.product div.thumbnails::after,.woocommerce div.product div.thumbnails::before,.woocommerce-page #content div.product div.thumbnails::after,.woocommerce-page #content div.product div.thumbnails::before,.woocommerce-page div.product div.thumbnails::after,.woocommerce-page div.product div.thumbnails::before{content:' ';display:table}.woocommerce #content div.product div.thumbnails::after,.woocommerce div.product div.thumbnails::after,.woocommerce-page #content div.product div.thumbnails::after,.woocommerce-page div.product div.thumbnails::after{clear:both}.woocommerce #content div.product div.thumbnails a,.woocommerce div.product div.thumbnails a,.woocommerce-page #content div.product div.thumbnails a,.woocommerce-page div.product div.thumbnails a{float:right;width:30.75%;margin-left:3.8%;margin-bottom:1em}.woocommerce #content div.product div.thumbnails a.last,.woocommerce div.product div.thumbnails a.last,.woocommerce-page #content div.product div.thumbnails a.last,.woocommerce-page div.product div.thumbnails a.last{margin-left:0}.woocommerce #content div.product div.thumbnails a.first,.woocommerce div.product div.thumbnails a.first,.woocommerce-page #content div.product div.thumbnails a.first,.woocommerce-page div.product div.thumbnails a.first{clear:both}.woocommerce #content div.product div.thumbnails.columns-1 a,.woocommerce div.product div.thumbnails.columns-1 a,.woocommerce-page #content div.product div.thumbnails.columns-1 a,.woocommerce-page div.product div.thumbnails.columns-1 a{width:100%;margin-left:0;float:none}.woocommerce #content div.product div.thumbnails.columns-2 a,.woocommerce div.product div.thumbnails.columns-2 a,.woocommerce-page #content div.product div.thumbnails.columns-2 a,.woocommerce-page div.product div.thumbnails.columns-2 a{width:48%}.woocommerce #content div.product div.thumbnails.columns-4 a,.woocommerce div.product div.thumbnails.columns-4 a,.woocommerce-page #content div.product div.thumbnails.columns-4 a,.woocommerce-page div.product div.thumbnails.columns-4 a{width:22.05%}.woocommerce #content div.product div.thumbnails.columns-5 a,.woocommerce div.product div.thumbnails.columns-5 a,.woocommerce-page #content div.product div.thumbnails.columns-5 a,.woocommerce-page div.product div.thumbnails.columns-5 a{width:16.9%}.woocommerce #content div.product div.summary,.woocommerce div.product div.summary,.woocommerce-page #content div.product div.summary,.woocommerce-page div.product div.summary{float:left;width:48%;clear:none}.woocommerce #content div.product .woocommerce-tabs,.woocommerce div.product .woocommerce-tabs,.woocommerce-page #content div.product .woocommerce-tabs,.woocommerce-page div.product .woocommerce-tabs{clear:both}.woocommerce #content div.product .woocommerce-tabs ul.tabs::after,.woocommerce #content div.product .woocommerce-tabs ul.tabs::before,.woocommerce div.product .woocommerce-tabs ul.tabs::after,.woocommerce div.product .woocommerce-tabs ul.tabs::before,.woocommerce-page #content div.product .woocommerce-tabs ul.tabs::after,.woocommerce-page #content div.product .woocommerce-tabs ul.tabs::before,.woocommerce-page div.product .woocommerce-tabs ul.tabs::after,.woocommerce-page div.product .woocommerce-tabs ul.tabs::before{content:' ';display:table}.woocommerce #content div.product .woocommerce-tabs ul.tabs::after,.woocommerce div.product .woocommerce-tabs ul.tabs::after,.woocommerce-page #content div.product .woocommerce-tabs ul.tabs::after,.woocommerce-page div.product .woocommerce-tabs ul.tabs::after{clear:both}.woocommerce #content div.product .woocommerce-tabs ul.tabs li,.woocommerce div.product .woocommerce-tabs ul.tabs li,.woocommerce-page #content div.product .woocommerce-tabs ul.tabs li,.woocommerce-page div.product .woocommerce-tabs ul.tabs li{display:inline-block}.woocommerce #content div.product #reviews .comment::after,.woocommerce #content div.product #reviews .comment::before,.woocommerce div.product #reviews .comment::after,.woocommerce div.product #reviews .comment::before,.woocommerce-page #content div.product #reviews .comment::after,.woocommerce-page #content div.product #reviews .comment::before,.woocommerce-page div.product #reviews .comment::after,.woocommerce-page div.product #reviews .comment::before{content:' ';display:table}.woocommerce #content div.product #reviews .comment::after,.woocommerce div.product #reviews .comment::after,.woocommerce-page #content div.product #reviews .comment::after,.woocommerce-page div.product #reviews .comment::after{clear:both}.woocommerce #content div.product #reviews .comment img,.woocommerce div.product #reviews .comment img,.woocommerce-page #content div.product #reviews .comment img,.woocommerce-page div.product #reviews .comment img{float:left;height:auto}.woocommerce ul.products,.woocommerce-page ul.products{clear:both}.woocommerce ul.products::after,.woocommerce ul.products::before,.woocommerce-page ul.products::after,.woocommerce-page ul.products::before{content:' ';display:table}.woocommerce ul.products::after,.woocommerce-page ul.products::after{clear:both}.woocommerce ul.products li.product,.woocommerce-page ul.products li.product{float:right;margin:0 0 2.992em 3.8%;padding:0;position:relative;width:22.05%;margin-right:0}.woocommerce ul.products li.first,.woocommerce-page ul.products li.first{clear:both}.woocommerce ul.products li.last,.woocommerce-page ul.products li.last{margin-left:0}.woocommerce ul.products.columns-1 li.product,.woocommerce-page ul.products.columns-1 li.product{width:100%;margin-left:0}.woocommerce ul.products.columns-2 li.product,.woocommerce-page ul.products.columns-2 li.product{width:48%}.woocommerce ul.products.columns-3 li.product,.woocommerce-page ul.products.columns-3 li.product{width:30.75%}.woocommerce ul.products.columns-5 li.product,.woocommerce-page ul.products.columns-5 li.product{width:16.95%}.woocommerce ul.products.columns-6 li.product,.woocommerce-page ul.products.columns-6 li.product{width:13.5%}.woocommerce-page.columns-1 ul.products li.product,.woocommerce.columns-1 ul.products li.product{width:100%;margin-left:0}.woocommerce-page.columns-2 ul.products li.product,.woocommerce.columns-2 ul.products li.product{width:48%}.woocommerce-page.columns-3 ul.products li.product,.woocommerce.columns-3 ul.products li.product{width:30.75%}.woocommerce-page.columns-5 ul.products li.product,.woocommerce.columns-5 ul.products li.product{width:16.95%}.woocommerce-page.columns-6 ul.products li.product,.woocommerce.columns-6 ul.products li.product{width:13.5%}.woocommerce .woocommerce-result-count,.woocommerce-page .woocommerce-result-count{float:right}.woocommerce .woocommerce-ordering,.woocommerce-page .woocommerce-ordering{float:left}.woocommerce .woocommerce-pagination ul.page-numbers::after,.woocommerce .woocommerce-pagination ul.page-numbers::before,.woocommerce-page .woocommerce-pagination ul.page-numbers::after,.woocommerce-page .woocommerce-pagination ul.page-numbers::before{content:' ';display:table}.woocommerce .woocommerce-pagination ul.page-numbers::after,.woocommerce-page .woocommerce-pagination ul.page-numbers::after{clear:both}.woocommerce .woocommerce-pagination ul.page-numbers li,.woocommerce-page .woocommerce-pagination ul.page-numbers li{display:inline-block}.woocommerce #content table.cart img,.woocommerce table.cart img,.woocommerce-page #content table.cart img,.woocommerce-page table.cart img{height:auto}.woocommerce #content table.cart td.actions,.woocommerce table.cart td.actions,.woocommerce-page #content table.cart td.actions,.woocommerce-page table.cart td.actions{text-align:left}.woocommerce #content table.cart td.actions .input-text,.woocommerce table.cart td.actions .input-text,.woocommerce-page #content table.cart td.actions .input-text,.woocommerce-page table.cart td.actions .input-text{width:80px}.woocommerce #content table.cart td.actions .coupon,.woocommerce table.cart td.actions .coupon,.woocommerce-page #content table.cart td.actions .coupon,.woocommerce-page table.cart td.actions .coupon{float:right}.woocommerce #content table.cart td.actions .coupon label,.woocommerce table.cart td.actions .coupon label,.woocommerce-page #content table.cart td.actions .coupon label,.woocommerce-page table.cart td.actions .coupon label{display:none}.woocommerce .cart-collaterals,.woocommerce-page .cart-collaterals{width:100%}.woocommerce .cart-collaterals::after,.woocommerce .cart-collaterals::before,.woocommerce-page .cart-collaterals::after,.woocommerce-page .cart-collaterals::before{content:' ';display:table}.woocommerce .cart-collaterals::after,.woocommerce-page .cart-collaterals::after{clear:both}.woocommerce .cart-collaterals .related,.woocommerce-page .cart-collaterals .related{width:30.75%;float:right}.woocommerce .cart-collaterals .cross-sells,.woocommerce-page .cart-collaterals .cross-sells{width:48%;float:right}.woocommerce .cart-collaterals .cross-sells ul.products,.woocommerce-page .cart-collaterals .cross-sells ul.products{float:none}.woocommerce .cart-collaterals .cross-sells ul.products li,.woocommerce-page .cart-collaterals .cross-sells ul.products li{width:48%}.woocommerce .cart-collaterals .shipping_calculator,.woocommerce-page .cart-collaterals .shipping_calculator{width:48%;clear:left;float:left}.woocommerce .cart-collaterals .shipping_calculator::after,.woocommerce .cart-collaterals .shipping_calculator::before,.woocommerce-page .cart-collaterals .shipping_calculator::after,.woocommerce-page .cart-collaterals .shipping_calculator::before{content:' ';display:table}.woocommerce .cart-collaterals .shipping_calculator::after,.woocommerce-page .cart-collaterals .shipping_calculator::after{clear:both}.woocommerce .cart-collaterals .shipping_calculator .col2-set .col-1,.woocommerce .cart-collaterals .shipping_calculator .col2-set .col-2,.woocommerce-page .cart-collaterals .shipping_calculator .col2-set .col-1,.woocommerce-page .cart-collaterals .shipping_calculator .col2-set .col-2{width:47%}.woocommerce .cart-collaterals .cart_totals,.woocommerce-page .cart-collaterals .cart_totals{float:left;width:48%}.woocommerce ul.cart_list li::after,.woocommerce ul.cart_list li::before,.woocommerce ul.product_list_widget li::after,.woocommerce ul.product_list_widget li::before,.woocommerce-page ul.cart_list li::after,.woocommerce-page ul.cart_list li::before,.woocommerce-page ul.product_list_widget li::after,.woocommerce-page ul.product_list_widget li::before{content:' ';display:table}.woocommerce ul.cart_list li::after,.woocommerce ul.product_list_widget li::after,.woocommerce-page ul.cart_list li::after,.woocommerce-page ul.product_list_widget li::after{clear:both}.woocommerce ul.cart_list li img,.woocommerce ul.product_list_widget li img,.woocommerce-page ul.cart_list li img,.woocommerce-page ul.product_list_widget li img{float:left;height:auto}.woocommerce form .form-row::after,.woocommerce form .form-row::before,.woocommerce-page form .form-row::after,.woocommerce-page form .form-row::before{content:' ';display:table}.woocommerce form .form-row::after,.woocommerce-page form .form-row::after{clear:both}.woocommerce form .form-row label,.woocommerce-page form .form-row label{display:block}.woocommerce form .form-row label.checkbox,.woocommerce-page form .form-row label.checkbox{display:inline}.woocommerce form .form-row select,.woocommerce-page form .form-row select{width:100%}.woocommerce form .form-row .input-text,.woocommerce-page form .form-row .input-text{box-sizing:border-box;width:100%}.woocommerce form .form-row-first,.woocommerce form .form-row-last,.woocommerce-page form .form-row-first,.woocommerce-page form .form-row-last{width:47%;overflow:visible}.woocommerce form .form-row-first,.woocommerce-page form .form-row-first{float:right;float:right}.woocommerce form .form-row-last,.woocommerce-page form .form-row-last{float:left}.woocommerce form .form-row-wide,.woocommerce-page form .form-row-wide{clear:both}.woocommerce #payment .form-row select,.woocommerce-page #payment .form-row select{width:auto}.woocommerce #payment .terms,.woocommerce #payment .wc-terms-and-conditions,.woocommerce-page #payment .terms,.woocommerce-page #payment .wc-terms-and-conditions{text-align:right;padding:0 0 0 1em;float:right}.woocommerce #payment #place_order,.woocommerce-page #payment #place_order{float:left}.woocommerce .woocommerce-billing-fields::after,.woocommerce .woocommerce-billing-fields::before,.woocommerce .woocommerce-shipping-fields::after,.woocommerce .woocommerce-shipping-fields::before,.woocommerce-page .woocommerce-billing-fields::after,.woocommerce-page .woocommerce-billing-fields::before,.woocommerce-page .woocommerce-shipping-fields::after,.woocommerce-page .woocommerce-shipping-fields::before{content:' ';display:table}.woocommerce .woocommerce-billing-fields::after,.woocommerce .woocommerce-shipping-fields::after,.woocommerce-page .woocommerce-billing-fields::after,.woocommerce-page .woocommerce-shipping-fields::after{clear:both}.woocommerce .woocommerce-terms-and-conditions,.woocommerce-page .woocommerce-terms-and-conditions{margin-bottom:1.618em;padding:1.618em}.woocommerce .woocommerce-oembed,.woocommerce-page .woocommerce-oembed{position:relative}.woocommerce-account .woocommerce-MyAccount-navigation{float:right;width:30%}.woocommerce-account .woocommerce-MyAccount-content{float:left;width:68%}.woocommerce-page.left-sidebar #content.twentyeleven{width:58.4%;margin:0 7.6%;float:left}.woocommerce-page.right-sidebar #content.twentyeleven{margin:0 7.6%;width:58.4%;float:right}.twentyfourteen .tfwc{padding:12px 10px 0;max-width:474px;margin:0 auto}.twentyfourteen .tfwc .product .entry-summary{padding:0!important;margin:0 0 1.618em!important}.twentyfourteen .tfwc div.product.hentry.has-post-thumbnail{margin-top:0}@media screen and (min-width:673px){.twentyfourteen .tfwc{padding-left:30px;padding-right:30px}}@media screen and (min-width:1040px){.twentyfourteen .tfwc{padding-left:15px;padding-right:15px}}@media screen and (min-width:1110px){.twentyfourteen .tfwc{padding-left:30px;padding-right:30px}}@media screen and (min-width:1218px){.twentyfourteen .tfwc{margin-left:54px}.full-width .twentyfourteen .tfwc{margin-left:auto}}.twentyfifteen .t15wc{padding-right:7.6923%;padding-left:7.6923%;padding-top:7.6923%;margin-bottom:7.6923%;background:#fff;box-shadow:0 0 1px rgba(0,0,0,.15)}.twentyfifteen .t15wc .page-title{margin-right:0}@media screen and (min-width:38.75em){.twentyfifteen .t15wc{margin-left:7.6923%;margin-right:7.6923%;margin-top:8.3333%}}@media screen and (min-width:59.6875em){.twentyfifteen .t15wc{margin-right:8.3333%;margin-left:8.3333%;padding:10%}.single-product .twentyfifteen .entry-summary{padding:0!important}}.twentysixteen .site-main{margin-left:7.6923%;margin-right:7.6923%}.twentysixteen .entry-summary{margin-left:0;margin-right:0}#content .twentysixteen div.product div.images,#content .twentysixteen div.product div.summary{width:46.42857%}@media screen and (min-width:44.375em){.twentysixteen .site-main{margin-left:23.0769%}}@media screen and (min-width:56.875em){.twentysixteen .site-main{margin-left:0;margin-right:0}.no-sidebar .twentysixteen .site-main{margin-left:15%;margin-right:15%}.no-sidebar .twentysixteen .entry-summary{margin-left:0;margin-right:0}}.rtl .woocommerce .col2-set .col-1,.rtl .woocommerce-page .col2-set .col-1{float:left}.rtl .woocommerce .col2-set .col-2,.rtl .woocommerce-page .col2-set .col-2{float:right} \ No newline at end of file diff --git a/assets/css/woocommerce-layout.css b/assets/css/woocommerce-layout.css index 9f49d9feea6..7650e2321c2 100644 --- a/assets/css/woocommerce-layout.css +++ b/assets/css/woocommerce-layout.css @@ -1 +1 @@ -.woocommerce .woocommerce-error .button,.woocommerce .woocommerce-info .button,.woocommerce .woocommerce-message .button,.woocommerce-page .woocommerce-error .button,.woocommerce-page .woocommerce-info .button,.woocommerce-page .woocommerce-message .button{float:right}.woocommerce .col2-set,.woocommerce-page .col2-set{width:100%}.woocommerce .col2-set::after,.woocommerce .col2-set::before,.woocommerce-page .col2-set::after,.woocommerce-page .col2-set::before{content:' ';display:table}.woocommerce .col2-set::after,.woocommerce-page .col2-set::after{clear:both}.woocommerce .col2-set .col-1,.woocommerce-page .col2-set .col-1{float:left;width:48%}.woocommerce .col2-set .col-2,.woocommerce-page .col2-set .col-2{float:right;width:48%}.woocommerce img,.woocommerce-page img{height:auto;max-width:100%}.woocommerce #content div.product div.images,.woocommerce div.product div.images,.woocommerce-page #content div.product div.images,.woocommerce-page div.product div.images{float:left;width:48%}.woocommerce #content div.product div.thumbnails::after,.woocommerce #content div.product div.thumbnails::before,.woocommerce div.product div.thumbnails::after,.woocommerce div.product div.thumbnails::before,.woocommerce-page #content div.product div.thumbnails::after,.woocommerce-page #content div.product div.thumbnails::before,.woocommerce-page div.product div.thumbnails::after,.woocommerce-page div.product div.thumbnails::before{content:' ';display:table}.woocommerce #content div.product div.thumbnails::after,.woocommerce div.product div.thumbnails::after,.woocommerce-page #content div.product div.thumbnails::after,.woocommerce-page div.product div.thumbnails::after{clear:both}.woocommerce #content div.product div.thumbnails a,.woocommerce div.product div.thumbnails a,.woocommerce-page #content div.product div.thumbnails a,.woocommerce-page div.product div.thumbnails a{float:left;width:30.75%;margin-right:3.8%;margin-bottom:1em}.woocommerce #content div.product div.thumbnails a.last,.woocommerce div.product div.thumbnails a.last,.woocommerce-page #content div.product div.thumbnails a.last,.woocommerce-page div.product div.thumbnails a.last{margin-right:0}.woocommerce #content div.product div.thumbnails a.first,.woocommerce div.product div.thumbnails a.first,.woocommerce-page #content div.product div.thumbnails a.first,.woocommerce-page div.product div.thumbnails a.first{clear:both}.woocommerce #content div.product div.thumbnails.columns-1 a,.woocommerce div.product div.thumbnails.columns-1 a,.woocommerce-page #content div.product div.thumbnails.columns-1 a,.woocommerce-page div.product div.thumbnails.columns-1 a{width:100%;margin-right:0;float:none}.woocommerce #content div.product div.thumbnails.columns-2 a,.woocommerce div.product div.thumbnails.columns-2 a,.woocommerce-page #content div.product div.thumbnails.columns-2 a,.woocommerce-page div.product div.thumbnails.columns-2 a{width:48%}.woocommerce #content div.product div.thumbnails.columns-4 a,.woocommerce div.product div.thumbnails.columns-4 a,.woocommerce-page #content div.product div.thumbnails.columns-4 a,.woocommerce-page div.product div.thumbnails.columns-4 a{width:22.05%}.woocommerce #content div.product div.thumbnails.columns-5 a,.woocommerce div.product div.thumbnails.columns-5 a,.woocommerce-page #content div.product div.thumbnails.columns-5 a,.woocommerce-page div.product div.thumbnails.columns-5 a{width:16.9%}.woocommerce #content div.product div.summary,.woocommerce div.product div.summary,.woocommerce-page #content div.product div.summary,.woocommerce-page div.product div.summary{float:right;width:48%;clear:none}.woocommerce #content div.product .woocommerce-tabs,.woocommerce div.product .woocommerce-tabs,.woocommerce-page #content div.product .woocommerce-tabs,.woocommerce-page div.product .woocommerce-tabs{clear:both}.woocommerce #content div.product .woocommerce-tabs ul.tabs::after,.woocommerce #content div.product .woocommerce-tabs ul.tabs::before,.woocommerce div.product .woocommerce-tabs ul.tabs::after,.woocommerce div.product .woocommerce-tabs ul.tabs::before,.woocommerce-page #content div.product .woocommerce-tabs ul.tabs::after,.woocommerce-page #content div.product .woocommerce-tabs ul.tabs::before,.woocommerce-page div.product .woocommerce-tabs ul.tabs::after,.woocommerce-page div.product .woocommerce-tabs ul.tabs::before{content:' ';display:table}.woocommerce #content div.product .woocommerce-tabs ul.tabs::after,.woocommerce div.product .woocommerce-tabs ul.tabs::after,.woocommerce-page #content div.product .woocommerce-tabs ul.tabs::after,.woocommerce-page div.product .woocommerce-tabs ul.tabs::after{clear:both}.woocommerce #content div.product .woocommerce-tabs ul.tabs li,.woocommerce div.product .woocommerce-tabs ul.tabs li,.woocommerce-page #content div.product .woocommerce-tabs ul.tabs li,.woocommerce-page div.product .woocommerce-tabs ul.tabs li{display:inline-block}.woocommerce #content div.product #reviews .comment::after,.woocommerce #content div.product #reviews .comment::before,.woocommerce div.product #reviews .comment::after,.woocommerce div.product #reviews .comment::before,.woocommerce-page #content div.product #reviews .comment::after,.woocommerce-page #content div.product #reviews .comment::before,.woocommerce-page div.product #reviews .comment::after,.woocommerce-page div.product #reviews .comment::before{content:' ';display:table}.woocommerce #content div.product #reviews .comment::after,.woocommerce div.product #reviews .comment::after,.woocommerce-page #content div.product #reviews .comment::after,.woocommerce-page div.product #reviews .comment::after{clear:both}.woocommerce #content div.product #reviews .comment img,.woocommerce div.product #reviews .comment img,.woocommerce-page #content div.product #reviews .comment img,.woocommerce-page div.product #reviews .comment img{float:right;height:auto}.woocommerce ul.products,.woocommerce-page ul.products{clear:both}.woocommerce ul.products::after,.woocommerce ul.products::before,.woocommerce-page ul.products::after,.woocommerce-page ul.products::before{content:' ';display:table}.woocommerce ul.products::after,.woocommerce-page ul.products::after{clear:both}.woocommerce ul.products li.product,.woocommerce-page ul.products li.product{float:left;margin:0 3.8% 2.992em 0;padding:0;position:relative;width:22.05%;margin-left:0}.woocommerce ul.products li.first,.woocommerce-page ul.products li.first{clear:both}.woocommerce ul.products li.last,.woocommerce-page ul.products li.last{margin-right:0}.woocommerce ul.products.columns-1 li.product,.woocommerce-page ul.products.columns-1 li.product{width:100%;margin-right:0}.woocommerce ul.products.columns-2 li.product,.woocommerce-page ul.products.columns-2 li.product{width:48%}.woocommerce ul.products.columns-3 li.product,.woocommerce-page ul.products.columns-3 li.product{width:30.75%}.woocommerce ul.products.columns-5 li.product,.woocommerce-page ul.products.columns-5 li.product{width:16.95%}.woocommerce ul.products.columns-6 li.product,.woocommerce-page ul.products.columns-6 li.product{width:13.5%}.woocommerce-page.columns-1 ul.products li.product,.woocommerce.columns-1 ul.products li.product{width:100%;margin-right:0}.woocommerce-page.columns-2 ul.products li.product,.woocommerce.columns-2 ul.products li.product{width:48%}.woocommerce-page.columns-3 ul.products li.product,.woocommerce.columns-3 ul.products li.product{width:30.75%}.woocommerce-page.columns-5 ul.products li.product,.woocommerce.columns-5 ul.products li.product{width:16.95%}.woocommerce-page.columns-6 ul.products li.product,.woocommerce.columns-6 ul.products li.product{width:13.5%}.woocommerce .woocommerce-result-count,.woocommerce-page .woocommerce-result-count{float:left}.woocommerce .woocommerce-ordering,.woocommerce-page .woocommerce-ordering{float:right}.woocommerce .woocommerce-pagination ul.page-numbers::after,.woocommerce .woocommerce-pagination ul.page-numbers::before,.woocommerce-page .woocommerce-pagination ul.page-numbers::after,.woocommerce-page .woocommerce-pagination ul.page-numbers::before{content:' ';display:table}.woocommerce .woocommerce-pagination ul.page-numbers::after,.woocommerce-page .woocommerce-pagination ul.page-numbers::after{clear:both}.woocommerce .woocommerce-pagination ul.page-numbers li,.woocommerce-page .woocommerce-pagination ul.page-numbers li{display:inline-block}.woocommerce #content table.cart img,.woocommerce table.cart img,.woocommerce-page #content table.cart img,.woocommerce-page table.cart img{height:auto}.woocommerce #content table.cart td.actions,.woocommerce table.cart td.actions,.woocommerce-page #content table.cart td.actions,.woocommerce-page table.cart td.actions{text-align:right}.woocommerce #content table.cart td.actions .input-text,.woocommerce table.cart td.actions .input-text,.woocommerce-page #content table.cart td.actions .input-text,.woocommerce-page table.cart td.actions .input-text{width:80px}.woocommerce #content table.cart td.actions .coupon,.woocommerce table.cart td.actions .coupon,.woocommerce-page #content table.cart td.actions .coupon,.woocommerce-page table.cart td.actions .coupon{float:left}.woocommerce #content table.cart td.actions .coupon label,.woocommerce table.cart td.actions .coupon label,.woocommerce-page #content table.cart td.actions .coupon label,.woocommerce-page table.cart td.actions .coupon label{display:none}.woocommerce .cart-collaterals,.woocommerce-page .cart-collaterals{width:100%}.woocommerce .cart-collaterals::after,.woocommerce .cart-collaterals::before,.woocommerce-page .cart-collaterals::after,.woocommerce-page .cart-collaterals::before{content:' ';display:table}.woocommerce .cart-collaterals::after,.woocommerce-page .cart-collaterals::after{clear:both}.woocommerce .cart-collaterals .related,.woocommerce-page .cart-collaterals .related{width:30.75%;float:left}.woocommerce .cart-collaterals .cross-sells,.woocommerce-page .cart-collaterals .cross-sells{width:48%;float:left}.woocommerce .cart-collaterals .cross-sells ul.products,.woocommerce-page .cart-collaterals .cross-sells ul.products{float:none}.woocommerce .cart-collaterals .cross-sells ul.products li,.woocommerce-page .cart-collaterals .cross-sells ul.products li{width:48%}.woocommerce .cart-collaterals .shipping_calculator,.woocommerce-page .cart-collaterals .shipping_calculator{width:48%;clear:right;float:right}.woocommerce .cart-collaterals .shipping_calculator::after,.woocommerce .cart-collaterals .shipping_calculator::before,.woocommerce-page .cart-collaterals .shipping_calculator::after,.woocommerce-page .cart-collaterals .shipping_calculator::before{content:' ';display:table}.woocommerce .cart-collaterals .shipping_calculator::after,.woocommerce-page .cart-collaterals .shipping_calculator::after{clear:both}.woocommerce .cart-collaterals .shipping_calculator .col2-set .col-1,.woocommerce .cart-collaterals .shipping_calculator .col2-set .col-2,.woocommerce-page .cart-collaterals .shipping_calculator .col2-set .col-1,.woocommerce-page .cart-collaterals .shipping_calculator .col2-set .col-2{width:47%}.woocommerce .cart-collaterals .cart_totals,.woocommerce-page .cart-collaterals .cart_totals{float:right;width:48%}.woocommerce ul.cart_list li::after,.woocommerce ul.cart_list li::before,.woocommerce ul.product_list_widget li::after,.woocommerce ul.product_list_widget li::before,.woocommerce-page ul.cart_list li::after,.woocommerce-page ul.cart_list li::before,.woocommerce-page ul.product_list_widget li::after,.woocommerce-page ul.product_list_widget li::before{content:' ';display:table}.woocommerce ul.cart_list li::after,.woocommerce ul.product_list_widget li::after,.woocommerce-page ul.cart_list li::after,.woocommerce-page ul.product_list_widget li::after{clear:both}.woocommerce ul.cart_list li img,.woocommerce ul.product_list_widget li img,.woocommerce-page ul.cart_list li img,.woocommerce-page ul.product_list_widget li img{float:right;height:auto}.woocommerce form .form-row::after,.woocommerce form .form-row::before,.woocommerce-page form .form-row::after,.woocommerce-page form .form-row::before{content:' ';display:table}.woocommerce form .form-row::after,.woocommerce-page form .form-row::after{clear:both}.woocommerce form .form-row label,.woocommerce-page form .form-row label{display:block}.woocommerce form .form-row label.checkbox,.woocommerce-page form .form-row label.checkbox{display:inline}.woocommerce form .form-row select,.woocommerce-page form .form-row select{width:100%}.woocommerce form .form-row .input-text,.woocommerce-page form .form-row .input-text{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.woocommerce form .form-row-first,.woocommerce form .form-row-last,.woocommerce-page form .form-row-first,.woocommerce-page form .form-row-last{width:47%;overflow:visible}.woocommerce form .form-row-first,.woocommerce-page form .form-row-first{float:left}.woocommerce form .form-row-last,.woocommerce-page form .form-row-last{float:right}.woocommerce form .form-row-wide,.woocommerce-page form .form-row-wide{clear:both}.woocommerce #payment .form-row select,.woocommerce-page #payment .form-row select{width:auto}.woocommerce #payment .terms,.woocommerce #payment .wc-terms-and-conditions,.woocommerce-page #payment .terms,.woocommerce-page #payment .wc-terms-and-conditions{text-align:left;padding:0 1em 0 0;float:left}.woocommerce #payment #place_order,.woocommerce-page #payment #place_order{float:right}.woocommerce .woocommerce-billing-fields::after,.woocommerce .woocommerce-billing-fields::before,.woocommerce .woocommerce-shipping-fields::after,.woocommerce .woocommerce-shipping-fields::before,.woocommerce-page .woocommerce-billing-fields::after,.woocommerce-page .woocommerce-billing-fields::before,.woocommerce-page .woocommerce-shipping-fields::after,.woocommerce-page .woocommerce-shipping-fields::before{content:' ';display:table}.woocommerce .woocommerce-billing-fields::after,.woocommerce .woocommerce-shipping-fields::after,.woocommerce-page .woocommerce-billing-fields::after,.woocommerce-page .woocommerce-shipping-fields::after{clear:both}.woocommerce .woocommerce-terms-and-conditions,.woocommerce-page .woocommerce-terms-and-conditions{margin-bottom:1.618em;padding:1.618em}.woocommerce .woocommerce-oembed,.woocommerce-page .woocommerce-oembed{position:relative}.woocommerce-account .woocommerce-MyAccount-navigation{float:left;width:30%}.woocommerce-account .woocommerce-MyAccount-content{float:right;width:68%}.woocommerce-page.left-sidebar #content.twentyeleven{width:58.4%;margin:0 7.6%;float:right}.woocommerce-page.right-sidebar #content.twentyeleven{margin:0 7.6%;width:58.4%;float:left}.twentyfourteen .tfwc{padding:12px 10px 0;max-width:474px;margin:0 auto}.twentyfourteen .tfwc .product .entry-summary{padding:0!important;margin:0 0 1.618em!important}.twentyfourteen .tfwc div.product.hentry.has-post-thumbnail{margin-top:0}@media screen and (min-width:673px){.twentyfourteen .tfwc{padding-right:30px;padding-left:30px}}@media screen and (min-width:1040px){.twentyfourteen .tfwc{padding-right:15px;padding-left:15px}}@media screen and (min-width:1110px){.twentyfourteen .tfwc{padding-right:30px;padding-left:30px}}@media screen and (min-width:1218px){.twentyfourteen .tfwc{margin-right:54px}.full-width .twentyfourteen .tfwc{margin-right:auto}}.twentyfifteen .t15wc{padding-left:7.6923%;padding-right:7.6923%;padding-top:7.6923%;margin-bottom:7.6923%;background:#fff;-webkit-box-shadow:0 0 1px rgba(0,0,0,.15);box-shadow:0 0 1px rgba(0,0,0,.15)}.twentyfifteen .t15wc .page-title{margin-left:0}@media screen and (min-width:38.75em){.twentyfifteen .t15wc{margin-right:7.6923%;margin-left:7.6923%;margin-top:8.3333%}}@media screen and (min-width:59.6875em){.twentyfifteen .t15wc{margin-left:8.3333%;margin-right:8.3333%;padding:10%}.single-product .twentyfifteen .entry-summary{padding:0!important}}.twentysixteen .site-main{margin-right:7.6923%;margin-left:7.6923%}.twentysixteen .entry-summary{margin-right:0;margin-left:0}#content .twentysixteen div.product div.images,#content .twentysixteen div.product div.summary{width:46.42857%}@media screen and (min-width:44.375em){.twentysixteen .site-main{margin-right:23.0769%}}@media screen and (min-width:56.875em){.twentysixteen .site-main{margin-right:0;margin-left:0}.no-sidebar .twentysixteen .site-main{margin-right:15%;margin-left:15%}.no-sidebar .twentysixteen .entry-summary{margin-right:0;margin-left:0}}.rtl .woocommerce .col2-set .col-1,.rtl .woocommerce-page .col2-set .col-1{float:right}.rtl .woocommerce .col2-set .col-2,.rtl .woocommerce-page .col2-set .col-2{float:left} \ No newline at end of file +.woocommerce .woocommerce-error .button,.woocommerce .woocommerce-info .button,.woocommerce .woocommerce-message .button,.woocommerce-page .woocommerce-error .button,.woocommerce-page .woocommerce-info .button,.woocommerce-page .woocommerce-message .button{float:right}.woocommerce .col2-set,.woocommerce-page .col2-set{width:100%}.woocommerce .col2-set::after,.woocommerce .col2-set::before,.woocommerce-page .col2-set::after,.woocommerce-page .col2-set::before{content:' ';display:table}.woocommerce .col2-set::after,.woocommerce-page .col2-set::after{clear:both}.woocommerce .col2-set .col-1,.woocommerce-page .col2-set .col-1{float:left;width:48%}.woocommerce .col2-set .col-2,.woocommerce-page .col2-set .col-2{float:right;width:48%}.woocommerce img,.woocommerce-page img{height:auto;max-width:100%}.woocommerce #content div.product div.images,.woocommerce div.product div.images,.woocommerce-page #content div.product div.images,.woocommerce-page div.product div.images{float:left;width:48%}.woocommerce #content div.product div.thumbnails::after,.woocommerce #content div.product div.thumbnails::before,.woocommerce div.product div.thumbnails::after,.woocommerce div.product div.thumbnails::before,.woocommerce-page #content div.product div.thumbnails::after,.woocommerce-page #content div.product div.thumbnails::before,.woocommerce-page div.product div.thumbnails::after,.woocommerce-page div.product div.thumbnails::before{content:' ';display:table}.woocommerce #content div.product div.thumbnails::after,.woocommerce div.product div.thumbnails::after,.woocommerce-page #content div.product div.thumbnails::after,.woocommerce-page div.product div.thumbnails::after{clear:both}.woocommerce #content div.product div.thumbnails a,.woocommerce div.product div.thumbnails a,.woocommerce-page #content div.product div.thumbnails a,.woocommerce-page div.product div.thumbnails a{float:left;width:30.75%;margin-right:3.8%;margin-bottom:1em}.woocommerce #content div.product div.thumbnails a.last,.woocommerce div.product div.thumbnails a.last,.woocommerce-page #content div.product div.thumbnails a.last,.woocommerce-page div.product div.thumbnails a.last{margin-right:0}.woocommerce #content div.product div.thumbnails a.first,.woocommerce div.product div.thumbnails a.first,.woocommerce-page #content div.product div.thumbnails a.first,.woocommerce-page div.product div.thumbnails a.first{clear:both}.woocommerce #content div.product div.thumbnails.columns-1 a,.woocommerce div.product div.thumbnails.columns-1 a,.woocommerce-page #content div.product div.thumbnails.columns-1 a,.woocommerce-page div.product div.thumbnails.columns-1 a{width:100%;margin-right:0;float:none}.woocommerce #content div.product div.thumbnails.columns-2 a,.woocommerce div.product div.thumbnails.columns-2 a,.woocommerce-page #content div.product div.thumbnails.columns-2 a,.woocommerce-page div.product div.thumbnails.columns-2 a{width:48%}.woocommerce #content div.product div.thumbnails.columns-4 a,.woocommerce div.product div.thumbnails.columns-4 a,.woocommerce-page #content div.product div.thumbnails.columns-4 a,.woocommerce-page div.product div.thumbnails.columns-4 a{width:22.05%}.woocommerce #content div.product div.thumbnails.columns-5 a,.woocommerce div.product div.thumbnails.columns-5 a,.woocommerce-page #content div.product div.thumbnails.columns-5 a,.woocommerce-page div.product div.thumbnails.columns-5 a{width:16.9%}.woocommerce #content div.product div.summary,.woocommerce div.product div.summary,.woocommerce-page #content div.product div.summary,.woocommerce-page div.product div.summary{float:right;width:48%;clear:none}.woocommerce #content div.product .woocommerce-tabs,.woocommerce div.product .woocommerce-tabs,.woocommerce-page #content div.product .woocommerce-tabs,.woocommerce-page div.product .woocommerce-tabs{clear:both}.woocommerce #content div.product .woocommerce-tabs ul.tabs::after,.woocommerce #content div.product .woocommerce-tabs ul.tabs::before,.woocommerce div.product .woocommerce-tabs ul.tabs::after,.woocommerce div.product .woocommerce-tabs ul.tabs::before,.woocommerce-page #content div.product .woocommerce-tabs ul.tabs::after,.woocommerce-page #content div.product .woocommerce-tabs ul.tabs::before,.woocommerce-page div.product .woocommerce-tabs ul.tabs::after,.woocommerce-page div.product .woocommerce-tabs ul.tabs::before{content:' ';display:table}.woocommerce #content div.product .woocommerce-tabs ul.tabs::after,.woocommerce div.product .woocommerce-tabs ul.tabs::after,.woocommerce-page #content div.product .woocommerce-tabs ul.tabs::after,.woocommerce-page div.product .woocommerce-tabs ul.tabs::after{clear:both}.woocommerce #content div.product .woocommerce-tabs ul.tabs li,.woocommerce div.product .woocommerce-tabs ul.tabs li,.woocommerce-page #content div.product .woocommerce-tabs ul.tabs li,.woocommerce-page div.product .woocommerce-tabs ul.tabs li{display:inline-block}.woocommerce #content div.product #reviews .comment::after,.woocommerce #content div.product #reviews .comment::before,.woocommerce div.product #reviews .comment::after,.woocommerce div.product #reviews .comment::before,.woocommerce-page #content div.product #reviews .comment::after,.woocommerce-page #content div.product #reviews .comment::before,.woocommerce-page div.product #reviews .comment::after,.woocommerce-page div.product #reviews .comment::before{content:' ';display:table}.woocommerce #content div.product #reviews .comment::after,.woocommerce div.product #reviews .comment::after,.woocommerce-page #content div.product #reviews .comment::after,.woocommerce-page div.product #reviews .comment::after{clear:both}.woocommerce #content div.product #reviews .comment img,.woocommerce div.product #reviews .comment img,.woocommerce-page #content div.product #reviews .comment img,.woocommerce-page div.product #reviews .comment img{float:right;height:auto}.woocommerce ul.products,.woocommerce-page ul.products{clear:both}.woocommerce ul.products::after,.woocommerce ul.products::before,.woocommerce-page ul.products::after,.woocommerce-page ul.products::before{content:' ';display:table}.woocommerce ul.products::after,.woocommerce-page ul.products::after{clear:both}.woocommerce ul.products li.product,.woocommerce-page ul.products li.product{float:left;margin:0 3.8% 2.992em 0;padding:0;position:relative;width:22.05%;margin-left:0}.woocommerce ul.products li.first,.woocommerce-page ul.products li.first{clear:both}.woocommerce ul.products li.last,.woocommerce-page ul.products li.last{margin-right:0}.woocommerce ul.products.columns-1 li.product,.woocommerce-page ul.products.columns-1 li.product{width:100%;margin-right:0}.woocommerce ul.products.columns-2 li.product,.woocommerce-page ul.products.columns-2 li.product{width:48%}.woocommerce ul.products.columns-3 li.product,.woocommerce-page ul.products.columns-3 li.product{width:30.75%}.woocommerce ul.products.columns-5 li.product,.woocommerce-page ul.products.columns-5 li.product{width:16.95%}.woocommerce ul.products.columns-6 li.product,.woocommerce-page ul.products.columns-6 li.product{width:13.5%}.woocommerce-page.columns-1 ul.products li.product,.woocommerce.columns-1 ul.products li.product{width:100%;margin-right:0}.woocommerce-page.columns-2 ul.products li.product,.woocommerce.columns-2 ul.products li.product{width:48%}.woocommerce-page.columns-3 ul.products li.product,.woocommerce.columns-3 ul.products li.product{width:30.75%}.woocommerce-page.columns-5 ul.products li.product,.woocommerce.columns-5 ul.products li.product{width:16.95%}.woocommerce-page.columns-6 ul.products li.product,.woocommerce.columns-6 ul.products li.product{width:13.5%}.woocommerce .woocommerce-result-count,.woocommerce-page .woocommerce-result-count{float:left}.woocommerce .woocommerce-ordering,.woocommerce-page .woocommerce-ordering{float:right}.woocommerce .woocommerce-pagination ul.page-numbers::after,.woocommerce .woocommerce-pagination ul.page-numbers::before,.woocommerce-page .woocommerce-pagination ul.page-numbers::after,.woocommerce-page .woocommerce-pagination ul.page-numbers::before{content:' ';display:table}.woocommerce .woocommerce-pagination ul.page-numbers::after,.woocommerce-page .woocommerce-pagination ul.page-numbers::after{clear:both}.woocommerce .woocommerce-pagination ul.page-numbers li,.woocommerce-page .woocommerce-pagination ul.page-numbers li{display:inline-block}.woocommerce #content table.cart img,.woocommerce table.cart img,.woocommerce-page #content table.cart img,.woocommerce-page table.cart img{height:auto}.woocommerce #content table.cart td.actions,.woocommerce table.cart td.actions,.woocommerce-page #content table.cart td.actions,.woocommerce-page table.cart td.actions{text-align:right}.woocommerce #content table.cart td.actions .input-text,.woocommerce table.cart td.actions .input-text,.woocommerce-page #content table.cart td.actions .input-text,.woocommerce-page table.cart td.actions .input-text{width:80px}.woocommerce #content table.cart td.actions .coupon,.woocommerce table.cart td.actions .coupon,.woocommerce-page #content table.cart td.actions .coupon,.woocommerce-page table.cart td.actions .coupon{float:left}.woocommerce #content table.cart td.actions .coupon label,.woocommerce table.cart td.actions .coupon label,.woocommerce-page #content table.cart td.actions .coupon label,.woocommerce-page table.cart td.actions .coupon label{display:none}.woocommerce .cart-collaterals,.woocommerce-page .cart-collaterals{width:100%}.woocommerce .cart-collaterals::after,.woocommerce .cart-collaterals::before,.woocommerce-page .cart-collaterals::after,.woocommerce-page .cart-collaterals::before{content:' ';display:table}.woocommerce .cart-collaterals::after,.woocommerce-page .cart-collaterals::after{clear:both}.woocommerce .cart-collaterals .related,.woocommerce-page .cart-collaterals .related{width:30.75%;float:left}.woocommerce .cart-collaterals .cross-sells,.woocommerce-page .cart-collaterals .cross-sells{width:48%;float:left}.woocommerce .cart-collaterals .cross-sells ul.products,.woocommerce-page .cart-collaterals .cross-sells ul.products{float:none}.woocommerce .cart-collaterals .cross-sells ul.products li,.woocommerce-page .cart-collaterals .cross-sells ul.products li{width:48%}.woocommerce .cart-collaterals .shipping_calculator,.woocommerce-page .cart-collaterals .shipping_calculator{width:48%;clear:right;float:right}.woocommerce .cart-collaterals .shipping_calculator::after,.woocommerce .cart-collaterals .shipping_calculator::before,.woocommerce-page .cart-collaterals .shipping_calculator::after,.woocommerce-page .cart-collaterals .shipping_calculator::before{content:' ';display:table}.woocommerce .cart-collaterals .shipping_calculator::after,.woocommerce-page .cart-collaterals .shipping_calculator::after{clear:both}.woocommerce .cart-collaterals .shipping_calculator .col2-set .col-1,.woocommerce .cart-collaterals .shipping_calculator .col2-set .col-2,.woocommerce-page .cart-collaterals .shipping_calculator .col2-set .col-1,.woocommerce-page .cart-collaterals .shipping_calculator .col2-set .col-2{width:47%}.woocommerce .cart-collaterals .cart_totals,.woocommerce-page .cart-collaterals .cart_totals{float:right;width:48%}.woocommerce ul.cart_list li::after,.woocommerce ul.cart_list li::before,.woocommerce ul.product_list_widget li::after,.woocommerce ul.product_list_widget li::before,.woocommerce-page ul.cart_list li::after,.woocommerce-page ul.cart_list li::before,.woocommerce-page ul.product_list_widget li::after,.woocommerce-page ul.product_list_widget li::before{content:' ';display:table}.woocommerce ul.cart_list li::after,.woocommerce ul.product_list_widget li::after,.woocommerce-page ul.cart_list li::after,.woocommerce-page ul.product_list_widget li::after{clear:both}.woocommerce ul.cart_list li img,.woocommerce ul.product_list_widget li img,.woocommerce-page ul.cart_list li img,.woocommerce-page ul.product_list_widget li img{float:right;height:auto}.woocommerce form .form-row::after,.woocommerce form .form-row::before,.woocommerce-page form .form-row::after,.woocommerce-page form .form-row::before{content:' ';display:table}.woocommerce form .form-row::after,.woocommerce-page form .form-row::after{clear:both}.woocommerce form .form-row label,.woocommerce-page form .form-row label{display:block}.woocommerce form .form-row label.checkbox,.woocommerce-page form .form-row label.checkbox{display:inline}.woocommerce form .form-row select,.woocommerce-page form .form-row select{width:100%}.woocommerce form .form-row .input-text,.woocommerce-page form .form-row .input-text{box-sizing:border-box;width:100%}.woocommerce form .form-row-first,.woocommerce form .form-row-last,.woocommerce-page form .form-row-first,.woocommerce-page form .form-row-last{width:47%;overflow:visible}.woocommerce form .form-row-first,.woocommerce-page form .form-row-first{float:left}.woocommerce form .form-row-last,.woocommerce-page form .form-row-last{float:right}.woocommerce form .form-row-wide,.woocommerce-page form .form-row-wide{clear:both}.woocommerce #payment .form-row select,.woocommerce-page #payment .form-row select{width:auto}.woocommerce #payment .terms,.woocommerce #payment .wc-terms-and-conditions,.woocommerce-page #payment .terms,.woocommerce-page #payment .wc-terms-and-conditions{text-align:left;padding:0 1em 0 0;float:left}.woocommerce #payment #place_order,.woocommerce-page #payment #place_order{float:right}.woocommerce .woocommerce-billing-fields::after,.woocommerce .woocommerce-billing-fields::before,.woocommerce .woocommerce-shipping-fields::after,.woocommerce .woocommerce-shipping-fields::before,.woocommerce-page .woocommerce-billing-fields::after,.woocommerce-page .woocommerce-billing-fields::before,.woocommerce-page .woocommerce-shipping-fields::after,.woocommerce-page .woocommerce-shipping-fields::before{content:' ';display:table}.woocommerce .woocommerce-billing-fields::after,.woocommerce .woocommerce-shipping-fields::after,.woocommerce-page .woocommerce-billing-fields::after,.woocommerce-page .woocommerce-shipping-fields::after{clear:both}.woocommerce .woocommerce-terms-and-conditions,.woocommerce-page .woocommerce-terms-and-conditions{margin-bottom:1.618em;padding:1.618em}.woocommerce .woocommerce-oembed,.woocommerce-page .woocommerce-oembed{position:relative}.woocommerce-account .woocommerce-MyAccount-navigation{float:left;width:30%}.woocommerce-account .woocommerce-MyAccount-content{float:right;width:68%}.woocommerce-page.left-sidebar #content.twentyeleven{width:58.4%;margin:0 7.6%;float:right}.woocommerce-page.right-sidebar #content.twentyeleven{margin:0 7.6%;width:58.4%;float:left}.twentyfourteen .tfwc{padding:12px 10px 0;max-width:474px;margin:0 auto}.twentyfourteen .tfwc .product .entry-summary{padding:0!important;margin:0 0 1.618em!important}.twentyfourteen .tfwc div.product.hentry.has-post-thumbnail{margin-top:0}@media screen and (min-width:673px){.twentyfourteen .tfwc{padding-right:30px;padding-left:30px}}@media screen and (min-width:1040px){.twentyfourteen .tfwc{padding-right:15px;padding-left:15px}}@media screen and (min-width:1110px){.twentyfourteen .tfwc{padding-right:30px;padding-left:30px}}@media screen and (min-width:1218px){.twentyfourteen .tfwc{margin-right:54px}.full-width .twentyfourteen .tfwc{margin-right:auto}}.twentyfifteen .t15wc{padding-left:7.6923%;padding-right:7.6923%;padding-top:7.6923%;margin-bottom:7.6923%;background:#fff;box-shadow:0 0 1px rgba(0,0,0,.15)}.twentyfifteen .t15wc .page-title{margin-left:0}@media screen and (min-width:38.75em){.twentyfifteen .t15wc{margin-right:7.6923%;margin-left:7.6923%;margin-top:8.3333%}}@media screen and (min-width:59.6875em){.twentyfifteen .t15wc{margin-left:8.3333%;margin-right:8.3333%;padding:10%}.single-product .twentyfifteen .entry-summary{padding:0!important}}.twentysixteen .site-main{margin-right:7.6923%;margin-left:7.6923%}.twentysixteen .entry-summary{margin-right:0;margin-left:0}#content .twentysixteen div.product div.images,#content .twentysixteen div.product div.summary{width:46.42857%}@media screen and (min-width:44.375em){.twentysixteen .site-main{margin-right:23.0769%}}@media screen and (min-width:56.875em){.twentysixteen .site-main{margin-right:0;margin-left:0}.no-sidebar .twentysixteen .site-main{margin-right:15%;margin-left:15%}.no-sidebar .twentysixteen .entry-summary{margin-right:0;margin-left:0}}.rtl .woocommerce .col2-set .col-1,.rtl .woocommerce-page .col2-set .col-1{float:right}.rtl .woocommerce .col2-set .col-2,.rtl .woocommerce-page .col2-set .col-2{float:left} \ No newline at end of file diff --git a/assets/css/woocommerce-rtl.css b/assets/css/woocommerce-rtl.css index 08ea4a3eba7..8b8056f32d6 100644 --- a/assets/css/woocommerce-rtl.css +++ b/assets/css/woocommerce-rtl.css @@ -1 +1 @@ -@charset "UTF-8";@-webkit-keyframes spin{100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}@keyframes spin{100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}.woocommerce-store-notice,p.demo_store{position:absolute;top:0;right:0;left:0;margin:0;width:100%;font-size:1em;padding:1em 0;text-align:center;background-color:#a46497;color:#fff;z-index:99998;-webkit-box-shadow:0 1px 1em rgba(0,0,0,.2);box-shadow:0 1px 1em rgba(0,0,0,.2);display:none}.woocommerce-store-notice a,p.demo_store a{color:#fff;text-decoration:underline}.screen-reader-text{clip:rect(1px,1px,1px,1px);height:1px;overflow:hidden;position:absolute!important;width:1px;word-wrap:normal!important}.admin-bar p.demo_store{top:32px}.clear{clear:both}.woocommerce .blockUI.blockOverlay{position:relative}.woocommerce .blockUI.blockOverlay::before{height:1em;width:1em;display:block;position:absolute;top:50%;right:50%;margin-right:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.woocommerce .loader::before{height:1em;width:1em;display:block;position:absolute;top:50%;right:50%;margin-right:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.woocommerce a.remove{display:block;font-size:1.5em;height:1em;width:1em;text-align:center;line-height:1;border-radius:100%;color:red!important;text-decoration:none;font-weight:700;border:0}.woocommerce a.remove:hover{color:#fff!important;background:red}.woocommerce small.note{display:block;color:#777;font-size:.857em;margin-top:10px}.woocommerce .woocommerce-breadcrumb{margin:0 0 1em;padding:0;font-size:.92em;color:#777}.woocommerce .woocommerce-breadcrumb::after,.woocommerce .woocommerce-breadcrumb::before{content:' ';display:table}.woocommerce .woocommerce-breadcrumb::after{clear:both}.woocommerce .woocommerce-breadcrumb a{color:#777}.woocommerce .quantity .qty{width:3.631em;text-align:center}.woocommerce div.product{margin-bottom:0;position:relative}.woocommerce div.product .product_title{clear:none;margin-top:0;padding:0}.woocommerce div.product p.price,.woocommerce div.product span.price{color:#77a464;font-size:1.25em}.woocommerce div.product p.price ins,.woocommerce div.product span.price ins{background:inherit;font-weight:700;display:inline-block}.woocommerce div.product p.price del,.woocommerce div.product span.price del{opacity:.5;display:inline-block}.woocommerce div.product p.stock{font-size:.92em}.woocommerce div.product .stock{color:#77a464}.woocommerce div.product .out-of-stock{color:red}.woocommerce div.product .woocommerce-product-rating{margin-bottom:1.618em}.woocommerce div.product div.images{margin-bottom:2em}.woocommerce div.product div.images img{display:block;width:100%;height:auto;-webkit-box-shadow:none;box-shadow:none}.woocommerce div.product div.images div.thumbnails{padding-top:1em}.woocommerce div.product div.images.woocommerce-product-gallery{position:relative}.woocommerce div.product div.images .woocommerce-product-gallery__wrapper{-webkit-transition:all cubic-bezier(.795,-.035,0,1) .5s;transition:all cubic-bezier(.795,-.035,0,1) .5s;margin:0;padding:0}.woocommerce div.product div.images .woocommerce-product-gallery__wrapper .zoomImg{background-color:#fff;opacity:0}.woocommerce div.product div.images .woocommerce-product-gallery__image--placeholder{border:1px solid #f2f2f2}.woocommerce div.product div.images .woocommerce-product-gallery__image:nth-child(n+2){width:25%;display:inline-block}.woocommerce div.product div.images .woocommerce-product-gallery__trigger{position:absolute;top:.5em;left:.5em;font-size:2em;z-index:9;width:36px;height:36px;background:#fff;text-indent:-9999px;border-radius:100%;-webkit-box-sizing:content-box;box-sizing:content-box}.woocommerce div.product div.images .woocommerce-product-gallery__trigger:before{content:"";display:block;width:10px;height:10px;border:2px solid #000;border-radius:100%;position:absolute;top:9px;right:9px;-webkit-box-sizing:content-box;box-sizing:content-box}.woocommerce div.product div.images .woocommerce-product-gallery__trigger:after{content:"";display:block;width:2px;height:8px;background:#000;border-radius:6px;position:absolute;top:19px;right:22px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);-webkit-box-sizing:content-box;box-sizing:content-box}.woocommerce div.product div.images .flex-control-thumbs{overflow:hidden;zoom:1;margin:0;padding:0}.woocommerce div.product div.images .flex-control-thumbs li{width:25%;float:right;margin:0;list-style:none}.woocommerce div.product div.images .flex-control-thumbs li img{cursor:pointer;opacity:.5;margin:0}.woocommerce div.product div.images .flex-control-thumbs li img.flex-active,.woocommerce div.product div.images .flex-control-thumbs li img:hover{opacity:1}.woocommerce div.product .woocommerce-product-gallery--columns-3 .flex-control-thumbs li:nth-child(3n+1){clear:right}.woocommerce div.product .woocommerce-product-gallery--columns-4 .flex-control-thumbs li:nth-child(4n+1){clear:right}.woocommerce div.product .woocommerce-product-gallery--columns-5 .flex-control-thumbs li:nth-child(5n+1){clear:right}.woocommerce div.product div.summary{margin-bottom:2em}.woocommerce div.product div.social{text-align:left;margin:0 0 1em}.woocommerce div.product div.social span{margin:0 2px 0 0}.woocommerce div.product div.social span span{margin:0}.woocommerce div.product div.social span .stButton .chicklets{padding-right:16px;width:0}.woocommerce div.product div.social iframe{float:right;margin-top:3px}.woocommerce div.product .woocommerce-tabs ul.tabs{list-style:none;padding:0 1em 0 0;margin:0 0 1.618em;overflow:hidden;position:relative}.woocommerce div.product .woocommerce-tabs ul.tabs li{border:1px solid #d3ced2;background-color:#ebe9eb;display:inline-block;position:relative;z-index:0;border-radius:4px 4px 0 0;margin:0 -5px;padding:0 1em}.woocommerce div.product .woocommerce-tabs ul.tabs li a{display:inline-block;padding:.5em 0;font-weight:700;color:#515151;text-decoration:none}.woocommerce div.product .woocommerce-tabs ul.tabs li a:hover{text-decoration:none;color:#6b6a6b}.woocommerce div.product .woocommerce-tabs ul.tabs li.active{background:#fff;z-index:2;border-bottom-color:#fff}.woocommerce div.product .woocommerce-tabs ul.tabs li.active a{color:inherit;text-shadow:inherit}.woocommerce div.product .woocommerce-tabs ul.tabs li.active::before{-webkit-box-shadow:-2px 2px 0 #fff;box-shadow:-2px 2px 0 #fff}.woocommerce div.product .woocommerce-tabs ul.tabs li.active::after{-webkit-box-shadow:2px 2px 0 #fff;box-shadow:2px 2px 0 #fff}.woocommerce div.product .woocommerce-tabs ul.tabs li::after,.woocommerce div.product .woocommerce-tabs ul.tabs li::before{border:1px solid #d3ced2;position:absolute;bottom:-1px;width:5px;height:5px;content:' ';-webkit-box-sizing:border-box;box-sizing:border-box}.woocommerce div.product .woocommerce-tabs ul.tabs li::before{right:-5px;border-bottom-left-radius:4px;border-width:0 0 1px 1px;-webkit-box-shadow:-2px 2px 0 #ebe9eb;box-shadow:-2px 2px 0 #ebe9eb}.woocommerce div.product .woocommerce-tabs ul.tabs li::after{left:-5px;border-bottom-right-radius:4px;border-width:0 1px 1px 0;-webkit-box-shadow:2px 2px 0 #ebe9eb;box-shadow:2px 2px 0 #ebe9eb}.woocommerce div.product .woocommerce-tabs ul.tabs::before{position:absolute;content:' ';width:100%;bottom:0;right:0;border-bottom:1px solid #d3ced2;z-index:1}.woocommerce div.product .woocommerce-tabs .panel{margin:0 0 2em;padding:0}.woocommerce div.product p.cart{margin-bottom:2em}.woocommerce div.product p.cart::after,.woocommerce div.product p.cart::before{content:' ';display:table}.woocommerce div.product p.cart::after{clear:both}.woocommerce div.product form.cart{margin-bottom:2em}.woocommerce div.product form.cart::after,.woocommerce div.product form.cart::before{content:' ';display:table}.woocommerce div.product form.cart::after{clear:both}.woocommerce div.product form.cart div.quantity{float:right;margin:0 0 0 4px}.woocommerce div.product form.cart table{border-width:0 0 1px}.woocommerce div.product form.cart table td{padding-right:0}.woocommerce div.product form.cart table div.quantity{float:none;margin:0}.woocommerce div.product form.cart table small.stock{display:block;float:none}.woocommerce div.product form.cart .variations{margin-bottom:1em;border:0;width:100%}.woocommerce div.product form.cart .variations td,.woocommerce div.product form.cart .variations th{border:0;vertical-align:top;line-height:2em}.woocommerce div.product form.cart .variations label{font-weight:700}.woocommerce div.product form.cart .variations select{max-width:100%;min-width:75%;display:inline-block;margin-left:1em}.woocommerce div.product form.cart .variations td.label{padding-left:1em}.woocommerce div.product form.cart .woocommerce-variation-description p{margin-bottom:1em}.woocommerce div.product form.cart .reset_variations{visibility:hidden;font-size:.83em}.woocommerce div.product form.cart .wc-no-matching-variations{display:none}.woocommerce div.product form.cart .button{vertical-align:middle;float:right}.woocommerce div.product form.cart .group_table td.woocommerce-grouped-product-list-item__label{padding-left:1em;padding-right:1em}.woocommerce div.product form.cart .group_table td{vertical-align:top;padding-bottom:.5em;border:0}.woocommerce div.product form.cart .group_table td:first-child{width:4em;text-align:center}.woocommerce div.product form.cart .group_table .wc-grouped-product-add-to-cart-checkbox{display:inline-block;width:auto;margin:0 auto;-webkit-transform:scale(1.5,1.5);-ms-transform:scale(1.5,1.5);transform:scale(1.5,1.5)}.woocommerce span.onsale{min-height:3.236em;min-width:3.236em;padding:.202em;font-size:1em;font-weight:700;position:absolute;text-align:center;line-height:3.236;top:-.5em;right:-.5em;margin:0;border-radius:100%;background-color:#77a464;color:#fff;font-size:.857em;z-index:9}.woocommerce .products ul,.woocommerce ul.products{margin:0 0 1em;padding:0;list-style:none outside;clear:both}.woocommerce .products ul::after,.woocommerce .products ul::before,.woocommerce ul.products::after,.woocommerce ul.products::before{content:' ';display:table}.woocommerce .products ul::after,.woocommerce ul.products::after{clear:both}.woocommerce .products ul li,.woocommerce ul.products li{list-style:none outside}.woocommerce ul.products li.product .onsale{top:0;left:0;right:auto;margin:-.5em 0 0 -.5em}.woocommerce ul.products li.product .woocommerce-loop-category__title,.woocommerce ul.products li.product .woocommerce-loop-product__title,.woocommerce ul.products li.product h3{padding:.5em 0;margin:0;font-size:1em}.woocommerce ul.products li.product a{text-decoration:none}.woocommerce ul.products li.product a img{width:100%;height:auto;display:block;margin:0 0 1em;-webkit-box-shadow:none;box-shadow:none}.woocommerce ul.products li.product strong{display:block}.woocommerce ul.products li.product .woocommerce-placeholder{border:1px solid #f2f2f2}.woocommerce ul.products li.product .star-rating{font-size:.857em}.woocommerce ul.products li.product .button{margin-top:1em}.woocommerce ul.products li.product .price{color:#77a464;display:block;font-weight:400;margin-bottom:.5em;font-size:.857em}.woocommerce ul.products li.product .price del{color:inherit;opacity:.5;display:inline-block}.woocommerce ul.products li.product .price ins{background:0 0;font-weight:700;display:inline-block}.woocommerce ul.products li.product .price .from{font-size:.67em;margin:-2px 0 0 0;text-transform:uppercase;color:rgba(132,132,132,.5)}.woocommerce .woocommerce-result-count{margin:0 0 1em}.woocommerce .woocommerce-ordering{margin:0 0 1em}.woocommerce .woocommerce-ordering select{vertical-align:top}.woocommerce nav.woocommerce-pagination{text-align:center}.woocommerce nav.woocommerce-pagination ul{display:inline-block;white-space:nowrap;padding:0;clear:both;border:1px solid #d3ced2;border-left:0;margin:1px}.woocommerce nav.woocommerce-pagination ul li{border-left:1px solid #d3ced2;padding:0;margin:0;float:right;display:inline;overflow:hidden}.woocommerce nav.woocommerce-pagination ul li a,.woocommerce nav.woocommerce-pagination ul li span{margin:0;text-decoration:none;padding:0;line-height:1;font-size:1em;font-weight:400;padding:.5em;min-width:1em;display:block}.woocommerce nav.woocommerce-pagination ul li a:focus,.woocommerce nav.woocommerce-pagination ul li a:hover,.woocommerce nav.woocommerce-pagination ul li span.current{background:#ebe9eb;color:#8a7e88}.woocommerce #respond input#submit,.woocommerce a.button,.woocommerce button.button,.woocommerce input.button{font-size:100%;margin:0;line-height:1;cursor:pointer;position:relative;text-decoration:none;overflow:visible;padding:.618em 1em;font-weight:700;border-radius:3px;right:auto;color:#515151;background-color:#ebe9eb;border:0;display:inline-block;background-image:none;-webkit-box-shadow:none;box-shadow:none;text-shadow:none}.woocommerce #respond input#submit.loading,.woocommerce a.button.loading,.woocommerce button.button.loading,.woocommerce input.button.loading{opacity:.25;padding-left:2.618em}.woocommerce #respond input#submit.loading::after,.woocommerce a.button.loading::after,.woocommerce button.button.loading::after,.woocommerce input.button.loading::after{font-family:WooCommerce;content:'\e01c';vertical-align:top;font-weight:400;position:absolute;top:.618em;left:1em;-webkit-animation:spin 2s linear infinite;animation:spin 2s linear infinite}.woocommerce #respond input#submit.added::after,.woocommerce a.button.added::after,.woocommerce button.button.added::after,.woocommerce input.button.added::after{font-family:WooCommerce;content:'\e017';margin-right:.53em;vertical-align:bottom}.woocommerce #respond input#submit:hover,.woocommerce a.button:hover,.woocommerce button.button:hover,.woocommerce input.button:hover{background-color:#dad8da;text-decoration:none;background-image:none;color:#515151}.woocommerce #respond input#submit.alt,.woocommerce a.button.alt,.woocommerce button.button.alt,.woocommerce input.button.alt{background-color:#a46497;color:#fff;-webkit-font-smoothing:antialiased}.woocommerce #respond input#submit.alt:hover,.woocommerce a.button.alt:hover,.woocommerce button.button.alt:hover,.woocommerce input.button.alt:hover{background-color:#935386;color:#fff}.woocommerce #respond input#submit.alt.disabled,.woocommerce #respond input#submit.alt.disabled:hover,.woocommerce #respond input#submit.alt:disabled,.woocommerce #respond input#submit.alt:disabled:hover,.woocommerce #respond input#submit.alt:disabled[disabled],.woocommerce #respond input#submit.alt:disabled[disabled]:hover,.woocommerce a.button.alt.disabled,.woocommerce a.button.alt.disabled:hover,.woocommerce a.button.alt:disabled,.woocommerce a.button.alt:disabled:hover,.woocommerce a.button.alt:disabled[disabled],.woocommerce a.button.alt:disabled[disabled]:hover,.woocommerce button.button.alt.disabled,.woocommerce button.button.alt.disabled:hover,.woocommerce button.button.alt:disabled,.woocommerce button.button.alt:disabled:hover,.woocommerce button.button.alt:disabled[disabled],.woocommerce button.button.alt:disabled[disabled]:hover,.woocommerce input.button.alt.disabled,.woocommerce input.button.alt.disabled:hover,.woocommerce input.button.alt:disabled,.woocommerce input.button.alt:disabled:hover,.woocommerce input.button.alt:disabled[disabled],.woocommerce input.button.alt:disabled[disabled]:hover{background-color:#a46497;color:#fff}.woocommerce #respond input#submit.disabled,.woocommerce #respond input#submit:disabled,.woocommerce #respond input#submit:disabled[disabled],.woocommerce a.button.disabled,.woocommerce a.button:disabled,.woocommerce a.button:disabled[disabled],.woocommerce button.button.disabled,.woocommerce button.button:disabled,.woocommerce button.button:disabled[disabled],.woocommerce input.button.disabled,.woocommerce input.button:disabled,.woocommerce input.button:disabled[disabled]{color:inherit;cursor:not-allowed;opacity:.5;padding:.618em 1em}.woocommerce #respond input#submit.disabled:hover,.woocommerce #respond input#submit:disabled:hover,.woocommerce #respond input#submit:disabled[disabled]:hover,.woocommerce a.button.disabled:hover,.woocommerce a.button:disabled:hover,.woocommerce a.button:disabled[disabled]:hover,.woocommerce button.button.disabled:hover,.woocommerce button.button:disabled:hover,.woocommerce button.button:disabled[disabled]:hover,.woocommerce input.button.disabled:hover,.woocommerce input.button:disabled:hover,.woocommerce input.button:disabled[disabled]:hover{color:inherit;background-color:#ebe9eb}.woocommerce .cart .button,.woocommerce .cart input.button{float:none}.woocommerce a.added_to_cart{padding-top:.5em;display:inline-block}.woocommerce #reviews h2 small{float:left;color:#777;font-size:15px;margin:10px 0 0}.woocommerce #reviews h2 small a{text-decoration:none;color:#777}.woocommerce #reviews h3{margin:0}.woocommerce #reviews #respond{margin:0;border:0;padding:0}.woocommerce #reviews #comment{height:75px}.woocommerce #reviews #comments .add_review::after,.woocommerce #reviews #comments .add_review::before{content:' ';display:table}.woocommerce #reviews #comments .add_review::after{clear:both}.woocommerce #reviews #comments h2{clear:none}.woocommerce #reviews #comments ol.commentlist{margin:0;width:100%;background:0 0;list-style:none}.woocommerce #reviews #comments ol.commentlist::after,.woocommerce #reviews #comments ol.commentlist::before{content:' ';display:table}.woocommerce #reviews #comments ol.commentlist::after{clear:both}.woocommerce #reviews #comments ol.commentlist li{padding:0;margin:0 0 20px;border:0;position:relative;background:100%;border:0}.woocommerce #reviews #comments ol.commentlist li .meta{color:#777;font-size:.75em}.woocommerce #reviews #comments ol.commentlist li img.avatar{float:right;position:absolute;top:0;right:0;padding:3px;width:32px;height:auto;background:#ebe9eb;border:1px solid #e4e1e3;margin:0;-webkit-box-shadow:none;box-shadow:none}.woocommerce #reviews #comments ol.commentlist li .comment-text{margin:0 50px 0 0;border:1px solid #e4e1e3;border-radius:4px;padding:1em 1em 0}.woocommerce #reviews #comments ol.commentlist li .comment-text::after,.woocommerce #reviews #comments ol.commentlist li .comment-text::before{content:' ';display:table}.woocommerce #reviews #comments ol.commentlist li .comment-text::after{clear:both}.woocommerce #reviews #comments ol.commentlist li .comment-text p{margin:0 0 1em}.woocommerce #reviews #comments ol.commentlist li .comment-text p.meta{font-size:.83em}.woocommerce #reviews #comments ol.commentlist ul.children{list-style:none outside;margin:20px 50px 0 0}.woocommerce #reviews #comments ol.commentlist ul.children .star-rating{display:none}.woocommerce #reviews #comments ol.commentlist #respond{border:1px solid #e4e1e3;border-radius:4px;padding:1em 1em 0;margin:20px 50px 0 0}.woocommerce #reviews #comments .commentlist>li::before{content:''}.woocommerce .star-rating{float:left;overflow:hidden;position:relative;height:1em;line-height:1;font-size:1em;width:5.4em;font-family:star}.woocommerce .star-rating::before{content:'\73\73\73\73\73';color:#d3ced2;float:right;top:0;right:0;position:absolute}.woocommerce .star-rating span{overflow:hidden;float:right;top:0;right:0;position:absolute;padding-top:1.5em}.woocommerce .star-rating span::before{content:'\53\53\53\53\53';top:0;position:absolute;right:0}.woocommerce .woocommerce-product-rating{line-height:2;display:block}.woocommerce .woocommerce-product-rating::after,.woocommerce .woocommerce-product-rating::before{content:' ';display:table}.woocommerce .woocommerce-product-rating::after{clear:both}.woocommerce .woocommerce-product-rating .star-rating{margin:.5em 0 0 4px;float:right}.woocommerce .products .star-rating{display:block;margin:0 0 .5em;float:none}.woocommerce .hreview-aggregate .star-rating{margin:10px 0 0}.woocommerce #review_form #respond{position:static;margin:0;width:auto;padding:0;background:transparent none;border:0}.woocommerce #review_form #respond::after,.woocommerce #review_form #respond::before{content:' ';display:table}.woocommerce #review_form #respond::after{clear:both}.woocommerce #review_form #respond p{margin:0 0 10px}.woocommerce #review_form #respond .form-submit input{right:auto}.woocommerce #review_form #respond textarea{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.woocommerce p.stars a{position:relative;height:1em;width:1em;text-indent:-999em;display:inline-block;text-decoration:none}.woocommerce p.stars a::before{display:block;position:absolute;top:0;right:0;width:1em;height:1em;line-height:1;font-family:WooCommerce;content:'\e021';text-indent:0}.woocommerce p.stars a:hover~a::before{content:'\e021'}.woocommerce p.stars:hover a::before{content:'\e020'}.woocommerce p.stars.selected a.active::before{content:'\e020'}.woocommerce p.stars.selected a.active~a::before{content:'\e021'}.woocommerce p.stars.selected a:not(.active)::before{content:'\e020'}.woocommerce table.shop_attributes{border:0;border-top:1px dotted rgba(0,0,0,.1);margin-bottom:1.618em;width:100%}.woocommerce table.shop_attributes th{width:150px;font-weight:700;padding:8px;border-top:0;border-bottom:1px dotted rgba(0,0,0,.1);margin:0;line-height:1.5}.woocommerce table.shop_attributes td{font-style:italic;padding:0;border-top:0;border-bottom:1px dotted rgba(0,0,0,.1);margin:0;line-height:1.5}.woocommerce table.shop_attributes td p{margin:0;padding:8px 0}.woocommerce table.shop_attributes tr:nth-child(even) td,.woocommerce table.shop_attributes tr:nth-child(even) th{background:rgba(0,0,0,.025)}.woocommerce table.shop_table{border:1px solid rgba(0,0,0,.1);margin:0 0 24px -1px;text-align:right;width:100%;border-collapse:separate;border-radius:5px}.woocommerce table.shop_table th{font-weight:700;padding:9px 12px;line-height:1.5em}.woocommerce table.shop_table td{border-top:1px solid rgba(0,0,0,.1);padding:9px 12px;vertical-align:middle;line-height:1.5em}.woocommerce table.shop_table td small{font-weight:400}.woocommerce table.shop_table tbody:first-child tr:first-child td,.woocommerce table.shop_table tbody:first-child tr:first-child th{border-top:0}.woocommerce table.shop_table tbody th,.woocommerce table.shop_table tfoot td,.woocommerce table.shop_table tfoot th{font-weight:700;border-top:1px solid rgba(0,0,0,.1)}.woocommerce table.my_account_orders{font-size:.85em}.woocommerce table.my_account_orders td,.woocommerce table.my_account_orders th{padding:4px 8px;vertical-align:middle}.woocommerce table.my_account_orders .button{white-space:nowrap}.woocommerce table.my_account_orders .order-actions{text-align:left}.woocommerce table.my_account_orders .order-actions .button{margin:.125em .25em .125em 0}.woocommerce table.woocommerce-MyAccount-downloads td,.woocommerce table.woocommerce-MyAccount-downloads th{vertical-align:top;text-align:center}.woocommerce table.woocommerce-MyAccount-downloads td:first-child,.woocommerce table.woocommerce-MyAccount-downloads th:first-child{text-align:right}.woocommerce table.woocommerce-MyAccount-downloads td:last-child,.woocommerce table.woocommerce-MyAccount-downloads th:last-child{text-align:right}.woocommerce table.woocommerce-MyAccount-downloads td .woocommerce-MyAccount-downloads-file::before,.woocommerce table.woocommerce-MyAccount-downloads th .woocommerce-MyAccount-downloads-file::before{content:'\2193';display:inline-block}.woocommerce td.product-name .wc-item-meta,.woocommerce td.product-name dl.variation{list-style:none outside}.woocommerce td.product-name .wc-item-meta .wc-item-meta-label,.woocommerce td.product-name .wc-item-meta dt,.woocommerce td.product-name dl.variation .wc-item-meta-label,.woocommerce td.product-name dl.variation dt{float:right;clear:both;margin-left:.25em;display:inline-block;list-style:none outside}.woocommerce td.product-name .wc-item-meta dd,.woocommerce td.product-name dl.variation dd{margin:0}.woocommerce td.product-name .wc-item-meta p,.woocommerce td.product-name .wc-item-meta:last-child,.woocommerce td.product-name dl.variation p,.woocommerce td.product-name dl.variation:last-child{margin-bottom:0}.woocommerce td.product-name p.backorder_notification{font-size:.83em}.woocommerce td.product-quantity{min-width:80px}.woocommerce ul.cart_list,.woocommerce ul.product_list_widget{list-style:none outside;padding:0;margin:0}.woocommerce ul.cart_list li,.woocommerce ul.product_list_widget li{padding:4px 0;margin:0;list-style:none}.woocommerce ul.cart_list li::after,.woocommerce ul.cart_list li::before,.woocommerce ul.product_list_widget li::after,.woocommerce ul.product_list_widget li::before{content:' ';display:table}.woocommerce ul.cart_list li::after,.woocommerce ul.product_list_widget li::after{clear:both}.woocommerce ul.cart_list li a,.woocommerce ul.product_list_widget li a{display:block;font-weight:700}.woocommerce ul.cart_list li img,.woocommerce ul.product_list_widget li img{float:left;margin-right:4px;width:32px;height:auto;-webkit-box-shadow:none;box-shadow:none}.woocommerce ul.cart_list li dl,.woocommerce ul.product_list_widget li dl{margin:0;padding-right:1em;border-right:2px solid rgba(0,0,0,.1)}.woocommerce ul.cart_list li dl::after,.woocommerce ul.cart_list li dl::before,.woocommerce ul.product_list_widget li dl::after,.woocommerce ul.product_list_widget li dl::before{content:' ';display:table}.woocommerce ul.cart_list li dl::after,.woocommerce ul.product_list_widget li dl::after{clear:both}.woocommerce ul.cart_list li dl dd,.woocommerce ul.cart_list li dl dt,.woocommerce ul.product_list_widget li dl dd,.woocommerce ul.product_list_widget li dl dt{display:inline-block;float:right;margin-bottom:1em}.woocommerce ul.cart_list li dl dt,.woocommerce ul.product_list_widget li dl dt{font-weight:700;padding:0 0 .25em;margin:0 0 0 4px;clear:right}.woocommerce ul.cart_list li dl dd,.woocommerce ul.product_list_widget li dl dd{padding:0 0 .25em}.woocommerce ul.cart_list li dl dd p:last-child,.woocommerce ul.product_list_widget li dl dd p:last-child{margin-bottom:0}.woocommerce ul.cart_list li .star-rating,.woocommerce ul.product_list_widget li .star-rating{float:none}.woocommerce .widget_shopping_cart .total,.woocommerce.widget_shopping_cart .total{border-top:3px double #ebe9eb;padding:4px 0 0}.woocommerce .widget_shopping_cart .total strong,.woocommerce.widget_shopping_cart .total strong{min-width:40px;display:inline-block}.woocommerce .widget_shopping_cart .cart_list li,.woocommerce.widget_shopping_cart .cart_list li{padding-right:2em;position:relative;padding-top:0}.woocommerce .widget_shopping_cart .cart_list li a.remove,.woocommerce.widget_shopping_cart .cart_list li a.remove{position:absolute;top:0;right:0}.woocommerce .widget_shopping_cart .buttons::after,.woocommerce .widget_shopping_cart .buttons::before,.woocommerce.widget_shopping_cart .buttons::after,.woocommerce.widget_shopping_cart .buttons::before{content:' ';display:table}.woocommerce .widget_shopping_cart .buttons::after,.woocommerce.widget_shopping_cart .buttons::after{clear:both}.woocommerce .widget_shopping_cart .buttons a,.woocommerce.widget_shopping_cart .buttons a{margin-left:5px;margin-bottom:5px}.woocommerce form .form-row{padding:3px;margin:0 0 6px}.woocommerce form .form-row [placeholder]:focus::-webkit-input-placeholder{-webkit-transition:opacity .5s .5s ease;transition:opacity .5s .5s ease;opacity:0}.woocommerce form .form-row label{line-height:2}.woocommerce form .form-row label.hidden{visibility:hidden}.woocommerce form .form-row label.inline{display:inline}.woocommerce form .form-row .woocommerce-input-wrapper .description{background:#1e85be;color:#fff;border-radius:3px;padding:1em;margin:.5em 0 0;clear:both;display:none;position:relative}.woocommerce form .form-row .woocommerce-input-wrapper .description a{color:#fff;text-decoration:underline;border:0;-webkit-box-shadow:none;box-shadow:none}.woocommerce form .form-row .woocommerce-input-wrapper .description:before{right:50%;top:0;margin-top:-4px;-webkit-transform:translatex(50%) rotate(-180deg);-ms-transform:translatex(50%) rotate(-180deg);transform:translatex(50%) rotate(-180deg);content:"";position:absolute;border-width:4px 6px 0 6px;border-style:solid;border-color:#1e85be transparent transparent transparent;z-index:100;display:block}.woocommerce form .form-row select{cursor:pointer;margin:0}.woocommerce form .form-row .required{color:red;font-weight:700;border:0!important;text-decoration:none;visibility:hidden}.woocommerce form .form-row .optional{visibility:visible}.woocommerce form .form-row .input-checkbox{display:inline;margin:-2px 0 0 8px;text-align:center;vertical-align:middle}.woocommerce form .form-row input.input-text,.woocommerce form .form-row textarea{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;margin:0;outline:0;line-height:normal}.woocommerce form .form-row textarea{height:4em;line-height:1.5;display:block;-webkit-box-shadow:none;box-shadow:none}.woocommerce form .form-row .select2-container{width:100%;line-height:2em}.woocommerce form .form-row.woocommerce-invalid label{color:#a00}.woocommerce form .form-row.woocommerce-invalid .select2-container,.woocommerce form .form-row.woocommerce-invalid input.input-text,.woocommerce form .form-row.woocommerce-invalid select{border-color:#a00}.woocommerce form .form-row.woocommerce-validated .select2-container,.woocommerce form .form-row.woocommerce-validated input.input-text,.woocommerce form .form-row.woocommerce-validated select{border-color:#69bf29}.woocommerce form .form-row ::-webkit-input-placeholder{line-height:normal}.woocommerce form .form-row :-moz-placeholder{line-height:normal}.woocommerce form .form-row :-ms-input-placeholder{line-height:normal}.woocommerce form.checkout_coupon,.woocommerce form.login,.woocommerce form.register{border:1px solid #d3ced2;padding:20px;margin:2em 0;text-align:right;border-radius:5px}.woocommerce ul#shipping_method{list-style:none outside;margin:0;padding:0}.woocommerce ul#shipping_method li{margin:0 0 .5em;line-height:1.5em;list-style:none outside}.woocommerce ul#shipping_method li input{margin:3px 0 0 .4375em;vertical-align:top}.woocommerce ul#shipping_method li label{display:inline}.woocommerce ul#shipping_method .amount{font-weight:700}.woocommerce p.woocommerce-shipping-contents{margin:0}.woocommerce ul.order_details{margin:0 0 3em;list-style:none}.woocommerce ul.order_details::after,.woocommerce ul.order_details::before{content:' ';display:table}.woocommerce ul.order_details::after{clear:both}.woocommerce ul.order_details li{float:right;margin-left:2em;text-transform:uppercase;font-size:.715em;line-height:1;border-left:1px dashed #d3ced2;padding-left:2em;margin-right:0;padding-right:0;list-style-type:none}.woocommerce ul.order_details li strong{display:block;font-size:1.4em;text-transform:none;line-height:1.5}.woocommerce ul.order_details li:last-of-type{border:none}.woocommerce .wc-bacs-bank-details-account-name{font-weight:700}.woocommerce .woocommerce-customer-details,.woocommerce .woocommerce-order-details,.woocommerce .woocommerce-order-downloads{margin-bottom:2em}.woocommerce .woocommerce-customer-details :last-child,.woocommerce .woocommerce-order-details :last-child,.woocommerce .woocommerce-order-downloads :last-child{margin-bottom:0}.woocommerce .woocommerce-customer-details address{font-style:normal;margin-bottom:0;border:1px solid rgba(0,0,0,.1);border-bottom-width:2px;border-left-width:2px;text-align:right;width:100%;border-radius:5px;padding:6px 12px}.woocommerce .woocommerce-customer-details .woocommerce-customer-details--email,.woocommerce .woocommerce-customer-details .woocommerce-customer-details--phone{margin-bottom:0;padding-right:1.5em}.woocommerce .woocommerce-customer-details .woocommerce-customer-details--phone::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-left:.618em;content:"";text-decoration:none;margin-right:-1.5em;line-height:1.75;position:absolute}.woocommerce .woocommerce-customer-details .woocommerce-customer-details--email::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-left:.618em;content:"";text-decoration:none;margin-right:-1.5em;line-height:1.75;position:absolute}.woocommerce .woocommerce-widget-layered-nav-list{margin:0;padding:0;border:0;list-style:none outside}.woocommerce .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item{padding:0 0 1px;list-style:none}.woocommerce .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item::after,.woocommerce .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item::before{content:' ';display:table}.woocommerce .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item::after{clear:both}.woocommerce .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item a,.woocommerce .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item span{padding:1px 0}.woocommerce .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item--chosen a::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-left:.618em;content:"";text-decoration:none;color:#a00}.woocommerce .woocommerce-widget-layered-nav-dropdown__submit{margin-top:1em}.woocommerce .widget_layered_nav_filters ul{margin:0;padding:0;border:0;list-style:none outside;overflow:hidden;zoom:1}.woocommerce .widget_layered_nav_filters ul li{float:right;padding:0 1px 1px 1em;list-style:none}.woocommerce .widget_layered_nav_filters ul li a{text-decoration:none}.woocommerce .widget_layered_nav_filters ul li a::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-left:.618em;content:"";text-decoration:none;color:#a00;vertical-align:inherit;margin-left:.5em}.woocommerce .widget_price_filter .price_slider{margin-bottom:1em}.woocommerce .widget_price_filter .price_slider_amount{text-align:left;line-height:2.4;font-size:.8751em}.woocommerce .widget_price_filter .price_slider_amount .button{font-size:1.15em;float:right}.woocommerce .widget_price_filter .ui-slider{position:relative;text-align:right;margin-right:.5em;margin-left:.5em}.woocommerce .widget_price_filter .ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1em;height:1em;background-color:#a46497;border-radius:1em;cursor:ew-resize;outline:0;top:-.3em;margin-left:-.5em}.woocommerce .widget_price_filter .ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;border-radius:1em;background-color:#a46497}.woocommerce .widget_price_filter .price_slider_wrapper .ui-widget-content{border-radius:1em;background-color:#602053;border:0}.woocommerce .widget_price_filter .ui-slider-horizontal{height:.5em}.woocommerce .widget_price_filter .ui-slider-horizontal .ui-slider-range{top:0;height:100%}.woocommerce .widget_price_filter .ui-slider-horizontal .ui-slider-range-min{right:-1px}.woocommerce .widget_price_filter .ui-slider-horizontal .ui-slider-range-max{left:-1px}.woocommerce .widget_rating_filter ul{margin:0;padding:0;border:0;list-style:none outside}.woocommerce .widget_rating_filter ul li{padding:0 0 1px;list-style:none}.woocommerce .widget_rating_filter ul li::after,.woocommerce .widget_rating_filter ul li::before{content:' ';display:table}.woocommerce .widget_rating_filter ul li::after{clear:both}.woocommerce .widget_rating_filter ul li a{padding:1px 0;text-decoration:none}.woocommerce .widget_rating_filter ul li .star-rating{float:none;display:inline-block}.woocommerce .widget_rating_filter ul li.chosen a::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-left:.618em;content:"";text-decoration:none;color:#a00}.woocommerce-no-js form.woocommerce-form-coupon,.woocommerce-no-js form.woocommerce-form-login{display:block!important}.woocommerce-no-js .showcoupon,.woocommerce-no-js .woocommerce-form-coupon-toggle,.woocommerce-no-js .woocommerce-form-login-toggle{display:none!important}.woocommerce-error,.woocommerce-info,.woocommerce-message{padding:1em 3.5em 1em 2em;margin:0 0 2em;position:relative;background-color:#f7f6f7;color:#515151;border-top:3px solid #a46497;list-style:none outside;width:auto;word-wrap:break-word}.woocommerce-error::after,.woocommerce-error::before,.woocommerce-info::after,.woocommerce-info::before,.woocommerce-message::after,.woocommerce-message::before{content:' ';display:table}.woocommerce-error::after,.woocommerce-info::after,.woocommerce-message::after{clear:both}.woocommerce-error::before,.woocommerce-info::before,.woocommerce-message::before{font-family:WooCommerce;content:'\e028';display:inline-block;position:absolute;top:1em;right:1.5em}.woocommerce-error .button,.woocommerce-info .button,.woocommerce-message .button{float:left}.woocommerce-error li,.woocommerce-info li,.woocommerce-message li{list-style:none outside!important;padding-right:0!important;margin-right:0!important}.rtl.woocommerce .price_label,.rtl.woocommerce .price_label span{direction:ltr;unicode-bidi:embed}.woocommerce-message{border-top-color:#8fae1b}.woocommerce-message::before{content:'\e015';color:#8fae1b}.woocommerce-info{border-top-color:#1e85be}.woocommerce-info::before{color:#1e85be}.woocommerce-error{border-top-color:#b81c23}.woocommerce-error::before{content:'\e016';color:#b81c23}.woocommerce-account .woocommerce::after,.woocommerce-account .woocommerce::before{content:' ';display:table}.woocommerce-account .woocommerce::after{clear:both}.woocommerce-account .addresses .title::after,.woocommerce-account .addresses .title::before{content:' ';display:table}.woocommerce-account .addresses .title::after{clear:both}.woocommerce-account .addresses .title h3{float:right}.woocommerce-account .addresses .title .edit{float:left}.woocommerce-account ol.commentlist.notes li.note p.meta{font-weight:700;margin-bottom:0}.woocommerce-account ol.commentlist.notes li.note .description p:last-child{margin-bottom:0}.woocommerce-account ul.digital-downloads{margin-right:0;padding-right:0}.woocommerce-account ul.digital-downloads li{list-style:none;margin-right:0;padding-right:0}.woocommerce-account ul.digital-downloads li::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-left:.618em;content:"";text-decoration:none}.woocommerce-account ul.digital-downloads li .count{float:left}#add_payment_method table.cart .product-thumbnail,.woocommerce-cart table.cart .product-thumbnail,.woocommerce-checkout table.cart .product-thumbnail{min-width:32px}#add_payment_method table.cart img,.woocommerce-cart table.cart img,.woocommerce-checkout table.cart img{width:32px;-webkit-box-shadow:none;box-shadow:none}#add_payment_method table.cart td,#add_payment_method table.cart th,.woocommerce-cart table.cart td,.woocommerce-cart table.cart th,.woocommerce-checkout table.cart td,.woocommerce-checkout table.cart th{vertical-align:middle}#add_payment_method table.cart td.actions .coupon .input-text,.woocommerce-cart table.cart td.actions .coupon .input-text,.woocommerce-checkout table.cart td.actions .coupon .input-text{float:right;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #d3ced2;padding:6px 6px 5px;margin:0 0 0 4px;outline:0}#add_payment_method table.cart input,.woocommerce-cart table.cart input,.woocommerce-checkout table.cart input{margin:0;vertical-align:middle}#add_payment_method .wc-proceed-to-checkout,.woocommerce-cart .wc-proceed-to-checkout,.woocommerce-checkout .wc-proceed-to-checkout{padding:1em 0}#add_payment_method .wc-proceed-to-checkout::after,#add_payment_method .wc-proceed-to-checkout::before,.woocommerce-cart .wc-proceed-to-checkout::after,.woocommerce-cart .wc-proceed-to-checkout::before,.woocommerce-checkout .wc-proceed-to-checkout::after,.woocommerce-checkout .wc-proceed-to-checkout::before{content:' ';display:table}#add_payment_method .wc-proceed-to-checkout::after,.woocommerce-cart .wc-proceed-to-checkout::after,.woocommerce-checkout .wc-proceed-to-checkout::after{clear:both}#add_payment_method .wc-proceed-to-checkout a.checkout-button,.woocommerce-cart .wc-proceed-to-checkout a.checkout-button,.woocommerce-checkout .wc-proceed-to-checkout a.checkout-button{display:block;text-align:center;margin-bottom:1em;font-size:1.25em;padding:1em}#add_payment_method .cart-collaterals .shipping-calculator-button,.woocommerce-cart .cart-collaterals .shipping-calculator-button,.woocommerce-checkout .cart-collaterals .shipping-calculator-button{float:none;margin-top:.5em;display:inline-block}#add_payment_method .cart-collaterals .shipping-calculator-button::after,.woocommerce-cart .cart-collaterals .shipping-calculator-button::after,.woocommerce-checkout .cart-collaterals .shipping-calculator-button::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-right:.618em;content:"";text-decoration:none}#add_payment_method .cart-collaterals .shipping-calculator-form,.woocommerce-cart .cart-collaterals .shipping-calculator-form,.woocommerce-checkout .cart-collaterals .shipping-calculator-form{margin:1em 0 0 0}#add_payment_method .cart-collaterals .cart_totals p small,.woocommerce-cart .cart-collaterals .cart_totals p small,.woocommerce-checkout .cart-collaterals .cart_totals p small{color:#777;font-size:.83em}#add_payment_method .cart-collaterals .cart_totals table,.woocommerce-cart .cart-collaterals .cart_totals table,.woocommerce-checkout .cart-collaterals .cart_totals table{border-collapse:separate;margin:0 0 6px;padding:0}#add_payment_method .cart-collaterals .cart_totals table tr:first-child td,#add_payment_method .cart-collaterals .cart_totals table tr:first-child th,.woocommerce-cart .cart-collaterals .cart_totals table tr:first-child td,.woocommerce-cart .cart-collaterals .cart_totals table tr:first-child th,.woocommerce-checkout .cart-collaterals .cart_totals table tr:first-child td,.woocommerce-checkout .cart-collaterals .cart_totals table tr:first-child th{border-top:0}#add_payment_method .cart-collaterals .cart_totals table th,.woocommerce-cart .cart-collaterals .cart_totals table th,.woocommerce-checkout .cart-collaterals .cart_totals table th{width:35%}#add_payment_method .cart-collaterals .cart_totals table td,#add_payment_method .cart-collaterals .cart_totals table th,.woocommerce-cart .cart-collaterals .cart_totals table td,.woocommerce-cart .cart-collaterals .cart_totals table th,.woocommerce-checkout .cart-collaterals .cart_totals table td,.woocommerce-checkout .cart-collaterals .cart_totals table th{vertical-align:top;border-right:0;border-left:0;line-height:1.5em}#add_payment_method .cart-collaterals .cart_totals table small,.woocommerce-cart .cart-collaterals .cart_totals table small,.woocommerce-checkout .cart-collaterals .cart_totals table small{color:#777}#add_payment_method .cart-collaterals .cart_totals table select,.woocommerce-cart .cart-collaterals .cart_totals table select,.woocommerce-checkout .cart-collaterals .cart_totals table select{width:100%}#add_payment_method .cart-collaterals .cart_totals .discount td,.woocommerce-cart .cart-collaterals .cart_totals .discount td,.woocommerce-checkout .cart-collaterals .cart_totals .discount td{color:#77a464}#add_payment_method .cart-collaterals .cart_totals tr td,#add_payment_method .cart-collaterals .cart_totals tr th,.woocommerce-cart .cart-collaterals .cart_totals tr td,.woocommerce-cart .cart-collaterals .cart_totals tr th,.woocommerce-checkout .cart-collaterals .cart_totals tr td,.woocommerce-checkout .cart-collaterals .cart_totals tr th{border-top:1px solid #ebe9eb}#add_payment_method .cart-collaterals .cart_totals .woocommerce-shipping-destination,.woocommerce-cart .cart-collaterals .cart_totals .woocommerce-shipping-destination,.woocommerce-checkout .cart-collaterals .cart_totals .woocommerce-shipping-destination{margin-bottom:0}#add_payment_method .cart-collaterals .cross-sells ul.products li.product,.woocommerce-cart .cart-collaterals .cross-sells ul.products li.product,.woocommerce-checkout .cart-collaterals .cross-sells ul.products li.product{margin-top:0}#add_payment_method .checkout .col-2 h3#ship-to-different-address,.woocommerce-cart .checkout .col-2 h3#ship-to-different-address,.woocommerce-checkout .checkout .col-2 h3#ship-to-different-address{float:right;clear:none}#add_payment_method .checkout .col-2 .notes,.woocommerce-cart .checkout .col-2 .notes,.woocommerce-checkout .checkout .col-2 .notes{clear:right}#add_payment_method .checkout .col-2 .form-row-first,.woocommerce-cart .checkout .col-2 .form-row-first,.woocommerce-checkout .checkout .col-2 .form-row-first{clear:right}#add_payment_method .checkout .create-account small,.woocommerce-cart .checkout .create-account small,.woocommerce-checkout .checkout .create-account small{font-size:11px;color:#777;font-weight:400}#add_payment_method .checkout div.shipping-address,.woocommerce-cart .checkout div.shipping-address,.woocommerce-checkout .checkout div.shipping-address{padding:0;clear:right;width:100%}#add_payment_method .checkout .shipping_address,.woocommerce-cart .checkout .shipping_address,.woocommerce-checkout .checkout .shipping_address{clear:both}#add_payment_method #payment,.woocommerce-cart #payment,.woocommerce-checkout #payment{background:#ebe9eb;border-radius:5px}#add_payment_method #payment ul.payment_methods,.woocommerce-cart #payment ul.payment_methods,.woocommerce-checkout #payment ul.payment_methods{text-align:right;padding:1em;border-bottom:1px solid #d3ced2;margin:0;list-style:none outside}#add_payment_method #payment ul.payment_methods::after,#add_payment_method #payment ul.payment_methods::before,.woocommerce-cart #payment ul.payment_methods::after,.woocommerce-cart #payment ul.payment_methods::before,.woocommerce-checkout #payment ul.payment_methods::after,.woocommerce-checkout #payment ul.payment_methods::before{content:' ';display:table}#add_payment_method #payment ul.payment_methods::after,.woocommerce-cart #payment ul.payment_methods::after,.woocommerce-checkout #payment ul.payment_methods::after{clear:both}#add_payment_method #payment ul.payment_methods li,.woocommerce-cart #payment ul.payment_methods li,.woocommerce-checkout #payment ul.payment_methods li{line-height:2;text-align:right;margin:0;font-weight:400}#add_payment_method #payment ul.payment_methods li input,.woocommerce-cart #payment ul.payment_methods li input,.woocommerce-checkout #payment ul.payment_methods li input{margin:0 0 0 1em}#add_payment_method #payment ul.payment_methods li img,.woocommerce-cart #payment ul.payment_methods li img,.woocommerce-checkout #payment ul.payment_methods li img{vertical-align:middle;margin:-2px .5em 0 0;padding:0;position:relative;-webkit-box-shadow:none;box-shadow:none}#add_payment_method #payment ul.payment_methods li img+img,.woocommerce-cart #payment ul.payment_methods li img+img,.woocommerce-checkout #payment ul.payment_methods li img+img{margin-right:2px}#add_payment_method #payment ul.payment_methods li:not(.woocommerce-notice)::after,#add_payment_method #payment ul.payment_methods li:not(.woocommerce-notice)::before,.woocommerce-cart #payment ul.payment_methods li:not(.woocommerce-notice)::after,.woocommerce-cart #payment ul.payment_methods li:not(.woocommerce-notice)::before,.woocommerce-checkout #payment ul.payment_methods li:not(.woocommerce-notice)::after,.woocommerce-checkout #payment ul.payment_methods li:not(.woocommerce-notice)::before{content:' ';display:table}#add_payment_method #payment ul.payment_methods li:not(.woocommerce-notice)::after,.woocommerce-cart #payment ul.payment_methods li:not(.woocommerce-notice)::after,.woocommerce-checkout #payment ul.payment_methods li:not(.woocommerce-notice)::after{clear:both}#add_payment_method #payment div.form-row,.woocommerce-cart #payment div.form-row,.woocommerce-checkout #payment div.form-row{padding:1em}#add_payment_method #payment div.payment_box,.woocommerce-cart #payment div.payment_box,.woocommerce-checkout #payment div.payment_box{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;padding:1em;margin:1em 0;font-size:.92em;border-radius:2px;line-height:1.5;background-color:#dfdcde;color:#515151}#add_payment_method #payment div.payment_box input.input-text,#add_payment_method #payment div.payment_box textarea,.woocommerce-cart #payment div.payment_box input.input-text,.woocommerce-cart #payment div.payment_box textarea,.woocommerce-checkout #payment div.payment_box input.input-text,.woocommerce-checkout #payment div.payment_box textarea{border-color:#c7c1c6;border-top-color:#bbb3b9}#add_payment_method #payment div.payment_box ::-webkit-input-placeholder,.woocommerce-cart #payment div.payment_box ::-webkit-input-placeholder,.woocommerce-checkout #payment div.payment_box ::-webkit-input-placeholder{color:#bbb3b9}#add_payment_method #payment div.payment_box :-moz-placeholder,.woocommerce-cart #payment div.payment_box :-moz-placeholder,.woocommerce-checkout #payment div.payment_box :-moz-placeholder{color:#bbb3b9}#add_payment_method #payment div.payment_box :-ms-input-placeholder,.woocommerce-cart #payment div.payment_box :-ms-input-placeholder,.woocommerce-checkout #payment div.payment_box :-ms-input-placeholder{color:#bbb3b9}#add_payment_method #payment div.payment_box .woocommerce-SavedPaymentMethods,.woocommerce-cart #payment div.payment_box .woocommerce-SavedPaymentMethods,.woocommerce-checkout #payment div.payment_box .woocommerce-SavedPaymentMethods{list-style:none outside;margin:0}#add_payment_method #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-new,#add_payment_method #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-token,.woocommerce-cart #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-new,.woocommerce-cart #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-token,.woocommerce-checkout #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-new,.woocommerce-checkout #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-token{margin:0 0 .5em}#add_payment_method #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-new label,#add_payment_method #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-token label,.woocommerce-cart #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-new label,.woocommerce-cart #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-token label,.woocommerce-checkout #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-new label,.woocommerce-checkout #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-token label{cursor:pointer}#add_payment_method #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-tokenInput,.woocommerce-cart #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-tokenInput,.woocommerce-checkout #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-tokenInput{vertical-align:middle;margin:-3px 0 0 1em;position:relative}#add_payment_method #payment div.payment_box .wc-credit-card-form,.woocommerce-cart #payment div.payment_box .wc-credit-card-form,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form{border:0;padding:0;margin:1em 0 0}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number{font-size:1.5em;padding:8px;background-repeat:no-repeat;background-position:left .618em center;background-size:32px 20px}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.visa,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.visa,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.visa,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.visa,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.visa,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.visa,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.visa,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.visa,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.visa{background-image:url(../images/icons/credit-cards/visa.svg)}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.mastercard,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.mastercard,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.mastercard,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.mastercard,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.mastercard,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.mastercard,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.mastercard,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.mastercard,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.mastercard{background-image:url(../images/icons/credit-cards/mastercard.svg)}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.laser,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.laser,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.laser,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.laser,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.laser,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.laser,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.laser,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.laser,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.laser{background-image:url(../images/icons/credit-cards/laser.svg)}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.dinersclub,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.dinersclub,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.dinersclub,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.dinersclub,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.dinersclub,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.dinersclub,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.dinersclub,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.dinersclub,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.dinersclub{background-image:url(../images/icons/credit-cards/diners.svg)}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.maestro,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.maestro,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.maestro,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.maestro,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.maestro,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.maestro,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.maestro,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.maestro,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.maestro{background-image:url(../images/icons/credit-cards/maestro.svg)}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.jcb,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.jcb,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.jcb,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.jcb,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.jcb,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.jcb,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.jcb,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.jcb,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.jcb{background-image:url(../images/icons/credit-cards/jcb.svg)}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.amex,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.amex,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.amex,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.amex,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.amex,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.amex,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.amex,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.amex,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.amex{background-image:url(../images/icons/credit-cards/amex.svg)}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.discover,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.discover,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.discover,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.discover,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.discover,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.discover,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.discover,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.discover,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.discover{background-image:url(../images/icons/credit-cards/discover.svg)}#add_payment_method #payment div.payment_box span.help,.woocommerce-cart #payment div.payment_box span.help,.woocommerce-checkout #payment div.payment_box span.help{font-size:.857em;color:#777;font-weight:400}#add_payment_method #payment div.payment_box .form-row,.woocommerce-cart #payment div.payment_box .form-row,.woocommerce-checkout #payment div.payment_box .form-row{margin:0 0 1em}#add_payment_method #payment div.payment_box p:last-child,.woocommerce-cart #payment div.payment_box p:last-child,.woocommerce-checkout #payment div.payment_box p:last-child{margin-bottom:0}#add_payment_method #payment div.payment_box::before,.woocommerce-cart #payment div.payment_box::before,.woocommerce-checkout #payment div.payment_box::before{content:'';display:block;border:1em solid #dfdcde;border-left-color:transparent;border-right-color:transparent;border-top-color:transparent;position:absolute;top:-.75em;right:0;margin:-1em 2em 0 0}#add_payment_method #payment .payment_method_paypal .about_paypal,.woocommerce-cart #payment .payment_method_paypal .about_paypal,.woocommerce-checkout #payment .payment_method_paypal .about_paypal{float:left;line-height:52px;font-size:.83em}#add_payment_method #payment .payment_method_paypal img,.woocommerce-cart #payment .payment_method_paypal img,.woocommerce-checkout #payment .payment_method_paypal img{max-height:52px;vertical-align:middle}.woocommerce-terms-and-conditions{border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background:rgba(0,0,0,.05)}.woocommerce-invalid #terms{outline:2px solid red;outline-offset:2px}.woocommerce-password-strength{text-align:center;font-weight:600;padding:3px .5em;font-size:1em}.woocommerce-password-strength.strong{background-color:#c1e1b9;border-color:#83c373}.woocommerce-password-strength.short{background-color:#f1adad;border-color:#e35b5b}.woocommerce-password-strength.bad{background-color:#fbc5a9;border-color:#f78b53}.woocommerce-password-strength.good{background-color:#ffe399;border-color:#ffc733}.woocommerce-password-hint{margin:.5em 0 0;display:block}#content.twentyeleven .woocommerce-pagination a{font-size:1em;line-height:1}.single-product .twentythirteen #reply-title,.single-product .twentythirteen #respond #commentform,.single-product .twentythirteen .entry-summary{padding:0}.single-product .twentythirteen p.stars{clear:both}.twentythirteen .woocommerce-breadcrumb{padding-top:40px}.twentyfourteen ul.products li.product{margin-top:0!important}body:not(.search-results) .twentysixteen .entry-summary{color:inherit;font-size:inherit;line-height:inherit}.twentysixteen .price ins{background:inherit;color:inherit} \ No newline at end of file +@charset "UTF-8";@-webkit-keyframes spin{100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}@keyframes spin{100%{-webkit-transform:rotate(-360deg);transform:rotate(-360deg)}}@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}.woocommerce-store-notice,p.demo_store{position:absolute;top:0;right:0;left:0;margin:0;width:100%;font-size:1em;padding:1em 0;text-align:center;background-color:#a46497;color:#fff;z-index:99998;box-shadow:0 1px 1em rgba(0,0,0,.2);display:none}.woocommerce-store-notice a,p.demo_store a{color:#fff;text-decoration:underline}.screen-reader-text{clip:rect(1px,1px,1px,1px);height:1px;overflow:hidden;position:absolute!important;width:1px;word-wrap:normal!important}.admin-bar p.demo_store{top:32px}.clear{clear:both}.woocommerce .blockUI.blockOverlay{position:relative}.woocommerce .blockUI.blockOverlay::before{height:1em;width:1em;display:block;position:absolute;top:50%;right:50%;margin-right:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.woocommerce .loader::before{height:1em;width:1em;display:block;position:absolute;top:50%;right:50%;margin-right:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.woocommerce a.remove{display:block;font-size:1.5em;height:1em;width:1em;text-align:center;line-height:1;border-radius:100%;color:red!important;text-decoration:none;font-weight:700;border:0}.woocommerce a.remove:hover{color:#fff!important;background:red}.woocommerce small.note{display:block;color:#777;font-size:.857em;margin-top:10px}.woocommerce .woocommerce-breadcrumb{margin:0 0 1em;padding:0;font-size:.92em;color:#777}.woocommerce .woocommerce-breadcrumb::after,.woocommerce .woocommerce-breadcrumb::before{content:' ';display:table}.woocommerce .woocommerce-breadcrumb::after{clear:both}.woocommerce .woocommerce-breadcrumb a{color:#777}.woocommerce .quantity .qty{width:3.631em;text-align:center}.woocommerce div.product{margin-bottom:0;position:relative}.woocommerce div.product .product_title{clear:none;margin-top:0;padding:0}.woocommerce div.product p.price,.woocommerce div.product span.price{color:#77a464;font-size:1.25em}.woocommerce div.product p.price ins,.woocommerce div.product span.price ins{background:inherit;font-weight:700;display:inline-block}.woocommerce div.product p.price del,.woocommerce div.product span.price del{opacity:.5;display:inline-block}.woocommerce div.product p.stock{font-size:.92em}.woocommerce div.product .stock{color:#77a464}.woocommerce div.product .out-of-stock{color:red}.woocommerce div.product .woocommerce-product-rating{margin-bottom:1.618em}.woocommerce div.product div.images{margin-bottom:2em}.woocommerce div.product div.images img{display:block;width:100%;height:auto;box-shadow:none}.woocommerce div.product div.images div.thumbnails{padding-top:1em}.woocommerce div.product div.images.woocommerce-product-gallery{position:relative}.woocommerce div.product div.images .woocommerce-product-gallery__wrapper{-webkit-transition:all cubic-bezier(.795,-.035,0,1) .5s;transition:all cubic-bezier(.795,-.035,0,1) .5s;margin:0;padding:0}.woocommerce div.product div.images .woocommerce-product-gallery__wrapper .zoomImg{background-color:#fff;opacity:0}.woocommerce div.product div.images .woocommerce-product-gallery__image--placeholder{border:1px solid #f2f2f2}.woocommerce div.product div.images .woocommerce-product-gallery__image:nth-child(n+2){width:25%;display:inline-block}.woocommerce div.product div.images .woocommerce-product-gallery__trigger{position:absolute;top:.5em;left:.5em;font-size:2em;z-index:9;width:36px;height:36px;background:#fff;text-indent:-9999px;border-radius:100%;box-sizing:content-box}.woocommerce div.product div.images .woocommerce-product-gallery__trigger:before{content:"";display:block;width:10px;height:10px;border:2px solid #000;border-radius:100%;position:absolute;top:9px;right:9px;box-sizing:content-box}.woocommerce div.product div.images .woocommerce-product-gallery__trigger:after{content:"";display:block;width:2px;height:8px;background:#000;border-radius:6px;position:absolute;top:19px;right:22px;-webkit-transform:rotate(45deg);-ms-transform:rotate(45deg);transform:rotate(45deg);box-sizing:content-box}.woocommerce div.product div.images .flex-control-thumbs{overflow:hidden;zoom:1;margin:0;padding:0}.woocommerce div.product div.images .flex-control-thumbs li{width:25%;float:right;margin:0;list-style:none}.woocommerce div.product div.images .flex-control-thumbs li img{cursor:pointer;opacity:.5;margin:0}.woocommerce div.product div.images .flex-control-thumbs li img.flex-active,.woocommerce div.product div.images .flex-control-thumbs li img:hover{opacity:1}.woocommerce div.product .woocommerce-product-gallery--columns-3 .flex-control-thumbs li:nth-child(3n+1){clear:right}.woocommerce div.product .woocommerce-product-gallery--columns-4 .flex-control-thumbs li:nth-child(4n+1){clear:right}.woocommerce div.product .woocommerce-product-gallery--columns-5 .flex-control-thumbs li:nth-child(5n+1){clear:right}.woocommerce div.product div.summary{margin-bottom:2em}.woocommerce div.product div.social{text-align:left;margin:0 0 1em}.woocommerce div.product div.social span{margin:0 2px 0 0}.woocommerce div.product div.social span span{margin:0}.woocommerce div.product div.social span .stButton .chicklets{padding-right:16px;width:0}.woocommerce div.product div.social iframe{float:right;margin-top:3px}.woocommerce div.product .woocommerce-tabs ul.tabs{list-style:none;padding:0 1em 0 0;margin:0 0 1.618em;overflow:hidden;position:relative}.woocommerce div.product .woocommerce-tabs ul.tabs li{border:1px solid #d3ced2;background-color:#ebe9eb;display:inline-block;position:relative;z-index:0;border-radius:4px 4px 0 0;margin:0 -5px;padding:0 1em}.woocommerce div.product .woocommerce-tabs ul.tabs li a{display:inline-block;padding:.5em 0;font-weight:700;color:#515151;text-decoration:none}.woocommerce div.product .woocommerce-tabs ul.tabs li a:hover{text-decoration:none;color:#6b6a6b}.woocommerce div.product .woocommerce-tabs ul.tabs li.active{background:#fff;z-index:2;border-bottom-color:#fff}.woocommerce div.product .woocommerce-tabs ul.tabs li.active a{color:inherit;text-shadow:inherit}.woocommerce div.product .woocommerce-tabs ul.tabs li.active::before{box-shadow:-2px 2px 0 #fff}.woocommerce div.product .woocommerce-tabs ul.tabs li.active::after{box-shadow:2px 2px 0 #fff}.woocommerce div.product .woocommerce-tabs ul.tabs li::after,.woocommerce div.product .woocommerce-tabs ul.tabs li::before{border:1px solid #d3ced2;position:absolute;bottom:-1px;width:5px;height:5px;content:' ';box-sizing:border-box}.woocommerce div.product .woocommerce-tabs ul.tabs li::before{right:-5px;border-bottom-left-radius:4px;border-width:0 0 1px 1px;box-shadow:-2px 2px 0 #ebe9eb}.woocommerce div.product .woocommerce-tabs ul.tabs li::after{left:-5px;border-bottom-right-radius:4px;border-width:0 1px 1px 0;box-shadow:2px 2px 0 #ebe9eb}.woocommerce div.product .woocommerce-tabs ul.tabs::before{position:absolute;content:' ';width:100%;bottom:0;right:0;border-bottom:1px solid #d3ced2;z-index:1}.woocommerce div.product .woocommerce-tabs .panel{margin:0 0 2em;padding:0}.woocommerce div.product p.cart{margin-bottom:2em}.woocommerce div.product p.cart::after,.woocommerce div.product p.cart::before{content:' ';display:table}.woocommerce div.product p.cart::after{clear:both}.woocommerce div.product form.cart{margin-bottom:2em}.woocommerce div.product form.cart::after,.woocommerce div.product form.cart::before{content:' ';display:table}.woocommerce div.product form.cart::after{clear:both}.woocommerce div.product form.cart div.quantity{float:right;margin:0 0 0 4px}.woocommerce div.product form.cart table{border-width:0 0 1px}.woocommerce div.product form.cart table td{padding-right:0}.woocommerce div.product form.cart table div.quantity{float:none;margin:0}.woocommerce div.product form.cart table small.stock{display:block;float:none}.woocommerce div.product form.cart .variations{margin-bottom:1em;border:0;width:100%}.woocommerce div.product form.cart .variations td,.woocommerce div.product form.cart .variations th{border:0;vertical-align:top;line-height:2em}.woocommerce div.product form.cart .variations label{font-weight:700}.woocommerce div.product form.cart .variations select{max-width:100%;min-width:75%;display:inline-block;margin-left:1em}.woocommerce div.product form.cart .variations td.label{padding-left:1em}.woocommerce div.product form.cart .woocommerce-variation-description p{margin-bottom:1em}.woocommerce div.product form.cart .reset_variations{visibility:hidden;font-size:.83em}.woocommerce div.product form.cart .wc-no-matching-variations{display:none}.woocommerce div.product form.cart .button{vertical-align:middle;float:right}.woocommerce div.product form.cart .group_table td.woocommerce-grouped-product-list-item__label{padding-left:1em;padding-right:1em}.woocommerce div.product form.cart .group_table td{vertical-align:top;padding-bottom:.5em;border:0}.woocommerce div.product form.cart .group_table td:first-child{width:4em;text-align:center}.woocommerce div.product form.cart .group_table .wc-grouped-product-add-to-cart-checkbox{display:inline-block;width:auto;margin:0 auto;-webkit-transform:scale(1.5,1.5);-ms-transform:scale(1.5,1.5);transform:scale(1.5,1.5)}.woocommerce span.onsale{min-height:3.236em;min-width:3.236em;padding:.202em;font-size:1em;font-weight:700;position:absolute;text-align:center;line-height:3.236;top:-.5em;right:-.5em;margin:0;border-radius:100%;background-color:#77a464;color:#fff;font-size:.857em;z-index:9}.woocommerce .products ul,.woocommerce ul.products{margin:0 0 1em;padding:0;list-style:none outside;clear:both}.woocommerce .products ul::after,.woocommerce .products ul::before,.woocommerce ul.products::after,.woocommerce ul.products::before{content:' ';display:table}.woocommerce .products ul::after,.woocommerce ul.products::after{clear:both}.woocommerce .products ul li,.woocommerce ul.products li{list-style:none outside}.woocommerce ul.products li.product .onsale{top:0;left:0;right:auto;margin:-.5em 0 0 -.5em}.woocommerce ul.products li.product .woocommerce-loop-category__title,.woocommerce ul.products li.product .woocommerce-loop-product__title,.woocommerce ul.products li.product h3{padding:.5em 0;margin:0;font-size:1em}.woocommerce ul.products li.product a{text-decoration:none}.woocommerce ul.products li.product a img{width:100%;height:auto;display:block;margin:0 0 1em;box-shadow:none}.woocommerce ul.products li.product strong{display:block}.woocommerce ul.products li.product .woocommerce-placeholder{border:1px solid #f2f2f2}.woocommerce ul.products li.product .star-rating{font-size:.857em}.woocommerce ul.products li.product .button{margin-top:1em}.woocommerce ul.products li.product .price{color:#77a464;display:block;font-weight:400;margin-bottom:.5em;font-size:.857em}.woocommerce ul.products li.product .price del{color:inherit;opacity:.5;display:inline-block}.woocommerce ul.products li.product .price ins{background:0 0;font-weight:700;display:inline-block}.woocommerce ul.products li.product .price .from{font-size:.67em;margin:-2px 0 0 0;text-transform:uppercase;color:rgba(132,132,132,.5)}.woocommerce .woocommerce-result-count{margin:0 0 1em}.woocommerce .woocommerce-ordering{margin:0 0 1em}.woocommerce .woocommerce-ordering select{vertical-align:top}.woocommerce nav.woocommerce-pagination{text-align:center}.woocommerce nav.woocommerce-pagination ul{display:inline-block;white-space:nowrap;padding:0;clear:both;border:1px solid #d3ced2;border-left:0;margin:1px}.woocommerce nav.woocommerce-pagination ul li{border-left:1px solid #d3ced2;padding:0;margin:0;float:right;display:inline;overflow:hidden}.woocommerce nav.woocommerce-pagination ul li a,.woocommerce nav.woocommerce-pagination ul li span{margin:0;text-decoration:none;padding:0;line-height:1;font-size:1em;font-weight:400;padding:.5em;min-width:1em;display:block}.woocommerce nav.woocommerce-pagination ul li a:focus,.woocommerce nav.woocommerce-pagination ul li a:hover,.woocommerce nav.woocommerce-pagination ul li span.current{background:#ebe9eb;color:#8a7e88}.woocommerce #respond input#submit,.woocommerce a.button,.woocommerce button.button,.woocommerce input.button{font-size:100%;margin:0;line-height:1;cursor:pointer;position:relative;text-decoration:none;overflow:visible;padding:.618em 1em;font-weight:700;border-radius:3px;right:auto;color:#515151;background-color:#ebe9eb;border:0;display:inline-block;background-image:none;box-shadow:none;text-shadow:none}.woocommerce #respond input#submit.loading,.woocommerce a.button.loading,.woocommerce button.button.loading,.woocommerce input.button.loading{opacity:.25;padding-left:2.618em}.woocommerce #respond input#submit.loading::after,.woocommerce a.button.loading::after,.woocommerce button.button.loading::after,.woocommerce input.button.loading::after{font-family:WooCommerce;content:'\e01c';vertical-align:top;font-weight:400;position:absolute;top:.618em;left:1em;-webkit-animation:spin 2s linear infinite;animation:spin 2s linear infinite}.woocommerce #respond input#submit.added::after,.woocommerce a.button.added::after,.woocommerce button.button.added::after,.woocommerce input.button.added::after{font-family:WooCommerce;content:'\e017';margin-right:.53em;vertical-align:bottom}.woocommerce #respond input#submit:hover,.woocommerce a.button:hover,.woocommerce button.button:hover,.woocommerce input.button:hover{background-color:#dad8da;text-decoration:none;background-image:none;color:#515151}.woocommerce #respond input#submit.alt,.woocommerce a.button.alt,.woocommerce button.button.alt,.woocommerce input.button.alt{background-color:#a46497;color:#fff;-webkit-font-smoothing:antialiased}.woocommerce #respond input#submit.alt:hover,.woocommerce a.button.alt:hover,.woocommerce button.button.alt:hover,.woocommerce input.button.alt:hover{background-color:#935386;color:#fff}.woocommerce #respond input#submit.alt.disabled,.woocommerce #respond input#submit.alt.disabled:hover,.woocommerce #respond input#submit.alt:disabled,.woocommerce #respond input#submit.alt:disabled:hover,.woocommerce #respond input#submit.alt:disabled[disabled],.woocommerce #respond input#submit.alt:disabled[disabled]:hover,.woocommerce a.button.alt.disabled,.woocommerce a.button.alt.disabled:hover,.woocommerce a.button.alt:disabled,.woocommerce a.button.alt:disabled:hover,.woocommerce a.button.alt:disabled[disabled],.woocommerce a.button.alt:disabled[disabled]:hover,.woocommerce button.button.alt.disabled,.woocommerce button.button.alt.disabled:hover,.woocommerce button.button.alt:disabled,.woocommerce button.button.alt:disabled:hover,.woocommerce button.button.alt:disabled[disabled],.woocommerce button.button.alt:disabled[disabled]:hover,.woocommerce input.button.alt.disabled,.woocommerce input.button.alt.disabled:hover,.woocommerce input.button.alt:disabled,.woocommerce input.button.alt:disabled:hover,.woocommerce input.button.alt:disabled[disabled],.woocommerce input.button.alt:disabled[disabled]:hover{background-color:#a46497;color:#fff}.woocommerce #respond input#submit.disabled,.woocommerce #respond input#submit:disabled,.woocommerce #respond input#submit:disabled[disabled],.woocommerce a.button.disabled,.woocommerce a.button:disabled,.woocommerce a.button:disabled[disabled],.woocommerce button.button.disabled,.woocommerce button.button:disabled,.woocommerce button.button:disabled[disabled],.woocommerce input.button.disabled,.woocommerce input.button:disabled,.woocommerce input.button:disabled[disabled]{color:inherit;cursor:not-allowed;opacity:.5;padding:.618em 1em}.woocommerce #respond input#submit.disabled:hover,.woocommerce #respond input#submit:disabled:hover,.woocommerce #respond input#submit:disabled[disabled]:hover,.woocommerce a.button.disabled:hover,.woocommerce a.button:disabled:hover,.woocommerce a.button:disabled[disabled]:hover,.woocommerce button.button.disabled:hover,.woocommerce button.button:disabled:hover,.woocommerce button.button:disabled[disabled]:hover,.woocommerce input.button.disabled:hover,.woocommerce input.button:disabled:hover,.woocommerce input.button:disabled[disabled]:hover{color:inherit;background-color:#ebe9eb}.woocommerce .cart .button,.woocommerce .cart input.button{float:none}.woocommerce a.added_to_cart{padding-top:.5em;display:inline-block}.woocommerce #reviews h2 small{float:left;color:#777;font-size:15px;margin:10px 0 0}.woocommerce #reviews h2 small a{text-decoration:none;color:#777}.woocommerce #reviews h3{margin:0}.woocommerce #reviews #respond{margin:0;border:0;padding:0}.woocommerce #reviews #comment{height:75px}.woocommerce #reviews #comments .add_review::after,.woocommerce #reviews #comments .add_review::before{content:' ';display:table}.woocommerce #reviews #comments .add_review::after{clear:both}.woocommerce #reviews #comments h2{clear:none}.woocommerce #reviews #comments ol.commentlist{margin:0;width:100%;background:0 0;list-style:none}.woocommerce #reviews #comments ol.commentlist::after,.woocommerce #reviews #comments ol.commentlist::before{content:' ';display:table}.woocommerce #reviews #comments ol.commentlist::after{clear:both}.woocommerce #reviews #comments ol.commentlist li{padding:0;margin:0 0 20px;border:0;position:relative;background:100%;border:0}.woocommerce #reviews #comments ol.commentlist li .meta{color:#777;font-size:.75em}.woocommerce #reviews #comments ol.commentlist li img.avatar{float:right;position:absolute;top:0;right:0;padding:3px;width:32px;height:auto;background:#ebe9eb;border:1px solid #e4e1e3;margin:0;box-shadow:none}.woocommerce #reviews #comments ol.commentlist li .comment-text{margin:0 50px 0 0;border:1px solid #e4e1e3;border-radius:4px;padding:1em 1em 0}.woocommerce #reviews #comments ol.commentlist li .comment-text::after,.woocommerce #reviews #comments ol.commentlist li .comment-text::before{content:' ';display:table}.woocommerce #reviews #comments ol.commentlist li .comment-text::after{clear:both}.woocommerce #reviews #comments ol.commentlist li .comment-text p{margin:0 0 1em}.woocommerce #reviews #comments ol.commentlist li .comment-text p.meta{font-size:.83em}.woocommerce #reviews #comments ol.commentlist ul.children{list-style:none outside;margin:20px 50px 0 0}.woocommerce #reviews #comments ol.commentlist ul.children .star-rating{display:none}.woocommerce #reviews #comments ol.commentlist #respond{border:1px solid #e4e1e3;border-radius:4px;padding:1em 1em 0;margin:20px 50px 0 0}.woocommerce #reviews #comments .commentlist>li::before{content:''}.woocommerce .star-rating{float:left;overflow:hidden;position:relative;height:1em;line-height:1;font-size:1em;width:5.4em;font-family:star}.woocommerce .star-rating::before{content:'\73\73\73\73\73';color:#d3ced2;float:right;top:0;right:0;position:absolute}.woocommerce .star-rating span{overflow:hidden;float:right;top:0;right:0;position:absolute;padding-top:1.5em}.woocommerce .star-rating span::before{content:'\53\53\53\53\53';top:0;position:absolute;right:0}.woocommerce .woocommerce-product-rating{line-height:2;display:block}.woocommerce .woocommerce-product-rating::after,.woocommerce .woocommerce-product-rating::before{content:' ';display:table}.woocommerce .woocommerce-product-rating::after{clear:both}.woocommerce .woocommerce-product-rating .star-rating{margin:.5em 0 0 4px;float:right}.woocommerce .products .star-rating{display:block;margin:0 0 .5em;float:none}.woocommerce .hreview-aggregate .star-rating{margin:10px 0 0}.woocommerce #review_form #respond{position:static;margin:0;width:auto;padding:0;background:transparent none;border:0}.woocommerce #review_form #respond::after,.woocommerce #review_form #respond::before{content:' ';display:table}.woocommerce #review_form #respond::after{clear:both}.woocommerce #review_form #respond p{margin:0 0 10px}.woocommerce #review_form #respond .form-submit input{right:auto}.woocommerce #review_form #respond textarea{box-sizing:border-box;width:100%}.woocommerce p.stars a{position:relative;height:1em;width:1em;text-indent:-999em;display:inline-block;text-decoration:none}.woocommerce p.stars a::before{display:block;position:absolute;top:0;right:0;width:1em;height:1em;line-height:1;font-family:WooCommerce;content:'\e021';text-indent:0}.woocommerce p.stars a:hover~a::before{content:'\e021'}.woocommerce p.stars:hover a::before{content:'\e020'}.woocommerce p.stars.selected a.active::before{content:'\e020'}.woocommerce p.stars.selected a.active~a::before{content:'\e021'}.woocommerce p.stars.selected a:not(.active)::before{content:'\e020'}.woocommerce table.shop_attributes{border:0;border-top:1px dotted rgba(0,0,0,.1);margin-bottom:1.618em;width:100%}.woocommerce table.shop_attributes th{width:150px;font-weight:700;padding:8px;border-top:0;border-bottom:1px dotted rgba(0,0,0,.1);margin:0;line-height:1.5}.woocommerce table.shop_attributes td{font-style:italic;padding:0;border-top:0;border-bottom:1px dotted rgba(0,0,0,.1);margin:0;line-height:1.5}.woocommerce table.shop_attributes td p{margin:0;padding:8px 0}.woocommerce table.shop_attributes tr:nth-child(even) td,.woocommerce table.shop_attributes tr:nth-child(even) th{background:rgba(0,0,0,.025)}.woocommerce table.shop_table{border:1px solid rgba(0,0,0,.1);margin:0 0 24px -1px;text-align:right;width:100%;border-collapse:separate;border-radius:5px}.woocommerce table.shop_table th{font-weight:700;padding:9px 12px;line-height:1.5em}.woocommerce table.shop_table td{border-top:1px solid rgba(0,0,0,.1);padding:9px 12px;vertical-align:middle;line-height:1.5em}.woocommerce table.shop_table td small{font-weight:400}.woocommerce table.shop_table tbody:first-child tr:first-child td,.woocommerce table.shop_table tbody:first-child tr:first-child th{border-top:0}.woocommerce table.shop_table tbody th,.woocommerce table.shop_table tfoot td,.woocommerce table.shop_table tfoot th{font-weight:700;border-top:1px solid rgba(0,0,0,.1)}.woocommerce table.my_account_orders{font-size:.85em}.woocommerce table.my_account_orders td,.woocommerce table.my_account_orders th{padding:4px 8px;vertical-align:middle}.woocommerce table.my_account_orders .button{white-space:nowrap}.woocommerce table.my_account_orders .order-actions{text-align:left}.woocommerce table.my_account_orders .order-actions .button{margin:.125em .25em .125em 0}.woocommerce table.woocommerce-MyAccount-downloads td,.woocommerce table.woocommerce-MyAccount-downloads th{vertical-align:top;text-align:center}.woocommerce table.woocommerce-MyAccount-downloads td:first-child,.woocommerce table.woocommerce-MyAccount-downloads th:first-child{text-align:right}.woocommerce table.woocommerce-MyAccount-downloads td:last-child,.woocommerce table.woocommerce-MyAccount-downloads th:last-child{text-align:right}.woocommerce table.woocommerce-MyAccount-downloads td .woocommerce-MyAccount-downloads-file::before,.woocommerce table.woocommerce-MyAccount-downloads th .woocommerce-MyAccount-downloads-file::before{content:'\2193';display:inline-block}.woocommerce td.product-name .wc-item-meta,.woocommerce td.product-name dl.variation{list-style:none outside}.woocommerce td.product-name .wc-item-meta .wc-item-meta-label,.woocommerce td.product-name .wc-item-meta dt,.woocommerce td.product-name dl.variation .wc-item-meta-label,.woocommerce td.product-name dl.variation dt{float:right;clear:both;margin-left:.25em;display:inline-block;list-style:none outside}.woocommerce td.product-name .wc-item-meta dd,.woocommerce td.product-name dl.variation dd{margin:0}.woocommerce td.product-name .wc-item-meta p,.woocommerce td.product-name .wc-item-meta:last-child,.woocommerce td.product-name dl.variation p,.woocommerce td.product-name dl.variation:last-child{margin-bottom:0}.woocommerce td.product-name p.backorder_notification{font-size:.83em}.woocommerce td.product-quantity{min-width:80px}.woocommerce ul.cart_list,.woocommerce ul.product_list_widget{list-style:none outside;padding:0;margin:0}.woocommerce ul.cart_list li,.woocommerce ul.product_list_widget li{padding:4px 0;margin:0;list-style:none}.woocommerce ul.cart_list li::after,.woocommerce ul.cart_list li::before,.woocommerce ul.product_list_widget li::after,.woocommerce ul.product_list_widget li::before{content:' ';display:table}.woocommerce ul.cart_list li::after,.woocommerce ul.product_list_widget li::after{clear:both}.woocommerce ul.cart_list li a,.woocommerce ul.product_list_widget li a{display:block;font-weight:700}.woocommerce ul.cart_list li img,.woocommerce ul.product_list_widget li img{float:left;margin-right:4px;width:32px;height:auto;box-shadow:none}.woocommerce ul.cart_list li dl,.woocommerce ul.product_list_widget li dl{margin:0;padding-right:1em;border-right:2px solid rgba(0,0,0,.1)}.woocommerce ul.cart_list li dl::after,.woocommerce ul.cart_list li dl::before,.woocommerce ul.product_list_widget li dl::after,.woocommerce ul.product_list_widget li dl::before{content:' ';display:table}.woocommerce ul.cart_list li dl::after,.woocommerce ul.product_list_widget li dl::after{clear:both}.woocommerce ul.cart_list li dl dd,.woocommerce ul.cart_list li dl dt,.woocommerce ul.product_list_widget li dl dd,.woocommerce ul.product_list_widget li dl dt{display:inline-block;float:right;margin-bottom:1em}.woocommerce ul.cart_list li dl dt,.woocommerce ul.product_list_widget li dl dt{font-weight:700;padding:0 0 .25em;margin:0 0 0 4px;clear:right}.woocommerce ul.cart_list li dl dd,.woocommerce ul.product_list_widget li dl dd{padding:0 0 .25em}.woocommerce ul.cart_list li dl dd p:last-child,.woocommerce ul.product_list_widget li dl dd p:last-child{margin-bottom:0}.woocommerce ul.cart_list li .star-rating,.woocommerce ul.product_list_widget li .star-rating{float:none}.woocommerce .widget_shopping_cart .total,.woocommerce.widget_shopping_cart .total{border-top:3px double #ebe9eb;padding:4px 0 0}.woocommerce .widget_shopping_cart .total strong,.woocommerce.widget_shopping_cart .total strong{min-width:40px;display:inline-block}.woocommerce .widget_shopping_cart .cart_list li,.woocommerce.widget_shopping_cart .cart_list li{padding-right:2em;position:relative;padding-top:0}.woocommerce .widget_shopping_cart .cart_list li a.remove,.woocommerce.widget_shopping_cart .cart_list li a.remove{position:absolute;top:0;right:0}.woocommerce .widget_shopping_cart .buttons::after,.woocommerce .widget_shopping_cart .buttons::before,.woocommerce.widget_shopping_cart .buttons::after,.woocommerce.widget_shopping_cart .buttons::before{content:' ';display:table}.woocommerce .widget_shopping_cart .buttons::after,.woocommerce.widget_shopping_cart .buttons::after{clear:both}.woocommerce .widget_shopping_cart .buttons a,.woocommerce.widget_shopping_cart .buttons a{margin-left:5px;margin-bottom:5px}.woocommerce form .form-row{padding:3px;margin:0 0 6px}.woocommerce form .form-row [placeholder]:focus::-webkit-input-placeholder{-webkit-transition:opacity .5s .5s ease;transition:opacity .5s .5s ease;opacity:0}.woocommerce form .form-row label{line-height:2}.woocommerce form .form-row label.hidden{visibility:hidden}.woocommerce form .form-row label.inline{display:inline}.woocommerce form .form-row .woocommerce-input-wrapper .description{background:#1e85be;color:#fff;border-radius:3px;padding:1em;margin:.5em 0 0;clear:both;display:none;position:relative}.woocommerce form .form-row .woocommerce-input-wrapper .description a{color:#fff;text-decoration:underline;border:0;box-shadow:none}.woocommerce form .form-row .woocommerce-input-wrapper .description:before{right:50%;top:0;margin-top:-4px;-webkit-transform:translatex(50%) rotate(-180deg);-ms-transform:translatex(50%) rotate(-180deg);transform:translatex(50%) rotate(-180deg);content:"";position:absolute;border-width:4px 6px 0 6px;border-style:solid;border-color:#1e85be transparent transparent transparent;z-index:100;display:block}.woocommerce form .form-row select{cursor:pointer;margin:0}.woocommerce form .form-row .required{color:red;font-weight:700;border:0!important;text-decoration:none;visibility:hidden}.woocommerce form .form-row .optional{visibility:visible}.woocommerce form .form-row .input-checkbox{display:inline;margin:-2px 0 0 8px;text-align:center;vertical-align:middle}.woocommerce form .form-row input.input-text,.woocommerce form .form-row textarea{box-sizing:border-box;width:100%;margin:0;outline:0;line-height:normal}.woocommerce form .form-row textarea{height:4em;line-height:1.5;display:block;box-shadow:none}.woocommerce form .form-row .select2-container{width:100%;line-height:2em}.woocommerce form .form-row.woocommerce-invalid label{color:#a00}.woocommerce form .form-row.woocommerce-invalid .select2-container,.woocommerce form .form-row.woocommerce-invalid input.input-text,.woocommerce form .form-row.woocommerce-invalid select{border-color:#a00}.woocommerce form .form-row.woocommerce-validated .select2-container,.woocommerce form .form-row.woocommerce-validated input.input-text,.woocommerce form .form-row.woocommerce-validated select{border-color:#69bf29}.woocommerce form .form-row ::-webkit-input-placeholder{line-height:normal}.woocommerce form .form-row :-moz-placeholder{line-height:normal}.woocommerce form .form-row :-ms-input-placeholder{line-height:normal}.woocommerce form.checkout_coupon,.woocommerce form.login,.woocommerce form.register{border:1px solid #d3ced2;padding:20px;margin:2em 0;text-align:right;border-radius:5px}.woocommerce ul#shipping_method{list-style:none outside;margin:0;padding:0}.woocommerce ul#shipping_method li{margin:0 0 .5em;line-height:1.5em;list-style:none outside}.woocommerce ul#shipping_method li input{margin:3px 0 0 .4375em;vertical-align:top}.woocommerce ul#shipping_method li label{display:inline}.woocommerce ul#shipping_method .amount{font-weight:700}.woocommerce p.woocommerce-shipping-contents{margin:0}.woocommerce ul.order_details{margin:0 0 3em;list-style:none}.woocommerce ul.order_details::after,.woocommerce ul.order_details::before{content:' ';display:table}.woocommerce ul.order_details::after{clear:both}.woocommerce ul.order_details li{float:right;margin-left:2em;text-transform:uppercase;font-size:.715em;line-height:1;border-left:1px dashed #d3ced2;padding-left:2em;margin-right:0;padding-right:0;list-style-type:none}.woocommerce ul.order_details li strong{display:block;font-size:1.4em;text-transform:none;line-height:1.5}.woocommerce ul.order_details li:last-of-type{border:none}.woocommerce .wc-bacs-bank-details-account-name{font-weight:700}.woocommerce .woocommerce-customer-details,.woocommerce .woocommerce-order-details,.woocommerce .woocommerce-order-downloads{margin-bottom:2em}.woocommerce .woocommerce-customer-details :last-child,.woocommerce .woocommerce-order-details :last-child,.woocommerce .woocommerce-order-downloads :last-child{margin-bottom:0}.woocommerce .woocommerce-customer-details address{font-style:normal;margin-bottom:0;border:1px solid rgba(0,0,0,.1);border-bottom-width:2px;border-left-width:2px;text-align:right;width:100%;border-radius:5px;padding:6px 12px}.woocommerce .woocommerce-customer-details .woocommerce-customer-details--email,.woocommerce .woocommerce-customer-details .woocommerce-customer-details--phone{margin-bottom:0;padding-right:1.5em}.woocommerce .woocommerce-customer-details .woocommerce-customer-details--phone::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-left:.618em;content:"";text-decoration:none;margin-right:-1.5em;line-height:1.75;position:absolute}.woocommerce .woocommerce-customer-details .woocommerce-customer-details--email::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-left:.618em;content:"";text-decoration:none;margin-right:-1.5em;line-height:1.75;position:absolute}.woocommerce .woocommerce-widget-layered-nav-list{margin:0;padding:0;border:0;list-style:none outside}.woocommerce .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item{padding:0 0 1px;list-style:none}.woocommerce .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item::after,.woocommerce .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item::before{content:' ';display:table}.woocommerce .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item::after{clear:both}.woocommerce .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item a,.woocommerce .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item span{padding:1px 0}.woocommerce .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item--chosen a::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-left:.618em;content:"";text-decoration:none;color:#a00}.woocommerce .woocommerce-widget-layered-nav-dropdown__submit{margin-top:1em}.woocommerce .widget_layered_nav_filters ul{margin:0;padding:0;border:0;list-style:none outside;overflow:hidden;zoom:1}.woocommerce .widget_layered_nav_filters ul li{float:right;padding:0 1px 1px 1em;list-style:none}.woocommerce .widget_layered_nav_filters ul li a{text-decoration:none}.woocommerce .widget_layered_nav_filters ul li a::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-left:.618em;content:"";text-decoration:none;color:#a00;vertical-align:inherit;margin-left:.5em}.woocommerce .widget_price_filter .price_slider{margin-bottom:1em}.woocommerce .widget_price_filter .price_slider_amount{text-align:left;line-height:2.4;font-size:.8751em}.woocommerce .widget_price_filter .price_slider_amount .button{font-size:1.15em;float:right}.woocommerce .widget_price_filter .ui-slider{position:relative;text-align:right;margin-right:.5em;margin-left:.5em}.woocommerce .widget_price_filter .ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1em;height:1em;background-color:#a46497;border-radius:1em;cursor:ew-resize;outline:0;top:-.3em;margin-left:-.5em}.woocommerce .widget_price_filter .ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;border-radius:1em;background-color:#a46497}.woocommerce .widget_price_filter .price_slider_wrapper .ui-widget-content{border-radius:1em;background-color:#602053;border:0}.woocommerce .widget_price_filter .ui-slider-horizontal{height:.5em}.woocommerce .widget_price_filter .ui-slider-horizontal .ui-slider-range{top:0;height:100%}.woocommerce .widget_price_filter .ui-slider-horizontal .ui-slider-range-min{right:-1px}.woocommerce .widget_price_filter .ui-slider-horizontal .ui-slider-range-max{left:-1px}.woocommerce .widget_rating_filter ul{margin:0;padding:0;border:0;list-style:none outside}.woocommerce .widget_rating_filter ul li{padding:0 0 1px;list-style:none}.woocommerce .widget_rating_filter ul li::after,.woocommerce .widget_rating_filter ul li::before{content:' ';display:table}.woocommerce .widget_rating_filter ul li::after{clear:both}.woocommerce .widget_rating_filter ul li a{padding:1px 0;text-decoration:none}.woocommerce .widget_rating_filter ul li .star-rating{float:none;display:inline-block}.woocommerce .widget_rating_filter ul li.chosen a::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-left:.618em;content:"";text-decoration:none;color:#a00}.woocommerce-no-js form.woocommerce-form-coupon,.woocommerce-no-js form.woocommerce-form-login{display:block!important}.woocommerce-no-js .showcoupon,.woocommerce-no-js .woocommerce-form-coupon-toggle,.woocommerce-no-js .woocommerce-form-login-toggle{display:none!important}.woocommerce-error,.woocommerce-info,.woocommerce-message{padding:1em 3.5em 1em 2em;margin:0 0 2em;position:relative;background-color:#f7f6f7;color:#515151;border-top:3px solid #a46497;list-style:none outside;width:auto;word-wrap:break-word}.woocommerce-error::after,.woocommerce-error::before,.woocommerce-info::after,.woocommerce-info::before,.woocommerce-message::after,.woocommerce-message::before{content:' ';display:table}.woocommerce-error::after,.woocommerce-info::after,.woocommerce-message::after{clear:both}.woocommerce-error::before,.woocommerce-info::before,.woocommerce-message::before{font-family:WooCommerce;content:'\e028';display:inline-block;position:absolute;top:1em;right:1.5em}.woocommerce-error .button,.woocommerce-info .button,.woocommerce-message .button{float:left}.woocommerce-error li,.woocommerce-info li,.woocommerce-message li{list-style:none outside!important;padding-right:0!important;margin-right:0!important}.rtl.woocommerce .price_label,.rtl.woocommerce .price_label span{direction:ltr;unicode-bidi:embed}.woocommerce-message{border-top-color:#8fae1b}.woocommerce-message::before{content:'\e015';color:#8fae1b}.woocommerce-info{border-top-color:#1e85be}.woocommerce-info::before{color:#1e85be}.woocommerce-error{border-top-color:#b81c23}.woocommerce-error::before{content:'\e016';color:#b81c23}.woocommerce-account .woocommerce::after,.woocommerce-account .woocommerce::before{content:' ';display:table}.woocommerce-account .woocommerce::after{clear:both}.woocommerce-account .addresses .title::after,.woocommerce-account .addresses .title::before{content:' ';display:table}.woocommerce-account .addresses .title::after{clear:both}.woocommerce-account .addresses .title h3{float:right}.woocommerce-account .addresses .title .edit{float:left}.woocommerce-account ol.commentlist.notes li.note p.meta{font-weight:700;margin-bottom:0}.woocommerce-account ol.commentlist.notes li.note .description p:last-child{margin-bottom:0}.woocommerce-account ul.digital-downloads{margin-right:0;padding-right:0}.woocommerce-account ul.digital-downloads li{list-style:none;margin-right:0;padding-right:0}.woocommerce-account ul.digital-downloads li::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-left:.618em;content:"";text-decoration:none}.woocommerce-account ul.digital-downloads li .count{float:left}#add_payment_method table.cart .product-thumbnail,.woocommerce-cart table.cart .product-thumbnail,.woocommerce-checkout table.cart .product-thumbnail{min-width:32px}#add_payment_method table.cart img,.woocommerce-cart table.cart img,.woocommerce-checkout table.cart img{width:32px;box-shadow:none}#add_payment_method table.cart td,#add_payment_method table.cart th,.woocommerce-cart table.cart td,.woocommerce-cart table.cart th,.woocommerce-checkout table.cart td,.woocommerce-checkout table.cart th{vertical-align:middle}#add_payment_method table.cart td.actions .coupon .input-text,.woocommerce-cart table.cart td.actions .coupon .input-text,.woocommerce-checkout table.cart td.actions .coupon .input-text{float:right;box-sizing:border-box;border:1px solid #d3ced2;padding:6px 6px 5px;margin:0 0 0 4px;outline:0}#add_payment_method table.cart input,.woocommerce-cart table.cart input,.woocommerce-checkout table.cart input{margin:0;vertical-align:middle}#add_payment_method .wc-proceed-to-checkout,.woocommerce-cart .wc-proceed-to-checkout,.woocommerce-checkout .wc-proceed-to-checkout{padding:1em 0}#add_payment_method .wc-proceed-to-checkout::after,#add_payment_method .wc-proceed-to-checkout::before,.woocommerce-cart .wc-proceed-to-checkout::after,.woocommerce-cart .wc-proceed-to-checkout::before,.woocommerce-checkout .wc-proceed-to-checkout::after,.woocommerce-checkout .wc-proceed-to-checkout::before{content:' ';display:table}#add_payment_method .wc-proceed-to-checkout::after,.woocommerce-cart .wc-proceed-to-checkout::after,.woocommerce-checkout .wc-proceed-to-checkout::after{clear:both}#add_payment_method .wc-proceed-to-checkout a.checkout-button,.woocommerce-cart .wc-proceed-to-checkout a.checkout-button,.woocommerce-checkout .wc-proceed-to-checkout a.checkout-button{display:block;text-align:center;margin-bottom:1em;font-size:1.25em;padding:1em}#add_payment_method .cart-collaterals .shipping-calculator-button,.woocommerce-cart .cart-collaterals .shipping-calculator-button,.woocommerce-checkout .cart-collaterals .shipping-calculator-button{float:none;margin-top:.5em;display:inline-block}#add_payment_method .cart-collaterals .shipping-calculator-button::after,.woocommerce-cart .cart-collaterals .shipping-calculator-button::after,.woocommerce-checkout .cart-collaterals .shipping-calculator-button::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-right:.618em;content:"";text-decoration:none}#add_payment_method .cart-collaterals .shipping-calculator-form,.woocommerce-cart .cart-collaterals .shipping-calculator-form,.woocommerce-checkout .cart-collaterals .shipping-calculator-form{margin:1em 0 0 0}#add_payment_method .cart-collaterals .cart_totals p small,.woocommerce-cart .cart-collaterals .cart_totals p small,.woocommerce-checkout .cart-collaterals .cart_totals p small{color:#777;font-size:.83em}#add_payment_method .cart-collaterals .cart_totals table,.woocommerce-cart .cart-collaterals .cart_totals table,.woocommerce-checkout .cart-collaterals .cart_totals table{border-collapse:separate;margin:0 0 6px;padding:0}#add_payment_method .cart-collaterals .cart_totals table tr:first-child td,#add_payment_method .cart-collaterals .cart_totals table tr:first-child th,.woocommerce-cart .cart-collaterals .cart_totals table tr:first-child td,.woocommerce-cart .cart-collaterals .cart_totals table tr:first-child th,.woocommerce-checkout .cart-collaterals .cart_totals table tr:first-child td,.woocommerce-checkout .cart-collaterals .cart_totals table tr:first-child th{border-top:0}#add_payment_method .cart-collaterals .cart_totals table th,.woocommerce-cart .cart-collaterals .cart_totals table th,.woocommerce-checkout .cart-collaterals .cart_totals table th{width:35%}#add_payment_method .cart-collaterals .cart_totals table td,#add_payment_method .cart-collaterals .cart_totals table th,.woocommerce-cart .cart-collaterals .cart_totals table td,.woocommerce-cart .cart-collaterals .cart_totals table th,.woocommerce-checkout .cart-collaterals .cart_totals table td,.woocommerce-checkout .cart-collaterals .cart_totals table th{vertical-align:top;border-right:0;border-left:0;line-height:1.5em}#add_payment_method .cart-collaterals .cart_totals table small,.woocommerce-cart .cart-collaterals .cart_totals table small,.woocommerce-checkout .cart-collaterals .cart_totals table small{color:#777}#add_payment_method .cart-collaterals .cart_totals table select,.woocommerce-cart .cart-collaterals .cart_totals table select,.woocommerce-checkout .cart-collaterals .cart_totals table select{width:100%}#add_payment_method .cart-collaterals .cart_totals .discount td,.woocommerce-cart .cart-collaterals .cart_totals .discount td,.woocommerce-checkout .cart-collaterals .cart_totals .discount td{color:#77a464}#add_payment_method .cart-collaterals .cart_totals tr td,#add_payment_method .cart-collaterals .cart_totals tr th,.woocommerce-cart .cart-collaterals .cart_totals tr td,.woocommerce-cart .cart-collaterals .cart_totals tr th,.woocommerce-checkout .cart-collaterals .cart_totals tr td,.woocommerce-checkout .cart-collaterals .cart_totals tr th{border-top:1px solid #ebe9eb}#add_payment_method .cart-collaterals .cart_totals .woocommerce-shipping-destination,.woocommerce-cart .cart-collaterals .cart_totals .woocommerce-shipping-destination,.woocommerce-checkout .cart-collaterals .cart_totals .woocommerce-shipping-destination{margin-bottom:0}#add_payment_method .cart-collaterals .cross-sells ul.products li.product,.woocommerce-cart .cart-collaterals .cross-sells ul.products li.product,.woocommerce-checkout .cart-collaterals .cross-sells ul.products li.product{margin-top:0}#add_payment_method .checkout .col-2 h3#ship-to-different-address,.woocommerce-cart .checkout .col-2 h3#ship-to-different-address,.woocommerce-checkout .checkout .col-2 h3#ship-to-different-address{float:right;clear:none}#add_payment_method .checkout .col-2 .notes,.woocommerce-cart .checkout .col-2 .notes,.woocommerce-checkout .checkout .col-2 .notes{clear:right}#add_payment_method .checkout .col-2 .form-row-first,.woocommerce-cart .checkout .col-2 .form-row-first,.woocommerce-checkout .checkout .col-2 .form-row-first{clear:right}#add_payment_method .checkout .create-account small,.woocommerce-cart .checkout .create-account small,.woocommerce-checkout .checkout .create-account small{font-size:11px;color:#777;font-weight:400}#add_payment_method .checkout div.shipping-address,.woocommerce-cart .checkout div.shipping-address,.woocommerce-checkout .checkout div.shipping-address{padding:0;clear:right;width:100%}#add_payment_method .checkout .shipping_address,.woocommerce-cart .checkout .shipping_address,.woocommerce-checkout .checkout .shipping_address{clear:both}#add_payment_method #payment,.woocommerce-cart #payment,.woocommerce-checkout #payment{background:#ebe9eb;border-radius:5px}#add_payment_method #payment ul.payment_methods,.woocommerce-cart #payment ul.payment_methods,.woocommerce-checkout #payment ul.payment_methods{text-align:right;padding:1em;border-bottom:1px solid #d3ced2;margin:0;list-style:none outside}#add_payment_method #payment ul.payment_methods::after,#add_payment_method #payment ul.payment_methods::before,.woocommerce-cart #payment ul.payment_methods::after,.woocommerce-cart #payment ul.payment_methods::before,.woocommerce-checkout #payment ul.payment_methods::after,.woocommerce-checkout #payment ul.payment_methods::before{content:' ';display:table}#add_payment_method #payment ul.payment_methods::after,.woocommerce-cart #payment ul.payment_methods::after,.woocommerce-checkout #payment ul.payment_methods::after{clear:both}#add_payment_method #payment ul.payment_methods li,.woocommerce-cart #payment ul.payment_methods li,.woocommerce-checkout #payment ul.payment_methods li{line-height:2;text-align:right;margin:0;font-weight:400}#add_payment_method #payment ul.payment_methods li input,.woocommerce-cart #payment ul.payment_methods li input,.woocommerce-checkout #payment ul.payment_methods li input{margin:0 0 0 1em}#add_payment_method #payment ul.payment_methods li img,.woocommerce-cart #payment ul.payment_methods li img,.woocommerce-checkout #payment ul.payment_methods li img{vertical-align:middle;margin:-2px .5em 0 0;padding:0;position:relative;box-shadow:none}#add_payment_method #payment ul.payment_methods li img+img,.woocommerce-cart #payment ul.payment_methods li img+img,.woocommerce-checkout #payment ul.payment_methods li img+img{margin-right:2px}#add_payment_method #payment ul.payment_methods li:not(.woocommerce-notice)::after,#add_payment_method #payment ul.payment_methods li:not(.woocommerce-notice)::before,.woocommerce-cart #payment ul.payment_methods li:not(.woocommerce-notice)::after,.woocommerce-cart #payment ul.payment_methods li:not(.woocommerce-notice)::before,.woocommerce-checkout #payment ul.payment_methods li:not(.woocommerce-notice)::after,.woocommerce-checkout #payment ul.payment_methods li:not(.woocommerce-notice)::before{content:' ';display:table}#add_payment_method #payment ul.payment_methods li:not(.woocommerce-notice)::after,.woocommerce-cart #payment ul.payment_methods li:not(.woocommerce-notice)::after,.woocommerce-checkout #payment ul.payment_methods li:not(.woocommerce-notice)::after{clear:both}#add_payment_method #payment div.form-row,.woocommerce-cart #payment div.form-row,.woocommerce-checkout #payment div.form-row{padding:1em}#add_payment_method #payment div.payment_box,.woocommerce-cart #payment div.payment_box,.woocommerce-checkout #payment div.payment_box{position:relative;box-sizing:border-box;width:100%;padding:1em;margin:1em 0;font-size:.92em;border-radius:2px;line-height:1.5;background-color:#dfdcde;color:#515151}#add_payment_method #payment div.payment_box input.input-text,#add_payment_method #payment div.payment_box textarea,.woocommerce-cart #payment div.payment_box input.input-text,.woocommerce-cart #payment div.payment_box textarea,.woocommerce-checkout #payment div.payment_box input.input-text,.woocommerce-checkout #payment div.payment_box textarea{border-color:#c7c1c6;border-top-color:#bbb3b9}#add_payment_method #payment div.payment_box ::-webkit-input-placeholder,.woocommerce-cart #payment div.payment_box ::-webkit-input-placeholder,.woocommerce-checkout #payment div.payment_box ::-webkit-input-placeholder{color:#bbb3b9}#add_payment_method #payment div.payment_box :-moz-placeholder,.woocommerce-cart #payment div.payment_box :-moz-placeholder,.woocommerce-checkout #payment div.payment_box :-moz-placeholder{color:#bbb3b9}#add_payment_method #payment div.payment_box :-ms-input-placeholder,.woocommerce-cart #payment div.payment_box :-ms-input-placeholder,.woocommerce-checkout #payment div.payment_box :-ms-input-placeholder{color:#bbb3b9}#add_payment_method #payment div.payment_box .woocommerce-SavedPaymentMethods,.woocommerce-cart #payment div.payment_box .woocommerce-SavedPaymentMethods,.woocommerce-checkout #payment div.payment_box .woocommerce-SavedPaymentMethods{list-style:none outside;margin:0}#add_payment_method #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-new,#add_payment_method #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-token,.woocommerce-cart #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-new,.woocommerce-cart #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-token,.woocommerce-checkout #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-new,.woocommerce-checkout #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-token{margin:0 0 .5em}#add_payment_method #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-new label,#add_payment_method #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-token label,.woocommerce-cart #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-new label,.woocommerce-cart #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-token label,.woocommerce-checkout #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-new label,.woocommerce-checkout #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-token label{cursor:pointer}#add_payment_method #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-tokenInput,.woocommerce-cart #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-tokenInput,.woocommerce-checkout #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-tokenInput{vertical-align:middle;margin:-3px 0 0 1em;position:relative}#add_payment_method #payment div.payment_box .wc-credit-card-form,.woocommerce-cart #payment div.payment_box .wc-credit-card-form,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form{border:0;padding:0;margin:1em 0 0}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number{font-size:1.5em;padding:8px;background-repeat:no-repeat;background-position:left .618em center;background-size:32px 20px}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.visa,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.visa,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.visa,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.visa,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.visa,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.visa,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.visa,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.visa,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.visa{background-image:url(../images/icons/credit-cards/visa.svg)}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.mastercard,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.mastercard,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.mastercard,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.mastercard,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.mastercard,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.mastercard,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.mastercard,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.mastercard,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.mastercard{background-image:url(../images/icons/credit-cards/mastercard.svg)}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.laser,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.laser,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.laser,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.laser,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.laser,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.laser,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.laser,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.laser,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.laser{background-image:url(../images/icons/credit-cards/laser.svg)}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.dinersclub,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.dinersclub,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.dinersclub,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.dinersclub,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.dinersclub,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.dinersclub,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.dinersclub,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.dinersclub,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.dinersclub{background-image:url(../images/icons/credit-cards/diners.svg)}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.maestro,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.maestro,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.maestro,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.maestro,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.maestro,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.maestro,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.maestro,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.maestro,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.maestro{background-image:url(../images/icons/credit-cards/maestro.svg)}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.jcb,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.jcb,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.jcb,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.jcb,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.jcb,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.jcb,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.jcb,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.jcb,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.jcb{background-image:url(../images/icons/credit-cards/jcb.svg)}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.amex,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.amex,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.amex,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.amex,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.amex,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.amex,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.amex,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.amex,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.amex{background-image:url(../images/icons/credit-cards/amex.svg)}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.discover,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.discover,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.discover,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.discover,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.discover,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.discover,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.discover,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.discover,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.discover{background-image:url(../images/icons/credit-cards/discover.svg)}#add_payment_method #payment div.payment_box span.help,.woocommerce-cart #payment div.payment_box span.help,.woocommerce-checkout #payment div.payment_box span.help{font-size:.857em;color:#777;font-weight:400}#add_payment_method #payment div.payment_box .form-row,.woocommerce-cart #payment div.payment_box .form-row,.woocommerce-checkout #payment div.payment_box .form-row{margin:0 0 1em}#add_payment_method #payment div.payment_box p:last-child,.woocommerce-cart #payment div.payment_box p:last-child,.woocommerce-checkout #payment div.payment_box p:last-child{margin-bottom:0}#add_payment_method #payment div.payment_box::before,.woocommerce-cart #payment div.payment_box::before,.woocommerce-checkout #payment div.payment_box::before{content:'';display:block;border:1em solid #dfdcde;border-left-color:transparent;border-right-color:transparent;border-top-color:transparent;position:absolute;top:-.75em;right:0;margin:-1em 2em 0 0}#add_payment_method #payment .payment_method_paypal .about_paypal,.woocommerce-cart #payment .payment_method_paypal .about_paypal,.woocommerce-checkout #payment .payment_method_paypal .about_paypal{float:left;line-height:52px;font-size:.83em}#add_payment_method #payment .payment_method_paypal img,.woocommerce-cart #payment .payment_method_paypal img,.woocommerce-checkout #payment .payment_method_paypal img{max-height:52px;vertical-align:middle}.woocommerce-terms-and-conditions{border:1px solid rgba(0,0,0,.2);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background:rgba(0,0,0,.05)}.woocommerce-invalid #terms{outline:2px solid red;outline-offset:2px}.woocommerce-password-strength{text-align:center;font-weight:600;padding:3px .5em;font-size:1em}.woocommerce-password-strength.strong{background-color:#c1e1b9;border-color:#83c373}.woocommerce-password-strength.short{background-color:#f1adad;border-color:#e35b5b}.woocommerce-password-strength.bad{background-color:#fbc5a9;border-color:#f78b53}.woocommerce-password-strength.good{background-color:#ffe399;border-color:#ffc733}.woocommerce-password-hint{margin:.5em 0 0;display:block}#content.twentyeleven .woocommerce-pagination a{font-size:1em;line-height:1}.single-product .twentythirteen #reply-title,.single-product .twentythirteen #respond #commentform,.single-product .twentythirteen .entry-summary{padding:0}.single-product .twentythirteen p.stars{clear:both}.twentythirteen .woocommerce-breadcrumb{padding-top:40px}.twentyfourteen ul.products li.product{margin-top:0!important}body:not(.search-results) .twentysixteen .entry-summary{color:inherit;font-size:inherit;line-height:inherit}.twentysixteen .price ins{background:inherit;color:inherit} \ No newline at end of file diff --git a/assets/css/woocommerce-smallscreen-rtl.css b/assets/css/woocommerce-smallscreen-rtl.css index fb6353136d2..0c3eb370df5 100644 --- a/assets/css/woocommerce-smallscreen-rtl.css +++ b/assets/css/woocommerce-smallscreen-rtl.css @@ -1 +1 @@ -.woocommerce table.shop_table_responsive thead,.woocommerce-page table.shop_table_responsive thead{display:none}.woocommerce table.shop_table_responsive tbody tr:first-child td:first-child,.woocommerce-page table.shop_table_responsive tbody tr:first-child td:first-child{border-top:0}.woocommerce table.shop_table_responsive tbody th,.woocommerce-page table.shop_table_responsive tbody th{display:none}.woocommerce table.shop_table_responsive tr,.woocommerce-page table.shop_table_responsive tr{display:block}.woocommerce table.shop_table_responsive tr td,.woocommerce-page table.shop_table_responsive tr td{display:block;text-align:left!important}.woocommerce table.shop_table_responsive tr td.order-actions,.woocommerce-page table.shop_table_responsive tr td.order-actions{text-align:right!important}.woocommerce table.shop_table_responsive tr td::before,.woocommerce-page table.shop_table_responsive tr td::before{content:attr(data-title) ": ";font-weight:700;float:right}.woocommerce table.shop_table_responsive tr td.actions::before,.woocommerce table.shop_table_responsive tr td.product-remove::before,.woocommerce-page table.shop_table_responsive tr td.actions::before,.woocommerce-page table.shop_table_responsive tr td.product-remove::before{display:none}.woocommerce table.shop_table_responsive tr:nth-child(2n) td,.woocommerce-page table.shop_table_responsive tr:nth-child(2n) td{background-color:rgba(0,0,0,.025)}.woocommerce table.my_account_orders tr td.order-actions,.woocommerce-page table.my_account_orders tr td.order-actions{text-align:right}.woocommerce table.my_account_orders tr td.order-actions::before,.woocommerce-page table.my_account_orders tr td.order-actions::before{display:none}.woocommerce table.my_account_orders tr td.order-actions .button,.woocommerce-page table.my_account_orders tr td.order-actions .button{float:none;margin:.125em 0 .125em .25em}.woocommerce .col2-set .col-1,.woocommerce .col2-set .col-2,.woocommerce-page .col2-set .col-1,.woocommerce-page .col2-set .col-2{float:none;width:100%}.woocommerce ul.products[class*=columns-] li.product,.woocommerce-page ul.products[class*=columns-] li.product{width:48%;float:right;clear:both;margin:0 0 2.992em}.woocommerce ul.products[class*=columns-] li.product:nth-child(2n),.woocommerce-page ul.products[class*=columns-] li.product:nth-child(2n){float:left;clear:none!important}.woocommerce #content div.product div.images,.woocommerce #content div.product div.summary,.woocommerce div.product div.images,.woocommerce div.product div.summary,.woocommerce-page #content div.product div.images,.woocommerce-page #content div.product div.summary,.woocommerce-page div.product div.images,.woocommerce-page div.product div.summary{float:none;width:100%}.woocommerce #content table.cart .product-thumbnail,.woocommerce table.cart .product-thumbnail,.woocommerce-page #content table.cart .product-thumbnail,.woocommerce-page table.cart .product-thumbnail{display:none}.woocommerce #content table.cart td.actions,.woocommerce table.cart td.actions,.woocommerce-page #content table.cart td.actions,.woocommerce-page table.cart td.actions{text-align:right}.woocommerce #content table.cart td.actions .coupon,.woocommerce table.cart td.actions .coupon,.woocommerce-page #content table.cart td.actions .coupon,.woocommerce-page table.cart td.actions .coupon{float:none;padding-bottom:.5em}.woocommerce #content table.cart td.actions .coupon::after,.woocommerce #content table.cart td.actions .coupon::before,.woocommerce table.cart td.actions .coupon::after,.woocommerce table.cart td.actions .coupon::before,.woocommerce-page #content table.cart td.actions .coupon::after,.woocommerce-page #content table.cart td.actions .coupon::before,.woocommerce-page table.cart td.actions .coupon::after,.woocommerce-page table.cart td.actions .coupon::before{content:' ';display:table}.woocommerce #content table.cart td.actions .coupon::after,.woocommerce table.cart td.actions .coupon::after,.woocommerce-page #content table.cart td.actions .coupon::after,.woocommerce-page table.cart td.actions .coupon::after{clear:both}.woocommerce #content table.cart td.actions .coupon .button,.woocommerce #content table.cart td.actions .coupon .input-text,.woocommerce #content table.cart td.actions .coupon input,.woocommerce table.cart td.actions .coupon .button,.woocommerce table.cart td.actions .coupon .input-text,.woocommerce table.cart td.actions .coupon input,.woocommerce-page #content table.cart td.actions .coupon .button,.woocommerce-page #content table.cart td.actions .coupon .input-text,.woocommerce-page #content table.cart td.actions .coupon input,.woocommerce-page table.cart td.actions .coupon .button,.woocommerce-page table.cart td.actions .coupon .input-text,.woocommerce-page table.cart td.actions .coupon input{width:48%;-webkit-box-sizing:border-box;box-sizing:border-box}.woocommerce #content table.cart td.actions .coupon .button.alt,.woocommerce #content table.cart td.actions .coupon .input-text+.button,.woocommerce table.cart td.actions .coupon .button.alt,.woocommerce table.cart td.actions .coupon .input-text+.button,.woocommerce-page #content table.cart td.actions .coupon .button.alt,.woocommerce-page #content table.cart td.actions .coupon .input-text+.button,.woocommerce-page table.cart td.actions .coupon .button.alt,.woocommerce-page table.cart td.actions .coupon .input-text+.button{float:left}.woocommerce #content table.cart td.actions .button,.woocommerce table.cart td.actions .button,.woocommerce-page #content table.cart td.actions .button,.woocommerce-page table.cart td.actions .button{display:block;width:100%}.woocommerce .cart-collaterals .cart_totals,.woocommerce .cart-collaterals .cross-sells,.woocommerce .cart-collaterals .shipping_calculator,.woocommerce-page .cart-collaterals .cart_totals,.woocommerce-page .cart-collaterals .cross-sells,.woocommerce-page .cart-collaterals .shipping_calculator{width:100%;float:none;text-align:right}.woocommerce-page.woocommerce-checkout form.login .form-row,.woocommerce.woocommerce-checkout form.login .form-row{width:100%;float:none}.woocommerce #payment .terms,.woocommerce-page #payment .terms{text-align:right;padding:0}.woocommerce #payment #place_order,.woocommerce-page #payment #place_order{float:none;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;margin-bottom:1em}.woocommerce .lost_reset_password .form-row-first,.woocommerce .lost_reset_password .form-row-last,.woocommerce-page .lost_reset_password .form-row-first,.woocommerce-page .lost_reset_password .form-row-last{width:100%;float:none;margin-left:0}.woocommerce-account .woocommerce-MyAccount-content,.woocommerce-account .woocommerce-MyAccount-navigation{float:none;width:100%}.single-product .twentythirteen .panel{padding-right:20px!important;padding-left:20px!important} \ No newline at end of file +.woocommerce table.shop_table_responsive thead,.woocommerce-page table.shop_table_responsive thead{display:none}.woocommerce table.shop_table_responsive tbody tr:first-child td:first-child,.woocommerce-page table.shop_table_responsive tbody tr:first-child td:first-child{border-top:0}.woocommerce table.shop_table_responsive tbody th,.woocommerce-page table.shop_table_responsive tbody th{display:none}.woocommerce table.shop_table_responsive tr,.woocommerce-page table.shop_table_responsive tr{display:block}.woocommerce table.shop_table_responsive tr td,.woocommerce-page table.shop_table_responsive tr td{display:block;text-align:left!important}.woocommerce table.shop_table_responsive tr td.order-actions,.woocommerce-page table.shop_table_responsive tr td.order-actions{text-align:right!important}.woocommerce table.shop_table_responsive tr td::before,.woocommerce-page table.shop_table_responsive tr td::before{content:attr(data-title) ": ";font-weight:700;float:right}.woocommerce table.shop_table_responsive tr td.actions::before,.woocommerce table.shop_table_responsive tr td.product-remove::before,.woocommerce-page table.shop_table_responsive tr td.actions::before,.woocommerce-page table.shop_table_responsive tr td.product-remove::before{display:none}.woocommerce table.shop_table_responsive tr:nth-child(2n) td,.woocommerce-page table.shop_table_responsive tr:nth-child(2n) td{background-color:rgba(0,0,0,.025)}.woocommerce table.my_account_orders tr td.order-actions,.woocommerce-page table.my_account_orders tr td.order-actions{text-align:right}.woocommerce table.my_account_orders tr td.order-actions::before,.woocommerce-page table.my_account_orders tr td.order-actions::before{display:none}.woocommerce table.my_account_orders tr td.order-actions .button,.woocommerce-page table.my_account_orders tr td.order-actions .button{float:none;margin:.125em 0 .125em .25em}.woocommerce .col2-set .col-1,.woocommerce .col2-set .col-2,.woocommerce-page .col2-set .col-1,.woocommerce-page .col2-set .col-2{float:none;width:100%}.woocommerce ul.products[class*=columns-] li.product,.woocommerce-page ul.products[class*=columns-] li.product{width:48%;float:right;clear:both;margin:0 0 2.992em}.woocommerce ul.products[class*=columns-] li.product:nth-child(2n),.woocommerce-page ul.products[class*=columns-] li.product:nth-child(2n){float:left;clear:none!important}.woocommerce #content div.product div.images,.woocommerce #content div.product div.summary,.woocommerce div.product div.images,.woocommerce div.product div.summary,.woocommerce-page #content div.product div.images,.woocommerce-page #content div.product div.summary,.woocommerce-page div.product div.images,.woocommerce-page div.product div.summary{float:none;width:100%}.woocommerce #content table.cart .product-thumbnail,.woocommerce table.cart .product-thumbnail,.woocommerce-page #content table.cart .product-thumbnail,.woocommerce-page table.cart .product-thumbnail{display:none}.woocommerce #content table.cart td.actions,.woocommerce table.cart td.actions,.woocommerce-page #content table.cart td.actions,.woocommerce-page table.cart td.actions{text-align:right}.woocommerce #content table.cart td.actions .coupon,.woocommerce table.cart td.actions .coupon,.woocommerce-page #content table.cart td.actions .coupon,.woocommerce-page table.cart td.actions .coupon{float:none;padding-bottom:.5em}.woocommerce #content table.cart td.actions .coupon::after,.woocommerce #content table.cart td.actions .coupon::before,.woocommerce table.cart td.actions .coupon::after,.woocommerce table.cart td.actions .coupon::before,.woocommerce-page #content table.cart td.actions .coupon::after,.woocommerce-page #content table.cart td.actions .coupon::before,.woocommerce-page table.cart td.actions .coupon::after,.woocommerce-page table.cart td.actions .coupon::before{content:' ';display:table}.woocommerce #content table.cart td.actions .coupon::after,.woocommerce table.cart td.actions .coupon::after,.woocommerce-page #content table.cart td.actions .coupon::after,.woocommerce-page table.cart td.actions .coupon::after{clear:both}.woocommerce #content table.cart td.actions .coupon .button,.woocommerce #content table.cart td.actions .coupon .input-text,.woocommerce #content table.cart td.actions .coupon input,.woocommerce table.cart td.actions .coupon .button,.woocommerce table.cart td.actions .coupon .input-text,.woocommerce table.cart td.actions .coupon input,.woocommerce-page #content table.cart td.actions .coupon .button,.woocommerce-page #content table.cart td.actions .coupon .input-text,.woocommerce-page #content table.cart td.actions .coupon input,.woocommerce-page table.cart td.actions .coupon .button,.woocommerce-page table.cart td.actions .coupon .input-text,.woocommerce-page table.cart td.actions .coupon input{width:48%;box-sizing:border-box}.woocommerce #content table.cart td.actions .coupon .button.alt,.woocommerce #content table.cart td.actions .coupon .input-text+.button,.woocommerce table.cart td.actions .coupon .button.alt,.woocommerce table.cart td.actions .coupon .input-text+.button,.woocommerce-page #content table.cart td.actions .coupon .button.alt,.woocommerce-page #content table.cart td.actions .coupon .input-text+.button,.woocommerce-page table.cart td.actions .coupon .button.alt,.woocommerce-page table.cart td.actions .coupon .input-text+.button{float:left}.woocommerce #content table.cart td.actions .button,.woocommerce table.cart td.actions .button,.woocommerce-page #content table.cart td.actions .button,.woocommerce-page table.cart td.actions .button{display:block;width:100%}.woocommerce .cart-collaterals .cart_totals,.woocommerce .cart-collaterals .cross-sells,.woocommerce .cart-collaterals .shipping_calculator,.woocommerce-page .cart-collaterals .cart_totals,.woocommerce-page .cart-collaterals .cross-sells,.woocommerce-page .cart-collaterals .shipping_calculator{width:100%;float:none;text-align:right}.woocommerce-page.woocommerce-checkout form.login .form-row,.woocommerce.woocommerce-checkout form.login .form-row{width:100%;float:none}.woocommerce #payment .terms,.woocommerce-page #payment .terms{text-align:right;padding:0}.woocommerce #payment #place_order,.woocommerce-page #payment #place_order{float:none;width:100%;box-sizing:border-box;margin-bottom:1em}.woocommerce .lost_reset_password .form-row-first,.woocommerce .lost_reset_password .form-row-last,.woocommerce-page .lost_reset_password .form-row-first,.woocommerce-page .lost_reset_password .form-row-last{width:100%;float:none;margin-left:0}.woocommerce-account .woocommerce-MyAccount-content,.woocommerce-account .woocommerce-MyAccount-navigation{float:none;width:100%}.single-product .twentythirteen .panel{padding-right:20px!important;padding-left:20px!important} \ No newline at end of file diff --git a/assets/css/woocommerce-smallscreen.css b/assets/css/woocommerce-smallscreen.css index 2e6afbb4644..1abb2533ef8 100644 --- a/assets/css/woocommerce-smallscreen.css +++ b/assets/css/woocommerce-smallscreen.css @@ -1 +1 @@ -.woocommerce table.shop_table_responsive thead,.woocommerce-page table.shop_table_responsive thead{display:none}.woocommerce table.shop_table_responsive tbody tr:first-child td:first-child,.woocommerce-page table.shop_table_responsive tbody tr:first-child td:first-child{border-top:0}.woocommerce table.shop_table_responsive tbody th,.woocommerce-page table.shop_table_responsive tbody th{display:none}.woocommerce table.shop_table_responsive tr,.woocommerce-page table.shop_table_responsive tr{display:block}.woocommerce table.shop_table_responsive tr td,.woocommerce-page table.shop_table_responsive tr td{display:block;text-align:right!important}.woocommerce table.shop_table_responsive tr td.order-actions,.woocommerce-page table.shop_table_responsive tr td.order-actions{text-align:left!important}.woocommerce table.shop_table_responsive tr td::before,.woocommerce-page table.shop_table_responsive tr td::before{content:attr(data-title) ": ";font-weight:700;float:left}.woocommerce table.shop_table_responsive tr td.actions::before,.woocommerce table.shop_table_responsive tr td.product-remove::before,.woocommerce-page table.shop_table_responsive tr td.actions::before,.woocommerce-page table.shop_table_responsive tr td.product-remove::before{display:none}.woocommerce table.shop_table_responsive tr:nth-child(2n) td,.woocommerce-page table.shop_table_responsive tr:nth-child(2n) td{background-color:rgba(0,0,0,.025)}.woocommerce table.my_account_orders tr td.order-actions,.woocommerce-page table.my_account_orders tr td.order-actions{text-align:left}.woocommerce table.my_account_orders tr td.order-actions::before,.woocommerce-page table.my_account_orders tr td.order-actions::before{display:none}.woocommerce table.my_account_orders tr td.order-actions .button,.woocommerce-page table.my_account_orders tr td.order-actions .button{float:none;margin:.125em .25em .125em 0}.woocommerce .col2-set .col-1,.woocommerce .col2-set .col-2,.woocommerce-page .col2-set .col-1,.woocommerce-page .col2-set .col-2{float:none;width:100%}.woocommerce ul.products[class*=columns-] li.product,.woocommerce-page ul.products[class*=columns-] li.product{width:48%;float:left;clear:both;margin:0 0 2.992em}.woocommerce ul.products[class*=columns-] li.product:nth-child(2n),.woocommerce-page ul.products[class*=columns-] li.product:nth-child(2n){float:right;clear:none!important}.woocommerce #content div.product div.images,.woocommerce #content div.product div.summary,.woocommerce div.product div.images,.woocommerce div.product div.summary,.woocommerce-page #content div.product div.images,.woocommerce-page #content div.product div.summary,.woocommerce-page div.product div.images,.woocommerce-page div.product div.summary{float:none;width:100%}.woocommerce #content table.cart .product-thumbnail,.woocommerce table.cart .product-thumbnail,.woocommerce-page #content table.cart .product-thumbnail,.woocommerce-page table.cart .product-thumbnail{display:none}.woocommerce #content table.cart td.actions,.woocommerce table.cart td.actions,.woocommerce-page #content table.cart td.actions,.woocommerce-page table.cart td.actions{text-align:left}.woocommerce #content table.cart td.actions .coupon,.woocommerce table.cart td.actions .coupon,.woocommerce-page #content table.cart td.actions .coupon,.woocommerce-page table.cart td.actions .coupon{float:none;padding-bottom:.5em}.woocommerce #content table.cart td.actions .coupon::after,.woocommerce #content table.cart td.actions .coupon::before,.woocommerce table.cart td.actions .coupon::after,.woocommerce table.cart td.actions .coupon::before,.woocommerce-page #content table.cart td.actions .coupon::after,.woocommerce-page #content table.cart td.actions .coupon::before,.woocommerce-page table.cart td.actions .coupon::after,.woocommerce-page table.cart td.actions .coupon::before{content:' ';display:table}.woocommerce #content table.cart td.actions .coupon::after,.woocommerce table.cart td.actions .coupon::after,.woocommerce-page #content table.cart td.actions .coupon::after,.woocommerce-page table.cart td.actions .coupon::after{clear:both}.woocommerce #content table.cart td.actions .coupon .button,.woocommerce #content table.cart td.actions .coupon .input-text,.woocommerce #content table.cart td.actions .coupon input,.woocommerce table.cart td.actions .coupon .button,.woocommerce table.cart td.actions .coupon .input-text,.woocommerce table.cart td.actions .coupon input,.woocommerce-page #content table.cart td.actions .coupon .button,.woocommerce-page #content table.cart td.actions .coupon .input-text,.woocommerce-page #content table.cart td.actions .coupon input,.woocommerce-page table.cart td.actions .coupon .button,.woocommerce-page table.cart td.actions .coupon .input-text,.woocommerce-page table.cart td.actions .coupon input{width:48%;-webkit-box-sizing:border-box;box-sizing:border-box}.woocommerce #content table.cart td.actions .coupon .button.alt,.woocommerce #content table.cart td.actions .coupon .input-text+.button,.woocommerce table.cart td.actions .coupon .button.alt,.woocommerce table.cart td.actions .coupon .input-text+.button,.woocommerce-page #content table.cart td.actions .coupon .button.alt,.woocommerce-page #content table.cart td.actions .coupon .input-text+.button,.woocommerce-page table.cart td.actions .coupon .button.alt,.woocommerce-page table.cart td.actions .coupon .input-text+.button{float:right}.woocommerce #content table.cart td.actions .button,.woocommerce table.cart td.actions .button,.woocommerce-page #content table.cart td.actions .button,.woocommerce-page table.cart td.actions .button{display:block;width:100%}.woocommerce .cart-collaterals .cart_totals,.woocommerce .cart-collaterals .cross-sells,.woocommerce .cart-collaterals .shipping_calculator,.woocommerce-page .cart-collaterals .cart_totals,.woocommerce-page .cart-collaterals .cross-sells,.woocommerce-page .cart-collaterals .shipping_calculator{width:100%;float:none;text-align:left}.woocommerce-page.woocommerce-checkout form.login .form-row,.woocommerce.woocommerce-checkout form.login .form-row{width:100%;float:none}.woocommerce #payment .terms,.woocommerce-page #payment .terms{text-align:left;padding:0}.woocommerce #payment #place_order,.woocommerce-page #payment #place_order{float:none;width:100%;-webkit-box-sizing:border-box;box-sizing:border-box;margin-bottom:1em}.woocommerce .lost_reset_password .form-row-first,.woocommerce .lost_reset_password .form-row-last,.woocommerce-page .lost_reset_password .form-row-first,.woocommerce-page .lost_reset_password .form-row-last{width:100%;float:none;margin-right:0}.woocommerce-account .woocommerce-MyAccount-content,.woocommerce-account .woocommerce-MyAccount-navigation{float:none;width:100%}.single-product .twentythirteen .panel{padding-left:20px!important;padding-right:20px!important} \ No newline at end of file +.woocommerce table.shop_table_responsive thead,.woocommerce-page table.shop_table_responsive thead{display:none}.woocommerce table.shop_table_responsive tbody tr:first-child td:first-child,.woocommerce-page table.shop_table_responsive tbody tr:first-child td:first-child{border-top:0}.woocommerce table.shop_table_responsive tbody th,.woocommerce-page table.shop_table_responsive tbody th{display:none}.woocommerce table.shop_table_responsive tr,.woocommerce-page table.shop_table_responsive tr{display:block}.woocommerce table.shop_table_responsive tr td,.woocommerce-page table.shop_table_responsive tr td{display:block;text-align:right!important}.woocommerce table.shop_table_responsive tr td.order-actions,.woocommerce-page table.shop_table_responsive tr td.order-actions{text-align:left!important}.woocommerce table.shop_table_responsive tr td::before,.woocommerce-page table.shop_table_responsive tr td::before{content:attr(data-title) ": ";font-weight:700;float:left}.woocommerce table.shop_table_responsive tr td.actions::before,.woocommerce table.shop_table_responsive tr td.product-remove::before,.woocommerce-page table.shop_table_responsive tr td.actions::before,.woocommerce-page table.shop_table_responsive tr td.product-remove::before{display:none}.woocommerce table.shop_table_responsive tr:nth-child(2n) td,.woocommerce-page table.shop_table_responsive tr:nth-child(2n) td{background-color:rgba(0,0,0,.025)}.woocommerce table.my_account_orders tr td.order-actions,.woocommerce-page table.my_account_orders tr td.order-actions{text-align:left}.woocommerce table.my_account_orders tr td.order-actions::before,.woocommerce-page table.my_account_orders tr td.order-actions::before{display:none}.woocommerce table.my_account_orders tr td.order-actions .button,.woocommerce-page table.my_account_orders tr td.order-actions .button{float:none;margin:.125em .25em .125em 0}.woocommerce .col2-set .col-1,.woocommerce .col2-set .col-2,.woocommerce-page .col2-set .col-1,.woocommerce-page .col2-set .col-2{float:none;width:100%}.woocommerce ul.products[class*=columns-] li.product,.woocommerce-page ul.products[class*=columns-] li.product{width:48%;float:left;clear:both;margin:0 0 2.992em}.woocommerce ul.products[class*=columns-] li.product:nth-child(2n),.woocommerce-page ul.products[class*=columns-] li.product:nth-child(2n){float:right;clear:none!important}.woocommerce #content div.product div.images,.woocommerce #content div.product div.summary,.woocommerce div.product div.images,.woocommerce div.product div.summary,.woocommerce-page #content div.product div.images,.woocommerce-page #content div.product div.summary,.woocommerce-page div.product div.images,.woocommerce-page div.product div.summary{float:none;width:100%}.woocommerce #content table.cart .product-thumbnail,.woocommerce table.cart .product-thumbnail,.woocommerce-page #content table.cart .product-thumbnail,.woocommerce-page table.cart .product-thumbnail{display:none}.woocommerce #content table.cart td.actions,.woocommerce table.cart td.actions,.woocommerce-page #content table.cart td.actions,.woocommerce-page table.cart td.actions{text-align:left}.woocommerce #content table.cart td.actions .coupon,.woocommerce table.cart td.actions .coupon,.woocommerce-page #content table.cart td.actions .coupon,.woocommerce-page table.cart td.actions .coupon{float:none;padding-bottom:.5em}.woocommerce #content table.cart td.actions .coupon::after,.woocommerce #content table.cart td.actions .coupon::before,.woocommerce table.cart td.actions .coupon::after,.woocommerce table.cart td.actions .coupon::before,.woocommerce-page #content table.cart td.actions .coupon::after,.woocommerce-page #content table.cart td.actions .coupon::before,.woocommerce-page table.cart td.actions .coupon::after,.woocommerce-page table.cart td.actions .coupon::before{content:' ';display:table}.woocommerce #content table.cart td.actions .coupon::after,.woocommerce table.cart td.actions .coupon::after,.woocommerce-page #content table.cart td.actions .coupon::after,.woocommerce-page table.cart td.actions .coupon::after{clear:both}.woocommerce #content table.cart td.actions .coupon .button,.woocommerce #content table.cart td.actions .coupon .input-text,.woocommerce #content table.cart td.actions .coupon input,.woocommerce table.cart td.actions .coupon .button,.woocommerce table.cart td.actions .coupon .input-text,.woocommerce table.cart td.actions .coupon input,.woocommerce-page #content table.cart td.actions .coupon .button,.woocommerce-page #content table.cart td.actions .coupon .input-text,.woocommerce-page #content table.cart td.actions .coupon input,.woocommerce-page table.cart td.actions .coupon .button,.woocommerce-page table.cart td.actions .coupon .input-text,.woocommerce-page table.cart td.actions .coupon input{width:48%;box-sizing:border-box}.woocommerce #content table.cart td.actions .coupon .button.alt,.woocommerce #content table.cart td.actions .coupon .input-text+.button,.woocommerce table.cart td.actions .coupon .button.alt,.woocommerce table.cart td.actions .coupon .input-text+.button,.woocommerce-page #content table.cart td.actions .coupon .button.alt,.woocommerce-page #content table.cart td.actions .coupon .input-text+.button,.woocommerce-page table.cart td.actions .coupon .button.alt,.woocommerce-page table.cart td.actions .coupon .input-text+.button{float:right}.woocommerce #content table.cart td.actions .button,.woocommerce table.cart td.actions .button,.woocommerce-page #content table.cart td.actions .button,.woocommerce-page table.cart td.actions .button{display:block;width:100%}.woocommerce .cart-collaterals .cart_totals,.woocommerce .cart-collaterals .cross-sells,.woocommerce .cart-collaterals .shipping_calculator,.woocommerce-page .cart-collaterals .cart_totals,.woocommerce-page .cart-collaterals .cross-sells,.woocommerce-page .cart-collaterals .shipping_calculator{width:100%;float:none;text-align:left}.woocommerce-page.woocommerce-checkout form.login .form-row,.woocommerce.woocommerce-checkout form.login .form-row{width:100%;float:none}.woocommerce #payment .terms,.woocommerce-page #payment .terms{text-align:left;padding:0}.woocommerce #payment #place_order,.woocommerce-page #payment #place_order{float:none;width:100%;box-sizing:border-box;margin-bottom:1em}.woocommerce .lost_reset_password .form-row-first,.woocommerce .lost_reset_password .form-row-last,.woocommerce-page .lost_reset_password .form-row-first,.woocommerce-page .lost_reset_password .form-row-last{width:100%;float:none;margin-right:0}.woocommerce-account .woocommerce-MyAccount-content,.woocommerce-account .woocommerce-MyAccount-navigation{float:none;width:100%}.single-product .twentythirteen .panel{padding-left:20px!important;padding-right:20px!important} \ No newline at end of file diff --git a/assets/css/woocommerce.css b/assets/css/woocommerce.css index e9117803a92..34d0ab7b995 100644 --- a/assets/css/woocommerce.css +++ b/assets/css/woocommerce.css @@ -1 +1 @@ -@charset "UTF-8";@-webkit-keyframes spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}.woocommerce-store-notice,p.demo_store{position:absolute;top:0;left:0;right:0;margin:0;width:100%;font-size:1em;padding:1em 0;text-align:center;background-color:#a46497;color:#fff;z-index:99998;-webkit-box-shadow:0 1px 1em rgba(0,0,0,.2);box-shadow:0 1px 1em rgba(0,0,0,.2);display:none}.woocommerce-store-notice a,p.demo_store a{color:#fff;text-decoration:underline}.screen-reader-text{clip:rect(1px,1px,1px,1px);height:1px;overflow:hidden;position:absolute!important;width:1px;word-wrap:normal!important}.admin-bar p.demo_store{top:32px}.clear{clear:both}.woocommerce .blockUI.blockOverlay{position:relative}.woocommerce .blockUI.blockOverlay::before{height:1em;width:1em;display:block;position:absolute;top:50%;left:50%;margin-left:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.woocommerce .loader::before{height:1em;width:1em;display:block;position:absolute;top:50%;left:50%;margin-left:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.woocommerce a.remove{display:block;font-size:1.5em;height:1em;width:1em;text-align:center;line-height:1;border-radius:100%;color:red!important;text-decoration:none;font-weight:700;border:0}.woocommerce a.remove:hover{color:#fff!important;background:red}.woocommerce small.note{display:block;color:#777;font-size:.857em;margin-top:10px}.woocommerce .woocommerce-breadcrumb{margin:0 0 1em;padding:0;font-size:.92em;color:#777}.woocommerce .woocommerce-breadcrumb::after,.woocommerce .woocommerce-breadcrumb::before{content:' ';display:table}.woocommerce .woocommerce-breadcrumb::after{clear:both}.woocommerce .woocommerce-breadcrumb a{color:#777}.woocommerce .quantity .qty{width:3.631em;text-align:center}.woocommerce div.product{margin-bottom:0;position:relative}.woocommerce div.product .product_title{clear:none;margin-top:0;padding:0}.woocommerce div.product p.price,.woocommerce div.product span.price{color:#77a464;font-size:1.25em}.woocommerce div.product p.price ins,.woocommerce div.product span.price ins{background:inherit;font-weight:700;display:inline-block}.woocommerce div.product p.price del,.woocommerce div.product span.price del{opacity:.5;display:inline-block}.woocommerce div.product p.stock{font-size:.92em}.woocommerce div.product .stock{color:#77a464}.woocommerce div.product .out-of-stock{color:red}.woocommerce div.product .woocommerce-product-rating{margin-bottom:1.618em}.woocommerce div.product div.images{margin-bottom:2em}.woocommerce div.product div.images img{display:block;width:100%;height:auto;-webkit-box-shadow:none;box-shadow:none}.woocommerce div.product div.images div.thumbnails{padding-top:1em}.woocommerce div.product div.images.woocommerce-product-gallery{position:relative}.woocommerce div.product div.images .woocommerce-product-gallery__wrapper{-webkit-transition:all cubic-bezier(.795,-.035,0,1) .5s;transition:all cubic-bezier(.795,-.035,0,1) .5s;margin:0;padding:0}.woocommerce div.product div.images .woocommerce-product-gallery__wrapper .zoomImg{background-color:#fff;opacity:0}.woocommerce div.product div.images .woocommerce-product-gallery__image--placeholder{border:1px solid #f2f2f2}.woocommerce div.product div.images .woocommerce-product-gallery__image:nth-child(n+2){width:25%;display:inline-block}.woocommerce div.product div.images .woocommerce-product-gallery__trigger{position:absolute;top:.5em;right:.5em;font-size:2em;z-index:9;width:36px;height:36px;background:#fff;text-indent:-9999px;border-radius:100%;-webkit-box-sizing:content-box;box-sizing:content-box}.woocommerce div.product div.images .woocommerce-product-gallery__trigger:before{content:"";display:block;width:10px;height:10px;border:2px solid #000;border-radius:100%;position:absolute;top:9px;left:9px;-webkit-box-sizing:content-box;box-sizing:content-box}.woocommerce div.product div.images .woocommerce-product-gallery__trigger:after{content:"";display:block;width:2px;height:8px;background:#000;border-radius:6px;position:absolute;top:19px;left:22px;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-box-sizing:content-box;box-sizing:content-box}.woocommerce div.product div.images .flex-control-thumbs{overflow:hidden;zoom:1;margin:0;padding:0}.woocommerce div.product div.images .flex-control-thumbs li{width:25%;float:left;margin:0;list-style:none}.woocommerce div.product div.images .flex-control-thumbs li img{cursor:pointer;opacity:.5;margin:0}.woocommerce div.product div.images .flex-control-thumbs li img.flex-active,.woocommerce div.product div.images .flex-control-thumbs li img:hover{opacity:1}.woocommerce div.product .woocommerce-product-gallery--columns-3 .flex-control-thumbs li:nth-child(3n+1){clear:left}.woocommerce div.product .woocommerce-product-gallery--columns-4 .flex-control-thumbs li:nth-child(4n+1){clear:left}.woocommerce div.product .woocommerce-product-gallery--columns-5 .flex-control-thumbs li:nth-child(5n+1){clear:left}.woocommerce div.product div.summary{margin-bottom:2em}.woocommerce div.product div.social{text-align:right;margin:0 0 1em}.woocommerce div.product div.social span{margin:0 0 0 2px}.woocommerce div.product div.social span span{margin:0}.woocommerce div.product div.social span .stButton .chicklets{padding-left:16px;width:0}.woocommerce div.product div.social iframe{float:left;margin-top:3px}.woocommerce div.product .woocommerce-tabs ul.tabs{list-style:none;padding:0 0 0 1em;margin:0 0 1.618em;overflow:hidden;position:relative}.woocommerce div.product .woocommerce-tabs ul.tabs li{border:1px solid #d3ced2;background-color:#ebe9eb;display:inline-block;position:relative;z-index:0;border-radius:4px 4px 0 0;margin:0 -5px;padding:0 1em}.woocommerce div.product .woocommerce-tabs ul.tabs li a{display:inline-block;padding:.5em 0;font-weight:700;color:#515151;text-decoration:none}.woocommerce div.product .woocommerce-tabs ul.tabs li a:hover{text-decoration:none;color:#6b6a6b}.woocommerce div.product .woocommerce-tabs ul.tabs li.active{background:#fff;z-index:2;border-bottom-color:#fff}.woocommerce div.product .woocommerce-tabs ul.tabs li.active a{color:inherit;text-shadow:inherit}.woocommerce div.product .woocommerce-tabs ul.tabs li.active::before{-webkit-box-shadow:2px 2px 0 #fff;box-shadow:2px 2px 0 #fff}.woocommerce div.product .woocommerce-tabs ul.tabs li.active::after{-webkit-box-shadow:-2px 2px 0 #fff;box-shadow:-2px 2px 0 #fff}.woocommerce div.product .woocommerce-tabs ul.tabs li::after,.woocommerce div.product .woocommerce-tabs ul.tabs li::before{border:1px solid #d3ced2;position:absolute;bottom:-1px;width:5px;height:5px;content:' ';-webkit-box-sizing:border-box;box-sizing:border-box}.woocommerce div.product .woocommerce-tabs ul.tabs li::before{left:-5px;border-bottom-right-radius:4px;border-width:0 1px 1px 0;-webkit-box-shadow:2px 2px 0 #ebe9eb;box-shadow:2px 2px 0 #ebe9eb}.woocommerce div.product .woocommerce-tabs ul.tabs li::after{right:-5px;border-bottom-left-radius:4px;border-width:0 0 1px 1px;-webkit-box-shadow:-2px 2px 0 #ebe9eb;box-shadow:-2px 2px 0 #ebe9eb}.woocommerce div.product .woocommerce-tabs ul.tabs::before{position:absolute;content:' ';width:100%;bottom:0;left:0;border-bottom:1px solid #d3ced2;z-index:1}.woocommerce div.product .woocommerce-tabs .panel{margin:0 0 2em;padding:0}.woocommerce div.product p.cart{margin-bottom:2em}.woocommerce div.product p.cart::after,.woocommerce div.product p.cart::before{content:' ';display:table}.woocommerce div.product p.cart::after{clear:both}.woocommerce div.product form.cart{margin-bottom:2em}.woocommerce div.product form.cart::after,.woocommerce div.product form.cart::before{content:' ';display:table}.woocommerce div.product form.cart::after{clear:both}.woocommerce div.product form.cart div.quantity{float:left;margin:0 4px 0 0}.woocommerce div.product form.cart table{border-width:0 0 1px}.woocommerce div.product form.cart table td{padding-left:0}.woocommerce div.product form.cart table div.quantity{float:none;margin:0}.woocommerce div.product form.cart table small.stock{display:block;float:none}.woocommerce div.product form.cart .variations{margin-bottom:1em;border:0;width:100%}.woocommerce div.product form.cart .variations td,.woocommerce div.product form.cart .variations th{border:0;vertical-align:top;line-height:2em}.woocommerce div.product form.cart .variations label{font-weight:700}.woocommerce div.product form.cart .variations select{max-width:100%;min-width:75%;display:inline-block;margin-right:1em}.woocommerce div.product form.cart .variations td.label{padding-right:1em}.woocommerce div.product form.cart .woocommerce-variation-description p{margin-bottom:1em}.woocommerce div.product form.cart .reset_variations{visibility:hidden;font-size:.83em}.woocommerce div.product form.cart .wc-no-matching-variations{display:none}.woocommerce div.product form.cart .button{vertical-align:middle;float:left}.woocommerce div.product form.cart .group_table td.woocommerce-grouped-product-list-item__label{padding-right:1em;padding-left:1em}.woocommerce div.product form.cart .group_table td{vertical-align:top;padding-bottom:.5em;border:0}.woocommerce div.product form.cart .group_table td:first-child{width:4em;text-align:center}.woocommerce div.product form.cart .group_table .wc-grouped-product-add-to-cart-checkbox{display:inline-block;width:auto;margin:0 auto;-webkit-transform:scale(1.5,1.5);-ms-transform:scale(1.5,1.5);transform:scale(1.5,1.5)}.woocommerce span.onsale{min-height:3.236em;min-width:3.236em;padding:.202em;font-size:1em;font-weight:700;position:absolute;text-align:center;line-height:3.236;top:-.5em;left:-.5em;margin:0;border-radius:100%;background-color:#77a464;color:#fff;font-size:.857em;z-index:9}.woocommerce .products ul,.woocommerce ul.products{margin:0 0 1em;padding:0;list-style:none outside;clear:both}.woocommerce .products ul::after,.woocommerce .products ul::before,.woocommerce ul.products::after,.woocommerce ul.products::before{content:' ';display:table}.woocommerce .products ul::after,.woocommerce ul.products::after{clear:both}.woocommerce .products ul li,.woocommerce ul.products li{list-style:none outside}.woocommerce ul.products li.product .onsale{top:0;right:0;left:auto;margin:-.5em -.5em 0 0}.woocommerce ul.products li.product .woocommerce-loop-category__title,.woocommerce ul.products li.product .woocommerce-loop-product__title,.woocommerce ul.products li.product h3{padding:.5em 0;margin:0;font-size:1em}.woocommerce ul.products li.product a{text-decoration:none}.woocommerce ul.products li.product a img{width:100%;height:auto;display:block;margin:0 0 1em;-webkit-box-shadow:none;box-shadow:none}.woocommerce ul.products li.product strong{display:block}.woocommerce ul.products li.product .woocommerce-placeholder{border:1px solid #f2f2f2}.woocommerce ul.products li.product .star-rating{font-size:.857em}.woocommerce ul.products li.product .button{margin-top:1em}.woocommerce ul.products li.product .price{color:#77a464;display:block;font-weight:400;margin-bottom:.5em;font-size:.857em}.woocommerce ul.products li.product .price del{color:inherit;opacity:.5;display:inline-block}.woocommerce ul.products li.product .price ins{background:0 0;font-weight:700;display:inline-block}.woocommerce ul.products li.product .price .from{font-size:.67em;margin:-2px 0 0 0;text-transform:uppercase;color:rgba(132,132,132,.5)}.woocommerce .woocommerce-result-count{margin:0 0 1em}.woocommerce .woocommerce-ordering{margin:0 0 1em}.woocommerce .woocommerce-ordering select{vertical-align:top}.woocommerce nav.woocommerce-pagination{text-align:center}.woocommerce nav.woocommerce-pagination ul{display:inline-block;white-space:nowrap;padding:0;clear:both;border:1px solid #d3ced2;border-right:0;margin:1px}.woocommerce nav.woocommerce-pagination ul li{border-right:1px solid #d3ced2;padding:0;margin:0;float:left;display:inline;overflow:hidden}.woocommerce nav.woocommerce-pagination ul li a,.woocommerce nav.woocommerce-pagination ul li span{margin:0;text-decoration:none;padding:0;line-height:1;font-size:1em;font-weight:400;padding:.5em;min-width:1em;display:block}.woocommerce nav.woocommerce-pagination ul li a:focus,.woocommerce nav.woocommerce-pagination ul li a:hover,.woocommerce nav.woocommerce-pagination ul li span.current{background:#ebe9eb;color:#8a7e88}.woocommerce #respond input#submit,.woocommerce a.button,.woocommerce button.button,.woocommerce input.button{font-size:100%;margin:0;line-height:1;cursor:pointer;position:relative;text-decoration:none;overflow:visible;padding:.618em 1em;font-weight:700;border-radius:3px;left:auto;color:#515151;background-color:#ebe9eb;border:0;display:inline-block;background-image:none;-webkit-box-shadow:none;box-shadow:none;text-shadow:none}.woocommerce #respond input#submit.loading,.woocommerce a.button.loading,.woocommerce button.button.loading,.woocommerce input.button.loading{opacity:.25;padding-right:2.618em}.woocommerce #respond input#submit.loading::after,.woocommerce a.button.loading::after,.woocommerce button.button.loading::after,.woocommerce input.button.loading::after{font-family:WooCommerce;content:'\e01c';vertical-align:top;font-weight:400;position:absolute;top:.618em;right:1em;-webkit-animation:spin 2s linear infinite;animation:spin 2s linear infinite}.woocommerce #respond input#submit.added::after,.woocommerce a.button.added::after,.woocommerce button.button.added::after,.woocommerce input.button.added::after{font-family:WooCommerce;content:'\e017';margin-left:.53em;vertical-align:bottom}.woocommerce #respond input#submit:hover,.woocommerce a.button:hover,.woocommerce button.button:hover,.woocommerce input.button:hover{background-color:#dad8da;text-decoration:none;background-image:none;color:#515151}.woocommerce #respond input#submit.alt,.woocommerce a.button.alt,.woocommerce button.button.alt,.woocommerce input.button.alt{background-color:#a46497;color:#fff;-webkit-font-smoothing:antialiased}.woocommerce #respond input#submit.alt:hover,.woocommerce a.button.alt:hover,.woocommerce button.button.alt:hover,.woocommerce input.button.alt:hover{background-color:#935386;color:#fff}.woocommerce #respond input#submit.alt.disabled,.woocommerce #respond input#submit.alt.disabled:hover,.woocommerce #respond input#submit.alt:disabled,.woocommerce #respond input#submit.alt:disabled:hover,.woocommerce #respond input#submit.alt:disabled[disabled],.woocommerce #respond input#submit.alt:disabled[disabled]:hover,.woocommerce a.button.alt.disabled,.woocommerce a.button.alt.disabled:hover,.woocommerce a.button.alt:disabled,.woocommerce a.button.alt:disabled:hover,.woocommerce a.button.alt:disabled[disabled],.woocommerce a.button.alt:disabled[disabled]:hover,.woocommerce button.button.alt.disabled,.woocommerce button.button.alt.disabled:hover,.woocommerce button.button.alt:disabled,.woocommerce button.button.alt:disabled:hover,.woocommerce button.button.alt:disabled[disabled],.woocommerce button.button.alt:disabled[disabled]:hover,.woocommerce input.button.alt.disabled,.woocommerce input.button.alt.disabled:hover,.woocommerce input.button.alt:disabled,.woocommerce input.button.alt:disabled:hover,.woocommerce input.button.alt:disabled[disabled],.woocommerce input.button.alt:disabled[disabled]:hover{background-color:#a46497;color:#fff}.woocommerce #respond input#submit.disabled,.woocommerce #respond input#submit:disabled,.woocommerce #respond input#submit:disabled[disabled],.woocommerce a.button.disabled,.woocommerce a.button:disabled,.woocommerce a.button:disabled[disabled],.woocommerce button.button.disabled,.woocommerce button.button:disabled,.woocommerce button.button:disabled[disabled],.woocommerce input.button.disabled,.woocommerce input.button:disabled,.woocommerce input.button:disabled[disabled]{color:inherit;cursor:not-allowed;opacity:.5;padding:.618em 1em}.woocommerce #respond input#submit.disabled:hover,.woocommerce #respond input#submit:disabled:hover,.woocommerce #respond input#submit:disabled[disabled]:hover,.woocommerce a.button.disabled:hover,.woocommerce a.button:disabled:hover,.woocommerce a.button:disabled[disabled]:hover,.woocommerce button.button.disabled:hover,.woocommerce button.button:disabled:hover,.woocommerce button.button:disabled[disabled]:hover,.woocommerce input.button.disabled:hover,.woocommerce input.button:disabled:hover,.woocommerce input.button:disabled[disabled]:hover{color:inherit;background-color:#ebe9eb}.woocommerce .cart .button,.woocommerce .cart input.button{float:none}.woocommerce a.added_to_cart{padding-top:.5em;display:inline-block}.woocommerce #reviews h2 small{float:right;color:#777;font-size:15px;margin:10px 0 0}.woocommerce #reviews h2 small a{text-decoration:none;color:#777}.woocommerce #reviews h3{margin:0}.woocommerce #reviews #respond{margin:0;border:0;padding:0}.woocommerce #reviews #comment{height:75px}.woocommerce #reviews #comments .add_review::after,.woocommerce #reviews #comments .add_review::before{content:' ';display:table}.woocommerce #reviews #comments .add_review::after{clear:both}.woocommerce #reviews #comments h2{clear:none}.woocommerce #reviews #comments ol.commentlist{margin:0;width:100%;background:0 0;list-style:none}.woocommerce #reviews #comments ol.commentlist::after,.woocommerce #reviews #comments ol.commentlist::before{content:' ';display:table}.woocommerce #reviews #comments ol.commentlist::after{clear:both}.woocommerce #reviews #comments ol.commentlist li{padding:0;margin:0 0 20px;border:0;position:relative;background:0;border:0}.woocommerce #reviews #comments ol.commentlist li .meta{color:#777;font-size:.75em}.woocommerce #reviews #comments ol.commentlist li img.avatar{float:left;position:absolute;top:0;left:0;padding:3px;width:32px;height:auto;background:#ebe9eb;border:1px solid #e4e1e3;margin:0;-webkit-box-shadow:none;box-shadow:none}.woocommerce #reviews #comments ol.commentlist li .comment-text{margin:0 0 0 50px;border:1px solid #e4e1e3;border-radius:4px;padding:1em 1em 0}.woocommerce #reviews #comments ol.commentlist li .comment-text::after,.woocommerce #reviews #comments ol.commentlist li .comment-text::before{content:' ';display:table}.woocommerce #reviews #comments ol.commentlist li .comment-text::after{clear:both}.woocommerce #reviews #comments ol.commentlist li .comment-text p{margin:0 0 1em}.woocommerce #reviews #comments ol.commentlist li .comment-text p.meta{font-size:.83em}.woocommerce #reviews #comments ol.commentlist ul.children{list-style:none outside;margin:20px 0 0 50px}.woocommerce #reviews #comments ol.commentlist ul.children .star-rating{display:none}.woocommerce #reviews #comments ol.commentlist #respond{border:1px solid #e4e1e3;border-radius:4px;padding:1em 1em 0;margin:20px 0 0 50px}.woocommerce #reviews #comments .commentlist>li::before{content:''}.woocommerce .star-rating{float:right;overflow:hidden;position:relative;height:1em;line-height:1;font-size:1em;width:5.4em;font-family:star}.woocommerce .star-rating::before{content:'\73\73\73\73\73';color:#d3ced2;float:left;top:0;left:0;position:absolute}.woocommerce .star-rating span{overflow:hidden;float:left;top:0;left:0;position:absolute;padding-top:1.5em}.woocommerce .star-rating span::before{content:'\53\53\53\53\53';top:0;position:absolute;left:0}.woocommerce .woocommerce-product-rating{line-height:2;display:block}.woocommerce .woocommerce-product-rating::after,.woocommerce .woocommerce-product-rating::before{content:' ';display:table}.woocommerce .woocommerce-product-rating::after{clear:both}.woocommerce .woocommerce-product-rating .star-rating{margin:.5em 4px 0 0;float:left}.woocommerce .products .star-rating{display:block;margin:0 0 .5em;float:none}.woocommerce .hreview-aggregate .star-rating{margin:10px 0 0}.woocommerce #review_form #respond{position:static;margin:0;width:auto;padding:0;background:transparent none;border:0}.woocommerce #review_form #respond::after,.woocommerce #review_form #respond::before{content:' ';display:table}.woocommerce #review_form #respond::after{clear:both}.woocommerce #review_form #respond p{margin:0 0 10px}.woocommerce #review_form #respond .form-submit input{left:auto}.woocommerce #review_form #respond textarea{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%}.woocommerce p.stars a{position:relative;height:1em;width:1em;text-indent:-999em;display:inline-block;text-decoration:none}.woocommerce p.stars a::before{display:block;position:absolute;top:0;left:0;width:1em;height:1em;line-height:1;font-family:WooCommerce;content:'\e021';text-indent:0}.woocommerce p.stars a:hover~a::before{content:'\e021'}.woocommerce p.stars:hover a::before{content:'\e020'}.woocommerce p.stars.selected a.active::before{content:'\e020'}.woocommerce p.stars.selected a.active~a::before{content:'\e021'}.woocommerce p.stars.selected a:not(.active)::before{content:'\e020'}.woocommerce table.shop_attributes{border:0;border-top:1px dotted rgba(0,0,0,.1);margin-bottom:1.618em;width:100%}.woocommerce table.shop_attributes th{width:150px;font-weight:700;padding:8px;border-top:0;border-bottom:1px dotted rgba(0,0,0,.1);margin:0;line-height:1.5}.woocommerce table.shop_attributes td{font-style:italic;padding:0;border-top:0;border-bottom:1px dotted rgba(0,0,0,.1);margin:0;line-height:1.5}.woocommerce table.shop_attributes td p{margin:0;padding:8px 0}.woocommerce table.shop_attributes tr:nth-child(even) td,.woocommerce table.shop_attributes tr:nth-child(even) th{background:rgba(0,0,0,.025)}.woocommerce table.shop_table{border:1px solid rgba(0,0,0,.1);margin:0 -1px 24px 0;text-align:left;width:100%;border-collapse:separate;border-radius:5px}.woocommerce table.shop_table th{font-weight:700;padding:9px 12px;line-height:1.5em}.woocommerce table.shop_table td{border-top:1px solid rgba(0,0,0,.1);padding:9px 12px;vertical-align:middle;line-height:1.5em}.woocommerce table.shop_table td small{font-weight:400}.woocommerce table.shop_table tbody:first-child tr:first-child td,.woocommerce table.shop_table tbody:first-child tr:first-child th{border-top:0}.woocommerce table.shop_table tbody th,.woocommerce table.shop_table tfoot td,.woocommerce table.shop_table tfoot th{font-weight:700;border-top:1px solid rgba(0,0,0,.1)}.woocommerce table.my_account_orders{font-size:.85em}.woocommerce table.my_account_orders td,.woocommerce table.my_account_orders th{padding:4px 8px;vertical-align:middle}.woocommerce table.my_account_orders .button{white-space:nowrap}.woocommerce table.my_account_orders .order-actions{text-align:right}.woocommerce table.my_account_orders .order-actions .button{margin:.125em 0 .125em .25em}.woocommerce table.woocommerce-MyAccount-downloads td,.woocommerce table.woocommerce-MyAccount-downloads th{vertical-align:top;text-align:center}.woocommerce table.woocommerce-MyAccount-downloads td:first-child,.woocommerce table.woocommerce-MyAccount-downloads th:first-child{text-align:left}.woocommerce table.woocommerce-MyAccount-downloads td:last-child,.woocommerce table.woocommerce-MyAccount-downloads th:last-child{text-align:left}.woocommerce table.woocommerce-MyAccount-downloads td .woocommerce-MyAccount-downloads-file::before,.woocommerce table.woocommerce-MyAccount-downloads th .woocommerce-MyAccount-downloads-file::before{content:'\2193';display:inline-block}.woocommerce td.product-name .wc-item-meta,.woocommerce td.product-name dl.variation{list-style:none outside}.woocommerce td.product-name .wc-item-meta .wc-item-meta-label,.woocommerce td.product-name .wc-item-meta dt,.woocommerce td.product-name dl.variation .wc-item-meta-label,.woocommerce td.product-name dl.variation dt{float:left;clear:both;margin-right:.25em;display:inline-block;list-style:none outside}.woocommerce td.product-name .wc-item-meta dd,.woocommerce td.product-name dl.variation dd{margin:0}.woocommerce td.product-name .wc-item-meta p,.woocommerce td.product-name .wc-item-meta:last-child,.woocommerce td.product-name dl.variation p,.woocommerce td.product-name dl.variation:last-child{margin-bottom:0}.woocommerce td.product-name p.backorder_notification{font-size:.83em}.woocommerce td.product-quantity{min-width:80px}.woocommerce ul.cart_list,.woocommerce ul.product_list_widget{list-style:none outside;padding:0;margin:0}.woocommerce ul.cart_list li,.woocommerce ul.product_list_widget li{padding:4px 0;margin:0;list-style:none}.woocommerce ul.cart_list li::after,.woocommerce ul.cart_list li::before,.woocommerce ul.product_list_widget li::after,.woocommerce ul.product_list_widget li::before{content:' ';display:table}.woocommerce ul.cart_list li::after,.woocommerce ul.product_list_widget li::after{clear:both}.woocommerce ul.cart_list li a,.woocommerce ul.product_list_widget li a{display:block;font-weight:700}.woocommerce ul.cart_list li img,.woocommerce ul.product_list_widget li img{float:right;margin-left:4px;width:32px;height:auto;-webkit-box-shadow:none;box-shadow:none}.woocommerce ul.cart_list li dl,.woocommerce ul.product_list_widget li dl{margin:0;padding-left:1em;border-left:2px solid rgba(0,0,0,.1)}.woocommerce ul.cart_list li dl::after,.woocommerce ul.cart_list li dl::before,.woocommerce ul.product_list_widget li dl::after,.woocommerce ul.product_list_widget li dl::before{content:' ';display:table}.woocommerce ul.cart_list li dl::after,.woocommerce ul.product_list_widget li dl::after{clear:both}.woocommerce ul.cart_list li dl dd,.woocommerce ul.cart_list li dl dt,.woocommerce ul.product_list_widget li dl dd,.woocommerce ul.product_list_widget li dl dt{display:inline-block;float:left;margin-bottom:1em}.woocommerce ul.cart_list li dl dt,.woocommerce ul.product_list_widget li dl dt{font-weight:700;padding:0 0 .25em;margin:0 4px 0 0;clear:left}.woocommerce ul.cart_list li dl dd,.woocommerce ul.product_list_widget li dl dd{padding:0 0 .25em}.woocommerce ul.cart_list li dl dd p:last-child,.woocommerce ul.product_list_widget li dl dd p:last-child{margin-bottom:0}.woocommerce ul.cart_list li .star-rating,.woocommerce ul.product_list_widget li .star-rating{float:none}.woocommerce .widget_shopping_cart .total,.woocommerce.widget_shopping_cart .total{border-top:3px double #ebe9eb;padding:4px 0 0}.woocommerce .widget_shopping_cart .total strong,.woocommerce.widget_shopping_cart .total strong{min-width:40px;display:inline-block}.woocommerce .widget_shopping_cart .cart_list li,.woocommerce.widget_shopping_cart .cart_list li{padding-left:2em;position:relative;padding-top:0}.woocommerce .widget_shopping_cart .cart_list li a.remove,.woocommerce.widget_shopping_cart .cart_list li a.remove{position:absolute;top:0;left:0}.woocommerce .widget_shopping_cart .buttons::after,.woocommerce .widget_shopping_cart .buttons::before,.woocommerce.widget_shopping_cart .buttons::after,.woocommerce.widget_shopping_cart .buttons::before{content:' ';display:table}.woocommerce .widget_shopping_cart .buttons::after,.woocommerce.widget_shopping_cart .buttons::after{clear:both}.woocommerce .widget_shopping_cart .buttons a,.woocommerce.widget_shopping_cart .buttons a{margin-right:5px;margin-bottom:5px}.woocommerce form .form-row{padding:3px;margin:0 0 6px}.woocommerce form .form-row [placeholder]:focus::-webkit-input-placeholder{-webkit-transition:opacity .5s .5s ease;transition:opacity .5s .5s ease;opacity:0}.woocommerce form .form-row label{line-height:2}.woocommerce form .form-row label.hidden{visibility:hidden}.woocommerce form .form-row label.inline{display:inline}.woocommerce form .form-row .woocommerce-input-wrapper .description{background:#1e85be;color:#fff;border-radius:3px;padding:1em;margin:.5em 0 0;clear:both;display:none;position:relative}.woocommerce form .form-row .woocommerce-input-wrapper .description a{color:#fff;text-decoration:underline;border:0;-webkit-box-shadow:none;box-shadow:none}.woocommerce form .form-row .woocommerce-input-wrapper .description:before{left:50%;top:0;margin-top:-4px;-webkit-transform:translatex(-50%) rotate(180deg);-ms-transform:translatex(-50%) rotate(180deg);transform:translatex(-50%) rotate(180deg);content:"";position:absolute;border-width:4px 6px 0 6px;border-style:solid;border-color:#1e85be transparent transparent transparent;z-index:100;display:block}.woocommerce form .form-row select{cursor:pointer;margin:0}.woocommerce form .form-row .required{color:red;font-weight:700;border:0!important;text-decoration:none;visibility:hidden}.woocommerce form .form-row .optional{visibility:visible}.woocommerce form .form-row .input-checkbox{display:inline;margin:-2px 8px 0 0;text-align:center;vertical-align:middle}.woocommerce form .form-row input.input-text,.woocommerce form .form-row textarea{-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;margin:0;outline:0;line-height:normal}.woocommerce form .form-row textarea{height:4em;line-height:1.5;display:block;-webkit-box-shadow:none;box-shadow:none}.woocommerce form .form-row .select2-container{width:100%;line-height:2em}.woocommerce form .form-row.woocommerce-invalid label{color:#a00}.woocommerce form .form-row.woocommerce-invalid .select2-container,.woocommerce form .form-row.woocommerce-invalid input.input-text,.woocommerce form .form-row.woocommerce-invalid select{border-color:#a00}.woocommerce form .form-row.woocommerce-validated .select2-container,.woocommerce form .form-row.woocommerce-validated input.input-text,.woocommerce form .form-row.woocommerce-validated select{border-color:#69bf29}.woocommerce form .form-row ::-webkit-input-placeholder{line-height:normal}.woocommerce form .form-row :-moz-placeholder{line-height:normal}.woocommerce form .form-row :-ms-input-placeholder{line-height:normal}.woocommerce form.checkout_coupon,.woocommerce form.login,.woocommerce form.register{border:1px solid #d3ced2;padding:20px;margin:2em 0;text-align:left;border-radius:5px}.woocommerce ul#shipping_method{list-style:none outside;margin:0;padding:0}.woocommerce ul#shipping_method li{margin:0 0 .5em;line-height:1.5em;list-style:none outside}.woocommerce ul#shipping_method li input{margin:3px .4375em 0 0;vertical-align:top}.woocommerce ul#shipping_method li label{display:inline}.woocommerce ul#shipping_method .amount{font-weight:700}.woocommerce p.woocommerce-shipping-contents{margin:0}.woocommerce ul.order_details{margin:0 0 3em;list-style:none}.woocommerce ul.order_details::after,.woocommerce ul.order_details::before{content:' ';display:table}.woocommerce ul.order_details::after{clear:both}.woocommerce ul.order_details li{float:left;margin-right:2em;text-transform:uppercase;font-size:.715em;line-height:1;border-right:1px dashed #d3ced2;padding-right:2em;margin-left:0;padding-left:0;list-style-type:none}.woocommerce ul.order_details li strong{display:block;font-size:1.4em;text-transform:none;line-height:1.5}.woocommerce ul.order_details li:last-of-type{border:none}.woocommerce .wc-bacs-bank-details-account-name{font-weight:700}.woocommerce .woocommerce-customer-details,.woocommerce .woocommerce-order-details,.woocommerce .woocommerce-order-downloads{margin-bottom:2em}.woocommerce .woocommerce-customer-details :last-child,.woocommerce .woocommerce-order-details :last-child,.woocommerce .woocommerce-order-downloads :last-child{margin-bottom:0}.woocommerce .woocommerce-customer-details address{font-style:normal;margin-bottom:0;border:1px solid rgba(0,0,0,.1);border-bottom-width:2px;border-right-width:2px;text-align:left;width:100%;border-radius:5px;padding:6px 12px}.woocommerce .woocommerce-customer-details .woocommerce-customer-details--email,.woocommerce .woocommerce-customer-details .woocommerce-customer-details--phone{margin-bottom:0;padding-left:1.5em}.woocommerce .woocommerce-customer-details .woocommerce-customer-details--phone::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-right:.618em;content:"";text-decoration:none;margin-left:-1.5em;line-height:1.75;position:absolute}.woocommerce .woocommerce-customer-details .woocommerce-customer-details--email::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-right:.618em;content:"";text-decoration:none;margin-left:-1.5em;line-height:1.75;position:absolute}.woocommerce .woocommerce-widget-layered-nav-list{margin:0;padding:0;border:0;list-style:none outside}.woocommerce .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item{padding:0 0 1px;list-style:none}.woocommerce .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item::after,.woocommerce .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item::before{content:' ';display:table}.woocommerce .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item::after{clear:both}.woocommerce .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item a,.woocommerce .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item span{padding:1px 0}.woocommerce .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item--chosen a::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-right:.618em;content:"";text-decoration:none;color:#a00}.woocommerce .woocommerce-widget-layered-nav-dropdown__submit{margin-top:1em}.woocommerce .widget_layered_nav_filters ul{margin:0;padding:0;border:0;list-style:none outside;overflow:hidden;zoom:1}.woocommerce .widget_layered_nav_filters ul li{float:left;padding:0 1em 1px 1px;list-style:none}.woocommerce .widget_layered_nav_filters ul li a{text-decoration:none}.woocommerce .widget_layered_nav_filters ul li a::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-right:.618em;content:"";text-decoration:none;color:#a00;vertical-align:inherit;margin-right:.5em}.woocommerce .widget_price_filter .price_slider{margin-bottom:1em}.woocommerce .widget_price_filter .price_slider_amount{text-align:right;line-height:2.4;font-size:.8751em}.woocommerce .widget_price_filter .price_slider_amount .button{font-size:1.15em;float:left}.woocommerce .widget_price_filter .ui-slider{position:relative;text-align:left;margin-left:.5em;margin-right:.5em}.woocommerce .widget_price_filter .ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1em;height:1em;background-color:#a46497;border-radius:1em;cursor:ew-resize;outline:0;top:-.3em;margin-left:-.5em}.woocommerce .widget_price_filter .ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;border-radius:1em;background-color:#a46497}.woocommerce .widget_price_filter .price_slider_wrapper .ui-widget-content{border-radius:1em;background-color:#602053;border:0}.woocommerce .widget_price_filter .ui-slider-horizontal{height:.5em}.woocommerce .widget_price_filter .ui-slider-horizontal .ui-slider-range{top:0;height:100%}.woocommerce .widget_price_filter .ui-slider-horizontal .ui-slider-range-min{left:-1px}.woocommerce .widget_price_filter .ui-slider-horizontal .ui-slider-range-max{right:-1px}.woocommerce .widget_rating_filter ul{margin:0;padding:0;border:0;list-style:none outside}.woocommerce .widget_rating_filter ul li{padding:0 0 1px;list-style:none}.woocommerce .widget_rating_filter ul li::after,.woocommerce .widget_rating_filter ul li::before{content:' ';display:table}.woocommerce .widget_rating_filter ul li::after{clear:both}.woocommerce .widget_rating_filter ul li a{padding:1px 0;text-decoration:none}.woocommerce .widget_rating_filter ul li .star-rating{float:none;display:inline-block}.woocommerce .widget_rating_filter ul li.chosen a::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-right:.618em;content:"";text-decoration:none;color:#a00}.woocommerce-no-js form.woocommerce-form-coupon,.woocommerce-no-js form.woocommerce-form-login{display:block!important}.woocommerce-no-js .showcoupon,.woocommerce-no-js .woocommerce-form-coupon-toggle,.woocommerce-no-js .woocommerce-form-login-toggle{display:none!important}.woocommerce-error,.woocommerce-info,.woocommerce-message{padding:1em 2em 1em 3.5em;margin:0 0 2em;position:relative;background-color:#f7f6f7;color:#515151;border-top:3px solid #a46497;list-style:none outside;width:auto;word-wrap:break-word}.woocommerce-error::after,.woocommerce-error::before,.woocommerce-info::after,.woocommerce-info::before,.woocommerce-message::after,.woocommerce-message::before{content:' ';display:table}.woocommerce-error::after,.woocommerce-info::after,.woocommerce-message::after{clear:both}.woocommerce-error::before,.woocommerce-info::before,.woocommerce-message::before{font-family:WooCommerce;content:'\e028';display:inline-block;position:absolute;top:1em;left:1.5em}.woocommerce-error .button,.woocommerce-info .button,.woocommerce-message .button{float:right}.woocommerce-error li,.woocommerce-info li,.woocommerce-message li{list-style:none outside!important;padding-left:0!important;margin-left:0!important}.rtl.woocommerce .price_label,.rtl.woocommerce .price_label span{direction:ltr;unicode-bidi:embed}.woocommerce-message{border-top-color:#8fae1b}.woocommerce-message::before{content:'\e015';color:#8fae1b}.woocommerce-info{border-top-color:#1e85be}.woocommerce-info::before{color:#1e85be}.woocommerce-error{border-top-color:#b81c23}.woocommerce-error::before{content:'\e016';color:#b81c23}.woocommerce-account .woocommerce::after,.woocommerce-account .woocommerce::before{content:' ';display:table}.woocommerce-account .woocommerce::after{clear:both}.woocommerce-account .addresses .title::after,.woocommerce-account .addresses .title::before{content:' ';display:table}.woocommerce-account .addresses .title::after{clear:both}.woocommerce-account .addresses .title h3{float:left}.woocommerce-account .addresses .title .edit{float:right}.woocommerce-account ol.commentlist.notes li.note p.meta{font-weight:700;margin-bottom:0}.woocommerce-account ol.commentlist.notes li.note .description p:last-child{margin-bottom:0}.woocommerce-account ul.digital-downloads{margin-left:0;padding-left:0}.woocommerce-account ul.digital-downloads li{list-style:none;margin-left:0;padding-left:0}.woocommerce-account ul.digital-downloads li::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-right:.618em;content:"";text-decoration:none}.woocommerce-account ul.digital-downloads li .count{float:right}#add_payment_method table.cart .product-thumbnail,.woocommerce-cart table.cart .product-thumbnail,.woocommerce-checkout table.cart .product-thumbnail{min-width:32px}#add_payment_method table.cart img,.woocommerce-cart table.cart img,.woocommerce-checkout table.cart img{width:32px;-webkit-box-shadow:none;box-shadow:none}#add_payment_method table.cart td,#add_payment_method table.cart th,.woocommerce-cart table.cart td,.woocommerce-cart table.cart th,.woocommerce-checkout table.cart td,.woocommerce-checkout table.cart th{vertical-align:middle}#add_payment_method table.cart td.actions .coupon .input-text,.woocommerce-cart table.cart td.actions .coupon .input-text,.woocommerce-checkout table.cart td.actions .coupon .input-text{float:left;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #d3ced2;padding:6px 6px 5px;margin:0 4px 0 0;outline:0}#add_payment_method table.cart input,.woocommerce-cart table.cart input,.woocommerce-checkout table.cart input{margin:0;vertical-align:middle}#add_payment_method .wc-proceed-to-checkout,.woocommerce-cart .wc-proceed-to-checkout,.woocommerce-checkout .wc-proceed-to-checkout{padding:1em 0}#add_payment_method .wc-proceed-to-checkout::after,#add_payment_method .wc-proceed-to-checkout::before,.woocommerce-cart .wc-proceed-to-checkout::after,.woocommerce-cart .wc-proceed-to-checkout::before,.woocommerce-checkout .wc-proceed-to-checkout::after,.woocommerce-checkout .wc-proceed-to-checkout::before{content:' ';display:table}#add_payment_method .wc-proceed-to-checkout::after,.woocommerce-cart .wc-proceed-to-checkout::after,.woocommerce-checkout .wc-proceed-to-checkout::after{clear:both}#add_payment_method .wc-proceed-to-checkout a.checkout-button,.woocommerce-cart .wc-proceed-to-checkout a.checkout-button,.woocommerce-checkout .wc-proceed-to-checkout a.checkout-button{display:block;text-align:center;margin-bottom:1em;font-size:1.25em;padding:1em}#add_payment_method .cart-collaterals .shipping-calculator-button,.woocommerce-cart .cart-collaterals .shipping-calculator-button,.woocommerce-checkout .cart-collaterals .shipping-calculator-button{float:none;margin-top:.5em;display:inline-block}#add_payment_method .cart-collaterals .shipping-calculator-button::after,.woocommerce-cart .cart-collaterals .shipping-calculator-button::after,.woocommerce-checkout .cart-collaterals .shipping-calculator-button::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-left:.618em;content:"";text-decoration:none}#add_payment_method .cart-collaterals .shipping-calculator-form,.woocommerce-cart .cart-collaterals .shipping-calculator-form,.woocommerce-checkout .cart-collaterals .shipping-calculator-form{margin:1em 0 0 0}#add_payment_method .cart-collaterals .cart_totals p small,.woocommerce-cart .cart-collaterals .cart_totals p small,.woocommerce-checkout .cart-collaterals .cart_totals p small{color:#777;font-size:.83em}#add_payment_method .cart-collaterals .cart_totals table,.woocommerce-cart .cart-collaterals .cart_totals table,.woocommerce-checkout .cart-collaterals .cart_totals table{border-collapse:separate;margin:0 0 6px;padding:0}#add_payment_method .cart-collaterals .cart_totals table tr:first-child td,#add_payment_method .cart-collaterals .cart_totals table tr:first-child th,.woocommerce-cart .cart-collaterals .cart_totals table tr:first-child td,.woocommerce-cart .cart-collaterals .cart_totals table tr:first-child th,.woocommerce-checkout .cart-collaterals .cart_totals table tr:first-child td,.woocommerce-checkout .cart-collaterals .cart_totals table tr:first-child th{border-top:0}#add_payment_method .cart-collaterals .cart_totals table th,.woocommerce-cart .cart-collaterals .cart_totals table th,.woocommerce-checkout .cart-collaterals .cart_totals table th{width:35%}#add_payment_method .cart-collaterals .cart_totals table td,#add_payment_method .cart-collaterals .cart_totals table th,.woocommerce-cart .cart-collaterals .cart_totals table td,.woocommerce-cart .cart-collaterals .cart_totals table th,.woocommerce-checkout .cart-collaterals .cart_totals table td,.woocommerce-checkout .cart-collaterals .cart_totals table th{vertical-align:top;border-left:0;border-right:0;line-height:1.5em}#add_payment_method .cart-collaterals .cart_totals table small,.woocommerce-cart .cart-collaterals .cart_totals table small,.woocommerce-checkout .cart-collaterals .cart_totals table small{color:#777}#add_payment_method .cart-collaterals .cart_totals table select,.woocommerce-cart .cart-collaterals .cart_totals table select,.woocommerce-checkout .cart-collaterals .cart_totals table select{width:100%}#add_payment_method .cart-collaterals .cart_totals .discount td,.woocommerce-cart .cart-collaterals .cart_totals .discount td,.woocommerce-checkout .cart-collaterals .cart_totals .discount td{color:#77a464}#add_payment_method .cart-collaterals .cart_totals tr td,#add_payment_method .cart-collaterals .cart_totals tr th,.woocommerce-cart .cart-collaterals .cart_totals tr td,.woocommerce-cart .cart-collaterals .cart_totals tr th,.woocommerce-checkout .cart-collaterals .cart_totals tr td,.woocommerce-checkout .cart-collaterals .cart_totals tr th{border-top:1px solid #ebe9eb}#add_payment_method .cart-collaterals .cart_totals .woocommerce-shipping-destination,.woocommerce-cart .cart-collaterals .cart_totals .woocommerce-shipping-destination,.woocommerce-checkout .cart-collaterals .cart_totals .woocommerce-shipping-destination{margin-bottom:0}#add_payment_method .cart-collaterals .cross-sells ul.products li.product,.woocommerce-cart .cart-collaterals .cross-sells ul.products li.product,.woocommerce-checkout .cart-collaterals .cross-sells ul.products li.product{margin-top:0}#add_payment_method .checkout .col-2 h3#ship-to-different-address,.woocommerce-cart .checkout .col-2 h3#ship-to-different-address,.woocommerce-checkout .checkout .col-2 h3#ship-to-different-address{float:left;clear:none}#add_payment_method .checkout .col-2 .notes,.woocommerce-cart .checkout .col-2 .notes,.woocommerce-checkout .checkout .col-2 .notes{clear:left}#add_payment_method .checkout .col-2 .form-row-first,.woocommerce-cart .checkout .col-2 .form-row-first,.woocommerce-checkout .checkout .col-2 .form-row-first{clear:left}#add_payment_method .checkout .create-account small,.woocommerce-cart .checkout .create-account small,.woocommerce-checkout .checkout .create-account small{font-size:11px;color:#777;font-weight:400}#add_payment_method .checkout div.shipping-address,.woocommerce-cart .checkout div.shipping-address,.woocommerce-checkout .checkout div.shipping-address{padding:0;clear:left;width:100%}#add_payment_method .checkout .shipping_address,.woocommerce-cart .checkout .shipping_address,.woocommerce-checkout .checkout .shipping_address{clear:both}#add_payment_method #payment,.woocommerce-cart #payment,.woocommerce-checkout #payment{background:#ebe9eb;border-radius:5px}#add_payment_method #payment ul.payment_methods,.woocommerce-cart #payment ul.payment_methods,.woocommerce-checkout #payment ul.payment_methods{text-align:left;padding:1em;border-bottom:1px solid #d3ced2;margin:0;list-style:none outside}#add_payment_method #payment ul.payment_methods::after,#add_payment_method #payment ul.payment_methods::before,.woocommerce-cart #payment ul.payment_methods::after,.woocommerce-cart #payment ul.payment_methods::before,.woocommerce-checkout #payment ul.payment_methods::after,.woocommerce-checkout #payment ul.payment_methods::before{content:' ';display:table}#add_payment_method #payment ul.payment_methods::after,.woocommerce-cart #payment ul.payment_methods::after,.woocommerce-checkout #payment ul.payment_methods::after{clear:both}#add_payment_method #payment ul.payment_methods li,.woocommerce-cart #payment ul.payment_methods li,.woocommerce-checkout #payment ul.payment_methods li{line-height:2;text-align:left;margin:0;font-weight:400}#add_payment_method #payment ul.payment_methods li input,.woocommerce-cart #payment ul.payment_methods li input,.woocommerce-checkout #payment ul.payment_methods li input{margin:0 1em 0 0}#add_payment_method #payment ul.payment_methods li img,.woocommerce-cart #payment ul.payment_methods li img,.woocommerce-checkout #payment ul.payment_methods li img{vertical-align:middle;margin:-2px 0 0 .5em;padding:0;position:relative;-webkit-box-shadow:none;box-shadow:none}#add_payment_method #payment ul.payment_methods li img+img,.woocommerce-cart #payment ul.payment_methods li img+img,.woocommerce-checkout #payment ul.payment_methods li img+img{margin-left:2px}#add_payment_method #payment ul.payment_methods li:not(.woocommerce-notice)::after,#add_payment_method #payment ul.payment_methods li:not(.woocommerce-notice)::before,.woocommerce-cart #payment ul.payment_methods li:not(.woocommerce-notice)::after,.woocommerce-cart #payment ul.payment_methods li:not(.woocommerce-notice)::before,.woocommerce-checkout #payment ul.payment_methods li:not(.woocommerce-notice)::after,.woocommerce-checkout #payment ul.payment_methods li:not(.woocommerce-notice)::before{content:' ';display:table}#add_payment_method #payment ul.payment_methods li:not(.woocommerce-notice)::after,.woocommerce-cart #payment ul.payment_methods li:not(.woocommerce-notice)::after,.woocommerce-checkout #payment ul.payment_methods li:not(.woocommerce-notice)::after{clear:both}#add_payment_method #payment div.form-row,.woocommerce-cart #payment div.form-row,.woocommerce-checkout #payment div.form-row{padding:1em}#add_payment_method #payment div.payment_box,.woocommerce-cart #payment div.payment_box,.woocommerce-checkout #payment div.payment_box{position:relative;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;padding:1em;margin:1em 0;font-size:.92em;border-radius:2px;line-height:1.5;background-color:#dfdcde;color:#515151}#add_payment_method #payment div.payment_box input.input-text,#add_payment_method #payment div.payment_box textarea,.woocommerce-cart #payment div.payment_box input.input-text,.woocommerce-cart #payment div.payment_box textarea,.woocommerce-checkout #payment div.payment_box input.input-text,.woocommerce-checkout #payment div.payment_box textarea{border-color:#c7c1c6;border-top-color:#bbb3b9}#add_payment_method #payment div.payment_box ::-webkit-input-placeholder,.woocommerce-cart #payment div.payment_box ::-webkit-input-placeholder,.woocommerce-checkout #payment div.payment_box ::-webkit-input-placeholder{color:#bbb3b9}#add_payment_method #payment div.payment_box :-moz-placeholder,.woocommerce-cart #payment div.payment_box :-moz-placeholder,.woocommerce-checkout #payment div.payment_box :-moz-placeholder{color:#bbb3b9}#add_payment_method #payment div.payment_box :-ms-input-placeholder,.woocommerce-cart #payment div.payment_box :-ms-input-placeholder,.woocommerce-checkout #payment div.payment_box :-ms-input-placeholder{color:#bbb3b9}#add_payment_method #payment div.payment_box .woocommerce-SavedPaymentMethods,.woocommerce-cart #payment div.payment_box .woocommerce-SavedPaymentMethods,.woocommerce-checkout #payment div.payment_box .woocommerce-SavedPaymentMethods{list-style:none outside;margin:0}#add_payment_method #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-new,#add_payment_method #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-token,.woocommerce-cart #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-new,.woocommerce-cart #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-token,.woocommerce-checkout #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-new,.woocommerce-checkout #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-token{margin:0 0 .5em}#add_payment_method #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-new label,#add_payment_method #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-token label,.woocommerce-cart #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-new label,.woocommerce-cart #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-token label,.woocommerce-checkout #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-new label,.woocommerce-checkout #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-token label{cursor:pointer}#add_payment_method #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-tokenInput,.woocommerce-cart #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-tokenInput,.woocommerce-checkout #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-tokenInput{vertical-align:middle;margin:-3px 1em 0 0;position:relative}#add_payment_method #payment div.payment_box .wc-credit-card-form,.woocommerce-cart #payment div.payment_box .wc-credit-card-form,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form{border:0;padding:0;margin:1em 0 0}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number{font-size:1.5em;padding:8px;background-repeat:no-repeat;background-position:right .618em center;background-size:32px 20px}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.visa,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.visa,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.visa,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.visa,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.visa,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.visa,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.visa,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.visa,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.visa{background-image:url(../images/icons/credit-cards/visa.svg)}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.mastercard,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.mastercard,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.mastercard,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.mastercard,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.mastercard,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.mastercard,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.mastercard,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.mastercard,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.mastercard{background-image:url(../images/icons/credit-cards/mastercard.svg)}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.laser,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.laser,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.laser,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.laser,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.laser,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.laser,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.laser,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.laser,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.laser{background-image:url(../images/icons/credit-cards/laser.svg)}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.dinersclub,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.dinersclub,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.dinersclub,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.dinersclub,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.dinersclub,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.dinersclub,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.dinersclub,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.dinersclub,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.dinersclub{background-image:url(../images/icons/credit-cards/diners.svg)}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.maestro,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.maestro,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.maestro,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.maestro,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.maestro,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.maestro,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.maestro,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.maestro,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.maestro{background-image:url(../images/icons/credit-cards/maestro.svg)}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.jcb,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.jcb,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.jcb,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.jcb,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.jcb,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.jcb,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.jcb,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.jcb,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.jcb{background-image:url(../images/icons/credit-cards/jcb.svg)}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.amex,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.amex,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.amex,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.amex,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.amex,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.amex,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.amex,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.amex,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.amex{background-image:url(../images/icons/credit-cards/amex.svg)}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.discover,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.discover,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.discover,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.discover,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.discover,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.discover,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.discover,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.discover,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.discover{background-image:url(../images/icons/credit-cards/discover.svg)}#add_payment_method #payment div.payment_box span.help,.woocommerce-cart #payment div.payment_box span.help,.woocommerce-checkout #payment div.payment_box span.help{font-size:.857em;color:#777;font-weight:400}#add_payment_method #payment div.payment_box .form-row,.woocommerce-cart #payment div.payment_box .form-row,.woocommerce-checkout #payment div.payment_box .form-row{margin:0 0 1em}#add_payment_method #payment div.payment_box p:last-child,.woocommerce-cart #payment div.payment_box p:last-child,.woocommerce-checkout #payment div.payment_box p:last-child{margin-bottom:0}#add_payment_method #payment div.payment_box::before,.woocommerce-cart #payment div.payment_box::before,.woocommerce-checkout #payment div.payment_box::before{content:'';display:block;border:1em solid #dfdcde;border-right-color:transparent;border-left-color:transparent;border-top-color:transparent;position:absolute;top:-.75em;left:0;margin:-1em 0 0 2em}#add_payment_method #payment .payment_method_paypal .about_paypal,.woocommerce-cart #payment .payment_method_paypal .about_paypal,.woocommerce-checkout #payment .payment_method_paypal .about_paypal{float:right;line-height:52px;font-size:.83em}#add_payment_method #payment .payment_method_paypal img,.woocommerce-cart #payment .payment_method_paypal img,.woocommerce-checkout #payment .payment_method_paypal img{max-height:52px;vertical-align:middle}.woocommerce-terms-and-conditions{border:1px solid rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background:rgba(0,0,0,.05)}.woocommerce-invalid #terms{outline:2px solid red;outline-offset:2px}.woocommerce-password-strength{text-align:center;font-weight:600;padding:3px .5em;font-size:1em}.woocommerce-password-strength.strong{background-color:#c1e1b9;border-color:#83c373}.woocommerce-password-strength.short{background-color:#f1adad;border-color:#e35b5b}.woocommerce-password-strength.bad{background-color:#fbc5a9;border-color:#f78b53}.woocommerce-password-strength.good{background-color:#ffe399;border-color:#ffc733}.woocommerce-password-hint{margin:.5em 0 0;display:block}#content.twentyeleven .woocommerce-pagination a{font-size:1em;line-height:1}.single-product .twentythirteen #reply-title,.single-product .twentythirteen #respond #commentform,.single-product .twentythirteen .entry-summary{padding:0}.single-product .twentythirteen p.stars{clear:both}.twentythirteen .woocommerce-breadcrumb{padding-top:40px}.twentyfourteen ul.products li.product{margin-top:0!important}body:not(.search-results) .twentysixteen .entry-summary{color:inherit;font-size:inherit;line-height:inherit}.twentysixteen .price ins{background:inherit;color:inherit} \ No newline at end of file +@charset "UTF-8";@-webkit-keyframes spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}.woocommerce-store-notice,p.demo_store{position:absolute;top:0;left:0;right:0;margin:0;width:100%;font-size:1em;padding:1em 0;text-align:center;background-color:#a46497;color:#fff;z-index:99998;box-shadow:0 1px 1em rgba(0,0,0,.2);display:none}.woocommerce-store-notice a,p.demo_store a{color:#fff;text-decoration:underline}.screen-reader-text{clip:rect(1px,1px,1px,1px);height:1px;overflow:hidden;position:absolute!important;width:1px;word-wrap:normal!important}.admin-bar p.demo_store{top:32px}.clear{clear:both}.woocommerce .blockUI.blockOverlay{position:relative}.woocommerce .blockUI.blockOverlay::before{height:1em;width:1em;display:block;position:absolute;top:50%;left:50%;margin-left:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.woocommerce .loader::before{height:1em;width:1em;display:block;position:absolute;top:50%;left:50%;margin-left:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.woocommerce a.remove{display:block;font-size:1.5em;height:1em;width:1em;text-align:center;line-height:1;border-radius:100%;color:red!important;text-decoration:none;font-weight:700;border:0}.woocommerce a.remove:hover{color:#fff!important;background:red}.woocommerce small.note{display:block;color:#777;font-size:.857em;margin-top:10px}.woocommerce .woocommerce-breadcrumb{margin:0 0 1em;padding:0;font-size:.92em;color:#777}.woocommerce .woocommerce-breadcrumb::after,.woocommerce .woocommerce-breadcrumb::before{content:' ';display:table}.woocommerce .woocommerce-breadcrumb::after{clear:both}.woocommerce .woocommerce-breadcrumb a{color:#777}.woocommerce .quantity .qty{width:3.631em;text-align:center}.woocommerce div.product{margin-bottom:0;position:relative}.woocommerce div.product .product_title{clear:none;margin-top:0;padding:0}.woocommerce div.product p.price,.woocommerce div.product span.price{color:#77a464;font-size:1.25em}.woocommerce div.product p.price ins,.woocommerce div.product span.price ins{background:inherit;font-weight:700;display:inline-block}.woocommerce div.product p.price del,.woocommerce div.product span.price del{opacity:.5;display:inline-block}.woocommerce div.product p.stock{font-size:.92em}.woocommerce div.product .stock{color:#77a464}.woocommerce div.product .out-of-stock{color:red}.woocommerce div.product .woocommerce-product-rating{margin-bottom:1.618em}.woocommerce div.product div.images{margin-bottom:2em}.woocommerce div.product div.images img{display:block;width:100%;height:auto;box-shadow:none}.woocommerce div.product div.images div.thumbnails{padding-top:1em}.woocommerce div.product div.images.woocommerce-product-gallery{position:relative}.woocommerce div.product div.images .woocommerce-product-gallery__wrapper{-webkit-transition:all cubic-bezier(.795,-.035,0,1) .5s;transition:all cubic-bezier(.795,-.035,0,1) .5s;margin:0;padding:0}.woocommerce div.product div.images .woocommerce-product-gallery__wrapper .zoomImg{background-color:#fff;opacity:0}.woocommerce div.product div.images .woocommerce-product-gallery__image--placeholder{border:1px solid #f2f2f2}.woocommerce div.product div.images .woocommerce-product-gallery__image:nth-child(n+2){width:25%;display:inline-block}.woocommerce div.product div.images .woocommerce-product-gallery__trigger{position:absolute;top:.5em;right:.5em;font-size:2em;z-index:9;width:36px;height:36px;background:#fff;text-indent:-9999px;border-radius:100%;box-sizing:content-box}.woocommerce div.product div.images .woocommerce-product-gallery__trigger:before{content:"";display:block;width:10px;height:10px;border:2px solid #000;border-radius:100%;position:absolute;top:9px;left:9px;box-sizing:content-box}.woocommerce div.product div.images .woocommerce-product-gallery__trigger:after{content:"";display:block;width:2px;height:8px;background:#000;border-radius:6px;position:absolute;top:19px;left:22px;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg);box-sizing:content-box}.woocommerce div.product div.images .flex-control-thumbs{overflow:hidden;zoom:1;margin:0;padding:0}.woocommerce div.product div.images .flex-control-thumbs li{width:25%;float:left;margin:0;list-style:none}.woocommerce div.product div.images .flex-control-thumbs li img{cursor:pointer;opacity:.5;margin:0}.woocommerce div.product div.images .flex-control-thumbs li img.flex-active,.woocommerce div.product div.images .flex-control-thumbs li img:hover{opacity:1}.woocommerce div.product .woocommerce-product-gallery--columns-3 .flex-control-thumbs li:nth-child(3n+1){clear:left}.woocommerce div.product .woocommerce-product-gallery--columns-4 .flex-control-thumbs li:nth-child(4n+1){clear:left}.woocommerce div.product .woocommerce-product-gallery--columns-5 .flex-control-thumbs li:nth-child(5n+1){clear:left}.woocommerce div.product div.summary{margin-bottom:2em}.woocommerce div.product div.social{text-align:right;margin:0 0 1em}.woocommerce div.product div.social span{margin:0 0 0 2px}.woocommerce div.product div.social span span{margin:0}.woocommerce div.product div.social span .stButton .chicklets{padding-left:16px;width:0}.woocommerce div.product div.social iframe{float:left;margin-top:3px}.woocommerce div.product .woocommerce-tabs ul.tabs{list-style:none;padding:0 0 0 1em;margin:0 0 1.618em;overflow:hidden;position:relative}.woocommerce div.product .woocommerce-tabs ul.tabs li{border:1px solid #d3ced2;background-color:#ebe9eb;display:inline-block;position:relative;z-index:0;border-radius:4px 4px 0 0;margin:0 -5px;padding:0 1em}.woocommerce div.product .woocommerce-tabs ul.tabs li a{display:inline-block;padding:.5em 0;font-weight:700;color:#515151;text-decoration:none}.woocommerce div.product .woocommerce-tabs ul.tabs li a:hover{text-decoration:none;color:#6b6a6b}.woocommerce div.product .woocommerce-tabs ul.tabs li.active{background:#fff;z-index:2;border-bottom-color:#fff}.woocommerce div.product .woocommerce-tabs ul.tabs li.active a{color:inherit;text-shadow:inherit}.woocommerce div.product .woocommerce-tabs ul.tabs li.active::before{box-shadow:2px 2px 0 #fff}.woocommerce div.product .woocommerce-tabs ul.tabs li.active::after{box-shadow:-2px 2px 0 #fff}.woocommerce div.product .woocommerce-tabs ul.tabs li::after,.woocommerce div.product .woocommerce-tabs ul.tabs li::before{border:1px solid #d3ced2;position:absolute;bottom:-1px;width:5px;height:5px;content:' ';box-sizing:border-box}.woocommerce div.product .woocommerce-tabs ul.tabs li::before{left:-5px;border-bottom-right-radius:4px;border-width:0 1px 1px 0;box-shadow:2px 2px 0 #ebe9eb}.woocommerce div.product .woocommerce-tabs ul.tabs li::after{right:-5px;border-bottom-left-radius:4px;border-width:0 0 1px 1px;box-shadow:-2px 2px 0 #ebe9eb}.woocommerce div.product .woocommerce-tabs ul.tabs::before{position:absolute;content:' ';width:100%;bottom:0;left:0;border-bottom:1px solid #d3ced2;z-index:1}.woocommerce div.product .woocommerce-tabs .panel{margin:0 0 2em;padding:0}.woocommerce div.product p.cart{margin-bottom:2em}.woocommerce div.product p.cart::after,.woocommerce div.product p.cart::before{content:' ';display:table}.woocommerce div.product p.cart::after{clear:both}.woocommerce div.product form.cart{margin-bottom:2em}.woocommerce div.product form.cart::after,.woocommerce div.product form.cart::before{content:' ';display:table}.woocommerce div.product form.cart::after{clear:both}.woocommerce div.product form.cart div.quantity{float:left;margin:0 4px 0 0}.woocommerce div.product form.cart table{border-width:0 0 1px}.woocommerce div.product form.cart table td{padding-left:0}.woocommerce div.product form.cart table div.quantity{float:none;margin:0}.woocommerce div.product form.cart table small.stock{display:block;float:none}.woocommerce div.product form.cart .variations{margin-bottom:1em;border:0;width:100%}.woocommerce div.product form.cart .variations td,.woocommerce div.product form.cart .variations th{border:0;vertical-align:top;line-height:2em}.woocommerce div.product form.cart .variations label{font-weight:700}.woocommerce div.product form.cart .variations select{max-width:100%;min-width:75%;display:inline-block;margin-right:1em}.woocommerce div.product form.cart .variations td.label{padding-right:1em}.woocommerce div.product form.cart .woocommerce-variation-description p{margin-bottom:1em}.woocommerce div.product form.cart .reset_variations{visibility:hidden;font-size:.83em}.woocommerce div.product form.cart .wc-no-matching-variations{display:none}.woocommerce div.product form.cart .button{vertical-align:middle;float:left}.woocommerce div.product form.cart .group_table td.woocommerce-grouped-product-list-item__label{padding-right:1em;padding-left:1em}.woocommerce div.product form.cart .group_table td{vertical-align:top;padding-bottom:.5em;border:0}.woocommerce div.product form.cart .group_table td:first-child{width:4em;text-align:center}.woocommerce div.product form.cart .group_table .wc-grouped-product-add-to-cart-checkbox{display:inline-block;width:auto;margin:0 auto;-webkit-transform:scale(1.5,1.5);-ms-transform:scale(1.5,1.5);transform:scale(1.5,1.5)}.woocommerce span.onsale{min-height:3.236em;min-width:3.236em;padding:.202em;font-size:1em;font-weight:700;position:absolute;text-align:center;line-height:3.236;top:-.5em;left:-.5em;margin:0;border-radius:100%;background-color:#77a464;color:#fff;font-size:.857em;z-index:9}.woocommerce .products ul,.woocommerce ul.products{margin:0 0 1em;padding:0;list-style:none outside;clear:both}.woocommerce .products ul::after,.woocommerce .products ul::before,.woocommerce ul.products::after,.woocommerce ul.products::before{content:' ';display:table}.woocommerce .products ul::after,.woocommerce ul.products::after{clear:both}.woocommerce .products ul li,.woocommerce ul.products li{list-style:none outside}.woocommerce ul.products li.product .onsale{top:0;right:0;left:auto;margin:-.5em -.5em 0 0}.woocommerce ul.products li.product .woocommerce-loop-category__title,.woocommerce ul.products li.product .woocommerce-loop-product__title,.woocommerce ul.products li.product h3{padding:.5em 0;margin:0;font-size:1em}.woocommerce ul.products li.product a{text-decoration:none}.woocommerce ul.products li.product a img{width:100%;height:auto;display:block;margin:0 0 1em;box-shadow:none}.woocommerce ul.products li.product strong{display:block}.woocommerce ul.products li.product .woocommerce-placeholder{border:1px solid #f2f2f2}.woocommerce ul.products li.product .star-rating{font-size:.857em}.woocommerce ul.products li.product .button{margin-top:1em}.woocommerce ul.products li.product .price{color:#77a464;display:block;font-weight:400;margin-bottom:.5em;font-size:.857em}.woocommerce ul.products li.product .price del{color:inherit;opacity:.5;display:inline-block}.woocommerce ul.products li.product .price ins{background:0 0;font-weight:700;display:inline-block}.woocommerce ul.products li.product .price .from{font-size:.67em;margin:-2px 0 0 0;text-transform:uppercase;color:rgba(132,132,132,.5)}.woocommerce .woocommerce-result-count{margin:0 0 1em}.woocommerce .woocommerce-ordering{margin:0 0 1em}.woocommerce .woocommerce-ordering select{vertical-align:top}.woocommerce nav.woocommerce-pagination{text-align:center}.woocommerce nav.woocommerce-pagination ul{display:inline-block;white-space:nowrap;padding:0;clear:both;border:1px solid #d3ced2;border-right:0;margin:1px}.woocommerce nav.woocommerce-pagination ul li{border-right:1px solid #d3ced2;padding:0;margin:0;float:left;display:inline;overflow:hidden}.woocommerce nav.woocommerce-pagination ul li a,.woocommerce nav.woocommerce-pagination ul li span{margin:0;text-decoration:none;padding:0;line-height:1;font-size:1em;font-weight:400;padding:.5em;min-width:1em;display:block}.woocommerce nav.woocommerce-pagination ul li a:focus,.woocommerce nav.woocommerce-pagination ul li a:hover,.woocommerce nav.woocommerce-pagination ul li span.current{background:#ebe9eb;color:#8a7e88}.woocommerce #respond input#submit,.woocommerce a.button,.woocommerce button.button,.woocommerce input.button{font-size:100%;margin:0;line-height:1;cursor:pointer;position:relative;text-decoration:none;overflow:visible;padding:.618em 1em;font-weight:700;border-radius:3px;left:auto;color:#515151;background-color:#ebe9eb;border:0;display:inline-block;background-image:none;box-shadow:none;text-shadow:none}.woocommerce #respond input#submit.loading,.woocommerce a.button.loading,.woocommerce button.button.loading,.woocommerce input.button.loading{opacity:.25;padding-right:2.618em}.woocommerce #respond input#submit.loading::after,.woocommerce a.button.loading::after,.woocommerce button.button.loading::after,.woocommerce input.button.loading::after{font-family:WooCommerce;content:'\e01c';vertical-align:top;font-weight:400;position:absolute;top:.618em;right:1em;-webkit-animation:spin 2s linear infinite;animation:spin 2s linear infinite}.woocommerce #respond input#submit.added::after,.woocommerce a.button.added::after,.woocommerce button.button.added::after,.woocommerce input.button.added::after{font-family:WooCommerce;content:'\e017';margin-left:.53em;vertical-align:bottom}.woocommerce #respond input#submit:hover,.woocommerce a.button:hover,.woocommerce button.button:hover,.woocommerce input.button:hover{background-color:#dad8da;text-decoration:none;background-image:none;color:#515151}.woocommerce #respond input#submit.alt,.woocommerce a.button.alt,.woocommerce button.button.alt,.woocommerce input.button.alt{background-color:#a46497;color:#fff;-webkit-font-smoothing:antialiased}.woocommerce #respond input#submit.alt:hover,.woocommerce a.button.alt:hover,.woocommerce button.button.alt:hover,.woocommerce input.button.alt:hover{background-color:#935386;color:#fff}.woocommerce #respond input#submit.alt.disabled,.woocommerce #respond input#submit.alt.disabled:hover,.woocommerce #respond input#submit.alt:disabled,.woocommerce #respond input#submit.alt:disabled:hover,.woocommerce #respond input#submit.alt:disabled[disabled],.woocommerce #respond input#submit.alt:disabled[disabled]:hover,.woocommerce a.button.alt.disabled,.woocommerce a.button.alt.disabled:hover,.woocommerce a.button.alt:disabled,.woocommerce a.button.alt:disabled:hover,.woocommerce a.button.alt:disabled[disabled],.woocommerce a.button.alt:disabled[disabled]:hover,.woocommerce button.button.alt.disabled,.woocommerce button.button.alt.disabled:hover,.woocommerce button.button.alt:disabled,.woocommerce button.button.alt:disabled:hover,.woocommerce button.button.alt:disabled[disabled],.woocommerce button.button.alt:disabled[disabled]:hover,.woocommerce input.button.alt.disabled,.woocommerce input.button.alt.disabled:hover,.woocommerce input.button.alt:disabled,.woocommerce input.button.alt:disabled:hover,.woocommerce input.button.alt:disabled[disabled],.woocommerce input.button.alt:disabled[disabled]:hover{background-color:#a46497;color:#fff}.woocommerce #respond input#submit.disabled,.woocommerce #respond input#submit:disabled,.woocommerce #respond input#submit:disabled[disabled],.woocommerce a.button.disabled,.woocommerce a.button:disabled,.woocommerce a.button:disabled[disabled],.woocommerce button.button.disabled,.woocommerce button.button:disabled,.woocommerce button.button:disabled[disabled],.woocommerce input.button.disabled,.woocommerce input.button:disabled,.woocommerce input.button:disabled[disabled]{color:inherit;cursor:not-allowed;opacity:.5;padding:.618em 1em}.woocommerce #respond input#submit.disabled:hover,.woocommerce #respond input#submit:disabled:hover,.woocommerce #respond input#submit:disabled[disabled]:hover,.woocommerce a.button.disabled:hover,.woocommerce a.button:disabled:hover,.woocommerce a.button:disabled[disabled]:hover,.woocommerce button.button.disabled:hover,.woocommerce button.button:disabled:hover,.woocommerce button.button:disabled[disabled]:hover,.woocommerce input.button.disabled:hover,.woocommerce input.button:disabled:hover,.woocommerce input.button:disabled[disabled]:hover{color:inherit;background-color:#ebe9eb}.woocommerce .cart .button,.woocommerce .cart input.button{float:none}.woocommerce a.added_to_cart{padding-top:.5em;display:inline-block}.woocommerce #reviews h2 small{float:right;color:#777;font-size:15px;margin:10px 0 0}.woocommerce #reviews h2 small a{text-decoration:none;color:#777}.woocommerce #reviews h3{margin:0}.woocommerce #reviews #respond{margin:0;border:0;padding:0}.woocommerce #reviews #comment{height:75px}.woocommerce #reviews #comments .add_review::after,.woocommerce #reviews #comments .add_review::before{content:' ';display:table}.woocommerce #reviews #comments .add_review::after{clear:both}.woocommerce #reviews #comments h2{clear:none}.woocommerce #reviews #comments ol.commentlist{margin:0;width:100%;background:0 0;list-style:none}.woocommerce #reviews #comments ol.commentlist::after,.woocommerce #reviews #comments ol.commentlist::before{content:' ';display:table}.woocommerce #reviews #comments ol.commentlist::after{clear:both}.woocommerce #reviews #comments ol.commentlist li{padding:0;margin:0 0 20px;border:0;position:relative;background:0;border:0}.woocommerce #reviews #comments ol.commentlist li .meta{color:#777;font-size:.75em}.woocommerce #reviews #comments ol.commentlist li img.avatar{float:left;position:absolute;top:0;left:0;padding:3px;width:32px;height:auto;background:#ebe9eb;border:1px solid #e4e1e3;margin:0;box-shadow:none}.woocommerce #reviews #comments ol.commentlist li .comment-text{margin:0 0 0 50px;border:1px solid #e4e1e3;border-radius:4px;padding:1em 1em 0}.woocommerce #reviews #comments ol.commentlist li .comment-text::after,.woocommerce #reviews #comments ol.commentlist li .comment-text::before{content:' ';display:table}.woocommerce #reviews #comments ol.commentlist li .comment-text::after{clear:both}.woocommerce #reviews #comments ol.commentlist li .comment-text p{margin:0 0 1em}.woocommerce #reviews #comments ol.commentlist li .comment-text p.meta{font-size:.83em}.woocommerce #reviews #comments ol.commentlist ul.children{list-style:none outside;margin:20px 0 0 50px}.woocommerce #reviews #comments ol.commentlist ul.children .star-rating{display:none}.woocommerce #reviews #comments ol.commentlist #respond{border:1px solid #e4e1e3;border-radius:4px;padding:1em 1em 0;margin:20px 0 0 50px}.woocommerce #reviews #comments .commentlist>li::before{content:''}.woocommerce .star-rating{float:right;overflow:hidden;position:relative;height:1em;line-height:1;font-size:1em;width:5.4em;font-family:star}.woocommerce .star-rating::before{content:'\73\73\73\73\73';color:#d3ced2;float:left;top:0;left:0;position:absolute}.woocommerce .star-rating span{overflow:hidden;float:left;top:0;left:0;position:absolute;padding-top:1.5em}.woocommerce .star-rating span::before{content:'\53\53\53\53\53';top:0;position:absolute;left:0}.woocommerce .woocommerce-product-rating{line-height:2;display:block}.woocommerce .woocommerce-product-rating::after,.woocommerce .woocommerce-product-rating::before{content:' ';display:table}.woocommerce .woocommerce-product-rating::after{clear:both}.woocommerce .woocommerce-product-rating .star-rating{margin:.5em 4px 0 0;float:left}.woocommerce .products .star-rating{display:block;margin:0 0 .5em;float:none}.woocommerce .hreview-aggregate .star-rating{margin:10px 0 0}.woocommerce #review_form #respond{position:static;margin:0;width:auto;padding:0;background:transparent none;border:0}.woocommerce #review_form #respond::after,.woocommerce #review_form #respond::before{content:' ';display:table}.woocommerce #review_form #respond::after{clear:both}.woocommerce #review_form #respond p{margin:0 0 10px}.woocommerce #review_form #respond .form-submit input{left:auto}.woocommerce #review_form #respond textarea{box-sizing:border-box;width:100%}.woocommerce p.stars a{position:relative;height:1em;width:1em;text-indent:-999em;display:inline-block;text-decoration:none}.woocommerce p.stars a::before{display:block;position:absolute;top:0;left:0;width:1em;height:1em;line-height:1;font-family:WooCommerce;content:'\e021';text-indent:0}.woocommerce p.stars a:hover~a::before{content:'\e021'}.woocommerce p.stars:hover a::before{content:'\e020'}.woocommerce p.stars.selected a.active::before{content:'\e020'}.woocommerce p.stars.selected a.active~a::before{content:'\e021'}.woocommerce p.stars.selected a:not(.active)::before{content:'\e020'}.woocommerce table.shop_attributes{border:0;border-top:1px dotted rgba(0,0,0,.1);margin-bottom:1.618em;width:100%}.woocommerce table.shop_attributes th{width:150px;font-weight:700;padding:8px;border-top:0;border-bottom:1px dotted rgba(0,0,0,.1);margin:0;line-height:1.5}.woocommerce table.shop_attributes td{font-style:italic;padding:0;border-top:0;border-bottom:1px dotted rgba(0,0,0,.1);margin:0;line-height:1.5}.woocommerce table.shop_attributes td p{margin:0;padding:8px 0}.woocommerce table.shop_attributes tr:nth-child(even) td,.woocommerce table.shop_attributes tr:nth-child(even) th{background:rgba(0,0,0,.025)}.woocommerce table.shop_table{border:1px solid rgba(0,0,0,.1);margin:0 -1px 24px 0;text-align:left;width:100%;border-collapse:separate;border-radius:5px}.woocommerce table.shop_table th{font-weight:700;padding:9px 12px;line-height:1.5em}.woocommerce table.shop_table td{border-top:1px solid rgba(0,0,0,.1);padding:9px 12px;vertical-align:middle;line-height:1.5em}.woocommerce table.shop_table td small{font-weight:400}.woocommerce table.shop_table tbody:first-child tr:first-child td,.woocommerce table.shop_table tbody:first-child tr:first-child th{border-top:0}.woocommerce table.shop_table tbody th,.woocommerce table.shop_table tfoot td,.woocommerce table.shop_table tfoot th{font-weight:700;border-top:1px solid rgba(0,0,0,.1)}.woocommerce table.my_account_orders{font-size:.85em}.woocommerce table.my_account_orders td,.woocommerce table.my_account_orders th{padding:4px 8px;vertical-align:middle}.woocommerce table.my_account_orders .button{white-space:nowrap}.woocommerce table.my_account_orders .order-actions{text-align:right}.woocommerce table.my_account_orders .order-actions .button{margin:.125em 0 .125em .25em}.woocommerce table.woocommerce-MyAccount-downloads td,.woocommerce table.woocommerce-MyAccount-downloads th{vertical-align:top;text-align:center}.woocommerce table.woocommerce-MyAccount-downloads td:first-child,.woocommerce table.woocommerce-MyAccount-downloads th:first-child{text-align:left}.woocommerce table.woocommerce-MyAccount-downloads td:last-child,.woocommerce table.woocommerce-MyAccount-downloads th:last-child{text-align:left}.woocommerce table.woocommerce-MyAccount-downloads td .woocommerce-MyAccount-downloads-file::before,.woocommerce table.woocommerce-MyAccount-downloads th .woocommerce-MyAccount-downloads-file::before{content:'\2193';display:inline-block}.woocommerce td.product-name .wc-item-meta,.woocommerce td.product-name dl.variation{list-style:none outside}.woocommerce td.product-name .wc-item-meta .wc-item-meta-label,.woocommerce td.product-name .wc-item-meta dt,.woocommerce td.product-name dl.variation .wc-item-meta-label,.woocommerce td.product-name dl.variation dt{float:left;clear:both;margin-right:.25em;display:inline-block;list-style:none outside}.woocommerce td.product-name .wc-item-meta dd,.woocommerce td.product-name dl.variation dd{margin:0}.woocommerce td.product-name .wc-item-meta p,.woocommerce td.product-name .wc-item-meta:last-child,.woocommerce td.product-name dl.variation p,.woocommerce td.product-name dl.variation:last-child{margin-bottom:0}.woocommerce td.product-name p.backorder_notification{font-size:.83em}.woocommerce td.product-quantity{min-width:80px}.woocommerce ul.cart_list,.woocommerce ul.product_list_widget{list-style:none outside;padding:0;margin:0}.woocommerce ul.cart_list li,.woocommerce ul.product_list_widget li{padding:4px 0;margin:0;list-style:none}.woocommerce ul.cart_list li::after,.woocommerce ul.cart_list li::before,.woocommerce ul.product_list_widget li::after,.woocommerce ul.product_list_widget li::before{content:' ';display:table}.woocommerce ul.cart_list li::after,.woocommerce ul.product_list_widget li::after{clear:both}.woocommerce ul.cart_list li a,.woocommerce ul.product_list_widget li a{display:block;font-weight:700}.woocommerce ul.cart_list li img,.woocommerce ul.product_list_widget li img{float:right;margin-left:4px;width:32px;height:auto;box-shadow:none}.woocommerce ul.cart_list li dl,.woocommerce ul.product_list_widget li dl{margin:0;padding-left:1em;border-left:2px solid rgba(0,0,0,.1)}.woocommerce ul.cart_list li dl::after,.woocommerce ul.cart_list li dl::before,.woocommerce ul.product_list_widget li dl::after,.woocommerce ul.product_list_widget li dl::before{content:' ';display:table}.woocommerce ul.cart_list li dl::after,.woocommerce ul.product_list_widget li dl::after{clear:both}.woocommerce ul.cart_list li dl dd,.woocommerce ul.cart_list li dl dt,.woocommerce ul.product_list_widget li dl dd,.woocommerce ul.product_list_widget li dl dt{display:inline-block;float:left;margin-bottom:1em}.woocommerce ul.cart_list li dl dt,.woocommerce ul.product_list_widget li dl dt{font-weight:700;padding:0 0 .25em;margin:0 4px 0 0;clear:left}.woocommerce ul.cart_list li dl dd,.woocommerce ul.product_list_widget li dl dd{padding:0 0 .25em}.woocommerce ul.cart_list li dl dd p:last-child,.woocommerce ul.product_list_widget li dl dd p:last-child{margin-bottom:0}.woocommerce ul.cart_list li .star-rating,.woocommerce ul.product_list_widget li .star-rating{float:none}.woocommerce .widget_shopping_cart .total,.woocommerce.widget_shopping_cart .total{border-top:3px double #ebe9eb;padding:4px 0 0}.woocommerce .widget_shopping_cart .total strong,.woocommerce.widget_shopping_cart .total strong{min-width:40px;display:inline-block}.woocommerce .widget_shopping_cart .cart_list li,.woocommerce.widget_shopping_cart .cart_list li{padding-left:2em;position:relative;padding-top:0}.woocommerce .widget_shopping_cart .cart_list li a.remove,.woocommerce.widget_shopping_cart .cart_list li a.remove{position:absolute;top:0;left:0}.woocommerce .widget_shopping_cart .buttons::after,.woocommerce .widget_shopping_cart .buttons::before,.woocommerce.widget_shopping_cart .buttons::after,.woocommerce.widget_shopping_cart .buttons::before{content:' ';display:table}.woocommerce .widget_shopping_cart .buttons::after,.woocommerce.widget_shopping_cart .buttons::after{clear:both}.woocommerce .widget_shopping_cart .buttons a,.woocommerce.widget_shopping_cart .buttons a{margin-right:5px;margin-bottom:5px}.woocommerce form .form-row{padding:3px;margin:0 0 6px}.woocommerce form .form-row [placeholder]:focus::-webkit-input-placeholder{-webkit-transition:opacity .5s .5s ease;transition:opacity .5s .5s ease;opacity:0}.woocommerce form .form-row label{line-height:2}.woocommerce form .form-row label.hidden{visibility:hidden}.woocommerce form .form-row label.inline{display:inline}.woocommerce form .form-row .woocommerce-input-wrapper .description{background:#1e85be;color:#fff;border-radius:3px;padding:1em;margin:.5em 0 0;clear:both;display:none;position:relative}.woocommerce form .form-row .woocommerce-input-wrapper .description a{color:#fff;text-decoration:underline;border:0;box-shadow:none}.woocommerce form .form-row .woocommerce-input-wrapper .description:before{left:50%;top:0;margin-top:-4px;-webkit-transform:translatex(-50%) rotate(180deg);-ms-transform:translatex(-50%) rotate(180deg);transform:translatex(-50%) rotate(180deg);content:"";position:absolute;border-width:4px 6px 0 6px;border-style:solid;border-color:#1e85be transparent transparent transparent;z-index:100;display:block}.woocommerce form .form-row select{cursor:pointer;margin:0}.woocommerce form .form-row .required{color:red;font-weight:700;border:0!important;text-decoration:none;visibility:hidden}.woocommerce form .form-row .optional{visibility:visible}.woocommerce form .form-row .input-checkbox{display:inline;margin:-2px 8px 0 0;text-align:center;vertical-align:middle}.woocommerce form .form-row input.input-text,.woocommerce form .form-row textarea{box-sizing:border-box;width:100%;margin:0;outline:0;line-height:normal}.woocommerce form .form-row textarea{height:4em;line-height:1.5;display:block;box-shadow:none}.woocommerce form .form-row .select2-container{width:100%;line-height:2em}.woocommerce form .form-row.woocommerce-invalid label{color:#a00}.woocommerce form .form-row.woocommerce-invalid .select2-container,.woocommerce form .form-row.woocommerce-invalid input.input-text,.woocommerce form .form-row.woocommerce-invalid select{border-color:#a00}.woocommerce form .form-row.woocommerce-validated .select2-container,.woocommerce form .form-row.woocommerce-validated input.input-text,.woocommerce form .form-row.woocommerce-validated select{border-color:#69bf29}.woocommerce form .form-row ::-webkit-input-placeholder{line-height:normal}.woocommerce form .form-row :-moz-placeholder{line-height:normal}.woocommerce form .form-row :-ms-input-placeholder{line-height:normal}.woocommerce form.checkout_coupon,.woocommerce form.login,.woocommerce form.register{border:1px solid #d3ced2;padding:20px;margin:2em 0;text-align:left;border-radius:5px}.woocommerce ul#shipping_method{list-style:none outside;margin:0;padding:0}.woocommerce ul#shipping_method li{margin:0 0 .5em;line-height:1.5em;list-style:none outside}.woocommerce ul#shipping_method li input{margin:3px .4375em 0 0;vertical-align:top}.woocommerce ul#shipping_method li label{display:inline}.woocommerce ul#shipping_method .amount{font-weight:700}.woocommerce p.woocommerce-shipping-contents{margin:0}.woocommerce ul.order_details{margin:0 0 3em;list-style:none}.woocommerce ul.order_details::after,.woocommerce ul.order_details::before{content:' ';display:table}.woocommerce ul.order_details::after{clear:both}.woocommerce ul.order_details li{float:left;margin-right:2em;text-transform:uppercase;font-size:.715em;line-height:1;border-right:1px dashed #d3ced2;padding-right:2em;margin-left:0;padding-left:0;list-style-type:none}.woocommerce ul.order_details li strong{display:block;font-size:1.4em;text-transform:none;line-height:1.5}.woocommerce ul.order_details li:last-of-type{border:none}.woocommerce .wc-bacs-bank-details-account-name{font-weight:700}.woocommerce .woocommerce-customer-details,.woocommerce .woocommerce-order-details,.woocommerce .woocommerce-order-downloads{margin-bottom:2em}.woocommerce .woocommerce-customer-details :last-child,.woocommerce .woocommerce-order-details :last-child,.woocommerce .woocommerce-order-downloads :last-child{margin-bottom:0}.woocommerce .woocommerce-customer-details address{font-style:normal;margin-bottom:0;border:1px solid rgba(0,0,0,.1);border-bottom-width:2px;border-right-width:2px;text-align:left;width:100%;border-radius:5px;padding:6px 12px}.woocommerce .woocommerce-customer-details .woocommerce-customer-details--email,.woocommerce .woocommerce-customer-details .woocommerce-customer-details--phone{margin-bottom:0;padding-left:1.5em}.woocommerce .woocommerce-customer-details .woocommerce-customer-details--phone::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-right:.618em;content:"";text-decoration:none;margin-left:-1.5em;line-height:1.75;position:absolute}.woocommerce .woocommerce-customer-details .woocommerce-customer-details--email::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-right:.618em;content:"";text-decoration:none;margin-left:-1.5em;line-height:1.75;position:absolute}.woocommerce .woocommerce-widget-layered-nav-list{margin:0;padding:0;border:0;list-style:none outside}.woocommerce .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item{padding:0 0 1px;list-style:none}.woocommerce .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item::after,.woocommerce .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item::before{content:' ';display:table}.woocommerce .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item::after{clear:both}.woocommerce .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item a,.woocommerce .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item span{padding:1px 0}.woocommerce .woocommerce-widget-layered-nav-list .woocommerce-widget-layered-nav-list__item--chosen a::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-right:.618em;content:"";text-decoration:none;color:#a00}.woocommerce .woocommerce-widget-layered-nav-dropdown__submit{margin-top:1em}.woocommerce .widget_layered_nav_filters ul{margin:0;padding:0;border:0;list-style:none outside;overflow:hidden;zoom:1}.woocommerce .widget_layered_nav_filters ul li{float:left;padding:0 1em 1px 1px;list-style:none}.woocommerce .widget_layered_nav_filters ul li a{text-decoration:none}.woocommerce .widget_layered_nav_filters ul li a::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-right:.618em;content:"";text-decoration:none;color:#a00;vertical-align:inherit;margin-right:.5em}.woocommerce .widget_price_filter .price_slider{margin-bottom:1em}.woocommerce .widget_price_filter .price_slider_amount{text-align:right;line-height:2.4;font-size:.8751em}.woocommerce .widget_price_filter .price_slider_amount .button{font-size:1.15em;float:left}.woocommerce .widget_price_filter .ui-slider{position:relative;text-align:left;margin-left:.5em;margin-right:.5em}.woocommerce .widget_price_filter .ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1em;height:1em;background-color:#a46497;border-radius:1em;cursor:ew-resize;outline:0;top:-.3em;margin-left:-.5em}.woocommerce .widget_price_filter .ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;border-radius:1em;background-color:#a46497}.woocommerce .widget_price_filter .price_slider_wrapper .ui-widget-content{border-radius:1em;background-color:#602053;border:0}.woocommerce .widget_price_filter .ui-slider-horizontal{height:.5em}.woocommerce .widget_price_filter .ui-slider-horizontal .ui-slider-range{top:0;height:100%}.woocommerce .widget_price_filter .ui-slider-horizontal .ui-slider-range-min{left:-1px}.woocommerce .widget_price_filter .ui-slider-horizontal .ui-slider-range-max{right:-1px}.woocommerce .widget_rating_filter ul{margin:0;padding:0;border:0;list-style:none outside}.woocommerce .widget_rating_filter ul li{padding:0 0 1px;list-style:none}.woocommerce .widget_rating_filter ul li::after,.woocommerce .widget_rating_filter ul li::before{content:' ';display:table}.woocommerce .widget_rating_filter ul li::after{clear:both}.woocommerce .widget_rating_filter ul li a{padding:1px 0;text-decoration:none}.woocommerce .widget_rating_filter ul li .star-rating{float:none;display:inline-block}.woocommerce .widget_rating_filter ul li.chosen a::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-right:.618em;content:"";text-decoration:none;color:#a00}.woocommerce-no-js form.woocommerce-form-coupon,.woocommerce-no-js form.woocommerce-form-login{display:block!important}.woocommerce-no-js .showcoupon,.woocommerce-no-js .woocommerce-form-coupon-toggle,.woocommerce-no-js .woocommerce-form-login-toggle{display:none!important}.woocommerce-error,.woocommerce-info,.woocommerce-message{padding:1em 2em 1em 3.5em;margin:0 0 2em;position:relative;background-color:#f7f6f7;color:#515151;border-top:3px solid #a46497;list-style:none outside;width:auto;word-wrap:break-word}.woocommerce-error::after,.woocommerce-error::before,.woocommerce-info::after,.woocommerce-info::before,.woocommerce-message::after,.woocommerce-message::before{content:' ';display:table}.woocommerce-error::after,.woocommerce-info::after,.woocommerce-message::after{clear:both}.woocommerce-error::before,.woocommerce-info::before,.woocommerce-message::before{font-family:WooCommerce;content:'\e028';display:inline-block;position:absolute;top:1em;left:1.5em}.woocommerce-error .button,.woocommerce-info .button,.woocommerce-message .button{float:right}.woocommerce-error li,.woocommerce-info li,.woocommerce-message li{list-style:none outside!important;padding-left:0!important;margin-left:0!important}.rtl.woocommerce .price_label,.rtl.woocommerce .price_label span{direction:ltr;unicode-bidi:embed}.woocommerce-message{border-top-color:#8fae1b}.woocommerce-message::before{content:'\e015';color:#8fae1b}.woocommerce-info{border-top-color:#1e85be}.woocommerce-info::before{color:#1e85be}.woocommerce-error{border-top-color:#b81c23}.woocommerce-error::before{content:'\e016';color:#b81c23}.woocommerce-account .woocommerce::after,.woocommerce-account .woocommerce::before{content:' ';display:table}.woocommerce-account .woocommerce::after{clear:both}.woocommerce-account .addresses .title::after,.woocommerce-account .addresses .title::before{content:' ';display:table}.woocommerce-account .addresses .title::after{clear:both}.woocommerce-account .addresses .title h3{float:left}.woocommerce-account .addresses .title .edit{float:right}.woocommerce-account ol.commentlist.notes li.note p.meta{font-weight:700;margin-bottom:0}.woocommerce-account ol.commentlist.notes li.note .description p:last-child{margin-bottom:0}.woocommerce-account ul.digital-downloads{margin-left:0;padding-left:0}.woocommerce-account ul.digital-downloads li{list-style:none;margin-left:0;padding-left:0}.woocommerce-account ul.digital-downloads li::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-right:.618em;content:"";text-decoration:none}.woocommerce-account ul.digital-downloads li .count{float:right}#add_payment_method table.cart .product-thumbnail,.woocommerce-cart table.cart .product-thumbnail,.woocommerce-checkout table.cart .product-thumbnail{min-width:32px}#add_payment_method table.cart img,.woocommerce-cart table.cart img,.woocommerce-checkout table.cart img{width:32px;box-shadow:none}#add_payment_method table.cart td,#add_payment_method table.cart th,.woocommerce-cart table.cart td,.woocommerce-cart table.cart th,.woocommerce-checkout table.cart td,.woocommerce-checkout table.cart th{vertical-align:middle}#add_payment_method table.cart td.actions .coupon .input-text,.woocommerce-cart table.cart td.actions .coupon .input-text,.woocommerce-checkout table.cart td.actions .coupon .input-text{float:left;box-sizing:border-box;border:1px solid #d3ced2;padding:6px 6px 5px;margin:0 4px 0 0;outline:0}#add_payment_method table.cart input,.woocommerce-cart table.cart input,.woocommerce-checkout table.cart input{margin:0;vertical-align:middle}#add_payment_method .wc-proceed-to-checkout,.woocommerce-cart .wc-proceed-to-checkout,.woocommerce-checkout .wc-proceed-to-checkout{padding:1em 0}#add_payment_method .wc-proceed-to-checkout::after,#add_payment_method .wc-proceed-to-checkout::before,.woocommerce-cart .wc-proceed-to-checkout::after,.woocommerce-cart .wc-proceed-to-checkout::before,.woocommerce-checkout .wc-proceed-to-checkout::after,.woocommerce-checkout .wc-proceed-to-checkout::before{content:' ';display:table}#add_payment_method .wc-proceed-to-checkout::after,.woocommerce-cart .wc-proceed-to-checkout::after,.woocommerce-checkout .wc-proceed-to-checkout::after{clear:both}#add_payment_method .wc-proceed-to-checkout a.checkout-button,.woocommerce-cart .wc-proceed-to-checkout a.checkout-button,.woocommerce-checkout .wc-proceed-to-checkout a.checkout-button{display:block;text-align:center;margin-bottom:1em;font-size:1.25em;padding:1em}#add_payment_method .cart-collaterals .shipping-calculator-button,.woocommerce-cart .cart-collaterals .shipping-calculator-button,.woocommerce-checkout .cart-collaterals .shipping-calculator-button{float:none;margin-top:.5em;display:inline-block}#add_payment_method .cart-collaterals .shipping-calculator-button::after,.woocommerce-cart .cart-collaterals .shipping-calculator-button::after,.woocommerce-checkout .cart-collaterals .shipping-calculator-button::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-left:.618em;content:"";text-decoration:none}#add_payment_method .cart-collaterals .shipping-calculator-form,.woocommerce-cart .cart-collaterals .shipping-calculator-form,.woocommerce-checkout .cart-collaterals .shipping-calculator-form{margin:1em 0 0 0}#add_payment_method .cart-collaterals .cart_totals p small,.woocommerce-cart .cart-collaterals .cart_totals p small,.woocommerce-checkout .cart-collaterals .cart_totals p small{color:#777;font-size:.83em}#add_payment_method .cart-collaterals .cart_totals table,.woocommerce-cart .cart-collaterals .cart_totals table,.woocommerce-checkout .cart-collaterals .cart_totals table{border-collapse:separate;margin:0 0 6px;padding:0}#add_payment_method .cart-collaterals .cart_totals table tr:first-child td,#add_payment_method .cart-collaterals .cart_totals table tr:first-child th,.woocommerce-cart .cart-collaterals .cart_totals table tr:first-child td,.woocommerce-cart .cart-collaterals .cart_totals table tr:first-child th,.woocommerce-checkout .cart-collaterals .cart_totals table tr:first-child td,.woocommerce-checkout .cart-collaterals .cart_totals table tr:first-child th{border-top:0}#add_payment_method .cart-collaterals .cart_totals table th,.woocommerce-cart .cart-collaterals .cart_totals table th,.woocommerce-checkout .cart-collaterals .cart_totals table th{width:35%}#add_payment_method .cart-collaterals .cart_totals table td,#add_payment_method .cart-collaterals .cart_totals table th,.woocommerce-cart .cart-collaterals .cart_totals table td,.woocommerce-cart .cart-collaterals .cart_totals table th,.woocommerce-checkout .cart-collaterals .cart_totals table td,.woocommerce-checkout .cart-collaterals .cart_totals table th{vertical-align:top;border-left:0;border-right:0;line-height:1.5em}#add_payment_method .cart-collaterals .cart_totals table small,.woocommerce-cart .cart-collaterals .cart_totals table small,.woocommerce-checkout .cart-collaterals .cart_totals table small{color:#777}#add_payment_method .cart-collaterals .cart_totals table select,.woocommerce-cart .cart-collaterals .cart_totals table select,.woocommerce-checkout .cart-collaterals .cart_totals table select{width:100%}#add_payment_method .cart-collaterals .cart_totals .discount td,.woocommerce-cart .cart-collaterals .cart_totals .discount td,.woocommerce-checkout .cart-collaterals .cart_totals .discount td{color:#77a464}#add_payment_method .cart-collaterals .cart_totals tr td,#add_payment_method .cart-collaterals .cart_totals tr th,.woocommerce-cart .cart-collaterals .cart_totals tr td,.woocommerce-cart .cart-collaterals .cart_totals tr th,.woocommerce-checkout .cart-collaterals .cart_totals tr td,.woocommerce-checkout .cart-collaterals .cart_totals tr th{border-top:1px solid #ebe9eb}#add_payment_method .cart-collaterals .cart_totals .woocommerce-shipping-destination,.woocommerce-cart .cart-collaterals .cart_totals .woocommerce-shipping-destination,.woocommerce-checkout .cart-collaterals .cart_totals .woocommerce-shipping-destination{margin-bottom:0}#add_payment_method .cart-collaterals .cross-sells ul.products li.product,.woocommerce-cart .cart-collaterals .cross-sells ul.products li.product,.woocommerce-checkout .cart-collaterals .cross-sells ul.products li.product{margin-top:0}#add_payment_method .checkout .col-2 h3#ship-to-different-address,.woocommerce-cart .checkout .col-2 h3#ship-to-different-address,.woocommerce-checkout .checkout .col-2 h3#ship-to-different-address{float:left;clear:none}#add_payment_method .checkout .col-2 .notes,.woocommerce-cart .checkout .col-2 .notes,.woocommerce-checkout .checkout .col-2 .notes{clear:left}#add_payment_method .checkout .col-2 .form-row-first,.woocommerce-cart .checkout .col-2 .form-row-first,.woocommerce-checkout .checkout .col-2 .form-row-first{clear:left}#add_payment_method .checkout .create-account small,.woocommerce-cart .checkout .create-account small,.woocommerce-checkout .checkout .create-account small{font-size:11px;color:#777;font-weight:400}#add_payment_method .checkout div.shipping-address,.woocommerce-cart .checkout div.shipping-address,.woocommerce-checkout .checkout div.shipping-address{padding:0;clear:left;width:100%}#add_payment_method .checkout .shipping_address,.woocommerce-cart .checkout .shipping_address,.woocommerce-checkout .checkout .shipping_address{clear:both}#add_payment_method #payment,.woocommerce-cart #payment,.woocommerce-checkout #payment{background:#ebe9eb;border-radius:5px}#add_payment_method #payment ul.payment_methods,.woocommerce-cart #payment ul.payment_methods,.woocommerce-checkout #payment ul.payment_methods{text-align:left;padding:1em;border-bottom:1px solid #d3ced2;margin:0;list-style:none outside}#add_payment_method #payment ul.payment_methods::after,#add_payment_method #payment ul.payment_methods::before,.woocommerce-cart #payment ul.payment_methods::after,.woocommerce-cart #payment ul.payment_methods::before,.woocommerce-checkout #payment ul.payment_methods::after,.woocommerce-checkout #payment ul.payment_methods::before{content:' ';display:table}#add_payment_method #payment ul.payment_methods::after,.woocommerce-cart #payment ul.payment_methods::after,.woocommerce-checkout #payment ul.payment_methods::after{clear:both}#add_payment_method #payment ul.payment_methods li,.woocommerce-cart #payment ul.payment_methods li,.woocommerce-checkout #payment ul.payment_methods li{line-height:2;text-align:left;margin:0;font-weight:400}#add_payment_method #payment ul.payment_methods li input,.woocommerce-cart #payment ul.payment_methods li input,.woocommerce-checkout #payment ul.payment_methods li input{margin:0 1em 0 0}#add_payment_method #payment ul.payment_methods li img,.woocommerce-cart #payment ul.payment_methods li img,.woocommerce-checkout #payment ul.payment_methods li img{vertical-align:middle;margin:-2px 0 0 .5em;padding:0;position:relative;box-shadow:none}#add_payment_method #payment ul.payment_methods li img+img,.woocommerce-cart #payment ul.payment_methods li img+img,.woocommerce-checkout #payment ul.payment_methods li img+img{margin-left:2px}#add_payment_method #payment ul.payment_methods li:not(.woocommerce-notice)::after,#add_payment_method #payment ul.payment_methods li:not(.woocommerce-notice)::before,.woocommerce-cart #payment ul.payment_methods li:not(.woocommerce-notice)::after,.woocommerce-cart #payment ul.payment_methods li:not(.woocommerce-notice)::before,.woocommerce-checkout #payment ul.payment_methods li:not(.woocommerce-notice)::after,.woocommerce-checkout #payment ul.payment_methods li:not(.woocommerce-notice)::before{content:' ';display:table}#add_payment_method #payment ul.payment_methods li:not(.woocommerce-notice)::after,.woocommerce-cart #payment ul.payment_methods li:not(.woocommerce-notice)::after,.woocommerce-checkout #payment ul.payment_methods li:not(.woocommerce-notice)::after{clear:both}#add_payment_method #payment div.form-row,.woocommerce-cart #payment div.form-row,.woocommerce-checkout #payment div.form-row{padding:1em}#add_payment_method #payment div.payment_box,.woocommerce-cart #payment div.payment_box,.woocommerce-checkout #payment div.payment_box{position:relative;box-sizing:border-box;width:100%;padding:1em;margin:1em 0;font-size:.92em;border-radius:2px;line-height:1.5;background-color:#dfdcde;color:#515151}#add_payment_method #payment div.payment_box input.input-text,#add_payment_method #payment div.payment_box textarea,.woocommerce-cart #payment div.payment_box input.input-text,.woocommerce-cart #payment div.payment_box textarea,.woocommerce-checkout #payment div.payment_box input.input-text,.woocommerce-checkout #payment div.payment_box textarea{border-color:#c7c1c6;border-top-color:#bbb3b9}#add_payment_method #payment div.payment_box ::-webkit-input-placeholder,.woocommerce-cart #payment div.payment_box ::-webkit-input-placeholder,.woocommerce-checkout #payment div.payment_box ::-webkit-input-placeholder{color:#bbb3b9}#add_payment_method #payment div.payment_box :-moz-placeholder,.woocommerce-cart #payment div.payment_box :-moz-placeholder,.woocommerce-checkout #payment div.payment_box :-moz-placeholder{color:#bbb3b9}#add_payment_method #payment div.payment_box :-ms-input-placeholder,.woocommerce-cart #payment div.payment_box :-ms-input-placeholder,.woocommerce-checkout #payment div.payment_box :-ms-input-placeholder{color:#bbb3b9}#add_payment_method #payment div.payment_box .woocommerce-SavedPaymentMethods,.woocommerce-cart #payment div.payment_box .woocommerce-SavedPaymentMethods,.woocommerce-checkout #payment div.payment_box .woocommerce-SavedPaymentMethods{list-style:none outside;margin:0}#add_payment_method #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-new,#add_payment_method #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-token,.woocommerce-cart #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-new,.woocommerce-cart #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-token,.woocommerce-checkout #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-new,.woocommerce-checkout #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-token{margin:0 0 .5em}#add_payment_method #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-new label,#add_payment_method #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-token label,.woocommerce-cart #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-new label,.woocommerce-cart #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-token label,.woocommerce-checkout #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-new label,.woocommerce-checkout #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-token label{cursor:pointer}#add_payment_method #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-tokenInput,.woocommerce-cart #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-tokenInput,.woocommerce-checkout #payment div.payment_box .woocommerce-SavedPaymentMethods .woocommerce-SavedPaymentMethods-tokenInput{vertical-align:middle;margin:-3px 1em 0 0;position:relative}#add_payment_method #payment div.payment_box .wc-credit-card-form,.woocommerce-cart #payment div.payment_box .wc-credit-card-form,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form{border:0;padding:0;margin:1em 0 0}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number{font-size:1.5em;padding:8px;background-repeat:no-repeat;background-position:right .618em center;background-size:32px 20px}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.visa,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.visa,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.visa,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.visa,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.visa,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.visa,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.visa,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.visa,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.visa{background-image:url(../images/icons/credit-cards/visa.svg)}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.mastercard,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.mastercard,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.mastercard,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.mastercard,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.mastercard,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.mastercard,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.mastercard,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.mastercard,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.mastercard{background-image:url(../images/icons/credit-cards/mastercard.svg)}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.laser,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.laser,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.laser,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.laser,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.laser,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.laser,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.laser,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.laser,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.laser{background-image:url(../images/icons/credit-cards/laser.svg)}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.dinersclub,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.dinersclub,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.dinersclub,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.dinersclub,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.dinersclub,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.dinersclub,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.dinersclub,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.dinersclub,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.dinersclub{background-image:url(../images/icons/credit-cards/diners.svg)}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.maestro,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.maestro,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.maestro,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.maestro,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.maestro,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.maestro,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.maestro,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.maestro,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.maestro{background-image:url(../images/icons/credit-cards/maestro.svg)}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.jcb,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.jcb,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.jcb,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.jcb,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.jcb,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.jcb,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.jcb,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.jcb,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.jcb{background-image:url(../images/icons/credit-cards/jcb.svg)}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.amex,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.amex,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.amex,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.amex,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.amex,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.amex,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.amex,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.amex,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.amex{background-image:url(../images/icons/credit-cards/amex.svg)}#add_payment_method #payment div.payment_box .wc-credit-card-form-card-cvc.discover,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-expiry.discover,#add_payment_method #payment div.payment_box .wc-credit-card-form-card-number.discover,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-cvc.discover,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-expiry.discover,.woocommerce-cart #payment div.payment_box .wc-credit-card-form-card-number.discover,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-cvc.discover,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-expiry.discover,.woocommerce-checkout #payment div.payment_box .wc-credit-card-form-card-number.discover{background-image:url(../images/icons/credit-cards/discover.svg)}#add_payment_method #payment div.payment_box span.help,.woocommerce-cart #payment div.payment_box span.help,.woocommerce-checkout #payment div.payment_box span.help{font-size:.857em;color:#777;font-weight:400}#add_payment_method #payment div.payment_box .form-row,.woocommerce-cart #payment div.payment_box .form-row,.woocommerce-checkout #payment div.payment_box .form-row{margin:0 0 1em}#add_payment_method #payment div.payment_box p:last-child,.woocommerce-cart #payment div.payment_box p:last-child,.woocommerce-checkout #payment div.payment_box p:last-child{margin-bottom:0}#add_payment_method #payment div.payment_box::before,.woocommerce-cart #payment div.payment_box::before,.woocommerce-checkout #payment div.payment_box::before{content:'';display:block;border:1em solid #dfdcde;border-right-color:transparent;border-left-color:transparent;border-top-color:transparent;position:absolute;top:-.75em;left:0;margin:-1em 0 0 2em}#add_payment_method #payment .payment_method_paypal .about_paypal,.woocommerce-cart #payment .payment_method_paypal .about_paypal,.woocommerce-checkout #payment .payment_method_paypal .about_paypal{float:right;line-height:52px;font-size:.83em}#add_payment_method #payment .payment_method_paypal img,.woocommerce-cart #payment .payment_method_paypal img,.woocommerce-checkout #payment .payment_method_paypal img{max-height:52px;vertical-align:middle}.woocommerce-terms-and-conditions{border:1px solid rgba(0,0,0,.2);box-shadow:inset 0 1px 2px rgba(0,0,0,.1);background:rgba(0,0,0,.05)}.woocommerce-invalid #terms{outline:2px solid red;outline-offset:2px}.woocommerce-password-strength{text-align:center;font-weight:600;padding:3px .5em;font-size:1em}.woocommerce-password-strength.strong{background-color:#c1e1b9;border-color:#83c373}.woocommerce-password-strength.short{background-color:#f1adad;border-color:#e35b5b}.woocommerce-password-strength.bad{background-color:#fbc5a9;border-color:#f78b53}.woocommerce-password-strength.good{background-color:#ffe399;border-color:#ffc733}.woocommerce-password-hint{margin:.5em 0 0;display:block}#content.twentyeleven .woocommerce-pagination a{font-size:1em;line-height:1}.single-product .twentythirteen #reply-title,.single-product .twentythirteen #respond #commentform,.single-product .twentythirteen .entry-summary{padding:0}.single-product .twentythirteen p.stars{clear:both}.twentythirteen .woocommerce-breadcrumb{padding-top:40px}.twentyfourteen ul.products li.product{margin-top:0!important}body:not(.search-results) .twentysixteen .entry-summary{color:inherit;font-size:inherit;line-height:inherit}.twentysixteen .price ins{background:inherit;color:inherit} \ No newline at end of file From 67b46aadf88b9e2baf7b0ebccdae9448e4f306cb Mon Sep 17 00:00:00 2001 From: Gerhard Potgieter Date: Thu, 19 Jul 2018 14:12:12 +0200 Subject: [PATCH 140/984] Include postcss task in the watch to be the same as grunt css --- Gruntfile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gruntfile.js b/Gruntfile.js index a19b32a236a..df897dae4d8 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -164,7 +164,7 @@ module.exports = function( grunt ) { watch: { css: { files: ['<%= dirs.css %>/*.scss'], - tasks: ['sass', 'rtlcss', 'cssmin', 'concat'] + tasks: ['sass', 'rtlcss', 'postcss', 'cssmin', 'concat'] }, js: { files: [ From fb9aa71b336b04183b27a1cce8cb2a041fe4c18c Mon Sep 17 00:00:00 2001 From: Rodrigo Primo Date: Thu, 19 Jul 2018 09:59:39 -0300 Subject: [PATCH 141/984] Undoing DB changes on tearDown() is not necessary WP test suite starts a transaction when the test starts and roll it back when the test finishes. So it is not necessary to undo database changes using tearDown(). --- tests/unit-tests/formatting/functions.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tests/unit-tests/formatting/functions.php b/tests/unit-tests/formatting/functions.php index dd71af63365..7040792e49e 100644 --- a/tests/unit-tests/formatting/functions.php +++ b/tests/unit-tests/formatting/functions.php @@ -12,12 +12,6 @@ */ class WC_Tests_Formatting_Functions extends WC_Unit_Test_Case { - public function tearDown() { - update_option( 'woocommerce_price_num_decimals', '2' ); - update_option( 'woocommerce_price_decimal_sep', '.' ); - update_option( 'woocommerce_price_thousand_sep', ',' ); - } - /** * Test wc_string_to_bool(). * From 1d13dd4dd47b45b85afb90b1090608c5ec9ac4ea Mon Sep 17 00:00:00 2001 From: Rodrigo Primo Date: Thu, 19 Jul 2018 10:26:52 -0300 Subject: [PATCH 142/984] Use an artificial HTTP response for wc_do_oembeds() test Doing this to speed up the test as an HTTP request to an external server is slow and also because it should fix this test that has been failing on Travis only for an unknown reason. --- tests/unit-tests/formatting/functions.php | 39 +++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/tests/unit-tests/formatting/functions.php b/tests/unit-tests/formatting/functions.php index 7040792e49e..608d30ab7b6 100644 --- a/tests/unit-tests/formatting/functions.php +++ b/tests/unit-tests/formatting/functions.php @@ -10,7 +10,14 @@ * * @since 2.2 */ -class WC_Tests_Formatting_Functions extends WC_Unit_Test_Case { +class WC_Tests_Formatting_Functions extends WP_HTTP_TestCase { + + public function setUp() { + parent::setUp(); + + // Callback used by WP_HTTP_TestCase to decide whether to perform HTTP requests or to provide a mocked response. + $this->http_responder = array( $this, 'mock_http_responses' ); + } /** * Test wc_string_to_bool(). @@ -890,7 +897,35 @@ class WC_Tests_Formatting_Functions extends WC_Unit_Test_Case { */ public function test_wc_do_oembeds() { // In this case should only return the URL back, since oEmbed will run other actions on frontend. - $this->assertEquals( "", wc_do_oembeds( 'https://wordpress.tv/2015/10/19/mike-jolley-user-onboarding-for-wordpress-plugins/' ) ); // phpcs:ignore + $this->assertEquals( + "", // phpcs:ignore WordPress.WP.EnqueuedResources.NonEnqueuedScript + wc_do_oembeds( 'https://wordpress.tv/2015/10/19/mike-jolley-user-onboarding-for-wordpress-plugins/' ) + ); + } + + /** + * Provides a mocked response for the oembed test. This way it is not necessary to perform + * a regular request to an external server which would significantly slow down the tests. + * + * This function is called by WP_HTTP_TestCase::http_request_listner(). + * + * @param array $request Request arguments. + * @param string $url URL of the request. + * + * @return array|false mocked response or false to let WP perform a regular request. + */ + protected function mock_http_responses( $request, $url ) { + $mocked_response = false; + + if ( false !== strpos( $url, 'https://wordpress.tv/oembed/' ) ) { + $mocked_response = array( + // phpcs:ignore WordPress.WP.EnqueuedResources.NonEnqueuedScript + 'body' => '{"type":"video","version":"1.0","title":null,"width":500,"height":281,"html":"", // phpcs:ignore WordPress.WP.EnqueuedResources.NonEnqueuedScript + wc_do_oembeds( 'https://wordpress.tv/2015/10/19/mike-jolley-user-onboarding-for-wordpress-plugins/' ) + ); + } + + /** + * Provides a mocked response for the oembed test. This way it is not necessary to perform + * a regular request to an external server which would significantly slow down the tests. + * + * This function is called by WP_HTTP_TestCase::http_request_listner(). + * + * @param array $request Request arguments. + * @param string $url URL of the request. + * + * @return array|false mocked response or false to let WP perform a regular request. + */ + protected function mock_http_responses( $request, $url ) { + $mocked_response = false; + + if ( false !== strpos( $url, 'https://wordpress.tv/oembed/' ) ) { + $mocked_response = array( + // phpcs:ignore WordPress.WP.EnqueuedResources.NonEnqueuedScript + 'body' => '{"type":"video","version":"1.0","title":null,"width":500,"height":281,"html":"