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 = `
+
+
+
${errorMsg}
+
+
+ `;
+ $(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"