From 0921021a1558428304d98362fcbce32825b50809 Mon Sep 17 00:00:00 2001 From: Dinesh Salunke Date: Mon, 6 Nov 2023 18:15:17 +0530 Subject: [PATCH] refactor: add the classic theme js files for time being --- _dev/js/cart.js | 374 +++++++++++ _dev/js/checkout.js | 81 +++ _dev/js/components/block-cart.js | 50 ++ _dev/js/components/debounce.js | 33 + _dev/js/components/drop-down.js | 59 ++ _dev/js/components/form.js | 55 ++ _dev/js/components/product-miniature.js | 47 ++ _dev/js/components/product-select.js | 97 +++ _dev/js/components/top-menu.js | 80 +++ _dev/js/components/update-sources.js | 43 ++ _dev/js/components/usePasswordPolicy.js | 198 ++++++ _dev/js/customer.js | 43 ++ _dev/js/lib/bootstrap-filestyle.min.js | 25 + _dev/js/lib/jquery.scrollbox.min.js | 25 + _dev/js/listing.js | 262 ++++++++ _dev/js/product.js | 191 ++++++ _dev/js/responsive.js | 80 +++ _dev/js/selectors.js | 109 ++++ _dev/js/theme.js | 85 ++- _dev/package.json | 7 +- _dev/yarn-error.log | 822 ++++++++++++++++++++++++ _dev/yarn.lock | 25 + 22 files changed, 2786 insertions(+), 5 deletions(-) create mode 100644 _dev/js/cart.js create mode 100644 _dev/js/checkout.js create mode 100644 _dev/js/components/block-cart.js create mode 100644 _dev/js/components/debounce.js create mode 100644 _dev/js/components/drop-down.js create mode 100644 _dev/js/components/form.js create mode 100644 _dev/js/components/product-miniature.js create mode 100644 _dev/js/components/product-select.js create mode 100644 _dev/js/components/top-menu.js create mode 100644 _dev/js/components/update-sources.js create mode 100644 _dev/js/components/usePasswordPolicy.js create mode 100644 _dev/js/customer.js create mode 100644 _dev/js/lib/bootstrap-filestyle.min.js create mode 100644 _dev/js/lib/jquery.scrollbox.min.js create mode 100644 _dev/js/listing.js create mode 100644 _dev/js/product.js create mode 100644 _dev/js/responsive.js create mode 100644 _dev/js/selectors.js create mode 100644 _dev/yarn-error.log diff --git a/_dev/js/cart.js b/_dev/js/cart.js new file mode 100644 index 0000000..7271878 --- /dev/null +++ b/_dev/js/cart.js @@ -0,0 +1,374 @@ +import $ from 'jquery'; +import prestashop from 'prestashop'; +import debounce from './components/debounce'; + +prestashop.cart = prestashop.cart || {}; + +prestashop.cart.active_inputs = null; + +const spinnerSelector = 'input[name="product-quantity-spin"]'; +let hasError = false; +let isUpdateOperation = false; +let errorMsg = ''; + +const CheckUpdateQuantityOperations = { + switchErrorStat: () => { + /** + * if errorMsg is not empty or if notifications are shown, we have error to display + * if hasError is true, quantity was not updated : we don't disable checkout button + */ + const $checkoutBtn = $(prestashop.themeSelectors.checkout.btn); + + if ($(prestashop.themeSelectors.notifications.dangerAlert).length || (errorMsg !== '' && !hasError)) { + $checkoutBtn.addClass('disabled'); + } + + if (errorMsg !== '') { + const strError = ` + + `; + $(prestashop.themeSelectors.notifications.container).html(strError); + errorMsg = ''; + isUpdateOperation = false; + if (hasError) { + // if hasError is true, quantity was not updated : allow checkout + $checkoutBtn.removeClass('disabled'); + } + } else if (!hasError && isUpdateOperation) { + hasError = false; + isUpdateOperation = false; + $(prestashop.themeSelectors.notifications.container).html(''); + $checkoutBtn.removeClass('disabled'); + } + }, + checkUpdateOperation: (resp) => { + /** + * resp.hasError can be not defined but resp.errors not empty: quantity is updated but order cannot be placed + * when resp.hasError=true, quantity is not updated + */ + const {hasError: hasErrorOccurred, errors: errorData} = resp; + hasError = hasErrorOccurred ?? false; + const errors = errorData ?? ''; + + // 1.7.2.x returns errors as string, 1.7.3.x returns array + if (errors instanceof Array) { + errorMsg = errors.join(' '); + } else { + errorMsg = errors; + } + + isUpdateOperation = true; + }, +}; + +/** + * Attach Bootstrap TouchSpin event handlers + */ +function createSpin() { + $.each($(spinnerSelector), (index, spinner) => { + $(spinner).TouchSpin({ + verticalbuttons: true, + verticalupclass: 'material-icons touchspin-up', + verticaldownclass: 'material-icons touchspin-down', + buttondown_class: 'btn btn-touchspin js-touchspin js-increase-product-quantity', + buttonup_class: 'btn btn-touchspin js-touchspin js-decrease-product-quantity', + min: parseInt($(spinner).attr('min'), 10), + max: 1000000, + }); + }); + + $(prestashop.themeSelectors.touchspin).off('touchstart.touchspin'); + + CheckUpdateQuantityOperations.switchErrorStat(); +} + +const preventCustomModalOpen = (event) => { + if (window.shouldPreventModal) { + event.preventDefault(); + + return false; + } + + return true; +}; + +$(document).ready(() => { + const productLineInCartSelector = prestashop.themeSelectors.cart.productLineQty; + const promises = []; + + prestashop.on('updateCart', () => { + $(prestashop.themeSelectors.cart.quickview).modal('hide'); + }); + + prestashop.on('updatedCart', () => { + window.shouldPreventModal = false; + + $(prestashop.themeSelectors.product.customizationModal).on('show.bs.modal', (modalEvent) => { + preventCustomModalOpen(modalEvent); + }); + + createSpin(); + }); + + createSpin(); + + const $body = $('body'); + + function isTouchSpin(namespace) { + return namespace === 'on.startupspin' || namespace === 'on.startdownspin'; + } + + function shouldIncreaseProductQuantity(namespace) { + return namespace === 'on.startupspin'; + } + + function findCartLineProductQuantityInput($target) { + const $input = $target.parents(prestashop.themeSelectors.cart.touchspin).find(productLineInCartSelector); + + if ($input.is(':focus')) { + return null; + } + + return $input; + } + + function camelize(subject) { + const actionTypeParts = subject.split('-'); + let i; + let part; + let camelizedSubject = ''; + + for (i = 0; i < actionTypeParts.length; i += 1) { + part = actionTypeParts[i]; + + if (i !== 0) { + part = part.substring(0, 1).toUpperCase() + part.substring(1); + } + + camelizedSubject += part; + } + + return camelizedSubject; + } + + function parseCartAction($target, namespace) { + if (!isTouchSpin(namespace)) { + return { + url: $target.attr('href'), + type: camelize($target.data('link-action')), + }; + } + + const $input = findCartLineProductQuantityInput($target); + + if (!$input) { + return false; + } + + let cartAction = {}; + + if (shouldIncreaseProductQuantity(namespace)) { + cartAction = { + url: $input.data('up-url'), + type: 'increaseProductQuantity', + }; + } else { + cartAction = { + url: $input.data('down-url'), + type: 'decreaseProductQuantity', + }; + } + + return cartAction; + } + + const abortPreviousRequests = () => { + let promise; + while (promises.length > 0) { + promise = promises.pop(); + promise.abort(); + } + }; + + const getTouchSpinInput = ($button) => $($button.parents(prestashop.themeSelectors.cart.touchspin).find('input')); + + $(prestashop.themeSelectors.product.customizationModal).on('show.bs.modal', (modalEvent) => { + preventCustomModalOpen(modalEvent); + }); + + const handleCartAction = (event) => { + abortPreviousRequests(); + window.shouldPreventModal = true; + event.preventDefault(); + + const $target = $(event.currentTarget); + const {dataset} = event.currentTarget; + const cartAction = parseCartAction($target, event.namespace); + const requestData = { + ajax: '1', + action: 'update', + }; + + if (!cartAction) { + return; + } + + $.ajax({ + url: cartAction.url, + method: 'POST', + data: requestData, + dataType: 'json', + beforeSend(jqXHR) { + promises.push(jqXHR); + }, + }) + .then((resp) => { + const $quantityInput = getTouchSpinInput($target); + CheckUpdateQuantityOperations.checkUpdateOperation(resp); + $quantityInput.val(resp.quantity); + + // Refresh cart preview + prestashop.emit('updateCart', { + reason: dataset, + resp, + }); + }) + .fail((resp) => { + prestashop.emit('handleError', { + eventType: 'updateProductInCart', + resp, + cartAction: cartAction.type, + }); + }); + }; + + $body.on('click', prestashop.themeSelectors.cart.actions, handleCartAction); + + function sendUpdateQuantityInCartRequest(updateQuantityInCartUrl, requestData, $target) { + abortPreviousRequests(); + window.shouldPreventModal = true; + + return $.ajax({ + url: updateQuantityInCartUrl, + method: 'POST', + data: requestData, + dataType: 'json', + beforeSend(jqXHR) { + promises.push(jqXHR); + }, + }) + .then((resp) => { + CheckUpdateQuantityOperations.checkUpdateOperation(resp); + + $target.val(resp.quantity); + const dataset = ($target && $target.dataset) ? $target.dataset : resp; + + // Refresh cart preview + prestashop.emit('updateCart', { + reason: dataset, + resp, + }); + }) + .fail((resp) => { + prestashop.emit('handleError', { + eventType: 'updateProductQuantityInCart', + resp, + }); + }); + } + + function getQuantityChangeType($quantity) { + return $quantity > 0 ? 'up' : 'down'; + } + + function getRequestData(quantity) { + return { + ajax: '1', + qty: Math.abs(quantity), + action: 'update', + op: getQuantityChangeType(quantity), + }; + } + + function updateProductQuantityInCart(event) { + const $target = $(event.currentTarget); + const updateQuantityInCartUrl = $target.data('update-url'); + const baseValue = $target.attr('value'); + + // There should be a valid product quantity in cart + const targetValue = $target.val(); + /* eslint-disable */ + if (targetValue != parseInt(targetValue, 10) || targetValue < 0 || isNaN(targetValue)) { + window.shouldPreventModal = false; + $target.val(baseValue); + return; + } + /* eslint-enable */ + // There should be a new product quantity in cart + const qty = targetValue - baseValue; + + if (qty === 0) { + return; + } + + if (targetValue === '0') { + $target.closest('.product-line-actions').find('[data-link-action="delete-from-cart"]').click(); + } else { + $target.attr('value', targetValue); + sendUpdateQuantityInCartRequest(updateQuantityInCartUrl, getRequestData(qty), $target); + } + } + + $body.on('touchspin.on.stopspin', spinnerSelector, debounce(updateProductQuantityInCart)); + + $body.on('focusout keyup', productLineInCartSelector, (event) => { + if (event.type === 'keyup') { + if (event.keyCode === 13) { + isUpdateOperation = true; + updateProductQuantityInCart(event); + } + + return false; + } + + if (!isUpdateOperation) { + updateProductQuantityInCart(event); + } + + return false; + }); + + const $timeoutEffect = 400; + + $body.on('hidden.bs.collapse', prestashop.themeSelectors.cart.promoCode, () => { + $(prestashop.themeSelectors.cart.displayPromo).show($timeoutEffect); + }); + + $body.on('click', prestashop.themeSelectors.cart.promoCodeButton, (event) => { + event.preventDefault(); + + $(prestashop.themeSelectors.cart.promoCode).collapse('toggle'); + }); + + $body.on('click', prestashop.themeSelectors.cart.displayPromo, (event) => { + $(event.currentTarget).hide($timeoutEffect); + }); + + $body.on('click', prestashop.themeSelectors.cart.discountCode, (event) => { + event.stopPropagation(); + + const $code = $(event.currentTarget); + const $discountInput = $(prestashop.themeSelectors.cart.discountName); + + $discountInput.val($code.text()); + // Show promo code field + $(prestashop.themeSelectors.cart.promoCode).collapse('show'); + $(prestashop.themeSelectors.cart.displayPromo).hide($timeoutEffect); + + return false; + }); +}); diff --git a/_dev/js/checkout.js b/_dev/js/checkout.js new file mode 100644 index 0000000..2803290 --- /dev/null +++ b/_dev/js/checkout.js @@ -0,0 +1,81 @@ +/** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ +import $ from 'jquery'; +import prestashop from 'prestashop'; + +function setUpCheckout() { + $(prestashop.themeSelectors.checkout.termsLink).on('click', (event) => { + event.preventDefault(); + let url = $(event.target).attr('href'); + + if (url) { + // TODO: Handle request if no pretty URL + url += '?content_only=1'; + $.get(url, (content) => { + $(prestashop.themeSelectors.modal) + .find(prestashop.themeSelectors.modalContent) + .html($(content).find('.page-cms').contents()); + }).fail((resp) => { + prestashop.emit('handleError', {eventType: 'clickTerms', resp}); + }); + } + + $(prestashop.themeSelectors.modal).modal('show'); + }); + + $(prestashop.themeSelectors.checkout.giftCheckbox).on('click', () => { + $('#gift').slideToggle(); + }); +} + +function toggleImage() { + // Arrow show/hide details Checkout page + $(prestashop.themeSelectors.checkout.imagesLink).on('click', function () { + const icon = $(this).find('i.material-icons'); + + if (icon.text() === 'expand_more') { + icon.text('expand_less'); + } else { + icon.text('expand_more'); + } + }); +} + +$(document).ready(() => { + if ($('body#checkout').length === 1) { + setUpCheckout(); + toggleImage(); + } + + prestashop.on('updatedDeliveryForm', (params) => { + if (typeof params.deliveryOption === 'undefined' || params.deliveryOption.length === 0) { + return; + } + // Hide all carrier extra content ... + $(prestashop.themeSelectors.checkout.carrierExtraContent).hide(); + // and show the one related to the selected carrier + params.deliveryOption.next(prestashop.themeSelectors.checkout.carrierExtraContent).slideDown(); + }); +}); diff --git a/_dev/js/components/block-cart.js b/_dev/js/components/block-cart.js new file mode 100644 index 0000000..2405374 --- /dev/null +++ b/_dev/js/components/block-cart.js @@ -0,0 +1,50 @@ +/** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ +import prestashop from 'prestashop'; +import $ from 'jquery'; + +prestashop.blockcart = prestashop.blockcart || {}; + +prestashop.blockcart.showModal = (html) => { + function getBlockCartModal() { + return $('#blockcart-modal'); + } + + let $blockCartModal = getBlockCartModal(); + + if ($blockCartModal.length) { + $blockCartModal.remove(); + } + + $('body').append(html); + + $blockCartModal = getBlockCartModal(); + $blockCartModal.modal('show').on('hidden.bs.modal', (event) => { + prestashop.emit('updateProduct', { + reason: event.currentTarget.dataset, + event, + }); + }); +}; diff --git a/_dev/js/components/debounce.js b/_dev/js/components/debounce.js new file mode 100644 index 0000000..5d07ae8 --- /dev/null +++ b/_dev/js/components/debounce.js @@ -0,0 +1,33 @@ +/** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ + +export default function debounce(func, timeout = 300) { + let timer; + + return (...args) => { + clearTimeout(timer); + timer = setTimeout(() => { func.apply(this, args); }, timeout); + }; +} diff --git a/_dev/js/components/drop-down.js b/_dev/js/components/drop-down.js new file mode 100644 index 0000000..8bd9de9 --- /dev/null +++ b/_dev/js/components/drop-down.js @@ -0,0 +1,59 @@ +/** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ +import $ from 'jquery'; + +export default class DropDown { + constructor(el) { + this.el = el; + } + + init() { + this.el.on('show.bs.dropdown', (e, el) => { + if (el) { + $(`#${el}`).find('.dropdown-menu').first().stop(true, true) + .slideDown(); + } else { + $(e.target).find('.dropdown-menu').first().stop(true, true) + .slideDown(); + } + }); + + this.el.on('hide.bs.dropdown', (e, el) => { + if (el) { + $(`#${el}`).find('.dropdown-menu').first().stop(true, true) + .slideUp(); + } else { + $(e.target).find('.dropdown-menu').first().stop(true, true) + .slideUp(); + } + }); + + this.el.find('select.link').each((idx, el) => { + $(el).on('change', function () { + window.location = $(this).val(); + }); + }); + } +} diff --git a/_dev/js/components/form.js b/_dev/js/components/form.js new file mode 100644 index 0000000..01383c6 --- /dev/null +++ b/_dev/js/components/form.js @@ -0,0 +1,55 @@ +/** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ +import $ from 'jquery'; + +export default class Form { + init() { + this.parentFocus(); + this.togglePasswordVisibility(); + } + + parentFocus() { + $('.js-child-focus').on('focus', function () { + $(this).closest('.js-parent-focus').addClass('focus'); + }); + $('.js-child-focus').on('focusout', function () { + $(this).closest('.js-parent-focus').removeClass('focus'); + }); + } + + togglePasswordVisibility() { + $('button[data-action="show-password"]').on('click', function () { + const elm = $(this).closest('.input-group').children('input.js-visible-password'); + + if (elm.attr('type') === 'password') { + elm.attr('type', 'text'); + $(this).text($(this).data('textHide')); + } else { + elm.attr('type', 'password'); + $(this).text($(this).data('textShow')); + } + }); + } +} diff --git a/_dev/js/components/product-miniature.js b/_dev/js/components/product-miniature.js new file mode 100644 index 0000000..0a11a57 --- /dev/null +++ b/_dev/js/components/product-miniature.js @@ -0,0 +1,47 @@ +/** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ +import $ from 'jquery'; + +export default class ProductMinitature { + init() { + $('.js-product-miniature').each((index, element) => { + // Limit number of shown colors + if ($(element).find('.color').length > 5) { + let count = 0; + + $(element) + .find('.color') + .each((colorIndex, colorElement) => { + if (colorIndex > 4) { + $(colorElement).hide(); + count += 1; + } + }); + + $(element).find('.js-count').append(`+${count}`); + } + }); + } +} diff --git a/_dev/js/components/product-select.js b/_dev/js/components/product-select.js new file mode 100644 index 0000000..4d7d561 --- /dev/null +++ b/_dev/js/components/product-select.js @@ -0,0 +1,97 @@ +/** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ +import $ from 'jquery'; +// eslint-disable-next-line +import 'velocity-animate'; +// import updateSources from 'update-sources'; + +export default class ProductSelect { + init() { + const MAX_THUMBS = 5; + const $arrows = $('.js-modal-arrows'); + const $thumbnails = $('.js-modal-product-images'); + + $('body') + .on('click', '.js-modal-thumb', (event) => { + // Swap active classes on thumbnail + if ($('.js-modal-thumb').hasClass('selected')) { + $('.js-modal-thumb').removeClass('selected'); + } + $(event.currentTarget).addClass('selected'); + + // Get data from thumbnail and update cover src, alt and title + $(prestashop.themeSelectors.product.modalProductCover).attr('src', $(event.target).data('image-large-src')); + $(prestashop.themeSelectors.product.modalProductCover).attr('title', $(event.target).attr('title')); + $(prestashop.themeSelectors.product.modalProductCover).attr('alt', $(event.target).attr('alt')); + + // Get data from thumbnail and update cover sources + // updateSources( + // $(prestashop.themeSelectors.product.modalProductCover), + // $(event.target).data('image-large-sources'), + // ); + }) + .on('click', 'aside#thumbnails', (event) => { + if (event.target.id === 'thumbnails') { + $('#product-modal').modal('hide'); + } + }); + + if ($('.js-modal-product-images li').length <= MAX_THUMBS) { + $arrows.css('opacity', '.2'); + } else { + $arrows.on('click', (event) => { + if ($(event.target).hasClass('arrow-up') && $thumbnails.position().top < 0) { + this.move('up'); + $('.js-modal-arrow-down').css('opacity', '1'); + } else if ( + $(event.target).hasClass('arrow-down') + && $thumbnails.position().top + $thumbnails.height() > $('.js-modal-mask').height() + ) { + this.move('down'); + $('.js-modal-arrow-up').css('opacity', '1'); + } + }); + } + } + + move(direction) { + const THUMB_MARGIN = 10; + const $thumbnails = $('.js-modal-product-images'); + const thumbHeight = $('.js-modal-product-images li img').height() + THUMB_MARGIN; + const currentPosition = $thumbnails.position().top; + $thumbnails.velocity( + { + translateY: direction === 'up' ? currentPosition + thumbHeight : currentPosition - thumbHeight, + }, + () => { + if ($thumbnails.position().top >= 0) { + $('.js-modal-arrow-up').css('opacity', '.2'); + } else if ($thumbnails.position().top + $thumbnails.height() <= $('.js-modal-mask').height()) { + $('.js-modal-arrow-down').css('opacity', '.2'); + } + }, + ); + } +} diff --git a/_dev/js/components/top-menu.js b/_dev/js/components/top-menu.js new file mode 100644 index 0000000..d9aeec4 --- /dev/null +++ b/_dev/js/components/top-menu.js @@ -0,0 +1,80 @@ +/** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ +import $ from 'jquery'; +import prestashop from 'prestashop'; +import DropDown from './drop-down'; + +export default class TopMenu extends DropDown { + init() { + let elmtClass; + const self = this; + this.el.find('li').on('mouseenter mouseleave', (e) => { + if (this.el.parent().hasClass('mobile')) { + return; + } + const currentTargetClass = $(e.currentTarget).attr('class'); + + if (elmtClass !== currentTargetClass) { + const classesSelected = Array.prototype.slice + .call(e.currentTarget.classList) + .map((elem) => (typeof elem === 'string' ? `.${elem}` : false)); + + elmtClass = classesSelected.join(''); + + if (elmtClass && $(e.target).data('depth') === 0) { + $(`${elmtClass} .js-sub-menu`).css({ + top: $(`${elmtClass}`).height() + $(`${elmtClass}`).position().top, + }); + } + } + }); + $('#menu-icon').on('click', () => { + $('#mobile_top_menu_wrapper').toggle(); + self.toggleMobileMenu(); + }); + + this.el.on('click', (e) => { + if (this.el.parent().hasClass('mobile')) { + return; + } + e.stopPropagation(); + }); + + prestashop.on('responsive update', () => { + $('.js-sub-menu').removeAttr('style'); + self.toggleMobileMenu(); + }); + super.init(); + } + + toggleMobileMenu() { + $('#header').toggleClass('is-open'); + if ($('#mobile_top_menu_wrapper').is(':visible')) { + $('#notifications, #wrapper, #footer').hide(); + } else { + $('#notifications, #wrapper, #footer').show(); + } + } +} diff --git a/_dev/js/components/update-sources.js b/_dev/js/components/update-sources.js new file mode 100644 index 0000000..cdb6b98 --- /dev/null +++ b/_dev/js/components/update-sources.js @@ -0,0 +1,43 @@ +/** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ +import $ from 'jquery'; + +export default function updateSources(img, sources) { + if (sources === undefined) { + return; + } + + // Get source siblings of the img tag + const imgSiblingWebp = $(img).siblings('source[type="image/webp"]'); + const imgSiblingAvif = $(img).siblings('source[type="image/avif"]'); + + // Update them if they exist and we have a source for them + if (sources.webp !== undefined && imgSiblingWebp.length) { + imgSiblingWebp.attr('srcset', sources.webp); + } + if (sources.avif !== undefined && imgSiblingAvif.length) { + imgSiblingAvif.attr('srcset', sources.avif); + } +} diff --git a/_dev/js/components/usePasswordPolicy.js b/_dev/js/components/usePasswordPolicy.js new file mode 100644 index 0000000..799db52 --- /dev/null +++ b/_dev/js/components/usePasswordPolicy.js @@ -0,0 +1,198 @@ +/** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ + +import {sprintf} from 'sprintf-js'; + +const {passwordPolicy: PasswordPolicyMap} = prestashop.themeSelectors; + +const PASSWORD_POLICY_ERROR = 'The password policy elements are undefined.'; + +const getPasswordStrengthFeedback = ( + strength, +) => { + switch (strength) { + case 0: + return { + color: 'bg-danger', + }; + + case 1: + return { + color: 'bg-danger', + }; + + case 2: + return { + color: 'bg-warning', + }; + + case 3: + return { + color: 'bg-success', + }; + + case 4: + return { + color: 'bg-success', + }; + + default: + throw new Error('Invalid password strength indicator.'); + } +}; + +const watchPassword = async ( + elementInput, + feedbackContainer, + hints, +) => { + const {prestashop} = window; + const passwordValue = elementInput.value; + const elementIcon = feedbackContainer.querySelector(PasswordPolicyMap.requirementScoreIcon); + const result = await prestashop.checkPasswordScore(passwordValue); + const feedback = getPasswordStrengthFeedback(result.score); + const passwordLength = passwordValue.length; + const popoverContent = []; + + $(elementInput).popover('dispose'); + + feedbackContainer.style.display = passwordValue === '' ? 'none' : 'block'; + + if (result.feedback.warning !== '') { + if (result.feedback.warning in hints) { + popoverContent.push(hints[result.feedback.warning]); + } + } + + result.feedback.suggestions.forEach((suggestion) => { + if (suggestion in hints) { + popoverContent.push(hints[suggestion]); + } + }); + + $(elementInput).popover({ + html: true, + placement: 'top', + content: popoverContent.join('
'), + }).popover('show'); + + const passwordLengthValid = passwordLength >= parseInt(elementInput.dataset.minlength, 10) + && passwordLength <= parseInt(elementInput.dataset.maxlength, 10); + const passwordScoreValid = parseInt(elementInput.dataset.minscore, 10) <= result.score; + + feedbackContainer.querySelector(PasswordPolicyMap.requirementLengthIcon).classList.toggle( + 'text-success', + passwordLengthValid, + ); + + elementIcon.classList.toggle( + 'text-success', + passwordScoreValid, + ); + + // Change input border color depending on the validity + elementInput + .classList.remove('border-success', 'border-danger'); + elementInput + .classList.add(passwordScoreValid && passwordLengthValid ? 'border-success' : 'border-danger'); + elementInput + .classList.add('form-control', 'border'); + + const percentage = (result.score * 20) + 20; + const progressBar = feedbackContainer.querySelector(PasswordPolicyMap.progressBar); + + // increase and decrease progress bar + if (progressBar) { + progressBar.style.width = `${percentage}%`; + progressBar.classList.remove('bg-success', 'bg-danger', 'bg-warning'); + progressBar.classList.add(feedback.color); + } +}; + +// Not testable because it manipulates SVG elements, unsupported by JSDom +const usePasswordPolicy = (selector) => { + const elements = document.querySelectorAll(selector); + elements.forEach((element) => { + const inputColumn = element?.querySelector(PasswordPolicyMap.inputColumn); + const elementInput = element?.querySelector('input'); + const templateElement = document.createElement('div'); + const feedbackTemplate = document.querySelector(PasswordPolicyMap.template); + let feedbackContainer; + + if (feedbackTemplate && element && inputColumn && elementInput) { + templateElement.innerHTML = feedbackTemplate.innerHTML; + inputColumn.append(templateElement); + feedbackContainer = element.querySelector(PasswordPolicyMap.container); + + if (feedbackContainer) { + const hintElement = document.querySelector(PasswordPolicyMap.hint); + + if (hintElement) { + const hints = JSON.parse(hintElement.innerHTML); + + // eslint-disable-next-line max-len + const passwordRequirementsLength = feedbackContainer.querySelector(PasswordPolicyMap.requirementLength); + // eslint-disable-next-line max-len + const passwordRequirementsScore = feedbackContainer.querySelector(PasswordPolicyMap.requirementScore); + const passwordLengthText = passwordRequirementsLength?.querySelector('span'); + const passwordRequirementsText = passwordRequirementsScore?.querySelector('span'); + + if (passwordLengthText && passwordRequirementsLength && passwordRequirementsLength.dataset.translation) { + passwordLengthText.innerText = sprintf( + passwordRequirementsLength.dataset.translation, + elementInput.dataset.minlength, + elementInput.dataset.maxlength, + ); + } + + if (passwordRequirementsText && passwordRequirementsScore && passwordRequirementsScore.dataset.translation) { + passwordRequirementsText.innerText = sprintf( + passwordRequirementsScore.dataset.translation, + hints[elementInput.dataset.minscore], + ); + } + + // eslint-disable-next-line max-len + elementInput.addEventListener('keyup', () => watchPassword(elementInput, feedbackContainer, hints)); + elementInput.addEventListener('blur', () => { + $(elementInput).popover('dispose'); + }); + } + } + } + + if (element) { + return { + element, + }; + } + + return { + error: new Error(PASSWORD_POLICY_ERROR), + }; + }); +}; + +export default usePasswordPolicy; diff --git a/_dev/js/customer.js b/_dev/js/customer.js new file mode 100644 index 0000000..65e38d2 --- /dev/null +++ b/_dev/js/customer.js @@ -0,0 +1,43 @@ +/** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ +import $ from 'jquery'; +import prestashop from 'prestashop'; + +function initRmaItemSelector() { + $(`${prestashop.themeSelectors.order.returnForm} table thead input[type=checkbox]`).on('click', function () { + const checked = $(this).prop('checked'); + $(`${prestashop.themeSelectors.order.returnForm} table tbody input[type=checkbox]`).each((_, checkbox) => { + $(checkbox).prop('checked', checked); + }); + }); +} + +function setupCustomerScripts() { + if ($('body#order-detail')) { + initRmaItemSelector(); + } +} + +$(document).ready(setupCustomerScripts); diff --git a/_dev/js/lib/bootstrap-filestyle.min.js b/_dev/js/lib/bootstrap-filestyle.min.js new file mode 100644 index 0000000..9d91ff4 --- /dev/null +++ b/_dev/js/lib/bootstrap-filestyle.min.js @@ -0,0 +1,25 @@ +/** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ +(function($){var nextId=0;var Filestyle=function(element,options){this.options=options;this.$elementFilestyle=[];this.$element=$(element)};Filestyle.prototype={clear:function(){this.$element.val("");this.$elementFilestyle.find(":text").val("");this.$elementFilestyle.find(".badge").remove()},destroy:function(){this.$element.removeAttr("style").removeData("filestyle");this.$elementFilestyle.remove()},disabled:function(value){if(value===true){if(!this.options.disabled){this.$element.attr("disabled","true");this.$elementFilestyle.find("label").attr("disabled","true");this.options.disabled=true}}else{if(value===false){if(this.options.disabled){this.$element.removeAttr("disabled");this.$elementFilestyle.find("label").removeAttr("disabled");this.options.disabled=false}}else{return this.options.disabled}}},buttonBefore:function(value){if(value===true){if(!this.options.buttonBefore){this.options.buttonBefore=true;if(this.options.input){this.$elementFilestyle.remove();this.constructor();this.pushNameFiles()}}}else{if(value===false){if(this.options.buttonBefore){this.options.buttonBefore=false;if(this.options.input){this.$elementFilestyle.remove();this.constructor();this.pushNameFiles()}}}else{return this.options.buttonBefore}}},icon:function(value){if(value===true){if(!this.options.icon){this.options.icon=true;this.$elementFilestyle.find("label").prepend(this.htmlIcon())}}else{if(value===false){if(this.options.icon){this.options.icon=false;this.$elementFilestyle.find(".icon-span-filestyle").remove()}}else{return this.options.icon}}},input:function(value){if(value===true){if(!this.options.input){this.options.input=true;if(this.options.buttonBefore){this.$elementFilestyle.append(this.htmlInput())}else{this.$elementFilestyle.prepend(this.htmlInput())}this.$elementFilestyle.find(".badge").remove();this.pushNameFiles();this.$elementFilestyle.find(".group-span-filestyle").addClass("input-group-btn")}}else{if(value===false){if(this.options.input){this.options.input=false;this.$elementFilestyle.find(":text").remove();var files=this.pushNameFiles();if(files.length>0&&this.options.badge){this.$elementFilestyle.find("label").append(' '+files.length+"")}this.$elementFilestyle.find(".group-span-filestyle").removeClass("input-group-btn")}}else{return this.options.input}}},size:function(value){if(value!==undefined){var btn=this.$elementFilestyle.find("label"),input=this.$elementFilestyle.find("input");btn.removeClass("btn-lg btn-sm");input.removeClass("input-lg input-sm");if(value!="nr"){btn.addClass("btn-"+value);input.addClass("input-"+value)}}else{return this.options.size}},placeholder:function(value){if(value!==undefined){this.options.placeholder=value;this.$elementFilestyle.find("input").attr("placeholder",value)}else{return this.options.placeholder}},buttonText:function(value){if(value!==undefined){this.options.buttonText=value;this.$elementFilestyle.find("label .buttonText").html(this.options.buttonText)}else{return this.options.buttonText}},buttonName:function(value){if(value!==undefined){this.options.buttonName=value;this.$elementFilestyle.find("label").attr({"class":"btn "+this.options.buttonName})}else{return this.options.buttonName}},iconName:function(value){if(value!==undefined){this.$elementFilestyle.find(".icon-span-filestyle").attr({"class":"icon-span-filestyle "+this.options.iconName})}else{return this.options.iconName}},htmlIcon:function(){if(this.options.icon){return' '}else{return""}},htmlInput:function(){if(this.options.input){return' '}else{return""}},pushNameFiles:function(){var content="",files=[];if(this.$element[0].files===undefined){files[0]={name:this.$element[0]&&this.$element[0].value}}else{files=this.$element[0].files}for(var i=0;i";html=_self.options.buttonBefore?btn+_self.htmlInput():_self.htmlInput()+btn;_self.$elementFilestyle=$('
'+html+"
");_self.$elementFilestyle.find(".group-span-filestyle").attr("tabindex","0").keypress(function(e){if(e.keyCode===13||e.charCode===32){_self.$elementFilestyle.find("label").click();return false}});_self.$element.css({position:"absolute",clip:"rect(0px 0px 0px 0px)"}).attr("tabindex","-1").after(_self.$elementFilestyle);if(_self.options.disabled){_self.$element.attr("disabled","true")}_self.$element.change(function(){var files=_self.pushNameFiles();if(_self.options.input==false&&_self.options.badge){if(_self.$elementFilestyle.find(".badge").length==0){_self.$elementFilestyle.find("label").append(' '+files.length+"")}else{if(files.length==0){_self.$elementFilestyle.find(".badge").remove()}else{_self.$elementFilestyle.find(".badge").html(files.length)}}}else{_self.$elementFilestyle.find(".badge").remove()}});if(window.navigator.userAgent.search(/firefox/i)>-1){_self.$elementFilestyle.find("label").click(function(){_self.$element.click();return false})}}};var old=$.fn.filestyle;$.fn.filestyle=function(option,value){var get="",element=this.each(function(){if($(this).attr("type")==="file"){var $this=$(this),data=$this.data("filestyle"),options=$.extend({},$.fn.filestyle.defaults,option,typeof option==="object"&&option);if(!data){$this.data("filestyle",(data=new Filestyle(this,options)));data.constructor()}if(typeof option==="string"){get=data[option](value)}}});if(typeof get!==undefined){return get}else{return element}};$.fn.filestyle.defaults={buttonText:"Choose file",iconName:"glyphicon glyphicon-folder-open",buttonName:"btn-default",size:"nr",input:true,badge:true,icon:true,buttonBefore:false,disabled:false,placeholder:""};$.fn.filestyle.noConflict=function(){$.fn.filestyle=old;return this};$(function(){$(".filestyle").each(function(){var $this=$(this),options={input:$this.attr("data-input")==="false"?false:true,icon:$this.attr("data-icon")==="false"?false:true,buttonBefore:$this.attr("data-buttonBefore")==="true"?true:false,disabled:$this.attr("data-disabled")==="true"?true:false,size:$this.attr("data-size"),buttonText:$this.attr("data-buttonText"),buttonName:$this.attr("data-buttonName"),iconName:$this.attr("data-iconName"),badge:$this.attr("data-badge")==="false"?false:true,placeholder:$this.attr("data-placeholder")};$this.filestyle(options)})})})(window.jQuery); diff --git a/_dev/js/lib/jquery.scrollbox.min.js b/_dev/js/lib/jquery.scrollbox.min.js new file mode 100644 index 0000000..6c791e7 --- /dev/null +++ b/_dev/js/lib/jquery.scrollbox.min.js @@ -0,0 +1,25 @@ +/** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ +(function($){$.fn.scrollbox=function(config){var defConfig={linear:false,startDelay:2,delay:3,step:5,speed:32,switchItems:1,direction:"vertical",distance:"auto",autoPlay:true,onMouseOverPause:true,paused:false,queue:null,listElement:"ul",listItemElement:"li",infiniteLoop:true,switchAmount:0,afterForward:null,afterBackward:null,triggerStackable:false};config=$.extend(defConfig,config);config.scrollOffset=config.direction==="vertical"?"scrollTop":"scrollLeft";if(config.queue){config.queue=$("#"+config.queue)}return this.each(function(){var container=$(this),containerUL,scrollingId=null,nextScrollId=null,paused=false,releaseStack,backward,forward,resetClock,scrollForward,scrollBackward,forwardHover,pauseHover,switchCount=0,stackedTriggerIndex=0;if(config.onMouseOverPause){container.bind("mouseover",function(){paused=true});container.bind("mouseout",function(){paused=false})}containerUL=container.children(config.listElement+":first-child");if(config.infiniteLoop===false&&config.switchAmount===0){config.switchAmount=containerUL.children().length}scrollForward=function(){if(paused){return}var curLi,i,newScrollOffset,scrollDistance,theStep;curLi=containerUL.children(config.listItemElement+":first-child");scrollDistance=config.distance!=="auto"?config.distance:config.direction==="vertical"?curLi.outerHeight(true):curLi.outerWidth(true);if(!config.linear){theStep=Math.max(3,parseInt((scrollDistance-container[0][config.scrollOffset])*.3,10));newScrollOffset=Math.min(container[0][config.scrollOffset]+theStep,scrollDistance)}else{newScrollOffset=Math.min(container[0][config.scrollOffset]+config.step,scrollDistance)}container[0][config.scrollOffset]=newScrollOffset;if(newScrollOffset>=scrollDistance){for(i=0;i0){containerUL.append(config.queue.find(config.listItemElement)[0]);containerUL.children(config.listItemElement+":first-child").remove()}else{containerUL.append(containerUL.children(config.listItemElement+":first-child"))}++switchCount}container[0][config.scrollOffset]=0;clearInterval(scrollingId);scrollingId=null;if($.isFunction(config.afterForward)){config.afterForward.call(container,{switchCount:switchCount,currentFirstChild:containerUL.children(config.listItemElement+":first-child")})}if(config.triggerStackable&&stackedTriggerIndex!==0){releaseStack();return}if(config.infiniteLoop===false&&switchCount>=config.switchAmount){return}if(config.autoPlay){nextScrollId=setTimeout(forward,config.delay*1e3)}}};scrollBackward=function(){if(paused){return}var curLi,i,newScrollOffset,scrollDistance,theStep;if(container[0][config.scrollOffset]===0){for(i=0;i0){stackedTriggerIndex--;nextScrollId=setTimeout(forward,0)}else{stackedTriggerIndex++;nextScrollId=setTimeout(backward,0)}};forward=function(){clearInterval(scrollingId);scrollingId=setInterval(scrollForward,config.speed)};backward=function(){clearInterval(scrollingId);scrollingId=setInterval(scrollBackward,config.speed)};forwardHover=function(){config.autoPlay=true;paused=false;clearInterval(scrollingId);scrollingId=setInterval(scrollForward,config.speed)};pauseHover=function(){paused=true};resetClock=function(delay){config.delay=delay||config.delay;clearTimeout(nextScrollId);if(config.autoPlay){nextScrollId=setTimeout(forward,config.delay*1e3)}};if(config.autoPlay){nextScrollId=setTimeout(forward,config.startDelay*1e3)}container.bind("resetClock",function(delay){resetClock(delay)});container.bind("forward",function(){if(config.triggerStackable){if(scrollingId!==null){stackedTriggerIndex++}else{forward()}}else{clearTimeout(nextScrollId);forward()}});container.bind("backward",function(){if(config.triggerStackable){if(scrollingId!==null){stackedTriggerIndex--}else{backward()}}else{clearTimeout(nextScrollId);backward()}});container.bind("pauseHover",function(){pauseHover()});container.bind("forwardHover",function(){forwardHover()});container.bind("speedUp",function(event,speed){if(speed==="undefined"){speed=Math.max(1,parseInt(config.speed/2,10))}config.speed=speed});container.bind("speedDown",function(event,speed){if(speed==="undefined"){speed=config.speed*2}config.speed=speed});container.bind("updateConfig",function(event,options){config=$.extend(config,options)})})}})(jQuery); diff --git a/_dev/js/listing.js b/_dev/js/listing.js new file mode 100644 index 0000000..e3fe44d --- /dev/null +++ b/_dev/js/listing.js @@ -0,0 +1,262 @@ +/** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ +import $ from 'jquery'; +import prestashop from 'prestashop'; +// eslint-disable-next-line +import "velocity-animate"; +import updateSources from './components/update-sources'; +import ProductMinitature from './components/product-miniature'; + +$(document).ready(() => { + const move = (direction) => { + const THUMB_MARGIN = 20; + const $thumbnails = $('.js-qv-product-images'); + const thumbHeight = $('.js-qv-product-images li img').height() + THUMB_MARGIN; + const currentPosition = $thumbnails.position().top; + $thumbnails.velocity( + { + translateY: + direction === 'up' + ? currentPosition + thumbHeight + : currentPosition - thumbHeight, + }, + () => { + if ($thumbnails.position().top >= 0) { + $('.arrow-up').css('opacity', '.2'); + } else if ( + $thumbnails.position().top + $thumbnails.height() + <= $('.js-qv-mask').height() + ) { + $('.arrow-down').css('opacity', '.2'); + } + }, + ); + }; + + const productConfig = (qv) => { + const MAX_THUMBS = 4; + const $arrows = $(prestashop.themeSelectors.product.arrows); + const $thumbnails = qv.find('.js-qv-product-images'); + $(prestashop.themeSelectors.product.thumb).on('click', (event) => { + // Swap active classes on thumbnail + if ($(prestashop.themeSelectors.product.thumb).hasClass('selected')) { + $(prestashop.themeSelectors.product.thumb).removeClass('selected'); + } + $(event.currentTarget).addClass('selected'); + + // Get data from thumbnail and update cover src, alt and title + $(prestashop.themeSelectors.product.cover).attr('src', $(event.target).data('image-large-src')); + $(prestashop.themeSelectors.product.cover).attr('alt', $(event.target).attr('alt')); + $(prestashop.themeSelectors.product.cover).attr('title', $(event.target).attr('title')); + + // Get data from thumbnail and update cover sources + updateSources( + $(prestashop.themeSelectors.product.cover), + $(event.target).data('image-large-sources'), + ); + }); + if ($thumbnails.find('li').length <= MAX_THUMBS) { + $arrows.hide(); + } else { + $arrows.on('click', (event) => { + if ( + $(event.target).hasClass('arrow-up') + && $('.js-qv-product-images').position().top < 0 + ) { + move('up'); + $(prestashop.themeSelectors.arrowDown).css('opacity', '1'); + } else if ( + $(event.target).hasClass('arrow-down') + && $thumbnails.position().top + $thumbnails.height() + > $('.js-qv-mask').height() + ) { + move('down'); + $(prestashop.themeSelectors.arrowUp).css('opacity', '1'); + } + }); + } + qv.find(prestashop.selectors.quantityWanted).TouchSpin({ + verticalbuttons: true, + verticalupclass: 'material-icons touchspin-up', + verticaldownclass: 'material-icons touchspin-down', + buttondown_class: 'btn btn-touchspin js-touchspin', + buttonup_class: 'btn btn-touchspin js-touchspin', + min: 1, + max: 1000000, + }); + + $(prestashop.themeSelectors.touchspin).off('touchstart.touchspin'); + }; + + prestashop.on('clickQuickView', (elm) => { + const data = { + action: 'quickview', + id_product: elm.dataset.idProduct, + id_product_attribute: elm.dataset.idProductAttribute, + }; + $.post(prestashop.urls.pages.product, data, null, 'json') + .then((resp) => { + $('body').append(resp.quickview_html); + const productModal = $( + `#quickview-modal-${resp.product.id}-${resp.product.id_product_attribute}`, + ); + productModal.modal('show'); + productConfig(productModal); + productModal.on('hidden.bs.modal', () => { + productModal.remove(); + }); + }) + .fail((resp) => { + prestashop.emit('handleError', { + eventType: 'clickQuickView', + resp, + }); + }); + }); + + $('body').on( + 'click', + prestashop.themeSelectors.listing.searchFilterToggler, + () => { + $(prestashop.themeSelectors.listing.searchFiltersWrapper).removeClass( + 'hidden-sm-down', + ); + $(prestashop.themeSelectors.contentWrapper).addClass('hidden-sm-down'); + $(prestashop.themeSelectors.footer).addClass('hidden-sm-down'); + }, + ); + $( + `${prestashop.themeSelectors.listing.searchFilterControls} ${prestashop.themeSelectors.clear}`, + ).on('click', () => { + $(prestashop.themeSelectors.listing.searchFiltersWrapper).addClass( + 'hidden-sm-down', + ); + $(prestashop.themeSelectors.contentWrapper).removeClass('hidden-sm-down'); + $(prestashop.themeSelectors.footer).removeClass('hidden-sm-down'); + }); + $(`${prestashop.themeSelectors.listing.searchFilterControls} .ok`).on( + 'click', + () => { + $(prestashop.themeSelectors.listing.searchFiltersWrapper).addClass( + 'hidden-sm-down', + ); + $(prestashop.themeSelectors.contentWrapper).removeClass('hidden-sm-down'); + $(prestashop.themeSelectors.footer).removeClass('hidden-sm-down'); + }, + ); + + const parseSearchUrl = function (event) { + if (event.target.dataset.searchUrl !== undefined) { + return event.target.dataset.searchUrl; + } + + if ($(event.target).parent()[0].dataset.searchUrl === undefined) { + throw new Error('Can not parse search URL'); + } + + return $(event.target).parent()[0].dataset.searchUrl; + }; + + function updateProductListDOM(data) { + $(prestashop.themeSelectors.listing.searchFilters).replaceWith( + data.rendered_facets, + ); + $(prestashop.themeSelectors.listing.activeSearchFilters).replaceWith( + data.rendered_active_filters, + ); + $(prestashop.themeSelectors.listing.listTop).replaceWith( + data.rendered_products_top, + ); + + const renderedProducts = $(data.rendered_products); + const productSelectors = $(prestashop.themeSelectors.listing.product); + + if (productSelectors.length > 0) { + productSelectors.removeClass().addClass(productSelectors.first().attr('class')); + } else { + productSelectors.removeClass().addClass(renderedProducts.first().attr('class')); + } + + $(prestashop.themeSelectors.listing.list).replaceWith(renderedProducts); + + $(prestashop.themeSelectors.listing.listBottom).replaceWith( + data.rendered_products_bottom, + ); + if (data.rendered_products_header) { + $(prestashop.themeSelectors.listing.listHeader).replaceWith( + data.rendered_products_header, + ); + } + + const productMinitature = new ProductMinitature(); + productMinitature.init(); + } + + $('body').on( + 'change', + `${prestashop.themeSelectors.listing.searchFilters} input[data-search-url]`, + (event) => { + prestashop.emit('updateFacets', parseSearchUrl(event)); + }, + ); + + $('body').on( + 'click', + prestashop.themeSelectors.listing.searchFiltersClearAll, + (event) => { + prestashop.emit('updateFacets', parseSearchUrl(event)); + }, + ); + + $('body').on('click', prestashop.themeSelectors.listing.searchLink, (event) => { + event.preventDefault(); + prestashop.emit( + 'updateFacets', + $(event.target) + .closest('a') + .get(0).href, + ); + }); + + window.addEventListener('popstate', (e) => { + if (e.state && e.state.current_url) { + window.location.href = e.state.current_url; + } + }); + + $('body').on( + 'change', + `${prestashop.themeSelectors.listing.searchFilters} select`, + (event) => { + const form = $(event.target).closest('form'); + prestashop.emit('updateFacets', `?${form.serialize()}`); + }, + ); + + prestashop.on('updateProductList', (data) => { + updateProductListDOM(data); + window.scrollTo(0, 0); + }); +}); diff --git a/_dev/js/product.js b/_dev/js/product.js new file mode 100644 index 0000000..67decd8 --- /dev/null +++ b/_dev/js/product.js @@ -0,0 +1,191 @@ +/** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ +import $ from 'jquery'; +import prestashop from 'prestashop'; +import ProductSelect from './components/product-select'; +import updateSources from './components/update-sources'; + +$(document).ready(() => { + function coverImage() { + const productCover = $(prestashop.themeSelectors.product.cover); + const modalProductCover = $(prestashop.themeSelectors.product.modalProductCover); + let thumbSelected = $(prestashop.themeSelectors.product.selected); + + const swipe = (selectedThumb, thumbParent) => { + const newSelectedThumb = thumbParent.find(prestashop.themeSelectors.product.thumb); + + // Swap active classes on thumbnail + selectedThumb.removeClass('selected'); + newSelectedThumb.addClass('selected'); + + // Update sources of both cover and modal cover + modalProductCover.prop('src', newSelectedThumb.data('image-large-src')); + productCover.prop('src', newSelectedThumb.data('image-medium-src')); + + // Get data from thumbnail and update cover src, alt and title + productCover.attr('title', newSelectedThumb.attr('title')); + modalProductCover.attr('title', newSelectedThumb.attr('title')); + productCover.attr('alt', newSelectedThumb.attr('alt')); + modalProductCover.attr('alt', newSelectedThumb.attr('alt')); + + // Get data from thumbnail and update cover sources + updateSources(productCover, newSelectedThumb.data('image-medium-sources')); + updateSources(modalProductCover, newSelectedThumb.data('image-large-sources')); + }; + + $(prestashop.themeSelectors.product.thumb).on('click', (event) => { + thumbSelected = $(prestashop.themeSelectors.product.selected); + swipe(thumbSelected, $(event.target).closest(prestashop.themeSelectors.product.thumbContainer)); + }); + + productCover.swipe({ + swipe: (event, direction) => { + thumbSelected = $(prestashop.themeSelectors.product.selected); + const parentThumb = thumbSelected.closest(prestashop.themeSelectors.product.thumbContainer); + + if (direction === 'right') { + if (parentThumb.prev().length > 0) { + swipe(thumbSelected, parentThumb.prev()); + } else if (parentThumb.next().length > 0) { + swipe(thumbSelected, parentThumb.next()); + } + } else if (direction === 'left') { + if (parentThumb.next().length > 0) { + swipe(thumbSelected, parentThumb.next()); + } else if (parentThumb.prev().length > 0) { + swipe(thumbSelected, parentThumb.prev()); + } + } + }, + allowPageScroll: 'vertical', + }); + } + + function imageScrollBox() { + if ($('#main .js-qv-product-images li').length > 2) { + $('#main .js-qv-mask').addClass('scroll'); + $('.scroll-box-arrows').addClass('scroll'); + $('#main .js-qv-mask').scrollbox({ + direction: 'h', + distance: 113, + autoPlay: false, + }); + $('.scroll-box-arrows .left').click(() => { + $('#main .js-qv-mask').trigger('backward'); + }); + $('.scroll-box-arrows .right').click(() => { + $('#main .js-qv-mask').trigger('forward'); + }); + } else { + $('#main .js-qv-mask').removeClass('scroll'); + $('.scroll-box-arrows').removeClass('scroll'); + } + } + + function createInputFile() { + $(prestashop.themeSelectors.fileInput).on('change', (event) => { + const target = $(event.currentTarget)[0]; + const file = (target) ? target.files[0] : null; + + if (target && file) { + $(target).prev().text(file.name); + } + }); + } + + function createProductSpin() { + const $quantityInput = $(prestashop.selectors.quantityWanted); + + $quantityInput.TouchSpin({ + verticalbuttons: true, + verticalupclass: 'material-icons touchspin-up', + verticaldownclass: 'material-icons touchspin-down', + buttondown_class: 'btn btn-touchspin js-touchspin', + buttonup_class: 'btn btn-touchspin js-touchspin', + min: parseInt($quantityInput.attr('min'), 10), + max: 1000000, + }); + + $(prestashop.themeSelectors.touchspin).off('touchstart.touchspin'); + + $quantityInput.on('focusout', () => { + if ($quantityInput.val() === '' || $quantityInput.val() < $quantityInput.attr('min')) { + $quantityInput.val($quantityInput.attr('min')); + $quantityInput.trigger('change'); + } + }); + + $('body').on('change keyup', prestashop.selectors.quantityWanted, (e) => { + if ($quantityInput.val() !== '') { + $(e.currentTarget).trigger('touchspin.stopspin'); + prestashop.emit('updateProduct', { + eventType: 'updatedProductQuantity', + event: e, + }); + } + }); + } + + function addJsProductTabActiveSelector() { + const nav = $(prestashop.themeSelectors.product.tabs); + nav.on('show.bs.tab', (e) => { + const target = $(e.target); + target.addClass(prestashop.themeSelectors.product.activeNavClass); + $(target.attr('href')).addClass(prestashop.themeSelectors.product.activeTabClass); + }); + nav.on('hide.bs.tab', (e) => { + const target = $(e.target); + target.removeClass(prestashop.themeSelectors.product.activeNavClass); + $(target.attr('href')).removeClass(prestashop.themeSelectors.product.activeTabClass); + }); + } + + createProductSpin(); + createInputFile(); + coverImage(); + imageScrollBox(); + addJsProductTabActiveSelector(); + + prestashop.on('updatedProduct', (event) => { + createInputFile(); + coverImage(); + if (event && event.product_minimal_quantity) { + const minimalProductQuantity = parseInt(event.product_minimal_quantity, 10); + const quantityInputSelector = prestashop.selectors.quantityWanted; + const quantityInput = $(quantityInputSelector); + + // @see http://www.virtuosoft.eu/code/bootstrap-touchspin/ about Bootstrap TouchSpin + quantityInput.trigger('touchspin.updatesettings', { + min: minimalProductQuantity, + }); + } + imageScrollBox(); + $($(prestashop.themeSelectors.product.activeTabs).attr('href')).addClass('active').removeClass('fade'); + $(prestashop.themeSelectors.product.imagesModal).replaceWith(event.product_images_modal); + + const productSelect = new ProductSelect(); + productSelect.init(); + }); +}); diff --git a/_dev/js/responsive.js b/_dev/js/responsive.js new file mode 100644 index 0000000..f925d09 --- /dev/null +++ b/_dev/js/responsive.js @@ -0,0 +1,80 @@ +/** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ +import $ from 'jquery'; +import prestashop from 'prestashop'; + +prestashop.responsive = prestashop.responsive || {}; + +prestashop.responsive.current_width = window.innerWidth; +prestashop.responsive.min_width = 768; +prestashop.responsive.mobile = prestashop.responsive.current_width < prestashop.responsive.min_width; + +function swapChildren(obj1, obj2) { + const temp = obj2.children().detach(); + obj2.empty().append(obj1.children().detach()); + obj1.append(temp); +} + +function toggleMobileStyles() { + if (prestashop.responsive.mobile) { + $("*[id^='_desktop_']").each((idx, el) => { + const target = $(`#${el.id.replace('_desktop_', '_mobile_')}`); + + if (target.length) { + swapChildren($(el), target); + } + }); + } else { + $("*[id^='_mobile_']").each((idx, el) => { + const target = $(`#${el.id.replace('_mobile_', '_desktop_')}`); + + if (target.length) { + swapChildren($(el), target); + } + }); + } + prestashop.emit('responsive update', { + mobile: prestashop.responsive.mobile, + }); +} + +$(window).on('resize', () => { + const cw = prestashop.responsive.current_width; + const mw = prestashop.responsive.min_width; + const w = window.innerWidth; + const toggle = (cw >= mw && w < mw) || (cw < mw && w >= mw); + + prestashop.responsive.current_width = w; + prestashop.responsive.mobile = prestashop.responsive.current_width < prestashop.responsive.min_width; + if (toggle) { + toggleMobileStyles(); + } +}); + +$(document).ready(() => { + if (prestashop.responsive.mobile) { + toggleMobileStyles(); + } +}); diff --git a/_dev/js/selectors.js b/_dev/js/selectors.js new file mode 100644 index 0000000..d0a7e8c --- /dev/null +++ b/_dev/js/selectors.js @@ -0,0 +1,109 @@ +/** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ +import prestashop from 'prestashop'; +import $ from 'jquery'; + +const passwordPolicy = { + template: '#password-feedback', + hint: '.js-hint-password', + container: '.password-strength-feedback', + strengthText: '.password-strength-text', + requirementScore: '.password-requirements-score', + requirementLength: '.password-requirements-length', + requirementScoreIcon: '.password-requirements-score i', + requirementLengthIcon: '.password-requirements-length i', + progressBar: '.progress-bar', + inputColumn: '.js-input-column', +}; + +prestashop.themeSelectors = { + product: { + tabs: '.tabs .nav-link', + activeNavClass: 'js-product-nav-active', + activeTabClass: 'js-product-tab-active', + activeTabs: '.tabs .nav-link.active, .js-product-nav-active', + imagesModal: '.js-product-images-modal', + thumb: '.js-thumb', + thumbContainer: '.thumb-container, .js-thumb-container', + arrows: '.js-arrows', + selected: '.selected, .js-thumb-selected', + modalProductCover: '.js-modal-product-cover', + cover: '.js-qv-product-cover', + customizationModal: '.js-customization-modal', + }, + listing: { + searchFilterToggler: '#search_filter_toggler, .js-search-toggler', + searchFiltersWrapper: '#search_filters_wrapper', + searchFilterControls: '#search_filter_controls', + searchFilters: '#search_filters', + activeSearchFilters: '#js-active-search-filters', + listTop: '#js-product-list-top', + product: '.js-product', + list: '#js-product-list', + listBottom: '#js-product-list-bottom', + listHeader: '#js-product-list-header', + searchFiltersClearAll: '.js-search-filters-clear-all', + searchLink: '.js-search-link', + }, + order: { + returnForm: '#order-return-form, .js-order-return-form', + }, + arrowDown: '.arrow-down, .js-arrow-down', + arrowUp: '.arrow-up, .js-arrow-up', + clear: '.clear', + fileInput: '.js-file-input', + contentWrapper: '#content-wrapper, .js-content-wrapper', + footer: '#footer, .js-footer', + modalContent: '.js-modal-content', + modal: '#modal, .js-checkout-modal', + touchspin: '.js-touchspin', + checkout: { + termsLink: '.js-terms a', + giftCheckbox: '.js-gift-checkbox', + imagesLink: '.card-block .cart-summary-products p a, .js-show-details', + carrierExtraContent: '.carrier-extra-content, .js-carrier-extra-content', + btn: '.checkout a', + }, + cart: { + productLineQty: '.js-cart-line-product-quantity', + quickview: '.quickview', + touchspin: '.bootstrap-touchspin', + promoCode: '#promo-code', + displayPromo: '.display-promo', + promoCodeButton: '.promo-code-button', + discountCode: '.js-discount .code', + discountName: '[name=discount_name]', + actions: '[data-link-action="delete-from-cart"], [data-link-action="remove-voucher"]', + }, + notifications: { + dangerAlert: '#notifications article.alert-danger', + container: '#notifications .notifications-container', + }, + passwordPolicy, +}; + +$(document).ready(() => { + prestashop.emit('themeSelectorsInit'); +}); diff --git a/_dev/js/theme.js b/_dev/js/theme.js index 7e2d0f6..633249f 100644 --- a/_dev/js/theme.js +++ b/_dev/js/theme.js @@ -1,5 +1,82 @@ -import $ from 'jquery'; -import prestashop from 'prestashop'; +/** + * Copyright since 2007 PrestaShop SA and Contributors + * PrestaShop is an International Registered Trademark & Property of PrestaShop SA + * + * NOTICE OF LICENSE + * + * This source file is subject to the Academic Free License 3.0 (AFL-3.0) + * that is bundled with this package in the file LICENSE.md. + * It is also available through the world-wide-web at this URL: + * https://opensource.org/licenses/AFL-3.0 + * If you did not receive a copy of the license and are unable to + * obtain it through the world-wide-web, please send an email + * to license@prestashop.com so we can send you a copy immediately. + * + * DISCLAIMER + * + * Do not edit or add to this file if you wish to upgrade PrestaShop to newer + * versions in the future. If you wish to customize PrestaShop for your + * needs please refer to https://devdocs.prestashop.com/ for more information. + * + * @author PrestaShop SA and Contributors + * @copyright Since 2007 PrestaShop SA and Contributors + * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) + */ +/* eslint-disable */ +import 'bootstrap-touchspin'; +import 'jquery-touchswipe'; +import './selectors'; -$(function() { -}) +import './responsive'; +import './checkout'; +import './customer'; +import './listing'; +import './product'; +import './cart'; + +import prestashop from 'prestashop'; +import EventEmitter from 'events'; +import DropDown from './components/drop-down'; +import Form from './components/form'; +import usePasswordPolicy from './components/usePasswordPolicy'; +import ProductMinitature from './components/product-miniature'; +import ProductSelect from './components/product-select'; +import TopMenu from './components/top-menu'; + +import './components/block-cart'; +import $ from 'jquery'; +/* eslint-enable */ + +// "inherit" EventEmitter +// eslint-disable-next-line +for (const i in EventEmitter.prototype) { + prestashop[i] = EventEmitter.prototype[i]; +} + +$(document).ready(() => { + const dropDownEl = $('.js-dropdown'); + const form = new Form(); + const topMenuEl = $('.js-top-menu ul[data-depth="0"]'); + const dropDown = new DropDown(dropDownEl); + const topMenu = new TopMenu(topMenuEl); + const productMinitature = new ProductMinitature(); + const productSelect = new ProductSelect(); + dropDown.init(); + form.init(); + topMenu.init(); + productMinitature.init(); + productSelect.init(); + usePasswordPolicy('.field-password-policy'); + + $('.carousel[data-touch="true"]').swipe({ + swipe(event, direction) { + if (direction === 'left') { + $(this).carousel('next'); + } + if (direction === 'right') { + $(this).carousel('prev'); + } + }, + allowPageScroll: 'vertical', + }); +}); diff --git a/_dev/package.json b/_dev/package.json index 7d18e10..75d4631 100644 --- a/_dev/package.json +++ b/_dev/package.json @@ -15,6 +15,11 @@ "dev": "yarn run dev:livereload & yarn run dev:tailwind & yarn run dev:js" }, "dependencies": { - "jquery": "^3.7.1" + "bootstrap-touchspin": "^4.7.3", + "events": "^3.3.0", + "jquery": "^3.7.1", + "jquery-touchswipe": "^1.6.19", + "sprintf-js": "^1.1.3", + "velocity-animate": "^1.5.2" } } diff --git a/_dev/yarn-error.log b/_dev/yarn-error.log new file mode 100644 index 0000000..fc5e38b --- /dev/null +++ b/_dev/yarn-error.log @@ -0,0 +1,822 @@ +Arguments: + /Users/dineshsalunke/.local/share/nvm/v16.20.0/bin/node /Users/dineshsalunke/.local/share/nvm/v16.20.0/bin/yarn add update-sources + +PATH: + /Users/dineshsalunke/.bun/bin:/Users/dineshsalunke/.local/bin:/Users/dineshsalunke/.local/share/nvm/v16.20.0/bin:/Users/dineshsalunke/.cargo/bin:/opt/homebrew/bin:/bin:/Users/dineshsalunke/go/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/Library/Apple/usr/bin:/usr/local/go/bin + +Yarn version: + 1.22.19 + +Node version: + 16.20.0 + +Platform: + darwin arm64 + +Trace: + Error: https://registry.yarnpkg.com/update-sources: Not found + at Request.params.callback [as _callback] (/Users/dineshsalunke/.local/share/nvm/v16.20.0/lib/node_modules/yarn/lib/cli.js:66145:18) + at Request.self.callback (/Users/dineshsalunke/.local/share/nvm/v16.20.0/lib/node_modules/yarn/lib/cli.js:140890:22) + at Request.emit (node:events:513:28) + at Request. (/Users/dineshsalunke/.local/share/nvm/v16.20.0/lib/node_modules/yarn/lib/cli.js:141862:10) + at Request.emit (node:events:513:28) + at IncomingMessage. (/Users/dineshsalunke/.local/share/nvm/v16.20.0/lib/node_modules/yarn/lib/cli.js:141784:12) + at Object.onceWrapper (node:events:627:28) + at IncomingMessage.emit (node:events:525:35) + at endReadableNT (node:internal/streams/readable:1358:12) + at processTicksAndRejections (node:internal/process/task_queues:83:21) + +npm manifest: + { + "name": "elegance", + "version": "1.0.0", + "main": "index.js", + "license": "MIT", + "devDependencies": { + "livereload": "^0.9.3", + "tailwindcss": "^3.3.5", + "vite": "^4.5.0" + }, + "scripts": { + "dev:tailwind": "tailwindcss -i ./elegance.css -o ../assets/css/theme.css --watch", + "dev:livereload": "livereload \"../templates/, ../modules/, ../assets/\"", + "dev:js": "vite dev", + "dev": "yarn run dev:livereload & yarn run dev:tailwind & yarn run dev:js" + }, + "dependencies": { + "bootstrap-touchspin": "^4.7.3", + "events": "^3.3.0", + "jquery": "^3.7.1", + "jquery-touchswipe": "^1.6.19", + "sprintf-js": "^1.1.3", + "velocity-animate": "^1.5.2" + } + } + +yarn manifest: + No manifest + +Lockfile: + # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. + # yarn lockfile v1 + + + "@alloc/quick-lru@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" + integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== + + "@esbuild/android-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz#984b4f9c8d0377443cc2dfcef266d02244593622" + integrity sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ== + + "@esbuild/android-arm@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz#fedb265bc3a589c84cc11f810804f234947c3682" + integrity sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw== + + "@esbuild/android-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz#35cf419c4cfc8babe8893d296cd990e9e9f756f2" + integrity sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg== + + "@esbuild/darwin-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz#08172cbeccf95fbc383399a7f39cfbddaeb0d7c1" + integrity sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA== + + "@esbuild/darwin-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz#d70d5790d8bf475556b67d0f8b7c5bdff053d85d" + integrity sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ== + + "@esbuild/freebsd-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz#98755cd12707f93f210e2494d6a4b51b96977f54" + integrity sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw== + + "@esbuild/freebsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz#c1eb2bff03915f87c29cece4c1a7fa1f423b066e" + integrity sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ== + + "@esbuild/linux-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz#bad4238bd8f4fc25b5a021280c770ab5fc3a02a0" + integrity sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA== + + "@esbuild/linux-arm@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz#3e617c61f33508a27150ee417543c8ab5acc73b0" + integrity sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg== + + "@esbuild/linux-ia32@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz#699391cccba9aee6019b7f9892eb99219f1570a7" + integrity sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA== + + "@esbuild/linux-loong64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz#e6fccb7aac178dd2ffb9860465ac89d7f23b977d" + integrity sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg== + + "@esbuild/linux-mips64el@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz#eeff3a937de9c2310de30622a957ad1bd9183231" + integrity sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ== + + "@esbuild/linux-ppc64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz#2f7156bde20b01527993e6881435ad79ba9599fb" + integrity sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA== + + "@esbuild/linux-riscv64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz#6628389f210123d8b4743045af8caa7d4ddfc7a6" + integrity sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A== + + "@esbuild/linux-s390x@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz#255e81fb289b101026131858ab99fba63dcf0071" + integrity sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ== + + "@esbuild/linux-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz#c7690b3417af318a9b6f96df3031a8865176d338" + integrity sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w== + + "@esbuild/netbsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz#30e8cd8a3dded63975e2df2438ca109601ebe0d1" + integrity sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A== + + "@esbuild/openbsd-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz#7812af31b205055874c8082ea9cf9ab0da6217ae" + integrity sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg== + + "@esbuild/sunos-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz#d5c275c3b4e73c9b0ecd38d1ca62c020f887ab9d" + integrity sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ== + + "@esbuild/win32-arm64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz#73bc7f5a9f8a77805f357fab97f290d0e4820ac9" + integrity sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg== + + "@esbuild/win32-ia32@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz#ec93cbf0ef1085cc12e71e0d661d20569ff42102" + integrity sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g== + + "@esbuild/win32-x64@0.18.20": + version "0.18.20" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz#786c5f41f043b07afb1af37683d7c33668858f6d" + integrity sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ== + + "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + + "@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + + "@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + + "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + + "@jridgewell/trace-mapping@^0.3.9": + version "0.3.20" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" + integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + + "@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + + "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + + "@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + + any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + + anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + + arg@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + + balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + + binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + + bootstrap-touchspin@^4.7.3: + version "4.7.3" + resolved "https://registry.yarnpkg.com/bootstrap-touchspin/-/bootstrap-touchspin-4.7.3.tgz#0316a3e7a390eb8811996cc14ab13ff0efb647de" + integrity sha512-VVyPKI05ybS4ciB0OJ8g4Jx4SU3rlrWa/ItSxIi7BWNVa0jUYt3eujeOiBWpkuEGukECwiAbwuzh3a+xLtxueQ== + + brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + + braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + + camelcase-css@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" + integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== + + chokidar@^3.5.0, chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + + commander@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + + concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + + cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + + didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.2.tgz#989346ffe9e839b4555ecf5666edea0d3e8ad037" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + + dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + + esbuild@^0.18.10: + version "0.18.20" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.18.20.tgz#4709f5a34801b43b799ab7d6d82f7284a9b7a7a6" + integrity sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA== + optionalDependencies: + "@esbuild/android-arm" "0.18.20" + "@esbuild/android-arm64" "0.18.20" + "@esbuild/android-x64" "0.18.20" + "@esbuild/darwin-arm64" "0.18.20" + "@esbuild/darwin-x64" "0.18.20" + "@esbuild/freebsd-arm64" "0.18.20" + "@esbuild/freebsd-x64" "0.18.20" + "@esbuild/linux-arm" "0.18.20" + "@esbuild/linux-arm64" "0.18.20" + "@esbuild/linux-ia32" "0.18.20" + "@esbuild/linux-loong64" "0.18.20" + "@esbuild/linux-mips64el" "0.18.20" + "@esbuild/linux-ppc64" "0.18.20" + "@esbuild/linux-riscv64" "0.18.20" + "@esbuild/linux-s390x" "0.18.20" + "@esbuild/linux-x64" "0.18.20" + "@esbuild/netbsd-x64" "0.18.20" + "@esbuild/openbsd-x64" "0.18.20" + "@esbuild/sunos-x64" "0.18.20" + "@esbuild/win32-arm64" "0.18.20" + "@esbuild/win32-ia32" "0.18.20" + "@esbuild/win32-x64" "0.18.20" + + events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + + fast-glob@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + + fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + + fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + + fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + + fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + + function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + + glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + + glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + + glob@7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + + hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + + inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + + inherits@2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + + is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + + is-core-module@^2.13.0: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== + dependencies: + hasown "^2.0.0" + + is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + + is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + + is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + + jiti@^1.19.1: + version "1.21.0" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" + integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== + + jquery-touchswipe@^1.6.19: + version "1.6.19" + resolved "https://registry.yarnpkg.com/jquery-touchswipe/-/jquery-touchswipe-1.6.19.tgz#dfd5ddaec0b78212dd500d29707129b9c7fd6cd4" + integrity sha512-b0BGje9reNRU3u6ksAK9QqnX7yBRgLNe/wYG7DOfyDlhBlYjayIT8bSOHmcuvptIDW/ubM9CTW/mnZf9Rohuow== + + jquery@^3.7.1: + version "3.7.1" + resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.7.1.tgz#083ef98927c9a6a74d05a6af02806566d16274de" + integrity sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg== + + lilconfig@^2.0.5, lilconfig@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + + lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + + livereload-js@^3.3.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-3.4.1.tgz#ba90fbc708ed1b9a024bb89c4ee12c96ea03d66f" + integrity sha512-5MP0uUeVCec89ZbNOT/i97Mc+q3SxXmiUGhRFOTmhrGPn//uWVQdCvcLJDy64MSBR5MidFdOR7B9viumoavy6g== + + livereload@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/livereload/-/livereload-0.9.3.tgz#a714816375ed52471408bede8b49b2ee6a0c55b1" + integrity sha512-q7Z71n3i4X0R9xthAryBdNGVGAO2R5X+/xXpmKeuPMrteg+W2U8VusTKV3YiJbXZwKsOlFlHe+go6uSNjfxrZw== + dependencies: + chokidar "^3.5.0" + livereload-js "^3.3.1" + opts ">= 1.2.0" + ws "^7.4.3" + + merge2@^1.3.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + + micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + + minimatch@^3.0.4: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + + mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + + nanoid@^3.3.6: + version "3.3.6" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + + normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + + object-assign@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + + object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-3.0.0.tgz#73f97f753e7baffc0e2cc9d6e079079744ac82e9" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + + once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + + "opts@>= 1.2.0": + version "2.0.2" + resolved "https://registry.yarnpkg.com/opts/-/opts-2.0.2.tgz#a17e189fbbfee171da559edd8a42423bc5993ce1" + integrity sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg== + + path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + + path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + + picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + + picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + + pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + + pirates@^4.0.1: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + + postcss-import@^15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-15.1.0.tgz#41c64ed8cc0e23735a9698b3249ffdbf704adc70" + integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + + postcss-js@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-js/-/postcss-js-4.0.1.tgz#61598186f3703bab052f1c4f7d805f3991bee9d2" + integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== + dependencies: + camelcase-css "^2.0.1" + + postcss-load-config@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-4.0.1.tgz#152383f481c2758274404e4962743191d73875bd" + integrity sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA== + dependencies: + lilconfig "^2.0.5" + yaml "^2.1.1" + + postcss-nested@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-nested/-/postcss-nested-6.0.1.tgz#f83dc9846ca16d2f4fa864f16e9d9f7d0961662c" + integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== + dependencies: + postcss-selector-parser "^6.0.11" + + postcss-selector-parser@^6.0.11: + version "6.0.13" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" + integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + + postcss-value-parser@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + + postcss@^8.4.23, postcss@^8.4.27: + version "8.4.31" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + + queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + + read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + + readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + + resolve@^1.1.7, resolve@^1.22.2: + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + + reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + + rollup@^3.27.1: + version "3.29.4" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-3.29.4.tgz#4d70c0f9834146df8705bfb69a9a19c9e1109981" + integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw== + optionalDependencies: + fsevents "~2.3.2" + + run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + + source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + + sprintf-js@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + + sucrase@^3.32.0: + version "3.34.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.34.0.tgz#1e0e2d8fcf07f8b9c3569067d92fbd8690fb576f" + integrity sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "7.1.6" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + + supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + + tailwindcss@^3.3.5: + version "3.3.5" + resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.3.5.tgz#22a59e2fbe0ecb6660809d9cc5f3976b077be3b8" + integrity sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA== + dependencies: + "@alloc/quick-lru" "^5.2.0" + arg "^5.0.2" + chokidar "^3.5.3" + didyoumean "^1.2.2" + dlv "^1.1.3" + fast-glob "^3.3.0" + glob-parent "^6.0.2" + is-glob "^4.0.3" + jiti "^1.19.1" + lilconfig "^2.1.0" + micromatch "^4.0.5" + normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.0.0" + postcss "^8.4.23" + postcss-import "^15.1.0" + postcss-js "^4.0.1" + postcss-load-config "^4.0.1" + postcss-nested "^6.0.1" + postcss-selector-parser "^6.0.11" + resolve "^1.22.2" + sucrase "^3.32.0" + + thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + + "thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + + to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + + ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + + util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + + velocity-animate@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/velocity-animate/-/velocity-animate-1.5.2.tgz#5a351d75fca2a92756f5c3867548b873f6c32105" + integrity sha512-m6EXlCAMetKztO1ppBhGU1/1MR3IiEevO6ESq6rcrSQ3Q77xYSW13jkfXW88o4xMrkXJhy/U7j4wFR/twMB0Eg== + + vite@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.0.tgz#ec406295b4167ac3bc23e26f9c8ff559287cff26" + integrity sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw== + dependencies: + esbuild "^0.18.10" + postcss "^8.4.27" + rollup "^3.27.1" + optionalDependencies: + fsevents "~2.3.2" + + wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + + ws@^7.4.3: + version "7.5.9" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + + yaml@^2.1.1: + version "2.3.3" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.3.tgz#01f6d18ef036446340007db8e016810e5d64aad9" + integrity sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ== diff --git a/_dev/yarn.lock b/_dev/yarn.lock index 89f15d0..dbdb93f 100644 --- a/_dev/yarn.lock +++ b/_dev/yarn.lock @@ -198,6 +198,11 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== +bootstrap-touchspin@^4.7.3: + version "4.7.3" + resolved "https://registry.yarnpkg.com/bootstrap-touchspin/-/bootstrap-touchspin-4.7.3.tgz#0316a3e7a390eb8811996cc14ab13ff0efb647de" + integrity sha512-VVyPKI05ybS4ciB0OJ8g4Jx4SU3rlrWa/ItSxIi7BWNVa0jUYt3eujeOiBWpkuEGukECwiAbwuzh3a+xLtxueQ== + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -286,6 +291,11 @@ esbuild@^0.18.10: "@esbuild/win32-ia32" "0.18.20" "@esbuild/win32-x64" "0.18.20" +events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + fast-glob@^3.3.0: version "3.3.1" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" @@ -408,6 +418,11 @@ jiti@^1.19.1: resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== +jquery-touchswipe@^1.6.19: + version "1.6.19" + resolved "https://registry.yarnpkg.com/jquery-touchswipe/-/jquery-touchswipe-1.6.19.tgz#dfd5ddaec0b78212dd500d29707129b9c7fd6cd4" + integrity sha512-b0BGje9reNRU3u6ksAK9QqnX7yBRgLNe/wYG7DOfyDlhBlYjayIT8bSOHmcuvptIDW/ubM9CTW/mnZf9Rohuow== + jquery@^3.7.1: version "3.7.1" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.7.1.tgz#083ef98927c9a6a74d05a6af02806566d16274de" @@ -634,6 +649,11 @@ source-map-js@^1.0.2: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== +sprintf-js@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + sucrase@^3.32.0: version "3.34.0" resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.34.0.tgz#1e0e2d8fcf07f8b9c3569067d92fbd8690fb576f" @@ -711,6 +731,11 @@ util-deprecate@^1.0.2: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +velocity-animate@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/velocity-animate/-/velocity-animate-1.5.2.tgz#5a351d75fca2a92756f5c3867548b873f6c32105" + integrity sha512-m6EXlCAMetKztO1ppBhGU1/1MR3IiEevO6ESq6rcrSQ3Q77xYSW13jkfXW88o4xMrkXJhy/U7j4wFR/twMB0Eg== + vite@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.0.tgz#ec406295b4167ac3bc23e26f9c8ff559287cff26"