Файловый менеджер - Редактировать - /home/tuudkjt/globeasy/wp-includes/ID3/resources.zip
Назад
PK �A,]XV��: : views/storeadmin/cpt.twignu ��� <div class="wrap"> <div id="rvx-admin-cpt"></div> </div> PK �A,]m��O O $ views/storeadmin/reviewReminder.twignu ��� <div class="wrap"> <div id="rvx-admin-review-reminder-email"></div> </div> PK �A,]Q�LF F views/storeadmin/discount.twignu ��� <div class="wrap"> <div id="rvx-admin-review-discount"></div> </div> PK �A,]�$��M M views/storeadmin/settings.twignu ��� <div class="wrap"> <div id="rvx-admin-general-settings"></div> </div> PK �A,] v� # views/storeadmin/notice/notice.twignu ��� <div class="notice is-dismissible rvx-border-4 !rvx-border-l-primary rvx-border-solid rvx-admin-notice"> <div class="rvx-flex rvx-gap-space16 rvx-items-center"> <div class="rvx-p-space8"> <img src="https://cdn.reviewx.io/assets/reviewx-icon.png" alt="brand logo" height="50" width="50"> </div> <div class="rvx-my-space16"> <h2 class="!rvx-m-0">🎁 New Year Special – 40% Off ReviewX! 🔥</h2> <p>Enhance reviews and boost conversions with ReviewX. Start the new year with an exclusive 40% discount. Hurry, this special offer ends soon!</p> <div class="rvx-flex rvx-gap-space16"> <a href="https://reviewx.io/wp-new-year-deal" target="_blank" role="button" class="!rvx-py-space8 rvx-px-space16 rvx-bg-primary rvx-text-white rvx-rounded-md rvx-cursor-pointer rvx-no-underline rvx-font-medium hover:rvx-bg-primary-100 hover:rvx-text-white"> Grab The Deal 🎁 </a> <a href="#" role="button" data-action="dismiss" data-duration="30" class="!rvx-py-space8 rvx-px-space16 rvx-border rvx-border-primary rvx-border-solid rvx-rounded-md rvx-cursor-pointer rvx-no-underline rvx-font-medium rvx-text-neutral-700 js-dismiss-notice"> Remind me Later </a> </div> </div> </div> <script> (function () { const noticeElement = document.querySelector('.rvx-admin-notice'); const dismissButtons = document.querySelectorAll('.js-dismiss-notice'); const nonce = "{{ nonce }}"; // Use the nonce passed from PHP dismissButtons.forEach(button => { button.addEventListener('click', function (e) { e.preventDefault(); const action = button.getAttribute('data-action'); const duration = button.getAttribute('data-duration'); // 'permanent' or days // Perform AJAX request fetch(ajaxurl, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, body: new URLSearchParams({ action: 'rvx_dismiss_notice', duration: duration, nonce: nonce }), }) .then(response => response.json()) .then(data => { if (data.success) { noticeElement.style.display = 'none'; } else { alert(data.data.message || 'Failed to dismiss the notice.'); } }) .catch(() => alert('An error occurred. Please try again.')); }); }); })(); </script> </div> PK �A,]� L L # views/storeadmin/import-export.twignu ��� <div class="wrap"> <div id="rvx-admin-review-import-export"></div> </div>PK �A,]"�j? ? views/storeadmin/onboard.twignu ��� <div class="wrap"> <div id="rvx-admin-onboard"></div> </div> PK �A,]kk� � views/storeadmin/layout.twignu ��� <script> var _bearer_token = '{{ bearer_token() }}'; </script> <div id="master-layout"> {% block content %} {% endblock %} </div>PK �A,]��? ? views/storeadmin/index.twignu ��� <div class="wrap"> <div id="rvx-admin-reviews"></div> </div> PK �A,]�9�i@ @ views/storeadmin/dashboard.twignu ��� <div class="wrap"> <div id="rvx-admin-dashboard"></div> </div>PK �A,]�׆�� � views/storeadmin/rollback.twignu ��� <div class="p-6 bg-gray-100 rounded-lg shadow-md"> <h2 class="text-lg font-bold text-gray-800">{{ title }}</h2> <div id="rollback-start-btn" class="mt-4"> <div class="p-4 bg-white rounded-lg shadow-md"> <h3 class="text-md font-semibold text-red-600 mb-2">Important: Before Proceeding</h3> <ul class="list-disc list-inside text-gray-600 space-y-2"> <li><strong>Backup Your Data:</strong> Ensure your site and database are fully backed up to avoid data loss during the rollback.</li> <li><strong>Stable Internet Connection:</strong> Do not refresh or close this tab until the rollback is complete.</li> <li><strong>Disclaimer:</strong> By proceeding, you accept that ReviewX is not liable for issues during or after the rollback.</li> </ul> <p class="mt-4 text-gray-600"> By clicking "Start Rollback," you confirm you’ve read and accepted the terms above. </p> </div> <a href="{{ page_url }}&&rollback_start=1" class="button button-primary inline-block mt-4 px-4 py-2 bg-blue-600 text-white text-sm font-semibold rounded-md hover:bg-blue-700 transition" onclick="this.remove();"> Start Rollback </a> </div> </div> <script> document.addEventListener("DOMContentLoaded", function () { const urlParams = new URLSearchParams(window.location.search); if (urlParams.has('rollback_start')) { const rollbackBtn = document.getElementById('rollback-start-btn'); if (rollbackBtn) { rollbackBtn.remove(); } } }); </script> PK �A,]�{B B views/storeadmin/google.twignu ��� <div class="wrap"> <div id="rvx-admin-integration"></div> </div> PK �A,]���$ , views/storefront/my-account/review-form.twignu ��� <div x-data="__reviewXState__()" x-init="await initializeMyAccountReviewForm({data: '{{ data }}', formLevelData: '{{ formLevelData }}'})" @notify-close-success-modal="()=>{ showReviewSuccessModal = false; document.getElementById('reviewxForm')?.classList.add('hidden'); document.getElementById('isShowTable')?.classList.remove('hidden'); }"> {% include "storefront/widget/Features/ReviewForm/index.twig" %} {% include "storefront/widget/Features/Reviews/Modals/ReviewSuccessModal.twig" %} </div>PK �A,]��_I I 1 views/storefront/shortcode/reviewShowWIthIds.twignu ��� <div x-data="{ ...__reviewXState__(), // Spread the state from the function rawTitle: '{{ title }}', // Set the title from Twig }" id="review-withids-container" class="rvx-container rvx-mx-auto" x-init=" // Initialize the review list with review IDs await initializeReviewWithReviewIdsShortCodes({ data: '{{ data }}' }); " @notify-like-dislike="await fetchReviewListWithIdsShortCodes()"> <style> #rvx-review-withids .rvx-masonry-layout { columns: 4 300px; column-gap: 16px; } #rvx-review-withids p.rvx-review-user__name { margin-bottom: 0px; } #rvx-review-withids p { margin-bottom: 5px; } </style> <!-- Title --> <h2 x-show="rawTitle !== 'false'" x-cloak class="rvx-text-1xl rvx-font-bold rvx-mb-[10px!important] rvx-mt-[5px!important]" x-text="rawTitle"> </h2> <div id="rvx-review-withids" :class="`${layoutView === 'masonry' && 'rvx-masonry-layout' } ${layoutView === 'grid' && 'rvx-grid rvx-grid-cols-[repeat(auto-fill,minmax(320px,1fr))] rvx-gap-space12'} ${layoutView === 'list' && 'rvx-space-y-space12'} rvx-review-wrapper`"> <template x-for="review in reviewWithReviewIdsShortCodeData?.data?.reviews"> <div class="rvx-rounded-md rvx-shadow-100 rvx-bg-neutral-100 rvx-columns-box rvx-review-card" :class="`${(layoutView === 'masonry' || layoutView === 'grid') ? '' : 'rvx-py-space16 rvx-pl-space16 rvx-pr-[47px]'} ${review?.is_highlighted ? 'rvx-bg-primary-10 rvx-border rvx-border-l-4 rvx-border-primary-50 rvx-border-solid' : 'rvx-bg-neutral-100'}`"> {% include 'storefront/widget/Features/Reviews/ReviewCard.twig' %} </div> </template> </div> </div>PK �A,]0#��+ �+ 0 views/storefront/shortcode/googleReviewList.twignu ��� <div id="google-reviews-container" class="rvx-container rvx-mx-auto" x-data="{ rawTitle: '{{ title }}', // Set the title from Twig loadMore: '{{ loadMore }}', // Set loadMore from Twig showLoadMore: true // Default to true, will be evaluated in x-init }" x-init=" // Evaluate conditions on initialization showLoadMore = loadMore !== 'false' && loadMore.trim().toLowerCase() !== 'false'; "> <h2 x-show="rawTitle !== 'false'" x-cloak class="rvx-text-1xl rvx-font-bold rvx-mb-[10px!important] rvx-mt-[5px!important]" x-text="rawTitle"> </h2> <div id="review-list" class="rvx-grid rvx-gap-6"></div> <template x-if="showLoadMore"> <div class="rvx-mt-6 text-center"> <button id="load-more-btn" class="rvx-bg-blue-500 rvx-text-white rvx-py-2 rvx-px-4 rvx-rounded-lg rvx-font-semibold rvx-shadow-md hover:rvx-bg-blue-600"> Load More </button> </div> </template> </div> <script> document.addEventListener("DOMContentLoaded", function () { // Reviews data passed from backend const reviews = {{ content.reviews|json_encode|raw }}; const reviewList = document.getElementById("review-list"); // ---------------------------- // Helper functions // ---------------------------- // For boolean parameters (e.g. loadMore) function getBooleanParam(param) { // Check if the parameter is strictly false. if (param === false) return false; // Convert to a string, trim whitespace, and check if it equals "false" if (String(param).toLowerCase().trim() === "false") return false; // For any other value, return true. return true; } // For numeric parameters (or false) (e.g. truncateLimit) function getNumericParam(param) { // Explicitly check if the param is false. if (param === false || String(param).toLowerCase() === "false") { return false; } const parsedValue = parseInt(param, 10); return isNaN(parsedValue) ? false : parsedValue; } // ---------------------------- // Retrieve and process parameters // ---------------------------- // loadMore: expected to be true or false. const loadMoreRaw = {{ loadMore|json_encode|raw }}; const loadMoreEnabled = getBooleanParam(loadMoreRaw); // reviewLimit: determines how many reviews to show initially let reviewLimit = {{ reviewLimit|json_encode|raw }}; // Truncate limit for the review feedback. const truncateParamRaw = {{ truncateLimit|json_encode|raw }}; const truncateLimit = getNumericParam(truncateParamRaw); // Attempt to get the load more button element. const loadMoreBtn = document.getElementById("load-more-btn"); // ---------------------------- // Utility functions // ---------------------------- // Function to truncate text if a numeric limit is set. function truncateText(text, limit) { if (limit === false) return text; // full text if limit is false return text.length > limit ? text.slice(0, limit) + "..." : text; } // ---------------------------- // Rendering functions // ---------------------------- function renderReviews() { // Clear the list reviewList.innerHTML = ""; // Render only the reviews up to reviewLimit. reviews.slice(0, reviewLimit).forEach(review => { const reviewCard = document.createElement("div"); reviewCard.className = "rvx-bg-white rvx-rounded-lg rvx-shadow-md rvx-p-6 hover:rvx-shadow-lg rvx-transition-shadow"; const uid = review.uid; // Apply text truncation if needed. const feedback = truncateText(review.feedback, truncateLimit); reviewCard.innerHTML = ` <div class="rvx-flex rvx-items-center rvx-mb-4"> <img src="${review.avatar}" alt="Reviewer avatar" class="rvx-w-12 rvx-h-12 rvx-rounded-full rvx-object-cover rvx-mr-4"> <div> <h3 class="rvx-font-semibold rvx-text-lg">${review.reviewer_name}</h3> <div class="rvx-flex rvx-items-center"> <div class="rvx-flex rvx-text-yellow-400"> ${renderStarRating(review.rating)} </div> <span class="rvx-ml-2 rvx-text-sm rvx-text-gray-600"> ${review.rating}/5 </span> </div> </div> </div> <p class="rvx-text-gray-600 rvx-mb-4" id="feedback-${uid}">${feedback}</p> <div class="rvx-text-sm rvx-text-gray-500"> <span>${review.relative_time_description}</span> </div> `; reviewList.appendChild(reviewCard); }); // Update the "Load More" button's visibility. if (loadMoreEnabled && loadMoreBtn) { loadMoreBtn.style.display = reviewLimit >= reviews.length ? "none" : "block"; } } // Render star ratings function renderStarRating(rating) { let fullStars = Math.floor(rating); let halfStar = rating % 1 >= 0.3 && rating % 1 <= 0.7; let emptyStars = 5 - fullStars - (halfStar ? 1 : 0); let stars = ""; for (let i = 0; i < fullStars; i++) { stars += fullStarIcon(); } if (halfStar) { stars += halfStarIcon(); } for (let i = 0; i < emptyStars; i++) { stars += emptyStarIcon(); } return stars; } // Returns a full star SVG icon function fullStarIcon() { return ` <svg class="rvx-w-5 rvx-h-5 rvx-fill-current rvx-text-yellow-400" xmlns="http://www.w3.org/2000/svg" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality" fill-rule="evenodd" clip-rule="evenodd" viewBox="0 0 512 488.282"> <path fill="#FFD401" fill-rule="nonzero" d="M268.313 8.2l65.464 153.293 166.054 14.902c7.332.632 12.754 7.085 12.118 14.412a13.262 13.262 0 01-4.495 8.87v.006L381.835 309.374l37.159 162.59c1.646 7.181-2.848 14.336-10.03 15.981a13.308 13.308 0 01-10.273-1.84l-142.686-85.309-143.144 85.579c-6.312 3.777-14.492 1.716-18.274-4.602a13.278 13.278 0 01-1.554-9.809l-.016-.006 37.164-162.589L4.551 199.683c-5.536-4.845-6.103-13.263-1.252-18.804a13.281 13.281 0 019.313-4.527l165.611-14.859L243.73 8.119c2.887-6.777 10.722-9.933 17.493-7.052a13.31 13.31 0 017.09 7.133z"/> </svg> `; } // Returns a half star SVG icon function halfStarIcon() { return ` <svg class="rvx-w-5 rvx-h-5 rvx-fill-current rvx-text-yellow-400" xmlns="http://www.w3.org/2000/svg" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality" fill-rule="evenodd" clip-rule="evenodd" viewBox="0 0 512 489.217"> <path fill="#ffcf00" fill-rule="nonzero" d="M278.41 15.832l59.521 139.378 152.968 13.689c6.245.682 11.71 3.801 15.512 8.326 3.833 4.52 5.956 10.445 5.537 16.752l-.082.966c-.92 9.22-5.067 12.81-10.171 17.221-37.832 32.769-75.441 65.864-113.148 98.789l34.123 149.31a23.635 23.635 0 01-3.012 17.826c-6.983 11.214-21.979 14.531-33.038 7.284l-130.623-78.111-131.443 78.586a23.6 23.6 0 01-17.899 2.655 23.638 23.638 0 01-14.546-10.822c-3.114-5.201-4.122-11.503-2.768-17.418l34.112-149.316L8.094 210.227a23.58 23.58 0 01-8.042-16.219 23.627 23.627 0 015.801-17.134c4.122-4.835 10.206-7.722 16.534-8.068l151.666-13.596L234.21 14.365c2.552-6.007 7.329-10.418 12.96-12.691 9.272-3.719 20.501-1.121 26.88 6.607 1.927 2.329 3.188 4.793 4.36 7.551zm-22.428 5.946v361.888a10.84 10.84 0 015.609 1.544l136.982 81.887c.186.124.429.223.687.264.625.274 1.57-.31 1.875-.796l.041-.041c.238-.382.336-.894.222-1.395l-35.574-155.654c-.847-3.781.341-7.898 3.461-10.63 39.371-34.381 78.638-68.948 118.143-103.169 1.436-1.245 2.614-2.257 2.707-3.058.083-1.054-.574-1.901-1.643-1.993l-158.355-14.252c-4.128-.124-8.002-2.588-9.722-6.632L258.337 24.376c-.418-.992-.795-1.782-1.115-2.17-.439-.247-.703-.439-1.24-.428z"/> </svg> `; } // Returns a half star SVG icon function emptyStarIcon() { return ` <svg class="rvx-w-5 rvx-h-5 rvx-fill-current rvx-text-yellow-400" xmlns="http://www.w3.org/2000/svg" shape-rendering="geometricPrecision" text-rendering="geometricPrecision" image-rendering="optimizeQuality" fill-rule="evenodd" clip-rule="evenodd" viewBox="0 0 122.88 117.42"> <path d="M66.71 3.55L81.1 37.26l36.58 3.28v-.01c1.55.13 2.91.89 3.85 2.01a5.663 5.663 0 011.32 4.13v.01a5.673 5.673 0 01-1.69 3.57c-.12.13-.25.25-.39.36L93.25 74.64l8.19 35.83c.35 1.53.05 3.06-.73 4.29a5.652 5.652 0 01-3.54 2.52l-.14.03c-.71.14-1.43.15-2.12.02v.01c-.75-.13-1.47-.42-2.11-.84l-.05-.03-31.3-18.71-31.55 18.86a5.664 5.664 0 01-7.79-1.96c-.38-.64-.62-1.33-.73-2.02-.1-.63-.09-1.27.02-1.89.02-.13.04-.27.08-.4l8.16-35.7c-9.24-8.07-18.74-16.1-27.83-24.3l-.08-.08a5.64 5.64 0 01-1.72-3.7c-.1-1.45.36-2.93 1.4-4.12l.12-.13.08-.08a5.668 5.668 0 013.77-1.72h.06l36.34-3.26 14.44-33.8c.61-1.44 1.76-2.5 3.11-3.05 1.35-.54 2.9-.57 4.34.04.69.29 1.3.71 1.8 1.22.53.53.94 1.15 1.22 1.82l.02.06zm10.19 37.2L61.85 5.51a.42.42 0 00-.09-.14.42.42 0 00-.14-.09.427.427 0 00-.35 0c-.1.04-.19.12-.24.24L45.98 40.75c-.37.86-1.18 1.49-2.18 1.58l-37.9 3.4c-.08.01-.16.02-.24.02-.06 0-.13.02-.18.05-.03.01-.05.03-.07.05l-.1.12c-.05.08-.07.17-.06.26.01.09.04.18.09.25.06.05.13.11.19.17l28.63 25c.77.61 1.17 1.62.94 2.65l-8.51 37.22-.03.14c-.01.06-.02.12-.01.17a.454.454 0 00.33.36c.12.03.24.02.34-.04l32.85-19.64c.8-.5 1.85-.54 2.72-.02L95.43 112c.08.04.16.09.24.14.05.03.1.05.16.06v.01c.04.01.09.01.14 0l.04-.01c.12-.03.22-.1.28-.2.06-.09.08-.21.05-.33L87.8 74.28a2.6 2.6 0 01.83-2.55l28.86-25.2c.04-.03.07-.08.1-.13.02-.04.03-.1.04-.17a.497.497 0 00-.09-.33.48.48 0 00-.3-.15v-.01c-.01 0-.03 0-.03-.01l-37.97-3.41c-1-.01-1.93-.6-2.34-1.57z" fill="#ffcf00"/> </svg> `; } // ---------------------------- // Responsive grid columns // ---------------------------- function updateGridColumns() { let autoColumns = 1; // Default to 1 column const width = reviewList.clientWidth; if (width > 1024) autoColumns = 3; else if (width > 768) autoColumns = 2; reviewList.className = `rvx-grid rvx-grid-cols-${autoColumns} rvx-gap-6`; } window.addEventListener("resize", updateGridColumns); // ---------------------------- // Initial render and binding // ---------------------------- updateGridColumns(); renderReviews(); // Bind "Load More" event listener only if enabled. if (loadMoreEnabled && loadMoreBtn) { loadMoreBtn.addEventListener("click", function () { // Increase reviewLimit by the same amount set in Twig (e.g., 3) reviewLimit += {{ reviewLimit|json_encode|raw }}; renderReviews(); }); } }); </script>PK �A,]o��c� � * views/storefront/shortcode/reviewList.twignu ��� <style> #rvx-review-list .rvx-masonry-layout { columns: 4 320px; column-gap: 16px; } #rvx-review-list p.rvx-review-user__name { margin-bottom: 0px; } #rvx-review-list p { margin-bottom: 5px; } .rvx-columns-box { -moz-column-break-inside: avoid; break-inside: avoid; } #rvx-review-list .rvx-review-info p { margin-bottom: 5px; } [x-cloak] { display: none !important; } </style> <div id="rvx-review-list" x-data="{ ...__reviewXState__(), // Spread the state from the function rawTitle: '{{ title }}', // Set the title from Twig isRvxUserLoggedIn: '{{ user_is_logged_in }}', }" id="review-list-container" class="rvx-container rvx-mx-auto" x-init=" // Initialize the review list await initializeAllReviewListShortCodes({ data: '{{ data|json_encode() }}' }); " @notify-like-dislike="await fetchAllReviewListShortCodes()"> <h2 x-show="rawTitle !== 'false'" x-cloak class="rvx-text-1xl rvx-font-bold rvx-mb-[10px!important] rvx-mt-[5px!important]" x-text="rawTitle"> </h2> {# {% if data.filter == "on" %} <template x-if="haveReviews || isFiltering"> <div> {% include 'storefront/widget/Features/Reviews/Filter/ReviewAllFilterShortcode.twig' %} </div> </template> {% endif %} #} <template x-if="fetchReviewsIsLoading"> {% include "storefront/widget/Components/Skeleton/ReviewListSkeleton.twig" %} </template> <template x-if="haveReviews && !fetchReviewsIsLoading && !fetchReviewsSettingsIsLoading" x-cloak> <div> {% include "storefront/widget/Features/Reviews/ReviewsAllLayout.twig" %} {% include "storefront/widget/Features/Reviews/Modals/ReviewDetailModal.twig" %} </div> </template> <template x-if="!haveReviews && !fetchReviewsIsLoading" x-cloak> <div class="rvx-bg-neutral-100 rvx-py-[64px] rvx-px-space24 rvx-rounded-md rvx-text-center"> {% include "storefront/widget/Components/EmptyPlaceholder.twig" %} </div> </template> </div>PK �A,]"�AKl l . views/storefront/shortcode/reviewListForm.twignu ��� <style> #rvx-storefront-widget p { margin: 0; } #rvx-storefront-widget .rvx-review-info p { margin-bottom: 5px; } [x-cloak] { display: none !important; } </style> <div id="rvx-storefront-widget" x-data="{ ...__reviewXState__(), rawTitle: '{{ title }}', isRvxUserLoggedIn: '{{ user_is_logged_in }}', }" x-init=" await initializeReviewsListShortcode({data: '{{ data }}', formLevelData: '{{ formLevelData }}', attributes: '{{ attributes|json_encode() }}' }); " @notify-attachment="notifyAttachmentAdded($event.detail.reviewAttachFiles)" @notify-close-success-modal="showReviewSuccessModal = false" @notify-like-dislike="await fetchReviewsListShortcode({productId: rvxAttributes.product.id})"> <h2 x-show="rawTitle !== 'false'" x-cloak class="rvx-text-1xl rvx-font-bold rvx-mb-[10px!important] rvx-mt-[5px!important]" x-text="rawTitle"> </h2> {% if attributes.graph == "on" %} <div x-show="fetchReviewsSettingsIsLoading" class="rvx-mb-space16"> {% include "storefront/widget/Components/Skeleton/SummarySkeleton.twig" %} </div> <template x-if="!fetchReviewsSettingsIsLoading" x-cloak> <div class="rvx-mt-6"> {% include "storefront/widget/Features/Aggregations/index.twig" %} {% include "storefront/widget/Components/RecommendedBanner.twig" %} <div class="rvx-w-full rvx-h-[2px] rvx-bg-neutral-100 rvx-rounded-full" :class="`${!reviewSettingsData?.data?.setting?.review_settings?.reviews?.multicriteria?.enable ? 'rvx-mb-space40' : 'rvx-mb-space12'}`"></div> {% include "storefront/widget/Features/MultriCriteriaAggregation/index.twig" %} </div> </template> {% endif %} {% if attributes.filter == "on" %} <template x-if="haveReviews || isFiltering"> <div> {% include 'storefront/widget/Features/Reviews/Filter/ReviewFilterShortcode.twig' %} </div> </template> {% endif %} {% if attributes.list == "on" %} <template x-if="fetchReviewsIsLoading"> {% include "storefront/widget/Components/Skeleton/ReviewListSkeleton.twig" %} </template> <template x-if="haveReviews && !fetchReviewsIsLoading && !fetchReviewsSettingsIsLoading" x-cloak> <div> {% include "storefront/widget/Features/Reviews/ReviewsLayout.twig" %} {% include "storefront/widget/Features/Reviews/Modals/ReviewDetailModal.twig" %} </div> </template> <template x-if="!haveReviews && !fetchReviewsIsLoading" x-cloak> <div class="rvx-bg-neutral-100 rvx-py-[64px] rvx-px-space24 rvx-rounded-md rvx-text-center"> {% include "storefront/widget/Components/EmptyPlaceholder.twig" %} </div> </template> {% endif %} {% if attributes.form == "on" %} {% include "storefront/widget/Features/Reviews/Modals/ReviewSuccessModal.twig" %} <div x-show="!fetchReviewsIsLoading || !fetchReviewsSettingsIsLoading" x-cloak> {% if not requireSignIn or (requireSignIn and user_is_logged_in) %} {% if not wooVerificationRequired or (wooVerificationRequired and user_is_logged_in and isVerifiedCustomer) %} {% include "storefront/widget/Features/ReviewForm/index.twig" %} {% else %} {% include "storefront/widget/Components/UnVerifyUserPlaceholder.twig" %} {% endif %} {% else %} <div class="rvx-grid rvx-place-content-center rvx-rounded-md rvx-mt-space20 rvx-p-space6 rvx-bg-neutral-200 rvx-h-[186px]"> <p class="rvx-text-gray-600"> Please <a href="{{ login_url }}" class="rvx-text-blue-500 hover:rvx-text-blue-700 rvx-font-semibold rvx-underline"> log in </a> to submit a review. </p> {% if registration_enabled %} <p class="rvx-text-gray-600"> Don't have an account? <a href="{{ register_url }}" class="rvx-text-green-500 hover:rvx-text-green-700 rvx-font-semibold rvx-underline"> Register here </a>. </p> {% endif %} </div> {% endif %} </div> {% endif %} </div>PK �A,]�_Zg� � - views/storefront/shortcode/reviewSummary.twignu ��� <div x-data="{ ...__reviewXState__(), // Spread the state from the function rawTitle: '{{ title }}', // Set the title from Twig }" id="review-summary-container" class="rvx-container rvx-mx-auto" x-init=" // Initialize the review summary await initializeReviewSummaryShortCodes({ data: '{{ data }}' }); "> <style> .rvx-review-form__star-active { fill: #ecbb09; } .rvx-review-form__star-inactive { fill: gray; } </style> <!-- Title --> <h2 x-show="rawTitle !== 'false'" x-cloak class="rvx-text-1xl rvx-font-bold rvx-mb-[10px!important] rvx-mt-[5px!important]" x-text="rawTitle"> </h2> <div id="rvx-review-summary" class="rvx-flex rvx-justify-between rvx-items-center"> <div class="rvx-space-y-space8"> <div class="rvx-flex rvx-gap-space12 rvx-items-center"> <div class="rvx-flex"> <p x-text="reviewAggregationData?.data?.aggregation?.total_avg_review" class="rvx-rating-out-of rvx-mb-[0px!important] rvx-flex rvx-items-baseline rvx-gap-space5 !rvx-text-[40px] rvx-font-bold rvx-leading-[38px] rvx-font-nunito rvx-text-neutral-800"> </p> <span class="rvx-rating !rvx-text-[24px] rvx-font-normal rvx-leading-[38px] rvx-font-nunito rvx-text-neutral-400"> /5 </span> </div> <div x-show="reviewSettingsData?.data?.setting?.widget_settings.display_badges" class="rvx-rating-badge rvx-bg-green-500 rvx-flex rvx-items-center rvx-rounded-sm rvx-w-[123px]" style="clip-path: polygon(0 0, 100% 0%, 88% 100%, 0% 100%)"> <span class="material-symbols-rounded rvx-fill-white rvx-text-white rvx-rating-badge__icon">grade</span> <span class="rvx-rating-badge__text rvx-text-white !rvx-text-[15.38px] rvx-font-nunito rvx-font-normal rvx-leading-[24.168px]"> Very Good</span> </div> </div> <template x-if="reviewAggregationData?.data?.aggregation.total_avg_review"> <div x-data="{ reviewAverage: reviewAggregationData?.data?.aggregation.total_avg_review, totalRating: 5 }" class="review rvx-flex rvx-gap-2 rvx-mb-2"> <template x-for="star in totalRating" :key="star"> <div> <!-- Full star --> <template x-if="isFullStar(star, reviewAverage)"> <svg class="rvx-aggregation-summary__star-active" width="24px" height="24px" viewBox="0 0 24 24"> <path :fill="reviewSettingsData?.data?.setting?.widget_settings?.star_color_code" d="M22,10.1c0.1-0.5-0.3-1.1-0.8-1.1l-5.7-0.8L12.9,3c-0.1-0.2-0.2-0.3-0.4-0.4C12,2.3,11.4,2.5,11.1,3L8.6,8.2L2.9,9C2.6,9,2.4,9.1,2.3,9.3c-0.4,0.4-0.4,1,0,1.4l4.1,4l-1,5.7c0,0.2,0,0.4,0.1,0.6c0.3,0.5,0.9,0.7,1.4,0.4l5.1-2.7l5.1,2.7c0.1,0.1,0.3,0.1,0.5,0.1v0c0.1,0,0.1,0,0.2,0c0.5-0.1,0.9-0.6,0.8-1.2l-1-5.7l4.1-4C21.9,10.5,22,10.3,22,10.1z" /> </svg> </template> <!-- Partial star --> <template x-if="isHalfStar(star, reviewAverage)"> <svg class="rvx-aggregation-summary__star-active-half" width="24" height="24" viewBox="0 0 24 24"> <defs> <linearGradient :id="`grad-${star}`"> <!-- dynamic offset --> <stop :offset="`${Math.floor(((reviewAverage - (star-1)) * 100))}%`" :stop-color="reviewSettingsData?.data?.setting?.widget_settings?.star_color_code" /> <stop :offset="`${Math.floor(((reviewAverage - (star-1)) * 100))}%`" stop-color="grey" /> </linearGradient> </defs> <path :fill="`url(#grad-${star})`" d="M22,10.1c0.1-0.5-0.3-1.1-0.8-1.1l-5.7-0.8L12.9,3c-0.1-0.2-0.2-0.3-0.4-0.4C12,2.3,11.4,2.5,11.1,3L8.6,8.2L2.9,9C2.6,9,2.4,9.1,2.3,9.3c-0.4,0.4-0.4,1,0,1.4l4.1,4l-1,5.7c0,0.2,0,0.4,0.1,0.6c0.3,0.5,0.9,0.7,1.4,0.4l5.1-2.7l5.1,2.7c0.1,0.1,0.3,0.1,0.5,0.1v0c0.1,0,0.1,0,0.2,0c0.5-0.1,0.9-0.6,0.8-1.2l-1-5.7l4.1-4C21.9,10.5,22,10.3,22,10.1z" /> </svg> </template> <!-- Empty star --> <template x-if="isFullEmptyStar(star, reviewAverage)"> <svg class="rvx-aggregation-summary__star-inactive rvx-fill-neutral-600" fill="none" width="24px" height="24px" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> <path d="M22,10.1c0.1-0.5-0.3-1.1-0.8-1.1l-5.7-0.8L12.9,3c-0.1-0.2-0.2-0.3-0.4-0.4C12,2.3,11.4,2.5,11.1,3L8.6,8.2L2.9,9C2.6,9,2.4,9.1,2.3,9.3c-0.4,0.4-0.4,1,0,1.4l4.1,4l-1,5.7c0,0.2,0,0.4,0.1,0.6c0.3,0.5,0.9,0.7,1.4,0.4l5.1-2.7l5.1,2.7c0.1,0.1,0.3,0.1,0.5,0.1v0c0.1,0,0.1,0,0.2,0c0.5-0.1,0.9-0.6,0.8-1.2l-1-5.7l4.1-4C21.9,10.5,22,10.3,22,10.1z" /> </svg> </template> </div> </template> </div> </template> <p class="rvx-total-review !rvx-text-[17.577px] rvx-font-normal rvx-leading-[28.562px]"> <span>Total</span> <span x-text="reviewAggregationData?.data?.aggregation?.total_reviews"></span> reviews </p> </div> <div class="rvx-h-[1px] rvx-line-separator rvx-w-[155px] !rvx-bg-neutral-300" style="transform: rotate(90deg)"></div> {% include "storefront/widget/Features/Aggregations/aggregations.twig" %} </div> </div>PK �A,]�/#�@ @ 0 views/storefront/shortcode/reviewsStarCount.twignu ��� <div x-data="{ rawTitle: '{{ title }}', info: '{{ info ?? 'default' }}'.trim().toLowerCase(), average: parseFloat('{{ data.starCount }}') || 0, totalRating: 5, stars: [], displayMap: { 'stars': ['stars'], 'rating': ['rating'], 'count': ['count'], 'text': ['text'], 'default': ['stars','rating','count','text'], 'stars_rating': ['stars','rating'], 'count_text': ['count','text'], 'rating_count': ['rating','count'], 'rating_count_text': ['rating','count','text'], 'stars_count': ['stars','count'], 'stars_count_text': ['stars','count','text'], }, has(type) { return this.displayMap[this.info]?.includes(type) || false; }, init() { this.stars = []; for (let i = 0; i < this.totalRating; i++) { let fill = Math.min(Math.max(this.average - i, 0), 1); // between 0.0 and 1.0 this.stars.push(fill); } } }" x-init="init()" id="review-star-container" class="rvx-container rvx-mx-auto" > <!-- Title --> <h2 x-show="rawTitle !== 'false'" x-cloak class="rvx-text-1xl rvx-font-bold rvx-mb-[10px!important] rvx-mt-[5px!important]" x-text="rawTitle"> </h2> <div id="rvx-review-star-count" class="rvx-flex rvx-gap-1 rvx-items-center"> <!-- Stars --> <template x-if="has('stars')"> <div class="rvx-flex rvx-gap-space2" style="margin-left:1px;margin-top:-3px;" :title="`${average} out of 5 stars`"> <template x-for="(fill,i) in stars" :key="i"> <svg class="rvx-w-5 rvx-h-5" width="24px" height="24px" viewBox="0 0 24 24"> <defs> <linearGradient :id="`gradi-${i}`"> <stop :offset="`${fill*100}%`" stop-color="#f5c800" /> <stop :offset="`${fill*100}%`" stop-color="#808080" /> </linearGradient> </defs> <path :fill="`url(#gradi-${i})`" d="M22,10.1c0.1-0.5-0.3-1.1-0.8-1.1l-5.7-0.8L12.9,3c-0.1-0.2-0.2-0.3-0.4-0.4C12,2.3,11.4,2.5,11.1,3L8.6,8.2L2.9,9C2.6,9,2.4,9.1,2.3,9.3c-0.4,0.4-0.4,1,0,1.4l4.1,4l-1,5.7c0,0.2,0,0.4,0.1,0.6c0.3,0.5,0.9,0.7,1.4,0.4l5.1-2.7l5.1,2.7c0.1,0.1,0.3,0.1,0.5,0.1v0c0.1,0,0.1,0,0.2,0c0.5-0.1,0.9-0.6,0.8-1.2l-1-5.7l4.1-4C21.9,10.5,22,10.3,22,10.1z" /> </svg> </template> </div> </template> <!-- Numeric rating --> <span x-show="has('rating')" class="rvx-text-[18px] rvx-text-neutral-900">{{ data.starCount }}</span> <!-- Review count --> <span x-show="has('count')" class="rvx-text-[17px] rvx-text-neutral-800 rvx-font-normal">({{ data.reviewsCount }})</span> <!-- Review text --> <span x-show="has('text')" class="rvx-text-[17px] rvx-text-neutral-700 rvx-font-normal">Reviews</span> </div> </div> PK �A,]��� � + views/storefront/shortcode/reviewStats.twignu ��� <div x-data="{ ...__reviewXState__(), // Spread the state from the function rawTitle: '{{ title }}', // Set the title from Twig }" id="review-stats-container" class="rvx-container rvx-mx-auto" x-init=" // Initialize the review stats await initializeReviewStatsShortCodes({ data: '{{ data }}' }); "> <style> .rvx-review-stats__star-active { fill: #ecbb09; } .rvx-review-stats__star-inactive { fill: gray; } </style> <!-- Title --> <h2 x-show="rawTitle !== 'false'" x-cloak class="rvx-text-1xl rvx-font-bold rvx-mb-[10px!important] rvx-mt-[5px!important]" x-text="rawTitle"> </h2> <div id="rvx-review-stats" class="rvx-flex rvx-justify-between rvx-items-center"> <div class="rvx-space-y-space8"> <div class="rvx-flex rvx-gap-space12 rvx-items-center"> <div class="rvx-flex"> <p x-text="reviewAggregationData?.data?.aggregation?.total_avg_review" class="rvx-rating-out-of rvx-mb-[0px!important] rvx-flex rvx-items-baseline rvx-gap-space5 !rvx-text-[40px] rvx-font-bold rvx-leading-[38px] rvx-font-nunito rvx-text-neutral-800"> </p> <span class="rvx-rating !rvx-text-[24px] rvx-font-normal rvx-leading-[38px] rvx-font-nunito rvx-text-neutral-400"> /5 </span> </div> <div x-show="reviewSettingsData?.data?.setting?.widget_settings.display_badges" class="rvx-rating-badge rvx-bg-green-500 rvx-flex rvx-items-center rvx-rounded-sm rvx-w-[123px]" style="clip-path: polygon(0 0, 100% 0%, 88% 100%, 0% 100%)"> <span class="material-symbols-rounded rvx-fill-white rvx-text-white rvx-rating-badge__icon">grade</span> <span class="rvx-rating-badge__text rvx-text-white !rvx-text-[15.38px] rvx-font-nunito rvx-font-normal rvx-leading-[24.168px]"> Very Good</span> </div> </div> <template x-if="reviewAggregationData?.data?.aggregation?.total_avg_review"> <div x-data="{ reviewAverage: reviewAggregationData?.data?.aggregation.total_avg_review, totalRating: 5 }" class="review rvx-flex rvx-gap-2 rvx-mb-2"> <template x-for="star in totalRating" :key="star"> <div> <!-- Full star --> <template x-if="isFullStar(star, reviewAverage)"> <svg class="rvx-aggregation-summary__star-active" width="24px" height="24px" viewBox="0 0 24 24"> <path :fill="reviewSettingsData?.data?.setting?.widget_settings?.star_color_code" d="M22,10.1c0.1-0.5-0.3-1.1-0.8-1.1l-5.7-0.8L12.9,3c-0.1-0.2-0.2-0.3-0.4-0.4C12,2.3,11.4,2.5,11.1,3L8.6,8.2L2.9,9C2.6,9,2.4,9.1,2.3,9.3c-0.4,0.4-0.4,1,0,1.4l4.1,4l-1,5.7c0,0.2,0,0.4,0.1,0.6c0.3,0.5,0.9,0.7,1.4,0.4l5.1-2.7l5.1,2.7c0.1,0.1,0.3,0.1,0.5,0.1v0c0.1,0,0.1,0,0.2,0c0.5-0.1,0.9-0.6,0.8-1.2l-1-5.7l4.1-4C21.9,10.5,22,10.3,22,10.1z" /> </svg> </template> <!-- Partial star --> <template x-if="isHalfStar(star, reviewAverage)"> <svg class="rvx-aggregation-summary__star-active-half" width="24" height="24" viewBox="0 0 24 24"> <defs> <linearGradient :id="`grad-${star}`"> <!-- dynamic offset --> <stop :offset="`${Math.floor(((reviewAverage - (star-1)) * 100))}%`" :stop-color="reviewSettingsData?.data?.setting?.widget_settings?.star_color_code" /> <stop :offset="`${Math.floor(((reviewAverage - (star-1)) * 100))}%`" stop-color="grey" /> </linearGradient> </defs> <path :fill="`url(#grad-${star})`" d="M22,10.1c0.1-0.5-0.3-1.1-0.8-1.1l-5.7-0.8L12.9,3c-0.1-0.2-0.2-0.3-0.4-0.4C12,2.3,11.4,2.5,11.1,3L8.6,8.2L2.9,9C2.6,9,2.4,9.1,2.3,9.3c-0.4,0.4-0.4,1,0,1.4l4.1,4l-1,5.7c0,0.2,0,0.4,0.1,0.6c0.3,0.5,0.9,0.7,1.4,0.4l5.1-2.7l5.1,2.7c0.1,0.1,0.3,0.1,0.5,0.1v0c0.1,0,0.1,0,0.2,0c0.5-0.1,0.9-0.6,0.8-1.2l-1-5.7l4.1-4C21.9,10.5,22,10.3,22,10.1z" /> </svg> </template> <!-- Empty star --> <template x-if="isFullEmptyStar(star, reviewAverage)"> <svg class="rvx-aggregation-summary__star-inactive rvx-fill-neutral-600" fill="none" width="24px" height="24px" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> <path d="M22,10.1c0.1-0.5-0.3-1.1-0.8-1.1l-5.7-0.8L12.9,3c-0.1-0.2-0.2-0.3-0.4-0.4C12,2.3,11.4,2.5,11.1,3L8.6,8.2L2.9,9C2.6,9,2.4,9.1,2.3,9.3c-0.4,0.4-0.4,1,0,1.4l4.1,4l-1,5.7c0,0.2,0,0.4,0.1,0.6c0.3,0.5,0.9,0.7,1.4,0.4l5.1-2.7l5.1,2.7c0.1,0.1,0.3,0.1,0.5,0.1v0c0.1,0,0.1,0,0.2,0c0.5-0.1,0.9-0.6,0.8-1.2l-1-5.7l4.1-4C21.9,10.5,22,10.3,22,10.1z" /> </svg> </template> </div> </template> </div> </template> <p class="rvx-total-review !rvx-text-[17.577px] rvx-font-normal rvx-leading-[28.562px]"> <span>Total</span> <span x-text="reviewAggregationData?.data?.aggregation?.total_reviews"></span> reviews </p> </div> </div> </div>PK �A,]���C C + views/storefront/shortcode/reviewGraph.twignu ��� <div x-data="{ ...__reviewXState__(), // Spread the state from the function rawTitle: '{{ title }}', // Set the title from Twig showTitle: true // Default to true, will be evaluated in x-init }" id="review-graph-container" class="rvx-container rvx-mx-auto" x-init=" // Initialize the review graph await initializeReviewGraphShortCodes({ data: '{{ data }}' }); "> <!-- Title --> <h2 x-show="rawTitle !== 'false'" x-cloak class="rvx-text-1xl rvx-font-bold rvx-mb-[10px!important] rvx-mt-[5px!important]" x-text="rawTitle"> </h2> <div id="rvx-review-graph" class="rvx-flex rvx-justify-between rvx-items-center"> {% include "storefront/widget/Features/Aggregations/aggregations.twig" %} </div> </div>PK �A,]b�H�; ; ? views/storefront/widget/Components/UnVerifyUserPlaceholder.twignu ��� <div class="rvx-bg-neutral-100 rvx-py-space24 rvx-px-space16 rvx-rounded-md rvx-text-center rvx-mt-space16"> <p class="!rvx-text-[16px] rvx-font-nunito rvx-font-semibold rvx-leading-[26px]"> {{__('Only logged in customers who have purchased this product may leave a review', 'reviewx')}} </p> </div>PK �A,]4�G�d d 8 views/storefront/widget/Components/EmptyPlaceholder.twignu ��� <p class="!rvx-text-[18px] rvx-font-nunito rvx-font-semibold rvx-leading-[29px]"> {{__('There are no reviews yet.', 'reviewx')}} </p> <p class="!rvx-text-[18px] rvx-font-nunito rvx-font-semibold rvx-leading-[29px]">{{__('Be the first to review ', 'reviewx')}}“<span x-text="reviewAggregationData?.data?.product.title"></span> ”</p>PK �A,]솔.# # C views/storefront/widget/Components/Skeleton/ReviewListSkeleton.twignu ��� <div class="rvx-grid rvx-grid-cols-[repeat(auto-fill,minmax(240px,1fr))] rvx-gap-space12"> <template x-for="loader in 2"> <div class="rvx-flex rvx-animate-pulse rvx-space-x-4 rvx-bg-neutral-100 rvx-p-space16 rvx-rounded-md"> <div class="rvx-flex-1 rvx-space-y-6 rvx-py-1"> <div class="rvx-space-y-3"> <div class="rvx-grid rvx-grid-cols-8 rvx-items-center rvx-gap-space12"> <div class="rvx-col-span-2 rvx-size-10 rvx-rounded-full rvx-bg-gray-200"></div> <div class="rvx-col-span-6 rvx-h-2 rvx-rounded rvx-bg-gray-200"></div> </div> <div class="rvx-h-2 rvx-rounded rvx-bg-gray-200"></div> </div> <div class="rvx-h-2 rvx-rounded rvx-bg-gray-200"></div> <div class="rvx-space-y-3"> <div class="rvx-grid rvx-grid-cols-3 rvx-gap-4"> <div class="rvx-col-span-2 rvx-h-2 rvx-rounded rvx-bg-gray-200"></div> <div class="rvx-col-span-1 rvx-h-2 rvx-rounded rvx-bg-gray-200"></div> </div> <div class="rvx-h-2 rvx-rounded rvx-bg-gray-200"></div> </div> </div> </div> </template> </div>PK �A,]P��� � @ views/storefront/widget/Components/Skeleton/SummarySkeleton.twignu ��� <div class="rvx-animate-pulse rvx-space-y-4"> <div class="rvx-flex rvx-items-center rvx-gap-space12 rvx-p-space16 rvx-rounded-md rvx-bg-neutral-100"> <div class="rvx-w-full rvx-space-y-3"> <div class="rvx-h-[38px] rvx-rounded rvx-bg-gray-200"></div> <div class="rvx-flex rvx-gap-space12"> <div class="rvx-size-[20px] rvx-rounded-full rvx-bg-gray-200"></div> <div class="rvx-size-[20px] rvx-rounded-full rvx-bg-gray-200"></div> <div class="rvx-size-[20px] rvx-rounded-full rvx-bg-gray-200"></div> <div class="rvx-size-[20px] rvx-rounded-full rvx-bg-gray-200"></div> <div class="rvx-size-[20px] rvx-rounded-full rvx-bg-gray-200"></div> </div> <div class="rvx-h-2 rvx-rounded rvx-bg-gray-200"></div> </div> <div class="rvx-w-full rvx-space-y-space16"> <div class=" rvx-rounded-md"> <div class="rvx-h-2 rvx-rounded rvx-bg-gray-200"></div> </div> <div class=" rvx-rounded-md"> <div class="rvx-h-2 rvx-rounded rvx-bg-gray-200"></div> </div> <div class=" rvx-rounded-md"> <div class="rvx-h-2 rvx-rounded rvx-bg-gray-200"></div> </div> <div class=" rvx-rounded-md"> <div class="rvx-h-2 rvx-rounded rvx-bg-gray-200"></div> </div> <div class=" rvx-rounded-md"> <div class="rvx-h-2 rvx-rounded rvx-bg-gray-200"></div> </div> </div> </div> <div class="rvx-rounded rvx-bg-neutral-100 rvx-p-space16 rvx-rounded-md rvx-my-space16"> <div class="rvx-h-2 rvx-rounded rvx-bg-gray-200"></div> </div> <div class="rvx-flex rvx-justify-between rvx-gap-space12 rvx-bg-neutral-100 rvx-p-space16 rvx-rounded-md"> <div class="rvx-space-y-2 rvx-w-full"> <div class="rvx-h-2 rvx-w-[50px] rvx-rounded rvx-bg-gray-200"></div> <div class="rvx-h-2 rvx-rounded rvx-bg-gray-200"></div> </div> <div class="rvx-space-y-2 rvx-w-full"> <div class="rvx-h-2 rvx-w-[50px] rvx-rounded rvx-bg-gray-200"></div> <div class="rvx-h-2 rvx-rounded rvx-bg-gray-200"></div> </div> <div class="rvx-space-y-2 rvx-w-full"> <div class="rvx-h-2 rvx-w-[50px] rvx-rounded rvx-bg-gray-200"></div> <div class="rvx-h-2 rvx-rounded rvx-bg-gray-200"></div> </div> </div> <div class="rvx-flex rvx-justify-between rvx-items-center rvx-gap-space12 rvx-bg-neutral-100 rvx-p-space16 rvx-rounded-md rvx-my-space16"> <div class="rvx-flex rvx-gap-space12 rvx-w-full"> <div class="rvx-h-[30px] rvx-rounded rvx-bg-gray-200 rvx-w-full"></div> <div class="rvx-h-[30px] rvx-rounded rvx-bg-gray-200 rvx-w-full"></div> </div> <div class="rvx-h-2 rvx-rounded rvx-bg-gray-200 rvx-w-full"></div> </div> </div>PK �A,]# vD D K views/storefront/widget/Components/Skeleton/LoadMoreReviewListSkeleton.twignu ��� <style> .rvx-columns-box { -moz-column-break-inside: avoid; break-inside: avoid; } </style> <div :class="`${layoutView === 'masonry' && 'rvx-masonry-layout' } ${layoutView === 'grid' && 'rvx-grid rvx-grid-cols-[repeat(auto-fill,minmax(320px,1fr))] rvx-gap-space12'} ${layoutView === 'list' && 'rvx-space-y-space12'} rvx-review-wrapper`"> <template x-for="loader in 4"> <div class="rvx-flex rvx-animate-pulse rvx-space-x-4 rvx-bg-neutral-100 rvx-p-space16 rvx-rounded-md rvx-columns-box"> <div class="rvx-flex-1 rvx-space-y-6 rvx-py-1"> <div class="rvx-space-y-3"> <div class="rvx-grid rvx-grid-cols-8 rvx-items-center rvx-gap-space12"> <div class="rvx-col-span-2 rvx-size-10 rvx-rounded-full rvx-bg-gray-200"></div> <div class="rvx-col-span-6 rvx-h-2 rvx-rounded rvx-bg-gray-200"></div> </div> <div class="rvx-h-2 rvx-rounded rvx-bg-gray-200"></div> </div> <div class="rvx-h-2 rvx-rounded rvx-bg-gray-200"></div> <div class="rvx-space-y-3"> <div class="rvx-grid rvx-grid-cols-3 rvx-gap-4"> <div class="rvx-col-span-2 rvx-h-2 rvx-rounded rvx-bg-gray-200"></div> <div class="rvx-col-span-1 rvx-h-2 rvx-rounded rvx-bg-gray-200"></div> </div> <div class="rvx-h-2 rvx-rounded rvx-bg-gray-200"></div> </div> </div> </div> </template> </div>PK �A,]9 mj j 9 views/storefront/widget/Components/RecommendedBanner.twignu ��� <div x-show="reviewAggregationData?.data?.aggregation?.recommnendation_count" class="rvx-flex rvx-recommendation-count rvx-items-center rvx-gap-space8 rvx-bg-neutral-100 rvx-rounded-md rvx-p-space8 rvx-my-space16"> <div class="rvx-bg-white rvx-rounded-full rvx-size-[31px] rvx-grid rvx-place-items-center"> <svg class="rvx-mb-[5px]" width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M11.7419 9.05682H7.23595C7.1217 9.05686 7.0106 9.01934 6.91976 8.95003C6.82893 8.88072 6.76341 8.78347 6.73328 8.67326C6.70315 8.56304 6.7101 8.44599 6.75304 8.34011C6.79598 8.23423 6.87254 8.1454 6.97093 8.08732C8.93417 6.92725 9.95395 5.57402 10.0885 3.95033C10.1354 3.38683 10.6373 2.93673 11.207 2.94418C11.7883 2.95347 12.333 3.1865 12.7409 3.60041C13.1491 4.01471 13.3741 4.56333 13.3743 5.14517V5.32041C13.3743 6.74172 12.9533 7.64796 12.1766 8.82307C12.1291 8.89492 12.0645 8.95388 11.9887 8.99467C11.9128 9.03546 11.828 9.05682 11.7419 9.05682Z" fill="#FFB159"/> <path d="M17.2642 9.64713C17.2642 8.74706 16.5319 8.01477 15.6318 8.01477H7.236C7.14271 8.01477 7.05112 8.0398 6.97087 8.08729C6.38151 8.43576 5.78643 8.72262 5.30828 8.95318C5.1415 9.03357 4.98398 9.10953 4.84071 9.18115C4.75417 9.22442 4.6814 9.29093 4.63054 9.37324C4.57967 9.45554 4.55273 9.55038 4.55273 9.64713V16.3155C4.55273 16.4122 4.57967 16.5071 4.63054 16.5894C4.6814 16.6717 4.75417 16.7382 4.84071 16.7814C6.94574 17.8338 8.69554 17.9611 10.736 17.9611C11.052 17.9611 11.3752 17.958 11.7075 17.9549C12.075 17.9514 12.455 17.9478 12.8534 17.9478H14.5003C15.4004 17.9478 16.1327 17.2156 16.1327 16.3155C16.1327 16.0128 16.0499 15.7292 15.9058 15.4859C16.3748 15.1988 16.6884 14.6817 16.6884 14.0927C16.6884 13.79 16.6056 13.5064 16.4615 13.2632C16.9305 12.976 17.2441 12.4589 17.2441 11.8699C17.2441 11.4465 17.0821 11.0603 16.8168 10.77C17.1057 10.4656 17.2642 10.0686 17.2642 9.64713Z" fill="#FFC889"/> <path d="M16.1797 5.10413H15.0683C14.7806 5.10413 14.5473 4.87086 14.5473 4.58317C14.5473 4.29547 14.7806 4.0622 15.0683 4.0622H16.1797C16.4674 4.0622 16.7006 4.29547 16.7006 4.58317C16.7006 4.87086 16.4674 5.10413 16.1797 5.10413ZM8.39994 5.10413H7.28854C7.00085 5.10413 6.76758 4.87086 6.76758 4.58317C6.76758 4.29547 7.00085 4.0622 7.28854 4.0622H8.39994C8.68763 4.0622 8.9209 4.29547 8.9209 4.58317C8.9209 4.87086 8.6877 5.10413 8.39994 5.10413ZM10.0675 2.21675C9.88746 2.21675 9.71239 2.12333 9.61592 1.9562L9.06022 0.993699C8.91636 0.744554 9.00174 0.425903 9.25088 0.282073C9.50003 0.138209 9.81868 0.223592 9.96251 0.472737L10.5182 1.43524C10.6621 1.68439 10.5767 2.00304 10.3275 2.14687C10.2485 2.19266 10.1589 2.21676 10.0675 2.21675ZM13.4007 2.21675C13.3094 2.21677 13.2197 2.19266 13.1407 2.14687C12.8916 2.003 12.8062 1.68439 12.95 1.43524L13.5057 0.472737C13.6496 0.223592 13.9682 0.13814 14.2174 0.282073C14.4665 0.425938 14.5519 0.744554 14.408 0.993699L13.8523 1.9562C13.7559 2.12333 13.5808 2.21675 13.4007 2.21675Z" fill="#29CCB1"/> <path d="M3.36419 15.2108V17.9545H2.32227V15.2108C2.32227 14.9232 2.55567 14.6898 2.84323 14.6898C3.13078 14.6898 3.36419 14.9232 3.36419 15.2108Z" fill="#6694FF"/> <path d="M16.1797 5.10413H15.0683C14.7806 5.10413 14.5473 4.87086 14.5473 4.58317C14.5473 4.29547 14.7806 4.0622 15.0683 4.0622H16.1797C16.4674 4.0622 16.7006 4.29547 16.7006 4.58317C16.7006 4.87086 16.4674 5.10413 16.1797 5.10413ZM8.39994 5.10413H7.28854C7.00085 5.10413 6.76758 4.87086 6.76758 4.58317C6.76758 4.29547 7.00085 4.0622 7.28854 4.0622H8.39994C8.68763 4.0622 8.9209 4.29547 8.9209 4.58317C8.9209 4.87086 8.6877 5.10413 8.39994 5.10413ZM10.0675 2.21675C9.88746 2.21675 9.71239 2.12333 9.61592 1.9562L9.06022 0.993699C8.91636 0.744554 9.00174 0.425903 9.25088 0.282073C9.50003 0.138209 9.81868 0.223592 9.96251 0.472737L10.5182 1.43524C10.6621 1.68439 10.5767 2.00304 10.3275 2.14687C10.2485 2.19266 10.1589 2.21676 10.0675 2.21675ZM13.4007 2.21675C13.3094 2.21677 13.2197 2.19266 13.1407 2.14687C12.8916 2.003 12.8062 1.68439 12.95 1.43524L13.5057 0.472737C13.6496 0.223592 13.9682 0.13814 14.2174 0.282073C14.4665 0.425938 14.5519 0.744554 14.408 0.993699L13.8523 1.9562C13.7559 2.12333 13.5808 2.21675 13.4007 2.21675Z" fill="#4CAF50"/> <path d="M3.36419 15.2108V17.9545H2.32227V15.2108C2.32227 14.9232 2.55567 14.6898 2.84323 14.6898C3.13078 14.6898 3.36419 14.9232 3.36419 15.2108Z" fill="#6694FF"/> <path d="M5.06612 8.01477H0.620572C0.333016 8.01477 0.0996094 8.24818 0.0996094 8.53573V17.4268C0.0996094 17.7147 0.333016 17.9478 0.620572 17.9544H3.95472C4.59341 17.9478 5.14738 17.5793 5.41517 17.0437C5.52858 16.8177 5.58746 16.5683 5.58708 16.3154V8.53573C5.58708 8.24814 5.35367 8.01477 5.06612 8.01477Z" fill="#2265FF"/> <path d="M3.36419 15.1761V17.9546H2.32227V15.1761C2.32227 14.8886 2.55567 14.6552 2.84323 14.6552C3.13078 14.6552 3.36419 14.8886 3.36419 15.1761Z" fill="#6694FF"/> </svg> </div> <p class="!rvx-text-[14px] rvx-text-neutral-800 !rvx-font-nunito"> <span x-text="reviewAggregationData?.data?.aggregation?.recommnendation_count"></span> {{__('Persons recommended this product', 'reviewx')}} </p> </div>PK �A,]��@� � E views/storefront/widget/Features/MultriCriteriaAggregation/index.twignu ��� <template x-if="reviewSettingsData?.data?.setting?.review_settings?.reviews?.multicriteria?.enable"> <div class="rvx-grid rvx-grid-cols-12 rvx-w-full rvx-gap-space16 rvx-mb-space16 rvx-aggregation-multicriteria"> <template x-for="criteria in formatMultiCriteriaAggregations"> <div class="rvx-col-span-4 rvx-flex rvx-gap-space16 rvx-w-full rvx-aggregation-multicriteria__row-outer"> <div class="rvx-grid rvx-grid-cols-12 rvx-gap-space8 rvx-w-full rvx-aggregation-multicriteria__row-inner"> <div class="rvx-col-span-8 rvx-w-full rvx-pb-[6px] rvx-aggregation-multicriteria__name"> <span x-text="criteria?.name" class="rvx-text-[14px] rvx-font-nunito"></span> <div class="rvx-w-full rvx-relative rvx-aggregation__progressbar"> <div class="rvx-bg-[#D9D9D9] rvx-rounded-full rvx-aggregation__progressbar-inactive" :style="{height: `12px`}"></div> <div class="rvx-bg-primary rvx-rounded-full rvx-absolute rvx-top-0 rvx-left-0 rvx-aggregation__progressbar-active" :style="{width: `${criteria?.percent}%`, height: `12px`, background: `${reviewSettingsData?.data?.setting?.widget_settings.brand_color_code}`}"> </div> </div> </div> <div class="rvx-col-span-4 rvx-flex rvx-justify-center rvx-items-center rvx-gap-space5 rvx-self-end rvx-aggregation-multicriteria__total"> <span x-text="criteria.total" class="rvx-text-[12px] rvx-font-nunito rvx-pt-[5px]"></span> <svg class="rvx-aggregation-multicriteria__star" width="16" height="16" viewBox="0 0 24 21" fill="none" xmlns="http://www.w3.org/2000/svg"> <path d="M11.9998 17.5001L6.53314 20.7667C6.2887 20.9001 6.04981 20.9556 5.81648 20.9334C5.58314 20.9112 5.37759 20.8334 5.19981 20.7001C5.02203 20.5667 4.8887 20.3834 4.79981 20.1501C4.71092 19.9167 4.69981 19.6778 4.76648 19.4334L6.19981 13.3334L1.36648 9.23339C1.16648 9.05561 1.04426 8.85005 0.999811 8.61672C0.955367 8.38339 0.966478 8.15561 1.03314 7.93339C1.09981 7.71116 1.22203 7.52783 1.39981 7.38339C1.57759 7.23894 1.79981 7.15561 2.06648 7.13339L8.39981 6.56672L10.8998 0.76672C11.0109 0.522275 11.1665 0.338942 11.3665 0.21672C11.5665 0.0944973 11.7776 0.0333862 11.9998 0.0333862C12.222 0.0333862 12.4331 0.0944973 12.6331 0.21672C12.8331 0.338942 12.9887 0.522275 13.0998 0.76672L15.5998 6.60005L21.9331 7.13339C22.1998 7.15561 22.422 7.2445 22.5998 7.40005C22.7776 7.55561 22.8998 7.7445 22.9665 7.96672C23.0331 8.18894 23.0387 8.41116 22.9831 8.63339C22.9276 8.85561 22.7998 9.05561 22.5998 9.23339L17.7998 13.3334L19.2331 19.4334C19.2998 19.6778 19.2887 19.9167 19.1998 20.1501C19.1109 20.3834 18.9776 20.5667 18.7998 20.7001C18.622 20.8334 18.4165 20.9112 18.1831 20.9334C17.9498 20.9556 17.7109 20.9001 17.4665 20.7667L11.9998 17.5001Z" :fill="`${reviewSettingsData?.data?.setting?.widget_settings?.star_color_code}`"/> </svg> </div> </div> </div> </template> </div> </template> <div x-show="reviewSettingsData?.data?.setting?.review_settings?.reviews?.multicriteria?.enable" class="rvx-w-full rvx-h-[2px] rvx-bg-neutral-100 rvx-rounded-full rvx-mb-space40"></div>PK �A,](�n n ? views/storefront/widget/Features/Aggregations/aggregations.twignu ��� <style> .rvx-table table tbody > tr:nth-child(odd) > td, table tbody > tr:nth-child(odd) > th { background: none; } </style> <table class="rvx-w-full rvx-table !rvx-border-none"> <tbody class=""> <template x-for="(stat, i) in formatAggregations"> <tr class="rvx-aggregation__row !rvx-font-nunito !rvx-border-none !rvx-bg-transparent !rvx-leading-normal"> <td class="rvx-text-[14px] rvx-flex rvx-gap-space5 rvx-items-center rvx-align-middle !rvx-p-0 !rvx-pb-space8 !rvx-pr-space8 rvx-aggregation__rating !rvx-bg-transparent !rvx-border-none"> <span x-text="stat.rating" class="rvx-text-[14px] rvx-pt-[2px] rvx-font-nunito rvx-text-neutral-800 rvx-font-semibold"></span> <svg class="rvx-aggregation__rating-icon" xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none"> <mask id="mask0_2499_19750" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="20" height="20"> <rect width="20" height="20" fill="#D9D9D9"/> </mask> <g mask="url(#mask0_2499_19750)"> <path d="M9.99909 14.0627L6.58242 16.1043C6.42964 16.1877 6.28034 16.2224 6.13451 16.2085C5.98867 16.1946 5.8602 16.146 5.74909 16.0627C5.63798 15.9793 5.55464 15.8647 5.49909 15.7189C5.44353 15.5731 5.43659 15.4238 5.47826 15.271L6.37409 11.4585L3.35326 8.896C3.22826 8.78488 3.15187 8.65641 3.12409 8.51058C3.09631 8.36475 3.10326 8.22238 3.14492 8.0835C3.18659 7.94461 3.26298 7.83002 3.37409 7.73975C3.4852 7.64947 3.62409 7.59738 3.79076 7.5835L7.74909 7.22933L9.31159 3.60433C9.38103 3.45155 9.47826 3.33697 9.60326 3.26058C9.72826 3.18419 9.8602 3.146 9.99909 3.146C10.138 3.146 10.2699 3.18419 10.3949 3.26058C10.5199 3.33697 10.6171 3.45155 10.6866 3.60433L12.2491 7.25016L16.2074 7.5835C16.3741 7.59738 16.513 7.65294 16.6241 7.75016C16.7352 7.84739 16.8116 7.96544 16.8533 8.10433C16.8949 8.24322 16.8984 8.38211 16.8637 8.521C16.8289 8.65988 16.7491 8.78488 16.6241 8.896L13.6241 11.4585L14.5199 15.271C14.5616 15.4238 14.5546 15.5731 14.4991 15.7189C14.4435 15.8647 14.3602 15.9793 14.2491 16.0627C14.138 16.146 14.0095 16.1946 13.8637 16.2085C13.7178 16.2224 13.5685 16.1877 13.4158 16.1043L9.99909 14.0627Z" :fill="`${reviewSettingsData?.data?.setting?.widget_settings.star_color_code}`"/> </g> </svg> </td> <td class="rvx-w-full !rvx-p-0 !rvx-pb-space8 rvx-align-middle !rvx-border-none !rvx-bg-transparent "> <div class="rvx-w-full rvx-relative rvx-aggregation__progressbar"> <div class="rvx-bg-[#D9D9D9] rvx-rounded-full rvx-aggregation__progressbar-inactive" :style="{ height: `8px` }"></div> <div class="rvx-bg-primary rvx-rounded-full rvx-absolute rvx-top-0 rvx-left-0 rvx-aggregation__progressbar-active" :style="{ width: `${stat?.percent}%`, height: `8px`, background: `${reviewSettingsData?.data?.setting?.widget_settings.brand_color_code}` }"> </div> </div> </td> <td class="!rvx-p-0 !rvx-px-space8 !rvx-pb-space8 rvx-align-middle !rvx-border-none rvx-aggregation__total-rating !rvx-bg-transparent"> <span x-text="stat.total" class="rvx-font-nunito rvx-text-neutral-800 rvx-font-semibold"></span> </td> <td class="!rvx-p-0 !rvx-pb-space8 rvx-align-middle !rvx-border-none rvx-aggregation__percent !rvx-bg-transparent"> <span x-text="'(' + stat?.percent + '%' + ')'" class="rvx-font-nunito rvx-text-neutral-800 rvx-font-semibold"></span> </td> </tr> </template> </tbody> </table> PK �A,]�/�l� � 8 views/storefront/widget/Features/Aggregations/index.twignu ��� <style> .rvx-aggregation-summary__star-inactive{ fill: gray; } </style> <div class="rvx-flex rvx-justify-between rvx-items-center" id="rvx-storefront-widget--aggregation__summary"> <div class="rvx-space-y-space8"> <div class="rvx-flex rvx-gap-space12 rvx-items-center"> <div class="rvx-flex rvx-items-baseline !rvx-leading-[0]"> <p x-text="reviewAggregationData?.data?.aggregation?.total_avg_review" class="rvx-rating-out-of rvx-average-rating rvx-flex rvx-items-baseline rvx-gap-space5 !rvx-text-[40px] rvx-font-bold rvx-leading-[38px] rvx-font-nunito rvx-text-neutral-800"> </p> <span class="rvx-max-rating rvx-rating-total !rvx-text-[24px] rvx-font-normal rvx-font-nunito rvx-text-neutral-400 rvx-break-normal"> /5 </span> </div> <template x-if="reviewSettingsData?.data?.setting?.widget_settings?.display_badges && Number(reviewAggregationData?.data?.aggregation?.total_avg_review) >= 4"> <div class="rvx-rating-badge rvx-bg-green-500 rvx-flex rvx-items-center rvx-rounded-sm rvx-w-[123px]" style="clip-path: polygon(0 0, 100% 0%, 88% 100%, 0% 100%)"> <span class="material-symbols-rounded rvx-fill-white rvx-text-white rvx-rating-badge__icon"> {{__('grade', 'reviewx')}} </span> <span class="rvx-rating-badge__text rvx-text-white !rvx-text-[15.38px] rvx-font-nunito rvx-font-normal rvx-leading-[24.168px]"> {{__('Very Good', 'reviewx')}} </span> </div> </template> </div> <template x-if="reviewAggregationData?.data?.aggregation.total_avg_review"> <div x-data="{ reviewAverage: reviewAggregationData?.data?.aggregation.total_avg_review, totalRating: 5 }" class="review rvx-flex rvx-gap-2 rvx-mb-2"> <template x-for="star in totalRating" :key="star"> <div> <!-- Full star --> <template x-if="isFullStar(star, reviewAverage)"> <svg class="rvx-aggregation-summary__star-active" width="24px" height="24px" viewBox="0 0 24 24"> <path :fill="reviewSettingsData?.data?.setting?.widget_settings?.star_color_code" d="M22,10.1c0.1-0.5-0.3-1.1-0.8-1.1l-5.7-0.8L12.9,3c-0.1-0.2-0.2-0.3-0.4-0.4C12,2.3,11.4,2.5,11.1,3L8.6,8.2L2.9,9C2.6,9,2.4,9.1,2.3,9.3c-0.4,0.4-0.4,1,0,1.4l4.1,4l-1,5.7c0,0.2,0,0.4,0.1,0.6c0.3,0.5,0.9,0.7,1.4,0.4l5.1-2.7l5.1,2.7c0.1,0.1,0.3,0.1,0.5,0.1v0c0.1,0,0.1,0,0.2,0c0.5-0.1,0.9-0.6,0.8-1.2l-1-5.7l4.1-4C21.9,10.5,22,10.3,22,10.1z" /> </svg> </template> <!-- Partial star --> <template x-if="isHalfStar(star, reviewAverage)"> <svg class="rvx-aggregation-summary__star-active-half" width="24" height="24" viewBox="0 0 24 24"> <defs> <linearGradient :id="`grad-${star}`"> <!-- dynamic offset --> <stop :offset="`${Math.floor(((reviewAverage - (star-1)) * 100))}%`" :stop-color="reviewSettingsData?.data?.setting?.widget_settings?.star_color_code" /> <stop :offset="`${Math.floor(((reviewAverage - (star-1)) * 100))}%`" stop-color="grey" /> </linearGradient> </defs> <path :fill="`url(#grad-${star})`" d="M22,10.1c0.1-0.5-0.3-1.1-0.8-1.1l-5.7-0.8L12.9,3c-0.1-0.2-0.2-0.3-0.4-0.4C12,2.3,11.4,2.5,11.1,3L8.6,8.2L2.9,9C2.6,9,2.4,9.1,2.3,9.3c-0.4,0.4-0.4,1,0,1.4l4.1,4l-1,5.7c0,0.2,0,0.4,0.1,0.6c0.3,0.5,0.9,0.7,1.4,0.4l5.1-2.7l5.1,2.7c0.1,0.1,0.3,0.1,0.5,0.1v0c0.1,0,0.1,0,0.2,0c0.5-0.1,0.9-0.6,0.8-1.2l-1-5.7l4.1-4C21.9,10.5,22,10.3,22,10.1z" /> </svg> </template> <!-- Empty star --> <template x-if="isFullEmptyStar(star, reviewAverage)"> <svg class="rvx-aggregation-summary__star-inactive rvx-fill-neutral-600" fill="none" width="24px" height="24px" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> <path d="M22,10.1c0.1-0.5-0.3-1.1-0.8-1.1l-5.7-0.8L12.9,3c-0.1-0.2-0.2-0.3-0.4-0.4C12,2.3,11.4,2.5,11.1,3L8.6,8.2L2.9,9C2.6,9,2.4,9.1,2.3,9.3c-0.4,0.4-0.4,1,0,1.4l4.1,4l-1,5.7c0,0.2,0,0.4,0.1,0.6c0.3,0.5,0.9,0.7,1.4,0.4l5.1-2.7l5.1,2.7c0.1,0.1,0.3,0.1,0.5,0.1v0c0.1,0,0.1,0,0.2,0c0.5-0.1,0.9-0.6,0.8-1.2l-1-5.7l4.1-4C21.9,10.5,22,10.3,22,10.1z" /> </svg> </template> </div> </template> </div> </template> <p class="rvx-total-review !rvx-text-[16px] rvx-font-normal rvx-leading-[28.562px] !rvx-font-nunito rvx-text-neutral-800"> <span>{{__('Total', 'reviewx')}}</span> <span x-text="reviewAggregationData?.data?.aggregation?.total_reviews"></span> {{__('reviews', 'reviewx')}} </p> </div> <div class="rvx-h-[1px] rvx-line-separator rvx-w-[155px] !rvx-bg-neutral-300" style="transform: rotate(90deg)"></div> {% include "storefront/widget/Features/Aggregations/aggregations.twig" %} </div>PK �A,]c52�. . >