Compare commits

..

No commits in common. "main" and "dev" have entirely different histories.
main ... dev

138 changed files with 2039 additions and 14265 deletions

View File

@ -1 +0,0 @@
@import "./node_modules/jquery-offcanvas/dist/jquery-offcanvas.min.css"

139
_dev/elegance.css Executable file → Normal file
View File

@ -4,142 +4,13 @@
body { body {
@apply bg-white; @apply bg-white;
@apply text-gray-600; @apply text-gray-700;
@apply font-light; @apply font-medium;
} }
a { .icon-tabler {
@apply text-gray-600;
}
a:hover {
@apply text-blue-900;
@apply underline;
@apply underline-offset-2;
}
.ti, .icon-tabler {
stroke-width: 1px; stroke-width: 1px;
fill: none; fill: none;
@apply text-gray-500; @apply text-gray-700;
@apply stroke-gray-500; @apply stroke-gray-700;
} }
a:hover .ti, a:hover .icon-tabler {
@apply stroke-blue-900;
}
ul {
@apply !list-inside;
}
input[type="radio"],input[type="checkbox"] {
@apply focus:ring-transparent;
}
.wrapper {
max-width: 50rem;
width: 100%;
margin: 0 auto;
}
.tabs {
position: relative;
height: 14.75rem;
}
.tabs::before,
.tabs::after {
content: "";
display: table;
}
.tabs::after {
clear: both;
}
.tab {
float: left;
}
.tab-switch {
display: none;
}
.tab-label {
position: relative;
display: block;
line-height: 2.75em;
height: 3em;
padding: 0 1.618em;
color: #000000;
cursor: pointer;
top: 0;
transition: all 0.25s;
border-bottom: #000000;
width: 120px;
text-align: center;
}
.tab-label:hover {
top: -0.25rem;
transition: top 0.25s;
}
.tab-content {
height: 12rem;
position: absolute;
z-index: 1;
top: 2.75em;
left: 0;
padding: 1.618rem;
background: #fff;
color: #2c3e50;
opacity: 0;
transition: all 0.35s;
}
.tab-switch:checked + .tab-label {
background: #fff;
color: #ffffff;
border-bottom: 0;
transition: all 0.35s;
z-index: 1;
top: -0.0625rem;
background-color: rgb(23 37 84);
}
.tab-switch:checked + label + .tab-content {
z-index: 2;
opacity: 1;
transition: all 0.35s;
}
.mainBody::-webkit-scrollbar {
-webkit-appearance: none;
}
.mainBody::-webkit-scrollbar:vertical {
width: 11px;
}
.mainBody::-webkit-scrollbar-thumb {
border-radius: 8px;
border: 2px solid white; /* should match background, can't be transparent */
background-color: rgba(0, 0, 0, .5);
}
.mainBody::-webkit-scrollbar-track {
background-color: #fff;
border-radius: 8px;
}
.mainBody {
height: 250px;
background-color: #ddd;
padding: 24px;
overflow: scroll;
border: 2px solid #000;
}
.pop-up{
display: none;
overflow-y:auto;
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
height: 70%;
background-color: white;
padding: 20px; z-index: 9999;
box-shadow: 0 0 0 9999px #000000b0;
}

View File

@ -1,400 +0,0 @@
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 = `
<article class="alert alert-danger" role="alert" data-alert="danger">
<ul>
<li>${errorMsg}</li>
</ul>
</article>
`;
$(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({
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;
};
$(function () {
const productLineInCartSelector =
prestashop.themeSelectors.cart.productLineQty;
const promises = [];
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;
});
});

View File

@ -1,83 +0,0 @@
/**
* 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 <contact@prestashop.com>
* @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');
}
});
}
$(function() {
if ($('body#checkout').length === 1) {
setUpCheckout();
toggleImage();
}
$('.tabs').simpletabs()
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();
});
});

View File

@ -1,91 +0,0 @@
/**
* 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 <contact@prestashop.com>
* @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';
import 'jquery-toast-plugin';
import 'jquery-toast-plugin/dist/jquery.toast.min.css';
$(() => {
prestashop.blockcart = prestashop.blockcart || {};
const showModal = prestashop.blockcart.showModal
|| function (modal) {
const $body = $('body');
$body.append(modal);
$('#blockcart-modal').modal();
console.log('called');
$body.one('click', '#blockcart-modal', (event) => {
if (event.target.id === 'blockcart-modal') {
$.modal.close();
}
});
};
prestashop.on('updateCart', (event) => {
const refreshURL = $('.blockcart').data('refresh-url');
let requestData = {};
if (
event
&& event.reason
&& typeof event.resp !== 'undefined'
&& !event.resp.hasError
) {
requestData = {
id_customization: event.reason.idCustomization,
id_product_attribute: event.reason.idProductAttribute,
id_product: event.reason.idProduct,
action: event.reason.linkAction,
};
}
if (event && event.resp && event.resp.hasError) {
prestashop.emit('showErrorNextToAddtoCartButton', {
errorMessage: event.resp.errors.join('<br/>'),
});
}
$.post(refreshURL, requestData)
.then((resp) => {
$('.blockcart').replaceWith($(resp.preview).find('.blockcart'));
if (resp.modal) {
$.toast({
heading: 'Added to Cart',
text: 'You can checkout or continue shopping.',
position: {
top: '100px',
right: '20px',
},
bgColor: '#ffffff',
textColor: '#111827',
loaderBg: '#172554',
class: 'rounded-none border border-gray-200',
});
}
})
.fail((resp) => {
prestashop.emit('handleError', {
eventType: 'updateShoppingCart',
resp,
});
});
});
});

View File

@ -1,59 +0,0 @@
/**
* 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 <contact@prestashop.com>
* @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();
});
});
}
}

View File

@ -1,55 +0,0 @@
/**
* 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 <contact@prestashop.com>
* @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'));
}
});
}
}

View File

@ -1,47 +0,0 @@
/**
* 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 <contact@prestashop.com>
* @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}`);
}
});
}
}

View File

@ -1,97 +0,0 @@
/**
* 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 <contact@prestashop.com>
* @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');
}
},
);
}
}

View File

@ -1,80 +0,0 @@
/**
* 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 <contact@prestashop.com>
* @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();
}
}
}

View File

@ -1,43 +0,0 @@
/**
* 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 <contact@prestashop.com>
* @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);
}
}

View File

@ -1,198 +0,0 @@
/**
* 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 <contact@prestashop.com>
* @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('<br/>'),
}).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;

View File

@ -1,43 +0,0 @@
/**
* 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 <contact@prestashop.com>
* @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);

View File

@ -1 +0,0 @@
import $ from "jquery";

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,270 +0,0 @@
/**
* 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 <contact@prestashop.com>
* @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,
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);
});
});

View File

@ -1,191 +0,0 @@
/**
* 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 <contact@prestashop.com>
* @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();
});
});

View File

@ -1,80 +0,0 @@
/**
* 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 <contact@prestashop.com>
* @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();
}
});

View File

@ -1,109 +0,0 @@
/**
* 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 <contact@prestashop.com>
* @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');
});

View File

@ -1,77 +0,0 @@
import $ from 'jquery'
var simpletabspluginname = 'simpletabs'
function SimpleTabsPlugin(element, options) {
this.$el = $(element)
this.$tabs = []
this.init()
}
$.extend(SimpleTabsPlugin.prototype, {
init() {
var self = this
this.$tabs = []
this.$el.find('ul > li > a').each(function() {
var $a = $(this)
var id = $a.attr('href')
if ( id.startsWith('#') ) {
id = id.replace('#', '')
var exists = self.$tabs.find(function(element) {
return element === id
})
var contentselector = '#' + id + '.tabs-content'
var content = self.$el.find(contentselector)
if ( exists ) {
exists.tab = $a
exists.content = content
} else {
self.$tabs.push({
id: id,
tab: $a,
content: content
})
}
}
})
self.$tabs.forEach(function(element) {
if (!element.tab.hasClass('active')) {
self.hide(element.id)
} else {
self.show(element.id)
}
element.tab.click(function(event) {
event.preventDefault()
self.show(element.id)
})
})
},
show(id) {
var self = this
this.$tabs.forEach(function( element ) {
self.hide(element.id)
if ( element.id === id ) {
element.tab.addClass('active').addClass('font-bold')
element.content.removeClass('hidden')
}
})
},
hide(id) {
this.$tabs.forEach(function( element ) {
if ( element.id === id ) {
element.tab.removeClass('active').removeClass('font-bold')
element.content.addClass('hidden')
}
})
},
})
$.fn.simpletabs = function(options) {
this.each(function() {
if ( !$.data(this, 'plugin_' + simpletabspluginname)) {
$.data(this, 'plugin_' + simpletabspluginname, new SimpleTabsPlugin(this, options))
}
})
}

View File

@ -1,195 +0,0 @@
/**
* 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 <contact@prestashop.com>
* @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/dist/js/bootstrap.min';
import "jquery-modal";
import "jquery-offcanvas/dist/jquery.offcanvas.min.css";
import "tooltipster";
import "tooltipster/dist/css/tooltipster.bundle.min.css";
import "tooltipster/dist/css/plugins/tooltipster/sideTip/themes/tooltipster-sideTip-shadow.min.css";
import touchspin from "bootstrap-touchspin";
import "jquery-touchswipe";
import "./selectors";
import "./tabs.js";
import "./responsive";
import "./checkout";
import "./customer";
import "./listing";
import "./product";
import "./cart";
import "./facets";
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";
import jo from "jquery-offcanvas";
jo(window, $);
touchspin(window, $);
/* eslint-enable */
// "inherit" EventEmitter
// eslint-disable-next-line
for (const i in EventEmitter.prototype) {
prestashop[i] = EventEmitter.prototype[i];
}
$(() => {
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',
});
$('#product-list-top-filters').offcanvas({
duration: 100,
effect: 'slide-in-over',
overlay: true,
classes: {
element: 'absolute top-0 z-50',
},
});
$('#show-filters').on('click.offcanvas', () => {
$('#product-list-top-filters').offcanvas('show');
});
$('#hide-filters').on('click.offcanvas', () => {
$('#product-list-top-filters').offcanvas('hide');
});
$('#product-list-top-filters').on('shown.offcanvas', () => {
$('#product-list-top-filters').show();
});
$('#product-list-top-filters').on('hide.offcanvas', () => {
$('#product-list-top-filters').hide();
});
function ThAccordion() {}
$.extend(ThAccordion.prototype, {
init() {},
});
$.fn.thaccordion = function () {
const selectors = {
root: '.th-accordion',
item: '.th-accordion-item',
trigger: '.th-accordion-item-trigger',
svg: '.th-accordion-item-trigger-svg',
content: '.th-accordion-item-content',
};
let selection = null;
const items = this.find(selectors.item);
const rotateClass = 'rotate-90 duration-500';
function collapseAll() {
items.each(function () {
$(this).find(selectors.content).hide(500);
$(this).find(selectors.svg).removeClass(rotateClass);
});
}
function close() {
$(selection).find(selectors.content).hide(500);
$(selection).find(selectors.svg).removeClass('rotate-90');
}
function open() {
collapseAll();
$(selection).find(selectors.content).show(500);
$(selection).find(selectors.svg).addClass(rotateClass);
}
function isOpen(item) {
return $(item).find(selectors.content).is(':visible');
}
collapseAll();
items.each(function () {
const self = this;
$(this)
.find(selectors.trigger)
.on('click', () => {
if (selection === self) {
if (isOpen(selection)) {
close();
} else {
open();
}
} else {
selection = self;
if (!isOpen(selection)) {
open();
}
}
});
});
};
$('.th-accordion').thaccordion();
$('.tooltip').tooltipster({
theme: 'tooltipster-shadow',
triggerOpen: {
click: true,
mouseenter: true,
touchstart: true,
},
delayTouch: [0, 2000],
});
$('.toggle-main-menu').on('click', () => {
$('.mobile-main-menu').toggle();
});
});

View File

@ -5,28 +5,11 @@
"license": "MIT", "license": "MIT",
"devDependencies": { "devDependencies": {
"livereload": "^0.9.3", "livereload": "^0.9.3",
"tailwindcss": "^3.3.5", "tailwindcss": "^3.3.5"
"vite": "^4.5.0"
}, },
"scripts": { "scripts": {
"dev:tailwind": "tailwindcss -i ./elegance.css -o ../assets/css/theme.css --watch", "dev:tailwind": "tailwindcss -i ./elegance.css -o ../assets/css/theme.css --watch",
"dev:livereload": "livereload \"../templates/, ../modules/, ../assets/\"", "dev:livereload": "livereload \"../templates/, ../modules/, ../assets/\"",
"dev:js": "vite build --watch", "dev": "yarn run dev:livereload & yarn run dev:tailwind"
"dev": "yarn run dev:livereload & yarn run dev:tailwind & yarn run dev:js",
"build:js": "vite build"
},
"dependencies": {
"@tailwindcss/forms": "^0.5.6",
"bootstrap-touchspin": "^4.7.3",
"events": "^3.3.0",
"jquery": "3.5.1",
"jquery-modal": "^0.9.2",
"jquery-offcanvas": "^3.4.7",
"jquery-toast-plugin": "^1.3.2",
"jquery-touchswipe": "^1.6.19",
"postcss-import": "^15.1.0",
"sprintf-js": "^1.1.3",
"tooltipster": "^4.2.8",
"velocity-animate": "^1.5.2"
} }
} }

View File

@ -1,6 +0,0 @@
module.exports = {
plugins: {
"postcss-import": {},
tailwindcss: {},
},
};

View File

@ -1,11 +1,12 @@
/** @type {import('tailwindcss').Config} */ /** @type {import('tailwindcss').Config} */
module.exports = { module.exports = {
content: ["../templates/**/*.tpl", "../modules/**/*.tpl"], content: ["../templates/**/*.tpl", "../modules/**/*.tpl"],
theme: { theme: {
fontFamily: { fontFamily: {
sans: ["Cairo"], sans: ["Cairo"],
serif: ["Cairo"], serif: ["Cairo"]
}
}, },
}, plugins: [],
plugins: [require("@tailwindcss/forms")], }
};

View File

@ -1,28 +0,0 @@
import { defineConfig } from "vite";
export default defineConfig({
build: {
sourcemap: "inline",
minify: false,
lib: {
entry: "./js/theme.js",
name: "theme",
formats: ["iife"],
fileName: function () {
return "theme.js";
},
},
outDir: "../assets/js/",
rollupOptions: {
external: ["$", "jquery", "prestashop"],
output: {
globals: {
$: "$",
jquery: "jQuery",
prestashop: "prestashop",
},
},
},
write: true,
},
});

View File

@ -1,822 +0,0 @@
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.<anonymous> (/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.<anonymous> (/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==

View File

@ -7,116 +7,6 @@
resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30" resolved "https://registry.yarnpkg.com/@alloc/quick-lru/-/quick-lru-5.2.0.tgz#7bf68b20c0a350f936915fcae06f58e32007ce30"
integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== 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": "@jridgewell/gen-mapping@^0.3.2":
version "0.3.3" version "0.3.3"
resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098"
@ -170,13 +60,6 @@
"@nodelib/fs.scandir" "2.1.5" "@nodelib/fs.scandir" "2.1.5"
fastq "^1.6.0" fastq "^1.6.0"
"@tailwindcss/forms@^0.5.6":
version "0.5.6"
resolved "https://registry.yarnpkg.com/@tailwindcss/forms/-/forms-0.5.6.tgz#29c6c2b032b363e0c5110efed1499867f6d7e868"
integrity sha512-Fw+2BJ0tmAwK/w01tEFL5TiaJBX1NLT1/YbWgvm7ws3Qcn11kiXxzNTEQDMs5V3mQemhB56l3u0i9dwdzSQldA==
dependencies:
mini-svg-data-uri "^1.2.3"
any-promise@^1.0.0: any-promise@^1.0.0:
version "1.3.0" version "1.3.0"
resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
@ -205,11 +88,6 @@ binary-extensions@^2.0.0:
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 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: brace-expansion@^1.1.7:
version "1.1.11" version "1.1.11"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
@ -270,39 +148,6 @@ dlv@^1.1.3:
resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79"
integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== 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: fast-glob@^3.3.0:
version "3.3.1" version "3.3.1"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4"
@ -425,31 +270,6 @@ jiti@^1.19.1:
resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d"
integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==
jquery-modal@^0.9.2:
version "0.9.2"
resolved "https://registry.yarnpkg.com/jquery-modal/-/jquery-modal-0.9.2.tgz#dbc046ec93440c46466fa8e21a6fc38c102a3ded"
integrity sha512-Bx6jTBuiUbdywriWd0UAZK9v7FKEDCOD5uRh47qd4coGvx+dG4w8cOGe4TG2OoR1dNrXn6Aqaeu8MAA+Oz7vOw==
jquery-offcanvas@^3.4.7:
version "3.4.7"
resolved "https://registry.yarnpkg.com/jquery-offcanvas/-/jquery-offcanvas-3.4.7.tgz#dde1f492f5904ff76bdd98ba42f1e514fa52ed70"
integrity sha512-5E3ITQNKgyzJfXqa80Nm9QBCVng4IpbrlGqAuCMSll7yPjoqJgTBl4akZE5rZXJrIpPrp1wPIjPF8tAyuhTD6g==
jquery-toast-plugin@^1.3.2:
version "1.3.2"
resolved "https://registry.yarnpkg.com/jquery-toast-plugin/-/jquery-toast-plugin-1.3.2.tgz#9bef5a7d7590403e0d56b1d73a05b9842d67fa05"
integrity sha512-0j/nfqA2FHFuJXp8QL33EVVCY//TDVfq4LULhTbasZYl2aZlX6YiSF5IGrI31dQiS9S4JkXBUfX3rMJcfl/u/g==
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.5.1:
version "3.5.1"
resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.5.1.tgz#d7b4d08e1bfdb86ad2f1a3d039ea17304717abb5"
integrity sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==
lilconfig@^2.0.5, lilconfig@^2.1.0: lilconfig@^2.0.5, lilconfig@^2.1.0:
version "2.1.0" version "2.1.0"
resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52"
@ -488,11 +308,6 @@ micromatch@^4.0.4, micromatch@^4.0.5:
braces "^3.0.2" braces "^3.0.2"
picomatch "^2.3.1" picomatch "^2.3.1"
mini-svg-data-uri@^1.2.3:
version "1.4.4"
resolved "https://registry.yarnpkg.com/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz#8ab0aabcdf8c29ad5693ca595af19dd2ead09939"
integrity sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==
minimatch@^3.0.4: minimatch@^3.0.4:
version "3.1.2" version "3.1.2"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
@ -615,7 +430,7 @@ postcss-value-parser@^4.0.0:
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
postcss@^8.4.23, postcss@^8.4.27: postcss@^8.4.23:
version "8.4.31" version "8.4.31"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d"
integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==
@ -657,13 +472,6 @@ reusify@^1.0.4:
resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76"
integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 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: run-parallel@^1.1.9:
version "1.2.0" version "1.2.0"
resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
@ -676,11 +484,6 @@ source-map-js@^1.0.2:
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== 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: sucrase@^3.32.0:
version "3.34.0" version "3.34.0"
resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.34.0.tgz#1e0e2d8fcf07f8b9c3569067d92fbd8690fb576f" resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.34.0.tgz#1e0e2d8fcf07f8b9c3569067d92fbd8690fb576f"
@ -748,11 +551,6 @@ to-regex-range@^5.0.1:
dependencies: dependencies:
is-number "^7.0.0" is-number "^7.0.0"
tooltipster@^4.2.8:
version "4.2.8"
resolved "https://registry.yarnpkg.com/tooltipster/-/tooltipster-4.2.8.tgz#ad1970dd71ad853034e64e3fdd1745f7f3485071"
integrity sha512-Znmbt5UMzaiFCRlVaRtfRZYQqxrmNlj1+3xX/aT0OiA3xkQZhXYGbLJmZPigx0YiReYZpO7Lm2XKbUxXsiU/pg==
ts-interface-checker@^0.1.9: ts-interface-checker@^0.1.9:
version "0.1.13" version "0.1.13"
resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699"
@ -763,22 +561,6 @@ util-deprecate@^1.0.2:
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== 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: wrappy@1:
version "1.0.2" version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"

1481
assets/css/theme.css Executable file → Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -56,9 +56,6 @@ global_settings:
- name: displayAfterWrapper - name: displayAfterWrapper
title: Display after wrapper title: Display after wrapper
description: Display after wrapper description: Display after wrapper
- name: displayCustomProductActions
title: Display Actions below Add to Cart
description: Display actions below product's add to cart button
modules_to_hook: modules_to_hook:
displayMainMenu: displayMainMenu:
- ps_mainmenu - ps_mainmenu
@ -79,6 +76,10 @@ global_settings:
- ps_facetedsearch - ps_facetedsearch
displaySearch: displaySearch:
- ps_searchbar - ps_searchbar
displayProductAdditionalInfo:
- ps_sharebuttons
displayReassurance:
- blockreassurance
displayOrderConfirmation2: displayOrderConfirmation2:
- ps_featuredproducts - ps_featuredproducts
displayCrossSellingShoppingCart: displayCrossSellingShoppingCart:

View File

@ -1,43 +0,0 @@
{**
* 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 version 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.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License version 3.0
*}
<div class="w-full flex justify-around">
{foreach from=$blocks item=$block key=$key}
<div{if $block['type_link'] !== $LINK_TYPE_NONE && !empty($block['link'])} style="cursor:pointer;" onclick="window.open('{$block['link']}')"{/if} class='flex flex-wrap md:flex-nowrap gap-2 items-center justify-center'>
<span class="item-product w-5 h-5">
{if $block['icon'] != 'undefined'}
{if $block['custom_icon']}
<img {if $block['is_svg']}class="svg" {/if}src="{$block['custom_icon']}">
{elseif $block['icon']}
<img class="svg" src="{$block['icon']}">
{/if}
{/if}&nbsp;
</span>
{if empty($block['description'])}
<p class="block-title text-sm" >{$block['title']}</p>
{else}
<div class='flex flex-col items-center md:items-start'>
<span class="block-title text-sm" >{$block['title']}</span>
<p class='text-xs'>{$block['description'] nofilter}</p>
</div>
{/if}
</div>
{/foreach}
</div>

View File

@ -1,26 +0,0 @@
{**
* 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 version 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.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License version 3.0
*}
<a class="w-full md:w-1/3 lg:w-1/5 flex flex-col p-4 border-gray-500" id="wishlist-link" href="{$url}">
<span class="flex flex-col items-center font-semibolds text-lg">
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-heart" width="32" height="32" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M19.5 12.572l-7.5 7.428l-7.5 -7.428a5 5 0 1 1 7.5 -6.566a5 5 0 1 1 7.5 6.572" /></svg>
{$wishlistsTitlePage}
</span>
</a>

View File

@ -1,25 +0,0 @@
{**
* 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 version 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.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License version 3.0
*}
<a class="w-full md:w-1/3 lg:w-1/4 flex flex-col p-4 border-gray-500" id="wishlist-link" disabled>
<span class="flex flex-col items-center font-semibolds text-lg">
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-ruler-measure" width="32" height="32" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M19.875 12c.621 0 1.125 .512 1.125 1.143v5.714c0 .631 -.504 1.143 -1.125 1.143h-15.875a1 1 0 0 1 -1 -1v-5.857c0 -.631 .504 -1.143 1.125 -1.143h15.75z" /><path d="M9 12v2" /><path d="M6 12v3" /><path d="M12 12v3" /><path d="M18 12v3" /><path d="M15 12v2" /><path d="M3 3v4" /><path d="M3 5h18" /><path d="M21 3v4" /></svg>
Body Measurements
</span>
</a>

View File

@ -22,89 +22,93 @@
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<section class="mx-auto max-w-6xl"> <section class="contact-form">
<form class="w-full flex flex-col gap-4" action="{$urls.pages.contact}" method="post" {if $contact.allow_file_upload}enctype="multipart/form-data"{/if}> <form action="{$urls.pages.contact}" method="post" {if $contact.allow_file_upload}enctype="multipart/form-data"{/if}>
{if !$notifications || $notifications.nw_error}
<div class="form-group row"> {if $notifications}
<div class="col-md-9 col-md-offset-3"> <div class="col-xs-12 alert {if $notifications.nw_error}alert-danger{else}alert-success{/if}">
<h3 class="text-xl font-medium">{l s='Contact us' d='Shop.Theme.Global'}</h3> <ul>
</div> {foreach $notifications.messages as $notif}
<li>{$notif}</li>
{/foreach}
</ul>
</div> </div>
<section class="form-fields w-full flex max-md:flex-col flex-wrap"> {/if}
<div class="form-group flex flex-col gap-2 w-full md:w-1/2 px-2 my-2">
<label class="col-md-3 font-medium">{l s='Subject' d='Shop.Forms.Labels'}</label> {if !$notifications || $notifications.nw_error}
<select name="id_contact" class="dropdown-toggle relative py-1 px-4 pr-8 w-full leading-1 border border-gray-300 text-left"> <section class="form-fields">
<div class="form-group row">
<div class="col-md-9 col-md-offset-3">
<h3>{l s='Contact us' d='Shop.Theme.Global'}</h3>
</div>
</div>
<div class="form-group row">
<label class="col-md-3 form-control-label">{l s='Subject' d='Shop.Forms.Labels'}</label>
<div class="col-md-6">
<select name="id_contact" class="form-control form-control-select">
{foreach from=$contact.contacts item=contact_elt} {foreach from=$contact.contacts item=contact_elt}
<option value="{$contact_elt.id_contact}">{$contact_elt.name}</option> <option value="{$contact_elt.id_contact}">{$contact_elt.name}</option>
{/foreach} {/foreach}
</select> </select>
</div>
</div> </div>
<div class="form-group flex flex-col gap-2 w-full md:w-1/2 px-2 my-2"> <div class="form-group row">
<label class="col-md-3 font-medium">{l s='Email address' d='Shop.Forms.Labels'}</label> <label class="col-md-3 form-control-label">{l s='Email address' d='Shop.Forms.Labels'}</label>
<div class="col-md-6">
<input <input
class="form-control px-4 py-1 border border-gray-300 w-full" class="form-control"
name="from" name="from"
type="email" type="email"
value="{$contact.email}" value="{$contact.email}"
placeholder="{l s='your@email.com' d='Shop.Forms.Help'}" placeholder="{l s='your@email.com' d='Shop.Forms.Help'}"
> >
</div>
</div> </div>
{if $contact.orders} {if $contact.orders}
<div class="form-group flex flex-col gap-2 w-full md:w-1/2 px-2 my-2"> <div class="form-group row">
<label class="col-md-3 font-medium"> <label class="col-md-3 form-control-label">{l s='Order reference' d='Shop.Forms.Labels'}</label>
{l s='Order reference' d='Shop.Forms.Labels'} <div class="col-md-6">
<select name="id_order" class="form-control form-control-select">
<i class="text-xs font-light">
{l s='( optional )' d='Shop.Forms.Help'}
</i>
</label>
<div class="flex flex-col">
<select name="id_order" class="dropdown-toggle relative w-full py-1 px-4 pr-8 leading-1 border border-gray-300 text-left">
<option value="">{l s='Select reference' d='Shop.Forms.Help'}</option> <option value="">{l s='Select reference' d='Shop.Forms.Help'}</option>
{foreach from=$contact.orders item=order} {foreach from=$contact.orders item=order}
<option value="{$order.id_order}">{$order.reference}</option> <option value="{$order.id_order}">{$order.reference}</option>
{/foreach} {/foreach}
</select> </select>
</div> </div>
<span class="col-md-3 form-control-comment">
{l s='optional' d='Shop.Forms.Help'}
</span>
</div> </div>
{/if} {/if}
<div class="form-group flex flex-col gap-2 w-full md:w-1/2 px-2 my-2"> {if $contact.allow_file_upload}
<label class="col-md-3 font-medium">{l s='Message' d='Shop.Forms.Labels'}</label> <div class="form-group row">
<label class="col-md-3 form-control-label">{l s='Attachment' d='Shop.Forms.Labels'}</label>
<div class="col-md-6">
<input type="file" name="fileUpload" class="filestyle" data-buttonText="{l s='Choose file' d='Shop.Theme.Actions'}">
</div>
<span class="col-md-3 form-control-comment">
{l s='optional' d='Shop.Forms.Help'}
</span>
</div>
{/if}
<div class="form-group row">
<label class="col-md-3 form-control-label">{l s='Message' d='Shop.Forms.Labels'}</label>
<div class="col-md-9"> <div class="col-md-9">
<textarea <textarea
class="form-control px-4 py-1 border border-gray-300 w-full" class="form-control"
name="message" name="message"
placeholder="{l s='How can we help?' d='Shop.Forms.Help'}" placeholder="{l s='How can we help?' d='Shop.Forms.Help'}"
rows="1" rows="3"
>{if $contact.message}{$contact.message}{/if}</textarea> >{if $contact.message}{$contact.message}{/if}</textarea>
</div> </div>
</div> </div>
{if $contact.allow_file_upload}
<div class="form-group flex flex-col gap-2 px-2 my-2 w-full md:w-1/2">
<label class="col-md-3 font-medium">{l s='Attachment' d='Shop.Forms.Labels'}
<i class="text-xs font-light">
{l s='( optional )' d='Shop.Forms.Help'}
</i>
</label>
<div class="flex flex-col w-full">
<input type="file" name="fileUpload"
class="form-control text-sm text-blue-950
border border-gray-300 w-full
file:mr-4 file:py-1.5 file:px-4
file:rounded-full file:border-0
file:text-sm file:font-semibold
file:bg-transparent file:text-blue-950
hover:file:text-blue-900"
data-buttonText="{l s='Choose file' d='Shop.Theme.Actions'}">
</div>
</div>
{/if}
{if isset($id_module)} {if isset($id_module)}
<div class="form-group row"> <div class="form-group row">
<div class="offset-md-3"> <div class="offset-md-3">
@ -123,12 +127,9 @@
</style> </style>
<input type="text" name="url" value=""/> <input type="text" name="url" value=""/>
<input type="hidden" name="token" value="{$token}" /> <input type="hidden" name="token" value="{$token}" />
<input class="uppercase font-medium py-2 text-center w-full bg-blue-950 hover:bg-blue-900 text-gray-50" type="submit" name="submitMessage" value="{l s='Send' d='Shop.Theme.Actions'}"> <input class="btn btn-primary" type="submit" name="submitMessage" value="{l s='Send' d='Shop.Theme.Actions'}">
</footer> </footer>
{else}
<div class="flex w-full justify-center font-semibold text-center">
{l s='Thank You for contacting us, we will get back to you shortly.' d='Shop.Theme.Global'}
</div>
{/if} {/if}
</form> </form>
</section> </section>

View File

@ -1,11 +1,11 @@
<?php
/** /**
* Copyright since 2007 PrestaShop SA and Contributors * 2007-2019 PrestaShop and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
* *
* NOTICE OF LICENSE * NOTICE OF LICENSE
* *
* This source file is subject to the Academic Free License 3.0 (AFL-3.0) * 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. * that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL: * It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0 * https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to * If you did not receive a copy of the license and are unable to
@ -16,18 +16,20 @@
* *
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer * 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 * versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information. * needs please refer to https://www.prestashop.com for more information.
* *
* @author PrestaShop SA and Contributors <contact@prestashop.com> * @author PrestaShop SA <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors * @copyright 2007-2019 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA
*/ */
export default function debounce(func, timeout = 300) { header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
let timer; header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
return (...args) => { header("Cache-Control: no-store, no-cache, must-revalidate");
clearTimeout(timer); header("Cache-Control: post-check=0, pre-check=0", false);
timer = setTimeout(() => { func.apply(this, args); }, timeout); header("Pragma: no-cache");
};
} header("Location: ../");
exit;

View File

@ -1,11 +1,10 @@
{** {**
* Copyright since 2007 PrestaShop SA and Contributors * 2007-2019 PrestaShop and Contributors
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
* *
* NOTICE OF LICENSE * NOTICE OF LICENSE
* *
* This source file is subject to the Academic Free License 3.0 (AFL-3.0) * 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. * that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL: * It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/AFL-3.0 * https://opensource.org/licenses/AFL-3.0
* If you did not receive a copy of the license and are unable to * If you did not receive a copy of the license and are unable to
@ -16,13 +15,14 @@
* *
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer * 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 * versions in the future. If you wish to customize PrestaShop for your
* needs please refer to https://devdocs.prestashop.com/ for more information. * needs please refer to https://www.prestashop.com for more information.
* *
* @author PrestaShop SA and Contributors <contact@prestashop.com> * @author PrestaShop SA <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors * @copyright 2007-2019 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA
*} *}
<div class="cart-summary-top js-cart-summary-top"> <div class="advertising-block">
{hook h='displayCheckoutSummaryTop'} <a href="{$adv_link}" title="{$adv_title}"><img src="{$image}" alt="{$adv_title}" title="{$adv_title}"/></a>
</div> </div>

View File

@ -26,7 +26,7 @@
<h2 class="h2 products-section-title text-uppercase"> <h2 class="h2 products-section-title text-uppercase">
{l s='Best Sellers' d='Shop.Theme.Catalog'} {l s='Best Sellers' d='Shop.Theme.Catalog'}
</h2> </h2>
<div class="products flex flex-wrap"> <div class="products">
{foreach from=$products item="product"} {foreach from=$products item="product"}
{include file="catalog/_partials/miniatures/product.tpl" product=$product} {include file="catalog/_partials/miniatures/product.tpl" product=$product}
{/foreach} {/foreach}

View File

@ -1,24 +0,0 @@
{**
* 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 version 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.
*
* @author PrestaShop SA and Contributors <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License version 3.0
*}
<div class="px-4">
<div class='w-full mt-2 p-2 bg-blue-100 border border-blue-300'>
<span>{l s='You pay for the merchandise upon delivery.' d='Modules.Cashondelivery.Shop'}</span>
</div>
</div>

View File

@ -22,15 +22,15 @@
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<section class="flex flex-col gap-8 mt-24"> <section class="featured-products clearfix mt-3">
<span class="text-2xl font-bold"> <h2>
{if $products|@count == 1} {if $products|@count == 1}
{l s='%s other product in the same category:' sprintf=[$products|@count] d='Shop.Theme.Catalog'} {l s='%s other product in the same category:' sprintf=[$products|@count] d='Shop.Theme.Catalog'}
{else} {else}
{l s='%s other products in the same category:' sprintf=[$products|@count] d='Shop.Theme.Catalog'} {l s='%s other products in the same category:' sprintf=[$products|@count] d='Shop.Theme.Catalog'}
{/if} {/if}
</span> </h2>
<div class="products flex flex-wrap"> <div class="products">
{foreach from=$products item="product"} {foreach from=$products item="product"}
{include file="catalog/_partials/miniatures/product.tpl" product=$product} {include file="catalog/_partials/miniatures/product.tpl" product=$product}
{/foreach} {/foreach}

View File

@ -1,38 +0,0 @@
{**
* 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 <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
*}
<div class="px-4">
<div class='flex flex-col gap-2 w-full mt-2 p-2 bg-blue-100 border border-blue-300'>
<span>{l s='Please send us your check following these rules:' d='Modules.Checkpayment.Shop'}</span>
<dl>
<dt class="font-semibold">{l s='Amount' d='Modules.Checkpayment.Shop'}</dt>
<dd class="text-sm mb-3">{$checkTotal} {$checkTaxLabel}</dd>
<dt class="font-semibold">{l s='Payee:' d='Modules.Checkpayment.Shop'}</dt>
<dd class="text-sm mb-3">{$checkOrder}</dd>
<dt class="font-semibold">{l s='Send your check to this address:' d='Modules.Checkpayment.Shop'}</dt>
<dd class="text-sm">{$checkAddress nofilter}</dd>
</dl>
</div>
</div>

View File

@ -24,26 +24,39 @@
*} *}
<div class="contact-rich"> <div class="contact-rich">
<h4 class="text-2xl font-bold">{l s='Store information' d='Shop.Theme.Global'}</h4> <h4>{l s='Store information' d='Shop.Theme.Global'}</h4>
<div class="mx-auto max-w-6xl"> <div class="block">
<h4 class="text-xl font-medium mt-6"> <div class="icon"><i class="material-icons">&#xE55F;</i></div>
Our Stylists <div class="data">{$contact_infos.address.formatted nofilter}</div>
</h4> </div>
<p> {if $contact_infos.phone}
Our Stylists are here for you. We have helped dress some of the biggest names in Hollywood and Professional <hr/>
sports. Our staff of highly experienced tailors and stylists understand the demands placed on you to always look <div class="block">
your very best. <div class="icon"><i class="material-icons">&#xE0CD;</i></div>
</p> <div class="data">
<p class="mt-3"> {l s='Call us:' d='Shop.Theme.Global'}<br/>
Your personal stylist is ready to assist you in all your clothing needs. <a href="tel:{$contact_infos.phone}">{$contact_infos.phone}</a>
</p> </div>
<h4 class="text-xl font-medium mt-6">Customer Service</h4> </div>
<p> Let us show you how custom works. {/if}
We will walk you through your first order. {if $contact_infos.fax}
Just drop us a line at <hr/>
<a href="mailto:customerservice@brooksbingham.com" class="underline underline-offset-2">customerservice@brooksbingham.com</a> <div class="block">
, and we will get in touch with you. <div class="icon"><i class="material-icons">&#xE0DF;</i></div>
</p> <div class="data">
</div> {l s='Fax:' d='Shop.Theme.Global'}<br/>
<hr class="my-8"/> {$contact_infos.fax}
</div>
</div>
{/if}
{if $contact_infos.email}
<hr/>
<div class="block">
<div class="icon"><i class="material-icons">&#xE158;</i></div>
<div class="data email">
{l s='Email us:' d='Shop.Theme.Global'}<br/>
</div>
<a href="mailto:{$contact_infos.email}">{$contact_infos.email}</a>
</div>
{/if}
</div> </div>

View File

@ -25,7 +25,7 @@
<section class="featured-products clearfix mt-3"> <section class="featured-products clearfix mt-3">
<h2>{l s='Customers who bought this product also bought:' d='Shop.Theme.Catalog'}</h2> <h2>{l s='Customers who bought this product also bought:' d='Shop.Theme.Catalog'}</h2>
<div class="products flex flex-wrap"> <div class="products">
{foreach from=$products item="product"} {foreach from=$products item="product"}
{include file="catalog/_partials/miniatures/product.tpl" product=$product} {include file="catalog/_partials/miniatures/product.tpl" product=$product}
{/foreach} {/foreach}

View File

@ -23,43 +23,29 @@
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
{*Mobile View*} <div id="block_myaccount_infos" class="col-md-3 links wrapper">
<div id="block_myaccount_infos" class=" md:hidden th-accordion"> <p class="h3 myaccount-title hidden-sm-down">
<div class="flex flex-col gap-4 th-accordion-item"> <a class="text-uppercase" href="{$urls.pages.my_account}" rel="nofollow">
<div class="title clearfix th-accordion-item-trigger flex items-center gap-2" data-target="#footer_account_list" data-toggle="collapse"> {l s='Your account' d='Shop.Theme.Customeraccount'}
<svg xmlns="http://www.w3.org/2000/svg" class="icon th-accordion-item-trigger-svg icon-tabler stroke-[3px] icon-tabler-chevron-right" width="20" height="20" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M9 6l6 6l-6 6" /></svg> </a>
<span class="font-bold">{l s='Your account' d='Shop.Theme.Customeraccount'}</span> </p>
</div> <div class="title clearfix hidden-md-up" data-target="#footer_account_list" data-toggle="collapse">
<ul class="account-list th-accordion-item-content pl-6" id="footer_account_list"> <span class="h3">{l s='Your account' d='Shop.Theme.Customeraccount'}</span>
{foreach from=$my_account_urls item=my_account_url} <span class="float-xs-right">
<li class="flex"> <span class="navbar-toggler collapse-icons">
<a href="{$my_account_url.url}" class="text-sm font-normal leading-6" title="{$my_account_url.title}" rel="nofollow"> <i class="material-icons add">&#xE313;</i>
{$my_account_url["title"]} <i class="material-icons remove">&#xE316;</i>
</a> </span>
</li> </span>
{/foreach}
<a href="{$logout_url}" class="text-sm font-normal leading-6" title="logout" rel="nofollow">
Sign out
</a>
</ul>
</div> </div>
</div> <ul class="account-list collapse" id="footer_account_list">
{*Desktop View*}
<div id="block_myaccount_infos" class="flex max-md:hidden flex-col gap-4">
<div class="title clearfix" data-target="#footer_account_list" data-toggle="collapse">
<span class="font-bold">{l s='Your account' d='Shop.Theme.Customeraccount'}</span>
</div>
<ul class="account-list" id="footer_account_list">
{foreach from=$my_account_urls item=my_account_url} {foreach from=$my_account_urls item=my_account_url}
<li class="flex"> <li>
<a href="{$my_account_url.url}" class="text-sm font-normal leading-6" title="{$my_account_url.title}" rel="nofollow"> <a href="{$my_account_url.url}" title="{$my_account_url.title}" rel="nofollow">
{$my_account_url["title"]} {$my_account_url.title}
</a> </a>
</li> </li>
{/foreach} {/foreach}
<a href="{$logout_url}" class="text-sm font-normal leading-6" title="logout" rel="nofollow"> {hook h='displayMyAccountBlock'}
Sign out
</a>
</ul> </ul>
</div> </div>

View File

@ -22,20 +22,16 @@
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<div id="_desktop_user_info" class="relative max-md:hidden"> <div id="_desktop_user_info" class="relative">
<div class="flex max-w-[200px] justify-end mx-4"> <div class="flex max-w-[200px] justify-end">
{if $logged} {if $logged}
<a <a
class="logout hidden-sm-down mr-4" class="logout hidden-sm-down"
href="{$logout_url}" href="{$logout_url}"
rel="nofollow" rel="nofollow"
> >
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-logout" width="24" height="24" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round"> <i class="material-icons">&#xE7FF;</i>
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path> {l s='Sign out' d='Shop.Theme.Actions'}
<path d="M14 8v-2a2 2 0 0 0 -2 -2h-7a2 2 0 0 0 -2 2v12a2 2 0 0 0 2 2h7a2 2 0 0 0 2 -2v-2"></path>
<path d="M9 12h12l-3 -3"></path>
<path d="M18 15l3 -3"></path>
</svg>
</a> </a>
<a <a
class="account" class="account"
@ -43,12 +39,8 @@
title="{l s='View my customer account' d='Shop.Theme.Customeraccount'}" title="{l s='View my customer account' d='Shop.Theme.Customeraccount'}"
rel="nofollow" rel="nofollow"
> >
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-user-circle" width="24" height="24" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round"> <i class="material-icons hidden-md-up logged">&#xE7FF;</i>
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path> <span class="hidden-sm-down">{$customerName}</span>
<path d="M12 12m-9 0a9 9 0 1 0 18 0a9 9 0 1 0 -18 0"></path>
<path d="M12 10m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0"></path>
<path d="M6.168 18.849a4 4 0 0 1 3.832 -2.849h4a4 4 0 0 1 3.834 2.855"></path>
</svg>
</a> </a>
{else} {else}
<a <a

View File

@ -26,13 +26,12 @@
<h2 class="products-section-title text-2xl font-bold"> <h2 class="products-section-title text-2xl font-bold">
{l s='Popular Products' d='Shop.Theme.Catalog'} {l s='Popular Products' d='Shop.Theme.Catalog'}
</h2> </h2>
<div class="products flex flex-wrap"> <div class="products grid grid-cols-1 md:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-8">
{foreach from=$products item="product"} {foreach from=$products item="product"}
{include file="catalog/_partials/miniatures/product.tpl" product=$product} {include file="catalog/_partials/miniatures/product.tpl" product=$product}
{/foreach} {/foreach}
</div> </div>
<a class="all-product-link text-2xl font-bold w-full flex items-center justify-end" href="{$allProductsLink}"> <a class="all-product-link text-2xl font-bold" href="{$allProductsLink}">
{l s='All products' d='Shop.Theme.Catalog'} {l s='All products' d='Shop.Theme.Catalog'}
<svg xmlns="http://www.w3.org/2000/svg" class="icon stroke-gray-600 stroke-[3px] icon-tabler icon-tabler-chevron-right" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M9 6l6 6l-6 6" /></svg>
</a> </a>
</section> </section>

View File

@ -24,11 +24,37 @@
*} *}
{if $homeslider.slides} {if $homeslider.slides}
<a href="https://brooksbingham.com/17-custom-made"> <div id="carousel" data-ride="carousel" class="carousel slide" data-interval="{$homeslider.speed}" data-wrap="{(string)$homeslider.wrap}" data-pause="{$homeslider.pause}">
<div class="mb-12 w-full lg:h-[90vh]" style="clip-path: inset(4px)"> <ul class="carousel-inner" role="listbox">
<video autoplay muted loop class="w-full h-auto object-cover" style="background-color: rgba(0, 0, 0, 0)"> {foreach from=$homeslider.slides item=slide name='homeslider'}
<source src="{$urls.img_ps_url}cms/hero.mp4" type="video/mp4" > <li class="carousel-item {if $smarty.foreach.homeslider.first}active{/if}" role="option" aria-hidden="{if $smarty.foreach.homeslider.first}false{else}true{/if}">
</video> <a href="{$slide.url}">
</div> <figure class="relative">
</a> <img src="{$slide.image_url}" alt="{$slide.legend|escape}">
{if $slide.title || $slide.description}
<figcaption class="caption absolute right-0 bottom-0">
<h2 class="display-1 text-uppercase">{$slide.title}</h2>
<div class="caption-description">{$slide.description nofilter}</div>
</figcaption>
{/if}
</figure>
</a>
</li>
{/foreach}
</ul>
<div class="direction" aria-label="{l s='Carousel buttons' d='Shop.Theme.Global'}">
<a class="left carousel-control" href="#carousel" role="button" data-slide="prev">
<span class="icon-prev hidden-xs" aria-hidden="true">
<i class="material-icons">&#xE5CB;</i>
</span>
<span class="sr-only">{l s='Previous' d='Shop.Theme.Global'}</span>
</a>
<a class="right carousel-control" href="#carousel" role="button" data-slide="next">
<span class="icon-next" aria-hidden="true">
<i class="material-icons">&#xE5CC;</i>
</span>
<span class="sr-only">{l s='Next' d='Shop.Theme.Global'}</span>
</a>
</div>
</div>
{/if} {/if}

View File

@ -0,0 +1,49 @@
{**
* 2007-2019 PrestaShop and Contributors
*
* 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.txt.
* 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://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2019 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA
*}
<div id="_desktop_language_selector">
<div class="language-selector-wrapper">
<span id="language-selector-label" class="hidden-md-up">{l s='Language:' d='Shop.Theme.Global'}</span>
<div class="language-selector dropdown js-dropdown">
<button data-toggle="dropdown" class="hidden-sm-down btn-unstyle" aria-haspopup="true" aria-expanded="false" aria-label="{l s='Language dropdown' d='Shop.Theme.Global'}">
<span class="expand-more">{$current_language.name_simple}</span>
<i class="material-icons expand-more">&#xE5C5;</i>
</button>
<ul class="dropdown-menu hidden-sm-down" aria-labelledby="language-selector-label">
{foreach from=$languages item=language}
<li {if $language.id_lang == $current_language.id_lang} class="current" {/if}>
<a href="{url entity='language' id=$language.id_lang}" class="dropdown-item" data-iso-code="{$language.iso_code}">{$language.name_simple}</a>
</li>
{/foreach}
</ul>
<select class="link hidden-md-up" aria-labelledby="language-selector-label">
{foreach from=$languages item=language}
<option value="{url entity='language' id=$language.id_lang}"{if $language.id_lang == $current_language.id_lang} selected="selected"{/if} data-iso-code="{$language.iso_code}">
{$language.name_simple}
</option>
{/foreach}
</select>
</div>
</div>
</div>

View File

@ -22,35 +22,16 @@
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<div class="container">
{*Mobile View*}
<div class="flex flex-wrap flex-1 flex-col md:flex-row th-accordion">
{foreach $linkBlocks as $linkBlock} {foreach $linkBlocks as $linkBlock}
<div class="flex md:hidden flex-col mb-4 md:w-1/3 th-accordion-item"> <div class="flex flex-col mb-4">
<div class="font-bold flex gap-2 items-center mb-4 th-accordion-item-trigger">
<svg xmlns="http://www.w3.org/2000/svg" class="icon th-accordion-item-trigger-svg icon-tabler stroke-[3px] icon-tabler-chevron-right" width="20" height="20" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M9 6l6 6l-6 6" /></svg>
{$linkBlock.title}
</div>
<ul class="flex flex-col th-accordion-item-content pl-6">
{foreach $linkBlock.links as $link}
<li class="flex">
<a id="{$link.id}-{$linkBlock.id}" class="text-sm font-normal leading-6 {$link.class}" href="{$link.url}" title="{$link.description}" {if !empty($link.target)} target="{$link.target}" {/if}>
{$link.title}
</a>
</li>
{/foreach}
</ul>
</div>
{*Desktop View*}
<div class="flex max-md:hidden flex-col mb-4 md:w-1/3">
<div class="font-bold mb-4"> <div class="font-bold mb-4">
{$linkBlock.title} {$linkBlock.title}
</div> </div>
<ul class="flex flex-col"> <ul>
{foreach $linkBlock.links as $link} {foreach $linkBlock.links as $link}
<li class="flex"> <li>
<a id="{$link.id}-{$linkBlock.id}" class="text-sm font-normal leading-6 {$link.class}" href="{$link.url}" title="{$link.description}" {if !empty($link.target)} target="{$link.target}" {/if}> <a id="{$link.id}-{$linkBlock.id}" class="{$link.class}" href="{$link.url}" title="{$link.description}" {if !empty($link.target)} target="{$link.target}" {/if}>
{$link.title} {$link.title}
</a> </a>
</li> </li>

View File

@ -1,9 +1,9 @@
{assign var=_counter value=0} {assign var=_counter value=0}
{function name="menu" nodes=[] depth=0 parent=null} {function name="menu" nodes=[] depth=0 parent=null}
{if $nodes|count} {if $nodes|count}
<ul class="flex flex-1 items-end lg:items-center justify-center top-menu max-lg:flex-col max-md:items-end" {if $depth == 0}id="top-menu"{/if} data-depth="{$depth}"> <ul class="flex flex-1 items-center justify-center top-menu" {if $depth == 0}id="top-menu"{/if} data-depth="{$depth}">
{foreach from=$nodes item=node} {foreach from=$nodes item=node}
<li class="{$node.type}{if $node.current} current {/if} px-2 py-2 font-medium hover:text-gray-950" id="{$node.page_identifier}"> <li class="{$node.type}{if $node.current} current {/if} px-2 py-2" id="{$node.page_identifier}">
{assign var=_counter value=$_counter+1} {assign var=_counter value=$_counter+1}
<a <a
class="{if $depth >= 0}dropdown-item{/if}{if $depth === 1} dropdown-submenu{/if}" class="{if $depth >= 0}dropdown-item{/if}{if $depth === 1} dropdown-submenu{/if}"
@ -13,13 +13,12 @@
{$node.label} {$node.label}
</a> </a>
</li> </li>
<hr class=" last:hidden w-full lg:hidden"/>
{/foreach} {/foreach}
</ul> </ul>
{/if} {/if}
{/function} {/function}
<button class="toggle-main-menu absolute right-4 top-1/2 block -translate-y-1/2 ring-primary focus:ring-2 lg:hidden"> <button class="absolute right-4 top-1/2 block -translate-y-1/2 p-3 ring-primary focus:ring-2 lg:hidden">
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-menu-2" width="24" height="24" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round"> <svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-menu-2" width="24" height="24" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path> <path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M4 6l16 0"></path> <path d="M4 6l16 0"></path>
@ -27,6 +26,6 @@
<path d="M4 18l16 0"></path> <path d="M4 18l16 0"></path>
</svg> </svg>
</button> </button>
<nav class="mobile-main-menu absolute z-10 right-4 top-[70%] w-full max-w-[160px] border border-gray-100 justify-center rounded-lg bg-white p-4 md:p-2 drop-shadow-lg lg:static lg:border-none lg:flex lg:w-full lg:max-w-full lg:bg-transparent lg:py-0 lg:shadow-none hidden" id="_desktop_top_menu"> <nav class="absolute right-4 top-full w-full max-w-[250px] justify-center rounded-lg bg-white py-5 px-6 shadow lg:static lg:flex lg:w-full lg:max-w-full lg:bg-transparent lg:py-0 lg:shadow-none hidden" id="_desktop_top_menu">
{menu nodes=$menu.children} {menu nodes=$menu.children}
</nav> </nav>

View File

@ -22,17 +22,18 @@
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<section class="featured-products flex flex-col gap-8">
<h2 class="products-section-title text-2xl font-bold"> <section class="featured-products clearfix mt-3">
<h2 class="h2 products-section-title text-uppercase">
{l s='New products' d='Shop.Theme.Catalog'} {l s='New products' d='Shop.Theme.Catalog'}
</h2> </h2>
<div class="products flex flex-wrap"> <div class="products">
{foreach from=$products item="product"} {foreach from=$products item="product"}
{include file="catalog/_partials/miniatures/product.tpl" product=$product} {include file="catalog/_partials/miniatures/product.tpl" product=$product}
{/foreach} {/foreach}
</div> </div>
<a class="all-product-link text-2xl font-bold" href="{$allNewProductsLink}"> <a class="all-product-link float-xs-left float-md-right h4" href="{$allNewProductsLink}">
{l s='All new products' d='Shop.Theme.Catalog'} {l s='All new products' d='Shop.Theme.Catalog'}<i class="material-icons">&#xE315;</i>
</a> </a>
</section> </section>

View File

@ -0,0 +1,35 @@
<?php
/**
* 2007-2019 PrestaShop and Contributors
*
* 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.txt.
* 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://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2019 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Location: ../");
exit;

View File

@ -0,0 +1,35 @@
<?php
/**
* 2007-2019 PrestaShop and Contributors
*
* 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.txt.
* 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://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2019 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Location: ../");
exit;

View File

@ -0,0 +1,39 @@
{**
* 2007-2019 PrestaShop and Contributors
*
* 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.txt.
* 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://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2019 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA
*}
<div class="block-contact col-md-2 links wrapper">
<h3 class="h3 hidden-sm-down">{$title}</h3>
<div>
{if $rss_links}
<ul>
{foreach from=$rss_links item='rss_link'}
<li><a href="{$rss_link['link']}" title="{$rss_link['title']}" target="_blank">{$rss_link['title']}</a></li>
{/foreach}
</ul>
{else}
<p>{l s='No RSS feed added' d='Shop.Theme.Catalog'}</p>
{/if}
</div>
</div>

View File

@ -0,0 +1,35 @@
<?php
/**
* 2007-2019 PrestaShop and Contributors
*
* 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.txt.
* 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://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2019 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA
*/
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header("Location: ../");
exit;

View File

@ -0,0 +1,37 @@
{**
* 2007-2019 PrestaShop and Contributors
*
* 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.txt.
* 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://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2019 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA
*}
{block name='social_sharing'}
{if $social_share_links}
<div class="social-sharing">
<span>{l s='Share' d='Shop.Theme.Actions'}</span>
<ul>
{foreach from=$social_share_links item='social_share_link'}
<li class="{$social_share_link.class} icon-gray"><a href="{$social_share_link.url}" class="text-hide" title="{$social_share_link.label}" target="_blank">{$social_share_link.label}</a></li>
{/foreach}
</ul>
</div>
{/if}
{/block}

View File

@ -1,5 +1,5 @@
{** {**
* 2007-2020 PrestaShop and Contributors * 2007-2019 PrestaShop and Contributors
* *
* NOTICE OF LICENSE * NOTICE OF LICENSE
* *
@ -11,20 +11,24 @@
* obtain it through the world-wide-web, please send an email * obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately. * 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://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com> * @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2020 PrestaShop SA and Contributors * @copyright 2007-2019 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
{block name='block_social'}
<dl> <div class="block-social col-lg-4 col-md-12 col-sm-12">
<dt class="font-semibold">{l s='Amount' d='Modules.Wirepayment.Shop'}</dt> <ul>
<dd class="text-sm mb-3">{$total}</dd> {foreach from=$social_links item='social_link'}
<dt class="font-semibold">{l s='Name of account owner' d='Modules.Wirepayment.Shop'}</dt> <li class="{$social_link.class}"><a href="{$social_link.url}" target="_blank">{$social_link.label}</a></li>
<dd class="text-sm mb-3">{$bankwireOwner}</dd> {/foreach}
<dt class="font-semibold">{l s='Please include these details' d='Modules.Wirepayment.Shop'}</dt> </ul>
<dd class="text-sm mb-3">{$bankwireDetails nofilter}</dd> </div>
<dt class="font-semibold">{l s='Bank name' d='Modules.Wirepayment.Shop'}</dt> {/block}
<dd class="text-sm">{$bankwireAddress nofilter}</dd>
</dl>

View File

@ -27,7 +27,7 @@
<h2 class="h2 products-section-title text-uppercase"> <h2 class="h2 products-section-title text-uppercase">
{l s='On sale' d='Shop.Theme.Catalog'} {l s='On sale' d='Shop.Theme.Catalog'}
</h2> </h2>
<div class="products flex flex-wrap"> <div class="products">
{foreach from=$products item="product"} {foreach from=$products item="product"}
{include file="catalog/_partials/miniatures/product.tpl" product=$product} {include file="catalog/_partials/miniatures/product.tpl" product=$product}
{/foreach} {/foreach}

View File

@ -22,9 +22,9 @@
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<section class="featured-products w-full flex flex-col gap-8 mt-24"> <section class="featured-products clearfix mt-3">
<h2 class="text-2xl font-bold">{l s='Viewed products' d='Shop.Theme.Catalog'}</h2> <h2>{l s='Viewed products' d='Shop.Theme.Catalog'}</h2>
<div class="products flex flex-wrap"> <div class="products">
{foreach from=$products item="product"} {foreach from=$products item="product"}
{include file="catalog/_partials/miniatures/product.tpl" product=$product} {include file="catalog/_partials/miniatures/product.tpl" product=$product}
{/foreach} {/foreach}

View File

@ -1,32 +0,0 @@
{**
* 2007-2020 PrestaShop and Contributors
*
* 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.txt.
* 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.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2020 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA
*}
<div class="px-4">
<div class='flex flex-col gap-2 w-full mt-2 p-2 bg-blue-100 border border-blue-300'>
<div class="flex flex-col gap-1">
<span>{l s='Please transfer the invoice amount to our bank account. You will receive our order confirmation by email containing bank details and order number.' d='Modules.Wirepayment.Shop'}</span>
{if $bankwireReservationDays}
<span>{l s='Goods will be reserved %s days for you and we\'ll process the order immediately after receiving the payment.' sprintf=[$bankwireReservationDays] d='Modules.Wirepayment.Shop'}</span>
{/if}
<span>{l s='Payment is made by transfer of the invoice amount to the following account:' d='Modules.Wirepayment.Shop'}</span>
</div>
{include file='module:ps_wirepayment/views/templates/hook/_partials/payment_infos.tpl'}
{$bankwireCustomText nofilter}
</div>
</div>

View File

@ -1,3 +0,0 @@
<a href="{$configure_link}" class="uppercase py-2 flex-1 text-center border border-blue-950 hover:text-blue-900 hover:border-blue-900 hover:no-underline text-blue-950 font-medium max-h-[40px]">
Customize in 3D
</a>

View File

@ -1,20 +0,0 @@
<table class="w-full striped">
<thead>
<tr>
<th>Particular</th>
<th>Value</th>
</tr>
</thead>
<tbody>
{foreach from=$line_items item="line_item"}
<tr class="even:bg-blue-500/10">
<td class="py-1 pl-2">
{$line_item["label"]}
</td>
<td class="py-1 pr-2">
{$line_item["value"]}
</td>
</tr>
{/foreach}
</tbody>
</table>

View File

@ -1,24 +0,0 @@
$(document).ready(function() {
//Check if the dialog should be shown based on the flag in local storage
if (!localStorage.getItem('tbm_dialog_closed')) {
$('#tbm-not-set-modal').modal('show');
}
//Handle click event for the close link
$('#close-tbm-modal').click(function() {
//Set flag in local storage when the close link is clicked
localStorage.setItem('tbm_dialog_closed', 'true');
});
//Handle click event for the "Set Measurements" button
$('#set-measurements-tbm-modal').click(function() {
//Set flag in local storage when the "Set Measurements" button is clicked
localStorage.setItem('tbm_dialog_closed', 'true');
});
//Listen for click event on logout button
$('.logout').click(function() {
//Clear the local storage item
localStorage.removeItem('tbm_dialog_closed');
});
});

View File

@ -1,272 +0,0 @@
$(document).ready(function() {
$('#photos-completed-button').click(function(event){
event.preventDefault();
var accessCode = $('#product-additional-info-access-code').val();
$.ajax({
url: 'index.php?fc=module&module=thobbodymeasurements&controller=SetProductMeasurements&ajax=true&action=getCustomerMeasurementsForMirrorSize',
method: 'POST',
dataType: 'json',
headers: {
Accepts: "application/json",
},
data: {
ajax: true,
action: 'getCustomerMeasurementsForMirrorSize',
accessCode: accessCode,
},
success: function(response) {
console.log(response);
// window.location.reload();
},
error: function(xhr, status, error) {
console.error(xhr.responseText);
}
});
});
$('#set-measurements-button').click(function(event) {
// Prevent the default behavior of the anchor tag
event.preventDefault();
// Toggle the visibility of the modal
$('#measurements-modal').toggle();
});
$(document).click(function(event) {
// Check if the click target is not within the modal
if (!$(event.target).closest('#measurements-modal').length && !$(event.target).is('#set-measurements-button')) {
// Hide the modal
$('#measurements-modal').hide();
}
});
});
$('#closebutton').click(function() {
$('#measurements-modal').hide();
});
$('#closemirrorbutton').click(function() {
$('#measurements-modal').hide();
});
// Add click event handler to the "Photos Completed" button
$('#photos-completed-button').click(function(event) {
// Perform some action here
alert('Photos Completed button clicked!');
});
$('#submit-measurements-button').click(function(event) {
event.preventDefault();
var measurements = [];
$('.modal-set-measurements .form-group').each(function() {
var attributeId = $(this).find('input').attr('id');
var value = $(this).find('input').val();
console.log("Attribute id: ",attributeId)
console.log("value: ",value)
measurements.push({
"attributeId": attributeId,
"value": value
});
});
console.log("measurements: ",measurements)
var formId = $('#current_form_id').val();
var formLabel = $('#current_form_label').val();
var productId = $('#product-additional-info-product-id').val();
var categoryId = $('#product-additional-info-category-id').val();
var productAttributeId = $('#product-additional-info-product-attribute-id').val();
$.ajax({
url: 'index.php?fc=module&module=thobbodymeasurements&controller=SetProductMeasurements&ajax=true&action=saveProductMeasurements',
method: 'POST',
dataType: 'json',
headers: {
Accepts: "application/json",
},
data: {
ajax: true,
action: 'saveProductMeasurements',
formId: formId,
formLabel: formLabel,
measurements: JSON.stringify(measurements),
productId: productId,
categoryId: categoryId,
productAttributeId: productAttributeId,
},
success: function(response) {
console.log(response);
window.location.reload();
},
error: function(xhr, status, error) {
console.error(xhr.responseText);
}
});
});
$('.add-to-cart').click( (event) => {
console.log("inside add to cart click...");
var productId = $('#product-additional-info-product-id').val();
var categoryId = $('#product-additional-info-category-id').val();
var productAttributeId = $('#product-additional-info-product-attribute-id').val();
if(!productId && !categoryId){
return;
}
event.preventDefault();
event.stopImmediatePropagation();
var formId = $('#current_form_id').val();
var formLabel = $('#current_form_label').val();
var measurements = [];
$('.modal-set-measurements .form-group').each(function() {
var attributeId = $(this).find('input').attr('id');
var value = $(this).find('input').val();
measurements.push({
"attributeId": attributeId,
"value": value
});
});
//first check if the measurements are set by the customer
$.ajax({
url: 'index.php?fc=module&module=thobbodymeasurements&controller=SetProductMeasurements&ajax=true&action=customerHasMeasurements',
method: 'POST',
dataType: 'json',
headers: {
Accepts: "application/json",
},
data: {
ajax: true,
action: 'customerHasMeasurements',
productId: productId,
categoryId: categoryId,
}
}).done(function (response){
console.log('has measurements response....');
if(!response.hasMeasurements){
console.log("Set measurements first...");
$('#measurements-modal').modal('show');
}else{
$.ajax({
url: 'index.php?fc=module&module=thobbodymeasurements&controller=SetProductMeasurements&ajax=true&action=saveProductMeasurements',
method: 'POST',
dataType: 'json',
headers: {
Accepts: "application/json",
},
data: {
ajax: true,
action: 'saveProductMeasurements',
formId: formId,
formLabel: formLabel,
measurements: JSON.stringify(measurements),
productId: productId,
categoryId: categoryId,
productAttributeId: productAttributeId,
},
success: function(response) {
console.log(response);
console.log("Proceed to add to cart....");
console.log(event.currentTarget)
const $form = $(event.currentTarget.form);
const query = `${$form.serialize()}&add=1&action=update`;
console.log("Form: ", $form.serialize());
console.log("Query: ", query);
const actionURL = $form.attr('action');
console.log("actionURL: ", actionURL);
const addToCartButton = $(event.currentTarget);
addToCartButton.prop('disabled', true);
const isQuantityInputValid = ($input) => {
let validInput = true;
$input.each((index, input) => {
const $currentInput = $(input);
const minimalValue = parseInt($currentInput.attr('min'), 10);
if (minimalValue && $currentInput.val() < minimalValue) {
onInvalidQuantity($currentInput);
validInput = false;
}
});
return validInput;
};
let onInvalidQuantity = ($input) => {
$input
.parents(prestashop.selectors.product.addToCart)
.first()
.find(prestashop.selectors.product.minimalQuantity)
.addClass('error');
$input
.parent()
.find('label')
.addClass('error');
};
const $quantityInput = $form.find('input[min]');
if (!isQuantityInputValid($quantityInput)) {
onInvalidQuantity($quantityInput);
return;
}
$.post(actionURL, query, null, 'json')
.then((resp) => {
console.log('Resp: ', resp);
if (!resp.hasError) {
prestashop.emit('updateCart', {
reason: {
idProduct: resp.id_product,
idProductAttribute: resp.id_product_attribute,
idCustomization: resp.id_customization,
linkAction: 'add-to-cart',
cart: resp.cart,
},
resp,
});
} else {
prestashop.emit('handleError', {
eventType: 'addProductToCart',
resp,
});
}
})
.fail((resp) => {
prestashop.emit('handleError', {
eventType: 'addProductToCart',
resp,
});
})
.always(() => {
setTimeout(() => {
addToCartButton.prop('disabled', false);
}, 1000);
});
},
error: function(xhr, status, error) {
console.error(xhr.responseText);
}
});
}
});
});

View File

@ -1,88 +0,0 @@
{**
* 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.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright Since 2007 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
*}
{extends file='customer/page.tpl'}
{block name='page_title'}
{l s='thob - Manual Body Measurements' mod='thobbodymeasurements'}
{/block}
{block name='page_content'}
<div class="bg-white-400 shadow-md">
<section class=" h-34 p-10 flex flex-col">
{if isset($selectedForm)}
<h2 class="text-lg font-bold">{l s='Form:' mod='thobbodymeasurements'} {$selectedForm.label_form}</h2>
<form action="#" method="post" class="flex flex-col items-center justify-center ">
{foreach from=$selectedForm.attributes item=attribute}
<section class="flex flex-row p-4">
<div class=" flex flex-row gap-4">
<div class="w-24 lg:pr-4 text-end mt-2">
<label for="{$attribute.id}" class="text-base font-semibold mt-1 ">{$attribute.name}:</label>
</div>
<div class="lg:w-[500px]">
<input
type="text"
id="{$attribute.id}"
name="{$attribute.id}"
class=" lg:w-[450px] p-2"
pattern="[0-9]+"
title="Please enter a positive number"
required
{if isset($customerMeasurements) && isset($customerMeasurements[$attribute.id])}
value="{$customerMeasurements[$attribute.id]}"
{else}
placeholder="Enter measurement"
{/if}
/>
</div>
<div class="mt-1 w-24 mt-2 text-start ">
{$attribute.unit}
</div>
</div>
<input type="hidden" name="selected_form_id" id="selected_form_id" class="form-control" value="{$selectedForm.id_form}">
<input type="hidden" name="selected_form_label" id="selected_form_label" class="form-control" value="{$selectedForm.label_form}">
</section>
{/foreach}
<div class="lg:pr-11">
<button name="measurements_submit_form" type="submit" class=" hover:text-white hover:no-underline px-6 py-2 bg-blue-950 disabled:bg-gray-700 text-white text-base font-light">{l s='Save Measurements' mod='thobbodymeasurements'}</button>
</div>
</form>
{else}
<form action="#" method="post" class="form-horizontal mx-auto">
<div class="flex lg:flex-row flex-col gap-4 justify-center">
<label for="form_select" class="form-control-label col-md-3 font-medium text-lg mt-1 ">{l s='Select a Form:' mod='thobbodymeasurements'}</label>
<div class="">
<select name="form_select" id="form_select" class="form-control p-2 form-control-select w-[220px] h-[40px] rounded">
{foreach from=$currentForms item=form}
<option value="{$form.id_form}">{$form.label_form}</option>
{/foreach}
</select>
</div>
</div>
<div class="lg:pl-32 p-4">
<div class=" hover:text-white hover:no-underline px-6 py-2 bg-blue-950 disabled:bg-gray-700 text-white text-base font-light w-32">
<button type="submit" class="">{l s='Select Form' mod='thobbodymeasurements'}</button>
</div>
</div>
</form>
{/if}
</section>
</div>
{/block}

View File

@ -1,7 +0,0 @@
<a class="w-full md:w-1/3 lg:w-1/5 flex flex-col p-4 border-gray-500" id="tbm-link" href="{$front_controller}">
<span class="flex flex-col items-center font-semibolds text-lg">
<svg xmlns="http://www.w3.org/2000/svg" width=32 height=32 viewBox="0 0 32 32" id="measurements" stroke="currentColor"><path d="M29.5,1h-5A2.5,2.5,0,0,0,22,3.5V22H3.5A2.5,2.5,0,0,0,1,24.5v5A2.5,2.5,0,0,0,3.5,32h26A2.5,2.5,0,0,0,32,29.5V3.5A2.5,2.5,0,0,0,29.5,1ZM31,29.5A1.5,1.5,0,0,1,29.5,31H3.5A1.5,1.5,0,0,1,2,29.5v-5A1.5,1.5,0,0,1,3.5,23H4v3.5a.5.5,0,0,0,1,0V23H7v1.5a.5.5,0,0,0,1,0V23h2v1.5a.5.5,0,0,0,1,0V23h2v3.5a.5.5,0,0,0,1,0V23h2v1.5a.5.5,0,0,0,1,0V23h2v1.5a.5.5,0,0,0,1,0V23h2v3.5a.5.5,0,0,0,1,0V23h3.5a.5.5,0,0,0,0-1H23V20h1.5a.5.5,0,0,0,0-1H23V17h1.5a.5.5,0,0,0,0-1H23V14h3.5a.5.5,0,0,0,0-1H23V11h1.5a.5.5,0,0,0,0-1H23V8h1.5a.5.5,0,0,0,0-1H23V5h3.5a.5.5,0,0,0,0-1H23V3.5A1.5,1.5,0,0,1,24.5,2h5A1.5,1.5,0,0,1,31,3.5Z"></path></svg>
Body Measurements
</span>
</a>

View File

@ -1,17 +0,0 @@
<div class="modal fade" id="tbm-not-set-modal" tabindex="-1" role="dialog" aria-labelledby="tbm-not-set-label" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title font-semibold" id="tbm-not-set-label">{l s='thob Body Measurements'}</h5>
</div>
<div class="modal-body p-8">
<p>{l s='Please fill your personal body measurements to have the best custom shopping experience.'}</p>
</div>
<div class="modal-footer text-end">
<a id="set-measurements-tbm-modal" href="{$front_controller}" class=" hover:text-white hover:no-underline px-6 py-2 bg-blue-950 disabled:bg-gray-700 text-white text-base font-light">{l s='Set Measurements'}</a>
<a id="close-tbm-modal" href="" class=" hover:text-white hover:no-underline px-6 py-2 bg-gray-700 text-white text-base font-light">{l s='Close'}</a>
</div>
</div>
</div>
</div>

View File

@ -1,22 +0,0 @@
{if $measurements}
<div class="block w-full overflow-auto scrolling-touch table-striped p-1">
<table class="w-full max-w-full mb-4 bg-transparent">
<thead>
<tr>
<th>Attribute</th>
<th>Value</th>
<th>Unit</th>
</tr>
</thead>
<tbody>
{foreach from=$measurements item="measurement"}
<tr>
<td style="text-align:left;">{$measurement.label}</td>
<td style="text-align:left;">{$measurement.value}</td>
<td style="text-align:left;">{$measurement.unit}</td>
</tr>
{/foreach}
</tbody>
</table>
</div>
{/if}

View File

@ -1,89 +0,0 @@
<input type="hidden" id="product-additional-info-product-id" value="{$productId}">
<input type="hidden" id="product-additional-info-category-id" value="{$categoryId}">
<input type="hidden" id="product-additional-info-product-attribute-id" value="{$productAttributeId}">
<input type="hidden" id="product-additional-info-access-code" value="{$accessCode}">
<a href="#" class="product-set-measurements-btn" id="set-measurements-button" data-toggle="modal" data-target="#measurements-modal">
Set Measurements
</a>
<!-- Modal -->
<div class="">
<div class="modal modal-set-measurements lg:w-[600px] mainBody pop-up" id="measurements-modal" tabindex="-1" role="dialog" >
<div class="wrapper">
<div class="tabs">
<div class="tab">
<input type="radio" name="css-tabs" id="tab-1" checked class="tab-switch">
<label for="tab-1" class="tab-label">Custom</label>
<div class="tab-content my-12">
{if isset($currentForm)}
<h2 class="font-semibold mb-4">{$currentForm.label_form}</h2>
<section class="form-fields">
{foreach from=json_decode($currentForm.attributes, true) item=$attribute}
<div class="mb-4 flex flex-row form-group ">
<div class="w-24 pr-8">
<label for="{$attribute.id}" class="form-control-label md:w-1/4 pr-4 pl-4 required">{$attribute.name}</label>
</div>
<div class=" js-input-column">
<input
type="text"
id="{$attribute.id}"
name="{$attribute.id}"
class=" block appearance-none md:w-56 w-24 py-1 px-2 mb-1 text-base leading-normal bg-white text-gray-800 border border-gray-200 rounded"
pattern="[0-9]+"
title="Please enter a positive number"
required
{if isset($customerMeasurements) && isset($customerMeasurements[$attribute.id])}
value="{$customerMeasurements[$attribute.id]}"
{/if}>
</div>
<div class="md:w-1/4 pr-4 pl-4 form-control-comment w-24">
<small class="block mt-1 text-gray-700 ">{$attribute.unit}</small>
</div>
</div>
{/foreach}
<input type="hidden" name="current_form_id" id="current_form_id" class="block appearance-none w-full py-1 px-2 mb-1 text-base leading-normal bg-white text-gray-800 border border-gray-200 rounded" value="{$currentForm.id_form}">
<input type="hidden" name="current_form_label" id="current_form_label" class="block appearance-none w-full py-1 px-2 mb-1 text-base leading-normal bg-white text-gray-800 border border-gray-200 rounded" value="{$currentForm.label_form}">
</section>
<button type="submit" class=" hover:text-white hover:no-underline px-6 py-2 bg-blue-950 disabled:bg-gray-700 text-white text-base font-light" id="submit-measurements-button">{l s='Submit' mod='thobbodymeasurements'}</button>
{else}
<p>No form data available.</p>
{/if}
<button type="button" class="hover:text-white hover:no-underline px-6 py-2 bg-gray-700 text-white text-base font-light" id="closebutton" data-dismiss="modal">Close</button>
</div>
</div>
<div class="tab mb-8">
<input type="radio" name="css-tabs" id="tab-2" class="tab-switch">
<label for="tab-2" class="tab-label">Mirror</label>
<div class="tab-content gap-mb-8">
<div class="tab-pane mb-8" id="mirror-size-measurements" role="tabpanel" aria-labelledby="mirror-size-measurements-tab">
{if $qrCode}
<img src="{$qrCode}" alt="Mirror Size QR Code" class="mx-auto max-w-full h-64">
<p class="mt-3"> Scan the above QR code to begin our easy 2 photo custom measurement collection.</p>
<p class="mt-3"> Click on 'Photos Completed' button once your above process is finished. </p>
<button type="button" class=" mt-3 mb-8 inline-block text-center select-none font-normal whitespace-no-wrap px-6 py-2 leading-normal no-underline bg-green-500 text-white hover:green-600" id="photos-completed-button" name="photos-completed-button">Photos Completed</button>
<button type="button" class=" mt-3 mb-8 hover:text-white hover:no-underline px-6 py-2 bg-gray-700 text-white text-base font-light " id="closemirrorbutton" data-dismiss="modal">Close</button>
{/if}
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -23,7 +23,7 @@
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<nav data-depth="{$breadcrumb.count}" class="breadcrumb hidden md:flex my-8 w-full"> <nav data-depth="{$breadcrumb.count}" class="breadcrumb hidden md:flex my-8 w-full">
<ol itemscope itemtype="http://schema.org/BreadcrumbList" class="hidden md:flex w-full "> <ol itemscope itemtype="http://schema.org/BreadcrumbList" class="hidden md:flex w-full gap-4">
{block name='breadcrumb'} {block name='breadcrumb'}
{foreach from=$breadcrumb.links item=path name=breadcrumb} {foreach from=$breadcrumb.links item=path name=breadcrumb}
{block name='breadcrumb_item'} {block name='breadcrumb_item'}
@ -31,9 +31,6 @@
<a itemprop="item" href="{$path.url}"> <a itemprop="item" href="{$path.url}">
<span itemprop="name">{$path.title}</span> <span itemprop="name">{$path.title}</span>
</a> </a>
{if !$smarty.foreach.breadcrumb.last}
<span class="mx-4">/</span>
{/if}
<meta itemprop="position" content="{$smarty.foreach.breadcrumb.iteration}"> <meta itemprop="position" content="{$smarty.foreach.breadcrumb.iteration}">
</li> </li>
{/block} {/block}

View File

@ -27,30 +27,13 @@
{hook h='displayFooterBefore'} {hook h='displayFooterBefore'}
{/block} {/block}
</div> </div>
<div class="container mx-auto flex flex-col gap-8"> <div class="container mx-auto">
<div class="flex flex-col lg:flex-row gap-8"> <div class="flex items-center">
<div class="w-32 max-sm:hidden flex flex-row justify-center items-center"> <div class="w-48 h-48 flex flex-col justify-center">
<a class="w-full" href="{$urls.base_url}"> <a class="w-24 h-24" href="{$urls.base_url}">
<img class="logo w-full" src="{$shop.logo}" alt="{$shop.name}"> <img class="logo w-full aspect-square object-fit" src="{$shop.logo}" alt="{$shop.name}">
</a>
</div>
<div class="w-full flex flex-1 flex-col lg:flex-row">
{block name='hook_footer'}
{hook h='displayFooter'}
{/block}
</div>
<div class="flex justify-center items-center gap-4">
<a class="p-4" href="https://www.facebook.com/BrooksBinghamClothing?mibextid=ZbWKwL" target="_blank">
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-facebook" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M7 10v4h3v7h4v-7h3l1 -4h-4v-2a1 1 0 0 1 1 -1h3v-4h-3a5 5 0 0 0 -5 5v2h-3" /></svg>
</a>
<a class="p-4" href="https://instagram.com/brooksbingham?igshid=YTQwZjQ0NmI0OA==" target="_blank">
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-brand-instagram" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M4 4m0 4a4 4 0 0 1 4 -4h8a4 4 0 0 1 4 4v8a4 4 0 0 1 -4 4h-8a4 4 0 0 1 -4 -4z"></path>
<path d="M12 12m-3 0a3 3 0 1 0 6 0a3 3 0 1 0 -6 0"></path>
<path d="M16.5 7.5l0 .01"></path>
</svg>
</a> </a>
<div class="h-96">
</div> </div>
</div> </div>
<div class="flex"> <div class="flex">
@ -58,9 +41,13 @@
{hook h='displayFooterAfter'} {hook h='displayFooterAfter'}
{/block} {/block}
</div> </div>
<div class="flex py-8 max-md:justify-center"> <div class="container">
<a href="{$urls.base_url}"> <div class="flex justify-center py-8">
<span class="text-sm">© 2024 Brooksbingham Clothing</span> {block name='copyright_link'}
</a> <a class="_blank" href="https://www.prestashop.com" target="_blank" rel="nofollow">
{l s='%copyright% %year% - Ecommerce software by %prestashop%' sprintf=['%prestashop%' => 'PrestaShop™', '%year%' => 'Y'|date, '%copyright%' => '©'] d='Shop.Theme.Global'}
</a>
{/block}
</div>
</div> </div>
</div> </div>

View File

@ -23,11 +23,11 @@
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
{if $errors|count} {if $errors|count}
<div class="help-block mb-4"> <div class="help-block">
{block name='form_errors'} {block name='form_errors'}
<ul> <ul>
{foreach $errors as $error} {foreach $errors as $error}
<li class="alert alert-danger px-4 py-2 border border-red-100 bg-red-50 text-red-900">{$error|nl2br nofilter}</li> <li class="alert alert-danger">{$error|nl2br nofilter}</li>
{/foreach} {/foreach}
</ul> </ul>
{/block} {/block}

View File

@ -30,18 +30,18 @@
{else} {else}
<div class="form-group {if !empty($field.errors)}has-error{/if} flex flex-col"> <div class="form-group row {if !empty($field.errors)}has-error{/if}">
<label class="font-medium form-control-label{if $field.required} required{/if} mb-1"> <label class="col-md-3 form-control-label{if $field.required} required{/if}">
{if $field.type !== 'checkbox'} {if $field.type !== 'checkbox'}
{$field.label} {$field.label}
{/if} {/if}
</label> </label>
<div class="flex gap-1 {if ($field.type === 'radio-buttons')}flex gap-2 items-center{else}flex-col{/if}"> <div class="col-md-6{if ($field.type === 'radio-buttons')} form-control-valign{/if}">
{if $field.type === 'select'} {if $field.type === 'select'}
{block name='form_field_item_select'} {block name='form_field_item_select'}
<select class="form-control form-control-select px-2 py-1 border-gray-300 w-full" name="{$field.name}" {if $field.required}required{/if}> <select class="form-control form-control-select" name="{$field.name}" {if $field.required}required{/if}>
<option value disabled selected>{l s='-- please choose --' d='Shop.Forms.Labels'}</option> <option value disabled selected>{l s='-- please choose --' d='Shop.Forms.Labels'}</option>
{foreach from=$field.availableValues item="label" key="value"} {foreach from=$field.availableValues item="label" key="value"}
<option value="{$value}" {if $value eq $field.value} selected {/if}>{$label}</option> <option value="{$value}" {if $value eq $field.value} selected {/if}>{$label}</option>
@ -53,7 +53,7 @@
{block name='form_field_item_country'} {block name='form_field_item_country'}
<select <select
class="form-control form-control-select js-country px-2 py-1 border-gray-300 w-full" class="form-control form-control-select js-country"
name="{$field.name}" name="{$field.name}"
{if $field.required}required{/if} {if $field.required}required{/if}
> >
@ -87,9 +87,10 @@
{elseif $field.type === 'checkbox'} {elseif $field.type === 'checkbox'}
{block name='form_field_item_checkbox'} {block name='form_field_item_checkbox'}
<span class="custom-checkbox flex gap-2"> <span class="custom-checkbox">
<input class="my-0.5" name="{$field.name}" type="checkbox" value="1" {if $field.value}checked="checked"{/if} {if $field.required}required{/if}> <label>
<label class="font-light text-sm" for="{$field.name}"> <input name="{$field.name}" type="checkbox" value="1" {if $field.value}checked="checked"{/if} {if $field.required}required{/if}>
<span><i class="material-icons rtl-no-flip checkbox-checked">&#xE5CA;</i></span>
{$field.label nofilter} {$field.label nofilter}
</label> </label>
</span> </span>
@ -131,9 +132,9 @@
{elseif $field.type === 'password'} {elseif $field.type === 'password'}
{block name='form_field_item_password'} {block name='form_field_item_password'}
<div class="input-group js-parent-focus relative"> <div class="input-group js-parent-focus">
<input <input
class="form-control js-child-focus js-visible-password px-2 py-1 border border-gray-300 w-full" class="form-control js-child-focus js-visible-password"
name="{$field.name}" name="{$field.name}"
title="{l s='At least 5 characters long' d='Shop.Forms.Help'}" title="{l s='At least 5 characters long' d='Shop.Forms.Help'}"
type="password" type="password"
@ -141,6 +142,17 @@
pattern=".{literal}{{/literal}5,{literal}}{/literal}" pattern=".{literal}{{/literal}5,{literal}}{/literal}"
{if $field.required}required{/if} {if $field.required}required{/if}
> >
<span class="input-group-btn">
<button
class="btn"
type="button"
data-action="show-password"
data-text-show="{l s='Show' d='Shop.Theme.Actions'}"
data-text-hide="{l s='Hide' d='Shop.Theme.Actions'}"
>
{l s='Show' d='Shop.Theme.Actions'}
</button>
</span>
</div> </div>
{/block} {/block}
@ -148,7 +160,7 @@
{block name='form_field_item_other'} {block name='form_field_item_other'}
<input <input
class="form-control px-2 py-1 border border-gray-300 w-full" class="form-control"
name="{$field.name}" name="{$field.name}"
type="{$field.type}" type="{$field.type}"
value="{$field.value}" value="{$field.value}"
@ -171,7 +183,7 @@
</div> </div>
<div class="col-md-3 form-control-comment text-sm text-gray-600"> <div class="col-md-3 form-control-comment">
{block name='form_field_comment'} {block name='form_field_comment'}
{if (!$field.required && !in_array($field.type, ['radio-buttons', 'checkbox']))} {if (!$field.required && !in_array($field.type, ['radio-buttons', 'checkbox']))}
{l s='Optional' d='Shop.Forms.Labels'} {l s='Optional' d='Shop.Forms.Labels'}

View File

@ -1,5 +1,5 @@
{** {**
* 2007-2019 PrestaShop and Contributorslivereload * 2007-2019 PrestaShop and Contributors
* *
* NOTICE OF LICENSE * NOTICE OF LICENSE
* *
@ -58,7 +58,6 @@
{block name='stylesheets'} {block name='stylesheets'}
{include file="_partials/stylesheets.tpl" stylesheets=$stylesheets} {include file="_partials/stylesheets.tpl" stylesheets=$stylesheets}
{/block} {/block}
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@2.36.0/tabler-icons.min.css">
{block name='javascript_head'} {block name='javascript_head'}
{include file="_partials/javascript.tpl" javascript=$javascript.head vars=$js_custom_vars} {include file="_partials/javascript.tpl" javascript=$javascript.head vars=$js_custom_vars}
@ -76,46 +75,13 @@
} }
} }
} }
</script> </script>
{literal} {** TODO: Remove this before going live *}
<!-- Hotjar Tracking Code for brooksbingham.com --> <script>document.write('<script src="http://'
<script> + location.host.split(':')[0]
(function(h,o,t,j,a,r){ + ':35729/livereload.js"></'
h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)}; + 'script>')</script>
h._hjSettings={hjid:1840785,hjsv:6};
a=o.getElementsByTagName('head')[0];
r=o.createElement('script');r.async=1;
r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv;
a.appendChild(r);
})(window,document,'https://static.hotjar.com/c/hotjar-','.js?sv=');
</script>
{/literal}
{literal}
<!--Start of Tawk.to Script-->
<script type="text/javascript">
var Tawk_API=Tawk_API||{}, Tawk_LoadStart=new Date();
(function(){
var s1=document.createElement("script"),s0=document.getElementsByTagName("script")[0];
s1.async=true;
s1.src='https://embed.tawk.to/5dcb9e0bd96992700fc72d14/1dphord7t';
s1.charset='UTF-8';
s1.setAttribute('crossorigin','*');
s0.parentNode.insertBefore(s1,s0);
})();
</script>
<!--End of Tawk.to Script-->
{/literal}
{literal}
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-5RQJPSV4');</script>
<!-- End Google Tag Manager -->
{/literal}
{block name='hook_header'} {block name='hook_header'}
{$HOOK_HEADER nofilter} {$HOOK_HEADER nofilter}
{/block} {/block}

View File

@ -26,7 +26,7 @@
{block name='header_top'} {block name='header_top'}
<div class="container mx-auto"> <div class="container mx-auto">
<div class="relative -mx-4 flex items-center justify-between h-24"> <div class="relative -mx-4 flex items-center justify-between h-24">
<div class="w-40 max-md:pl-4 max-w-full "> <div class="w-12 max-w-full ">
<a class="block w-full " href="{$urls.base_url}"> <a class="block w-full " href="{$urls.base_url}">
<img class="w-full" src="{$shop.logo}" alt="{$shop.name}"/> <img class="w-full" src="{$shop.logo}" alt="{$shop.name}"/>
</a> </a>
@ -35,7 +35,7 @@
<div class="w-full"> <div class="w-full">
{hook h='displayMainMenu'} {hook h='displayMainMenu'}
</div> </div>
<div class="relative right-12 items-center justify-end sm:flex lg:right-0"> <div class="relative right-16 hidden items-center justify-end sm:flex lg:right-0">
{hook h='displayTop'} {hook h='displayTop'}
</div> </div>
</div> </div>

View File

@ -22,7 +22,7 @@
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<nav class="pagination flex justify-between mt-16"> <nav class="pagination flex justify-between">
<div class="flex"> <div class="flex">
{block name='pagination_summary'} {block name='pagination_summary'}
{l s='Showing %from%-%to% of %total% item(s)' d='Shop.Theme.Catalog' sprintf=['%from%' => $pagination.items_shown_from ,'%to%' => $pagination.items_shown_to, '%total%' => $pagination.total_items]} {l s='Showing %from%-%to% of %total% item(s)' d='Shop.Theme.Catalog' sprintf=['%from%' => $pagination.items_shown_from ,'%to%' => $pagination.items_shown_to, '%total%' => $pagination.total_items]}
@ -34,17 +34,14 @@
{if $pagination.should_be_displayed} {if $pagination.should_be_displayed}
<ul class="flex gap-4"> <ul class="flex gap-4">
{foreach from=$pagination.pages item="page"} {foreach from=$pagination.pages item="page"}
<li {if $page.current} class="current font-bold" {/if}> <li {if $page.current} class="current" {/if}>
<a <a
rel="{if $page.type === 'previous'}prev{elseif $page.type === 'next'}next{else}nofollow{/if}" rel="{if $page.type === 'previous'}prev{elseif $page.type === 'next'}next{else}nofollow{/if}"
href="{$page.url}" href="{$page.url}"
disabled class="flex items-center {if $page.type === 'previous'}previous {elseif $page.type === 'next'}next {/if}{['disabled' => !$page.clickable, 'js-search-link' => true]|classnames}"
class="flex items-center {if $page.type === 'previous'}previous {elseif $page.type === 'next'}next {/if}{['disabled' => !$page.clickable, 'js-search-link' => true]|classnames} {if $page.type == 'spacer'} pointer-events-none{/if}"
> >
{if $page.type === 'previous'} {if $page.type === 'previous'}
{l s='Previous' d='Shop.Theme.Actions'} {l s='Previous' d='Shop.Theme.Actions'}
{elseif $page.type === 'spacer'}
...
{elseif $page.type === 'next'} {elseif $page.type === 'next'}
{l s='Next' d='Shop.Theme.Actions'} {l s='Next' d='Shop.Theme.Actions'}
{else} {else}

View File

@ -26,8 +26,6 @@
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Cairo:wght@200;300;400;500;600;700;800;900;1000&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Cairo:wght@200;300;400;500;600;700;800;900;1000&display=swap" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@2.36.0/tabler-icons.min.css"> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@2.36.0/tabler-icons.min.css">
<link rel="stylesheet" href="/themes/elegance/assets/js/style.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jquery-modal/0.9.2/jquery.modal.min.css" />
{foreach $stylesheets.external as $stylesheet} {foreach $stylesheets.external as $stylesheet}
<link rel="stylesheet" href="{$stylesheet.uri}" type="text/css" media="{$stylesheet.media}"> <link rel="stylesheet" href="{$stylesheet.uri}" type="text/css" media="{$stylesheet.media}">
{/foreach} {/foreach}

View File

@ -1,9 +0,0 @@
{**
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*}
<div id="js-product-list-footer">
{if !empty($category.additional_description) && $listing.pagination.items_shown_from == 1}
{$category.additional_description nofilter}
{/if}
</div>

View File

@ -22,11 +22,20 @@
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<div id="js-product-list-header" class="mb-8 flex flex-col gap-4"> <div id="js-product-list-header">
{if isset($subcategories) && $subcategories|@count> 0} {if $listing.pagination.items_shown_from == 1}
<div class="flex"> <div class="block-category card card-block">
<h2 class="tex-4xl font-bold">Categories</h2> <h1 class="h1">{$category.name}</h1>
</div> <div class="block-category-inner">
{include file='catalog/_partials/subcategories.tpl' subcategories=$subcategories} {if $category.description}
{/if} <div id="category-description" class="text-muted">{$category.description nofilter}</div>
{/if}
{if $category.image.large.url}
<div class="category-cover">
<img src="{$category.image.large.url}" alt="{if !empty($category.image.legend)}{$category.image.legend}{else}{$category.name}{/if}">
</div>
{/if}
</div>
</div>
{/if}
</div> </div>

View File

@ -24,56 +24,145 @@
*} *}
{if $facets|count} {if $facets|count}
<div id="search_filters"> <div id="search_filters">
<div class="th-accordion"> {block name='facets_title'}
{foreach from=$facets item="facet"} <p class="text-uppercase h6 hidden-sm-down">{l s='Filter By' d='Shop.Theme.Actions'}</p>
{if !$facet.displayed} {/block}
{continue}
{/if} {block name='facets_clearall_button'}
{if $facet.widgetType === 'dropdown'} {if $activeFilters|count}
<div class="th-accordion-item border-t border-gray-200 px-4 py-4"> <div id="_desktop_search_filters_clear_all" class="hidden-sm-down clear-all-wrapper">
<h3 class="-mx-2 -my-3 flow-root"> <button data-search-url="{$clear_all_link}" class="btn btn-tertiary js-search-filters-clear-all">
<!-- Expand/collapse section button --> <i class="material-icons">&#xE14C;</i>
<button id="show-filters-{$facet.label}" data-filter-name="{$facet.label}" type="button" class="th-accordion-item-trigger flex w-full items-center justify-between bg-white px-2 py-3 text-gray-400 hover:text-gray-500" aria-controls="filter-section-mobile-0" aria-expanded="false"> {l s='Clear all' d='Shop.Theme.Actions'}
<span class="font-medium text-gray-900"> </button>
{$active_found = false} </div>
{foreach from=$facet.filters item="filter"} {/if}
{if $filter.active} {/block}
{$filter.label}
{$active_found = true} {foreach from=$facets item="facet"}
{if !$facet.displayed}
{continue}
{/if}
<section class="facet clearfix">
<p class="h6 facet-title hidden-sm-down">{$facet.label}</p>
{assign var=_expand_id value=10|mt_rand:100000}
{assign var=_collapse value=true}
{foreach from=$facet.filters item="filter"}
{if $filter.active}{assign var=_collapse value=false}{/if}
{/foreach}
<div class="title hidden-md-up" data-target="#facet_{$_expand_id}" data-toggle="collapse"{if !$_collapse} aria-expanded="true"{/if}>
<p class="h6 facet-title">{$facet.label}</p>
<span class="float-xs-right">
<span class="navbar-toggler collapse-icons">
<i class="material-icons add">&#xE313;</i>
<i class="material-icons remove">&#xE316;</i>
</span>
</span>
</div>
{if $facet.widgetType !== 'dropdown'}
{block name='facet_item_other'}
<ul id="facet_{$_expand_id}" class="collapse{if !$_collapse} in{/if}">
{foreach from=$facet.filters key=filter_key item="filter"}
{if !$filter.displayed}
{continue}
{/if}
<li>
<label class="facet-label{if $filter.active} active {/if}" for="facet_input_{$_expand_id}_{$filter_key}">
{if $facet.multipleSelectionAllowed}
<span class="custom-checkbox">
<input
id="facet_input_{$_expand_id}_{$filter_key}"
data-search-url="{$filter.nextEncodedFacetsURL}"
type="checkbox"
{if $filter.active }checked{/if}
>
{if isset($filter.properties.color)}
<span class="color" style="background-color:{$filter.properties.color}"></span>
{elseif isset($filter.properties.texture)}
<span class="color texture" style="background-image:url({$filter.properties.texture})"></span>
{else}
<span {if !$js_enabled} class="ps-shown-by-js" {/if}><i class="material-icons rtl-no-flip checkbox-checked">&#xE5CA;</i></span>
{/if}
</span>
{else}
<span class="custom-radio">
<input
id="facet_input_{$_expand_id}_{$filter_key}"
data-search-url="{$filter.nextEncodedFacetsURL}"
type="radio"
name="filter {$facet.label}"
{if $filter.active }checked{/if}
>
<span {if !$js_enabled} class="ps-shown-by-js" {/if}></span>
</span>
{/if} {/if}
{/foreach}
{if !$active_found}
{$facet.label}
{/if}
</span>
<span class="ml-6 flex items-center">
<!-- Expand icon, show/hide based on section open state. -->
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-chevron-down" width="16" height="16" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M6 9l6 6l6 -6"></path>
</svg>
</span>
</button>
</h3>
<!-- Filter section, show/hide based on section state. -->
<div class="th-accordion-item-content pt-6 hidden" id="filter-section-{$facet.label}" data-filter-name="{$facet.label}">
<div class="flex flex-wrap w-full">
{foreach from=$facet.filters item="filter"}
{if !$filter.active}
<a <a
rel="nofollow"
href="{$filter.nextEncodedFacetsURL}" href="{$filter.nextEncodedFacetsURL}"
class="select-list text-sm w-1/2 p-2 text-center" class="_gray-darker search-link js-search-link"
rel="nofollow"
> >
{$filter.label} {$filter.label}
{if $filter.magnitude}
<span class="magnitude">({$filter.magnitude})</span>
{/if}
</a> </a>
{/if} </label>
{/foreach} </li>
</div> {/foreach}
</div> </ul>
</div> {/block}
{else}
{block name='facet_item_dropdown'}
<ul id="facet_{$_expand_id}" class="collapse{if !$_collapse} in{/if}">
<li>
<div class="col-sm-12 col-xs-12 col-md-12 facet-dropdown dropdown">
<a class="select-title" rel="nofollow" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
{$active_found = false}
<span>
{foreach from=$facet.filters item="filter"}
{if $filter.active}
{$filter.label}
{if $filter.magnitude}
({$filter.magnitude})
{/if}
{$active_found = true}
{/if}
{/foreach}
{if !$active_found}
{l s='(no filter)' d='Shop.Theme.Global'}
{/if}
</span>
<i class="material-icons float-xs-right">&#xE5C5;</i>
</a>
<div class="dropdown-menu">
{foreach from=$facet.filters item="filter"}
{if !$filter.active}
<a
rel="nofollow"
href="{$filter.nextEncodedFacetsURL}"
class="select-list"
>
{$filter.label}
{if $filter.magnitude}
({$filter.magnitude})
{/if}
</a>
{/if}
{/foreach}
</div>
</div>
</li>
</ul>
{/block}
{/if} {/if}
{/foreach} </section>
</div> {/foreach}
</div> </div>
{/if} {/if}

View File

@ -23,40 +23,70 @@
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
{block name='product_miniature_item'} {block name='product_miniature_item'}
<a href="{$product.url}" class="group w-full md:w-1/2 lg:w-1/3 xl:w-1/4 flex flex-col p-4"> <article class="product-miniature js-product-miniature flex flex-col shrink-0" data-id-product="{$product.id_product}" data-id-product-attribute="{$product.id_product_attribute}" itemscope itemtype="http://schema.org/Product">
{block name='product_thumbnail'} <div class="thumbnail-container flex flex-col gap-4">
{if $product.cover} {block name='product_thumbnail'}
<div class="thumbnail product-thumbnail w-full aspect-[342/513] bg-gray-100"> {if $product.cover}
<img <a href="{$product.url}" class="thumbnail product-thumbnail w-full aspect-[342/513] bg-gray-100">
src="{$product.cover.bySize.home_default.url}" <img
alt="{if !empty($product.cover.legend)}{$product.cover.legend}{else}{$product.name|truncate:30:'...'}{/if}" src="{$product.cover.bySize.home_default.url}"
data-full-size-image-url="{$product.cover.large.url}" alt="{if !empty($product.cover.legend)}{$product.cover.legend}{else}{$product.name|truncate:30:'...'}{/if}"
class="object-cover w-full h-full" data-full-size-image-url="{$product.cover.large.url}"
/> class="object-cover w-full h-full"
</div> />
{else} </a>
<div class="thumbnail product-thumbnail w-full aspect-[342/513]"> {else}
<img class="object-fit w-full h-full" src="{$urls.no_picture_image.bySize.home_default.url}" /> <a href="{$product.url}" class="thumbnail product-thumbnail w-full aspect-[342/513]">
</div> <img class="object-fit w-full h-full" src="{$urls.no_picture_image.bySize.home_default.url}" />
{/if} </a>
{/block}
<div class="product-description flex flex-col pt-4 group-hover:text-blue-900 gap-1">
{block name='product_price_and_shipping'}
<div class="flex w-full justify-between items-center">
{if $product.has_discount}
<span class="regular-price line-through leading-none font-medium">{$product.regular_price}</span>
{/if} {/if}
{if $product.show_price} {/block}
<div class="font-bold text-lg">
<span>{$product.price}</span>
</div>
{/if}
</div>
{/block}
{block name='product_name'}
<span class="text-lg font-light" itemprop="name">{$product.name|truncate:30:'...'}</span>
{/block}
</div>
</a>
{/block}
<div class="product-description flex flex-col">
{block name='product_price_and_shipping'}
{if $product.show_price}
<div class="product-price-and-shipping flex flex-col">
{if $product.has_discount}
{hook h='displayProductPriceBlock' product=$product type="old_price"}
<span class="regular-price">{$product.regular_price}</span>
{if $product.discount_type === 'percentage'}
<span class="discount-percentage discount-product">{$product.discount_percentage}</span>
{elseif $product.discount_type === 'amount'}
<span class="discount-amount discount-product">{$product.discount_amount_to_display}</span>
{/if}
{/if}
{hook h='displayProductPriceBlock' product=$product type="before_price"}
<span itemprop="price" class="price text-base font-medium">{$product.price}</span>
{hook h='displayProductPriceBlock' product=$product type='unit_price'}
{hook h='displayProductPriceBlock' product=$product type='weight'}
</div>
{/if}
{/block}
{block name='product_name'}
<h2 class="h3 product-title text-lg font-medium" itemprop="name"><a href="{$product.url}">{$product.name|truncate:30:'...'}</a></h2>
{/block}
{block name='product_reviews'}
{hook h='displayProductListReviews' product=$product}
{/block}
</div>
<!-- @todo: use include file='catalog/_partials/product-flags.tpl'} -->
<div class="highlighted-informations{if !$product.main_variants} no-variants{/if} hidden-sm-down">
{block name='product_variants'}
{if $product.main_variants}
{include file='catalog/_partials/variant-links.tpl' variants=$product.main_variants}
{/if}
{/block}
</div>
</div>
</article>
{/block}

View File

@ -22,65 +22,57 @@
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<div class="product-add-to-cart flex flex-col gap-3 mt-8 mb-4"> <div class="product-add-to-cart">
{if !$configuration.is_catalog} {if !$configuration.is_catalog}
<span class="control-label">{l s='Quantity' d='Shop.Theme.Catalog'}</span>
{block name='product_availability'}
<span id="product-availability" class='flex w-full justify-center items-center gap-1 text-xl'>
{if $product.show_availability && $product.availability_message}
{if $product.availability == 'available'}
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-box-seam" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M12 3l8 4.5v9l-8 4.5l-8 -4.5v-9l8 -4.5"></path>
<path d="M12 12l8 -4.5"></path>
<path d="M8.2 9.8l7.6 -4.6"></path>
<path d="M12 12v9"></path>
<path d="M12 12l-8 -4.5"></path>
</svg>
{elseif $product.availability == 'last_remaining_items'}
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-hourglass" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M6.5 7h11"></path>
<path d="M6.5 17h11"></path>
<path d="M6 20v-2a6 6 0 1 1 12 0v2a1 1 0 0 1 -1 1h-10a1 1 0 0 1 -1 -1z"></path>
<path d="M6 4v2a6 6 0 1 0 12 0v-2a1 1 0 0 0 -1 -1h-10a1 1 0 0 0 -1 1z"></path>
</svg>
{else}
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-package-off" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M8.812 4.793l3.188 -1.793l8 4.5v8.5m-2.282 1.784l-5.718 3.216l-8 -4.5v-9l2.223 -1.25"></path>
<path d="M14.543 10.57l5.457 -3.07"></path>
<path d="M12 12v9"></path>
<path d="M12 12l-8 -4.5"></path>
<path d="M16 5.25l-4.35 2.447m-2.564 1.442l-1.086 .611"></path>
<path d="M3 3l18 18"></path>
</svg>
{/if}
{$product.availability_message}
{/if}
</span>
{/block}
{block name='product_quantity'} {block name='product_quantity'}
<div class="flex w-full flex-col gap-4"> <div class="product-quantity clearfix">
<div class="qty">
<input
type="number"
name="qty"
id="quantity_wanted"
value="{$product.quantity_wanted}"
class="input-group"
min="{$product.minimal_quantity}"
aria-label="{l s='Quantity' d='Shop.Theme.Actions'}"
>
</div>
<div class="add"> <div class="add">
<button <button
class="add-to-cart w-full uppercase py-2 font-medium text-center bg-blue-950 text-gray-50 hover:text-gray-50 hover:bg-blue-900" class="btn btn-primary add-to-cart"
data-button-action="add-to-cart" data-button-action="add-to-cart"
type="submit" type="submit"
{if !$product.add_to_cart_url} {if !$product.add_to_cart_url}
disabled disabled
{/if} {/if}
> >
{l s='ADD TO CART' d='Shop.Theme.Actions'} <i class="material-icons shopping-cart">&#xE547;</i>
{l s='Add to cart' d='Shop.Theme.Actions'}
</button> </button>
</div> </div>
{hook h='displayCustomProductActions'}
{hook h='displayProductActions' product=$product} {hook h='displayProductActions' product=$product}
</div> </div>
{/block} {/block}
{block name='product_availability'}
<span id="product-availability">
{if $product.show_availability && $product.availability_message}
{if $product.availability == 'available'}
<i class="material-icons rtl-no-flip product-available">&#xE5CA;</i>
{elseif $product.availability == 'last_remaining_items'}
<i class="material-icons product-last-items">&#xE002;</i>
{else}
<i class="material-icons product-unavailable">&#xE14B;</i>
{/if}
{$product.availability_message}
{/if}
</span>
{/block}
{block name='product_minimal_quantity'} {block name='product_minimal_quantity'}
<p class="product-minimal-quantity"> <p class="product-minimal-quantity">
{if $product.minimal_quantity > 1} {if $product.minimal_quantity > 1}

View File

@ -22,6 +22,6 @@
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<div class="product-additional-info flex flex-col"> <div class="product-additional-info">
{hook h='displayProductAdditionalInfo' product=$product} {hook h='displayProductAdditionalInfo' product=$product}
</div> </div>

View File

@ -22,18 +22,25 @@
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<div class="images-container flex w-full flex-row-reverse justify-center gap-6 flex-wrap lg:flex-nowrap"> <div class="images-container">
{block name='product_cover'} {block name='product_cover'}
<div class="product-cover w-full"> <div class="product-cover">
<img class="js-qv-product-cover w-full bg-gray-100" src="{$product.cover.bySize.large_default.url}" alt="{$product.cover.legend}" title="{$product.cover.legend}" itemprop="image"> {if $product.cover}
<img class="js-qv-product-cover" src="{$product.cover.bySize.large_default.url}" alt="{$product.cover.legend}" title="{$product.cover.legend}" style="width:100%;" itemprop="image">
<div class="layer hidden-sm-down" data-toggle="modal" data-target="#product-modal">
<i class="material-icons zoom-in">&#xE8FF;</i>
</div>
{else}
<img src="{$urls.no_picture_image.bySize.large_default.url}" style="width:100%;">
{/if}
</div> </div>
{/block} {/block}
{block name='product_images'} {block name='product_images'}
<div class="js-qv-mask mask" > <div class="js-qv-mask mask">
<ul class="product-images js-qv-product-images flex flex-row lg:flex-col gap-6"> <ul class="product-images js-qv-product-images">
{foreach from=$product.images item=image} {foreach from=$product.images item=image}
<li class="thumb-container w-14 md:w-24"> <li class="thumb-container">
<img <img
class="thumb js-thumb {if $image.id_image == $product.cover.id_image} selected {/if}" class="thumb js-thumb {if $image.id_image == $product.cover.id_image} selected {/if}"
data-image-medium-src="{$image.bySize.medium_default.url}" data-image-medium-src="{$image.bySize.medium_default.url}"
@ -41,6 +48,7 @@
src="{$image.bySize.home_default.url}" src="{$image.bySize.home_default.url}"
alt="{$image.legend}" alt="{$image.legend}"
title="{$image.legend}" title="{$image.legend}"
width="100"
itemprop="image" itemprop="image"
> >
</li> </li>

View File

@ -1,19 +1,91 @@
{block name='product_features'} <div class="tab-pane fade{if !$product.description} in active{/if}"
{if $product.grouped_features} id="product-details"
<div class='w-full flex items-center flex-col gap-3'> data-product="{$product.embedded_attributes|json_encode}"
<h1 class='text-lg font-bold text-gray-600'> role="tabpanel"
Description >
</h1> {block name='product_reference'}
<ul class="product-features list-[square] w-full flex flex-col gap-1 justify-center"> {if isset($product_manufacturer->id)}
{foreach from=$product.grouped_features item=feature} <div class="product-manufacturer">
<div class="flex gap-2"> {if isset($manufacturer_image_url)}
<li class="w-44 shrink-0"> <a href="{$product_brand_url}">
<span class="name font-semibold">{$feature.name}</span> <img src="{$manufacturer_image_url}" class="img img-thumbnail manufacturer-logo" alt="{$product_manufacturer->name}">
</li> </a>
<span class="value">{$feature.value|escape:'htmlall'|nl2br nofilter}</span> {else}
</div> <label class="label">{l s='Brand' d='Shop.Theme.Catalog'}</label>
{/foreach} <span>
</ul> <a href="{$product_brand_url}">{$product_manufacturer->name}</a>
</span>
{/if}
</div>
{/if}
{if isset($product.reference_to_display) && $product.reference_to_display neq ''}
<div class="product-reference">
<label class="label">{l s='Reference' d='Shop.Theme.Catalog'} </label>
<span itemprop="sku">{$product.reference_to_display}</span>
</div>
{/if}
{/block}
{block name='product_quantities'}
{if $product.show_quantities}
<div class="product-quantities">
<label class="label">{l s='In stock' d='Shop.Theme.Catalog'}</label>
<span data-stock="{$product.quantity}" data-allow-oosp="{$product.allow_oosp}">{$product.quantity} {$product.quantity_label}</span>
</div>
{/if}
{/block}
{block name='product_availability_date'}
{if $product.availability_date}
<div class="product-availability-date">
<label>{l s='Availability date:' d='Shop.Theme.Catalog'} </label>
<span>{$product.availability_date}</span>
</div>
{/if}
{/block}
{block name='product_out_of_stock'}
<div class="product-out-of-stock">
{hook h='actionProductOutOfStock' product=$product}
</div> </div>
{/if} {/block}
{/block}
{block name='product_features'}
{if $product.grouped_features}
<section class="product-features">
<p class="h6">{l s='Data sheet' d='Shop.Theme.Catalog'}</p>
<dl class="data-sheet">
{foreach from=$product.grouped_features item=feature}
<dt class="name">{$feature.name}</dt>
<dd class="value">{$feature.value|escape:'htmlall'|nl2br nofilter}</dd>
{/foreach}
</dl>
</section>
{/if}
{/block}
{* if product have specific references, a table will be added to product details section *}
{block name='product_specific_references'}
{if !empty($product.specific_references)}
<section class="product-features">
<p class="h6">{l s='Specific References' d='Shop.Theme.Catalog'}</p>
<dl class="data-sheet">
{foreach from=$product.specific_references item=reference key=key}
<dt class="name">{$key}</dt>
<dd class="value">{$reference}</dd>
{/foreach}
</dl>
</section>
{/if}
{/block}
{block name='product_condition'}
{if $product.condition}
<div class="product-condition">
<label class="label">{l s='Condition' d='Shop.Theme.Catalog'} </label>
<link itemprop="itemCondition" href="{$product.condition.schema_url}"/>
<span>{$product.condition.label}</span>
</div>
{/if}
{/block}
</div>

View File

@ -23,12 +23,12 @@
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
{if $product.show_price} {if $product.show_price}
<div class="product-prices flex flex-col"> <div class="product-prices">
{block name='product_discount'} {block name='product_discount'}
{if $product.has_discount} {if $product.has_discount}
<div class="product-discount"> <div class="product-discount">
{hook h='displayProductPriceBlock' product=$product type="old_price"} {hook h='displayProductPriceBlock' product=$product type="old_price"}
<span class="regular-price line-through text-red-400 leading-none">{$product.regular_price}</span> <span class="regular-price">{$product.regular_price}</span>
</div> </div>
{/if} {/if}
{/block} {/block}
@ -43,14 +43,14 @@
<link itemprop="availability" href="{$product.seo_availability}"/> <link itemprop="availability" href="{$product.seo_availability}"/>
<meta itemprop="priceCurrency" content="{$currency.iso_code}"> <meta itemprop="priceCurrency" content="{$currency.iso_code}">
<div class="current-price flex gap-2 items-baseline"> <div class="current-price">
<span itemprop="price" class="text-2xl font-normal" content="{$product.price_amount}">{$product.price}</span> <span itemprop="price" content="{$product.price_amount}">{$product.price}</span>
{if $product.has_discount} {if $product.has_discount}
{if $product.discount_type === 'percentage'} {if $product.discount_type === 'percentage'}
<span class="discount discount-percentage">{l s='Save %percentage%' d='Shop.Theme.Catalog' sprintf=['%percentage%' => $product.discount_percentage_absolute]}</span> <span class="discount discount-percentage">{l s='Save %percentage%' d='Shop.Theme.Catalog' sprintf=['%percentage%' => $product.discount_percentage_absolute]}</span>
{else} {else}
<span class="discount discount-amount text-sm"> <span class="discount discount-amount">
{l s='Save %amount%' d='Shop.Theme.Catalog' sprintf=['%amount%' => $product.discount_to_display]} {l s='Save %amount%' d='Shop.Theme.Catalog' sprintf=['%amount%' => $product.discount_to_display]}
</span> </span>
{/if} {/if}
@ -92,6 +92,8 @@
<div class="tax-shipping-delivery-label"> <div class="tax-shipping-delivery-label">
{if !$configuration.taxes_enabled} {if !$configuration.taxes_enabled}
{l s='No tax' d='Shop.Theme.Catalog'} {l s='No tax' d='Shop.Theme.Catalog'}
{elseif $configuration.display_taxes_label}
{$product.labels.tax_long}
{/if} {/if}
{hook h='displayProductPriceBlock' product=$product type="price"} {hook h='displayProductPriceBlock' product=$product type="price"}
{hook h='displayProductPriceBlock' product=$product type="after_price"} {hook h='displayProductPriceBlock' product=$product type="after_price"}

4
templates/catalog/_partials/product-variants.tpl Executable file → Normal file
View File

@ -26,10 +26,10 @@
{foreach from=$groups key=id_attribute_group item=group} {foreach from=$groups key=id_attribute_group item=group}
{if !empty($group.attributes)} {if !empty($group.attributes)}
<div class="clearfix product-variants-item"> <div class="clearfix product-variants-item">
<span class="control-label font-semibold pr-2">{$group.name}:</span> <span class="control-label">{$group.name}</span>
{if $group.group_type == 'select'} {if $group.group_type == 'select'}
<select <select
class="form-control form-control-select p-2 w-14" class="form-control form-control-select"
id="group_{$id_attribute_group}" id="group_{$id_attribute_group}"
data-product-attribute="{$id_attribute_group}" data-product-attribute="{$id_attribute_group}"
name="group[{$id_attribute_group}]"> name="group[{$id_attribute_group}]">

View File

@ -22,50 +22,35 @@
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<div id="js-product-list-top" class="row products-selection">
<div class="col-md-6 hidden-sm-down total-products">
{if $listing.pagination.total_items > 1}
<p>{l s='There are %product_count% products.' d='Shop.Theme.Catalog' sprintf=['%product_count%' => $listing.pagination.total_items]}</p>
{elseif $listing.pagination.total_items > 0}
<p>{l s='There is 1 product.' d='Shop.Theme.Catalog'}</p>
{/if}
</div>
<div class="col-md-6">
<div class="row sort-by-row">
<div id="js-product-list-top" class="bg-white">
<!-- Top Bar With Filter Button and Sort By Selector -->
<div class="flex justify-between">
<!-- Show Filters Button -->
<div class="flex">
{if !empty($listing.rendered_facets)}
<button id="show-filters" type="button" class="flex space-x-2 items-center">
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-filter" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M4 4h16v2.172a2 2 0 0 1 -.586 1.414l-4.414 4.414v7l-6 2v-8.5l-4.48 -4.928a2 2 0 0 1 -.52 -1.345v-2.227z" />
</svg>
<span> Filter </span>
</button>
{/if}
</div>
<!-- Sort By Dropdown -->
<div class="flex max-w-[240px]">
{block name='sort_by'} {block name='sort_by'}
{include file='catalog/_partials/sort-orders.tpl' sort_orders=$listing.sort_orders} {include file='catalog/_partials/sort-orders.tpl' sort_orders=$listing.sort_orders}
{/block} {/block}
</div>
</div>
<!-- Off Screen Canvas Menu For Filters --> {if !empty($listing.rendered_facets)}
<div id="product-list-top-filters" class="offcanvas fixed inset-0 flex w-64 hidden" role="dialog" aria-modal="true"> <div class="col-sm-3 col-xs-4 hidden-md-up filter-button">
<div class="relative mr-auto flex h-full flex-col overflow-y-auto bg-white py-4 pb-12 shadow-xl"> <button id="search_filter_toggler" class="btn btn-secondary">
<div class="flex items-center justify-between px-4"> {l s='Filter' d='Shop.Theme.Actions'}
<h2 class="text-lg font-medium text-gray-900">Filters</h2>
<button id="hide-filters" type="button">
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-x" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"/>
<path d="M18 6l-12 12" /><path d="M6 6l12 12" />
</svg>
</button> </button>
</div> </div>
<form class="mt-4 border-t border-gray-200"> {/if}
{if !empty($listing.rendered_facets)} </div>
{include file='catalog/_partials/facets.tpl'} </div>
{else} <div class="col-sm-12 hidden-md-up text-sm-center showing">
<div></div> {l s='Showing %from%-%to% of %total% item(s)' d='Shop.Theme.Catalog' sprintf=[
{/if} '%from%' => $listing.pagination.items_shown_from ,
</form> '%to%' => $listing.pagination.items_shown_to,
</div> '%total%' => $listing.pagination.total_items
]}
</div> </div>
</div> </div>

View File

@ -22,8 +22,8 @@
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<div id="js-product-list" class="flex flex-col"> <div id="js-product-list flex flex-col">
<div class="products flex flex-wrap"> <div class="products grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
{foreach from=$listing.products item="product"} {foreach from=$listing.products item="product"}
{block name='product_miniature'} {block name='product_miniature'}
{include file='catalog/_partials/miniatures/product.tpl' product=$product} {include file='catalog/_partials/miniatures/product.tpl' product=$product}
@ -35,8 +35,8 @@
{include file='_partials/pagination.tpl' pagination=$listing.pagination} {include file='_partials/pagination.tpl' pagination=$listing.pagination}
{/block} {/block}
<div class="flex justify-center md:hidden my-8"> <div class="flex justify-center md:hidden my-4">
<a href="#js-product-list-header" class="btn btn-secondary font-semibold"> <a href="#header" class="btn btn-secondary">
{l s='Back to top' d='Shop.Theme.Actions'} {l s='Back to top' d='Shop.Theme.Actions'}
</a> </a>
</div> </div>

View File

@ -22,31 +22,26 @@
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<span class="col-sm-3 col-md-3 hidden-sm-down sort-by">{l s='Sort by:' d='Shop.Theme.Global'}</span>
<div class="relative flex-1 w-full max-w-[240px] group"> <div class="{if !empty($listing.rendered_facets)}col-sm-9 col-xs-8{else}col-sm-12 col-xs-12{/if} col-md-9 products-sort-order dropdown">
<button <button
class="dropdown-toggle relative px-4 pr-6 leading-1 w-full text-left" class="btn-unstyle select-title"
type="button"
rel="nofollow" rel="nofollow"
data-toggle="dropdown"
aria-haspopup="true" aria-haspopup="true"
aria-expanded="false"> aria-expanded="false">
{if isset($listing.sort_selected)}{$listing.sort_selected}{else}{l s='Select' d='Shop.Theme.Actions'}{/if} {if isset($listing.sort_selected)}{$listing.sort_selected}{else}{l s='Select' d='Shop.Theme.Actions'}{/if}
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-chevron-down absolute right-0 top-1" width="16" height="16" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"> <i class="material-icons float-xs-right">&#xE5C5;</i>
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M6 9l6 6l6 -6"></path>
</svg>
</button> </button>
<div class="dropdown-menu hidden group-hover:flex absolute top-full right-0 bg-white z-10 shadow-lg"> <div class="dropdown-menu">
<div class="flex flex-col whitespace-nowrap"> {foreach from=$listing.sort_orders item=sort_order}
{foreach from=$listing.sort_orders item=sort_order} <a
<a rel="nofollow"
rel="nofollow" href="{$sort_order.url}"
href="{$sort_order.url}" class="select-list {['current' => $sort_order.current, 'js-search-link' => true]|classnames}"
class="px-4 py-1 hover:text-yellow-700 select-list {['current' => $sort_order.current, 'js-search-link' => true]|classnames}" >
> {$sort_order.label}
{$sort_order.label} </a>
</a> {/foreach}
{/foreach}
</div>
</div> </div>
</div> </div>

View File

@ -1,52 +0,0 @@
{**
* 2007-2019 PrestaShop and Contributors
*
* 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.txt.
* 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://www.prestashop.com for more information.
*
* @author PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2019 PrestaShop SA and Contributors
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA
*}
{$componentName = 'subcategories'}
{if !empty($subcategories)}
{if (isset($display_subcategories) && $display_subcategories eq 1) || !isset($display_subcategories) }
<div id="subcategories" class="{$componentName} flex flex-col gap-2 md:flex-row">
{foreach from=$subcategories item=subcategory}
<div class="subcategory__wrapper flex-1 bg-gray-100">
<a class="subcategory relative" href="{$subcategory.url}" title="{$subcategory.name|escape:'html':'UTF-8'}">
<div class="subcategory__image w-full">
{if !empty($subcategory.image.large.url)}
<img
class="img-fluid hidden md:block mx-auto w-full max-w-[171px] aspect-[342/513]"
src="{$subcategory.image.large.url}"
width="{$subcategory.image.large.width}"
height="{$subcategory.image.large.height}"
alt="{$subcategory.name|escape:'html':'UTF-8'}"
loading="lazy"
>
{/if}
</div>
<div class="p-2 flex items-center w-full relative md:absolute left-0 bottom-0 right-0 top-0 bg-black/70 flex items-center justify-center">
<p class="subcategory__name font-bold text-center w-full text-gray-50">{$subcategory.name|escape:'html':'UTF-8'}</p>
</div>
</a>
</div>
{/foreach}
</div>
{/if}
{/if}

View File

@ -25,9 +25,4 @@
{extends file='catalog/listing/product-list.tpl'} {extends file='catalog/listing/product-list.tpl'}
{block name='product_list_header'} {block name='product_list_header'}
{include file='catalog/_partials/category-header.tpl' listing=$listing category=$category}
{/block}
{block name='product_list_footer'}
{include file='catalog/_partials/category-footer.tpl' listing=$listing category=$category}
{/block} {/block}

View File

@ -31,7 +31,7 @@
<h2 id="js-product-list-header" class="h2">{$listing.label}</h2> <h2 id="js-product-list-header" class="h2">{$listing.label}</h2>
{/block} {/block}
<section id="products" class="flex flex-col gap-8"> <section id="products" class="flex flex-col gap-4">
{if $listing.products|count} {if $listing.products|count}
{block name='product_list_top'} {block name='product_list_top'}

View File

@ -52,29 +52,36 @@
<section id="main" itemscope itemtype="https://schema.org/Product"> <section id="main" itemscope itemtype="https://schema.org/Product">
<meta itemprop="url" content="{$product.url}"> <meta itemprop="url" content="{$product.url}">
<div class="flex gap-8 flex-wrap lg:flex-nowrap"> <div class="row product-container">
<div class="col-md-6">
{block name='page_content_container'} {block name='page_content_container'}
<section class="flex w-full" id="content"> <section class="page-content" id="content">
{block name='page_content'} {block name='page_content'}
<!-- @todo: use include file='catalog/_partials/product-flags.tpl'} --> <!-- @todo: use include file='catalog/_partials/product-flags.tpl'} -->
{block name='product_flags'} {block name='product_flags'}
<ul class="product-flags">
{foreach from=$product.flags item=flag}
<li class="product-flag {$flag.type}">{$flag.label}</li>
{/foreach}
</ul>
{/block} {/block}
{block name='product_cover_thumbnails'} {block name='product_cover_thumbnails'}
{include file='catalog/_partials/product-cover-thumbnails.tpl'} {include file='catalog/_partials/product-cover-thumbnails.tpl'}
{/block} {/block}
<div class="scroll-box-arrows">
<i class="material-icons left">&#xE314;</i>
<i class="material-icons right">&#xE315;</i>
</div>
{/block} {/block}
</section> </section>
{/block} {/block}
<div class="flex flex-col w-full gap-3"> </div>
<div class="col-md-6">
{block name='page_header_container'} {block name='page_header_container'}
{block name='page_header'} {block name='page_header'}
<div class='flex flex-col gap-2'> <h1 class="h1" itemprop="name">{block name='page_title'}{$product.name}{/block}</h1>
<h1 class="text-2xl font-normal" itemprop="name">{block name='page_title'}{$product.name}{/block}</h1>
{if $product.description_short}
<span class='text-sm'>{$product.description_short nofilter}</span>
{/if}
</div>
{/block} {/block}
{/block} {/block}
{block name='product_prices'} {block name='product_prices'}
@ -82,6 +89,10 @@
{/block} {/block}
<div class="product-information"> <div class="product-information">
{block name='product_description_short'}
<div id="product-description-short-{$product.id}" itemprop="description">{$product.description_short nofilter}</div>
{/block}
{if $product.is_customizable && count($product.customizations.fields)} {if $product.is_customizable && count($product.customizations.fields)}
{block name='product_customization'} {block name='product_customization'}
{include file="catalog/_partials/product-customization.tpl" customizations=$product.customizations} {include file="catalog/_partials/product-customization.tpl" customizations=$product.customizations}
@ -116,14 +127,14 @@
{include file='catalog/_partials/product-discounts.tpl'} {include file='catalog/_partials/product-discounts.tpl'}
{/block} {/block}
{block name='product_additional_info'}
{include file='catalog/_partials/product-additional-info.tpl'}
{/block}
{block name='product_add_to_cart'} {block name='product_add_to_cart'}
{include file='catalog/_partials/product-add-to-cart.tpl'} {include file='catalog/_partials/product-add-to-cart.tpl'}
{/block} {/block}
{block name='product_additional_info'}
{include file='catalog/_partials/product-additional-info.tpl'}
{/block}
{* Input to refresh product HTML removed, block kept for compatibility with themes *} {* Input to refresh product HTML removed, block kept for compatibility with themes *}
{block name='product_refresh'}{/block} {block name='product_refresh'}{/block}
</form> </form>
@ -136,10 +147,86 @@
{/block} {/block}
{block name='product_tabs'} {block name='product_tabs'}
<div class='w-full flex items-center flex-col mt-12'> <div class="tabs">
{block name='product_details'} <ul class="nav nav-tabs" role="tablist">
{include file='catalog/_partials/product-details.tpl'} {if $product.description}
{/block} <li class="nav-item">
<a
class="nav-link{if $product.description} active{/if}"
data-toggle="tab"
href="#description"
role="tab"
aria-controls="description"
{if $product.description} aria-selected="true"{/if}>{l s='Description' d='Shop.Theme.Catalog'}</a>
</li>
{/if}
<li class="nav-item">
<a
class="nav-link{if !$product.description} active{/if}"
data-toggle="tab"
href="#product-details"
role="tab"
aria-controls="product-details"
{if !$product.description} aria-selected="true"{/if}>{l s='Product Details' d='Shop.Theme.Catalog'}</a>
</li>
{if $product.attachments}
<li class="nav-item">
<a
class="nav-link"
data-toggle="tab"
href="#attachments"
role="tab"
aria-controls="attachments">{l s='Attachments' d='Shop.Theme.Catalog'}</a>
</li>
{/if}
{foreach from=$product.extraContent item=extra key=extraKey}
<li class="nav-item">
<a
class="nav-link"
data-toggle="tab"
href="#extra-{$extraKey}"
role="tab"
aria-controls="extra-{$extraKey}">{$extra.title}</a>
</li>
{/foreach}
</ul>
<div class="tab-content" id="tab-content">
<div class="tab-pane fade in{if $product.description} active{/if}" id="description" role="tabpanel">
{block name='product_description'}
<div class="product-description">{$product.description nofilter}</div>
{/block}
</div>
{block name='product_details'}
{include file='catalog/_partials/product-details.tpl'}
{/block}
{block name='product_attachments'}
{if $product.attachments}
<div class="tab-pane fade in" id="attachments" role="tabpanel">
<section class="product-attachments">
<p class="h5 text-uppercase">{l s='Download' d='Shop.Theme.Actions'}</p>
{foreach from=$product.attachments item=attachment}
<div class="attachment">
<h4><a href="{url entity='attachment' params=['id_attachment' => $attachment.id_attachment]}">{$attachment.name}</a></h4>
<p>{$attachment.description}</p
<a href="{url entity='attachment' params=['id_attachment' => $attachment.id_attachment]}">
{l s='Download' d='Shop.Theme.Actions'} ({$attachment.file_size_formatted})
</a>
</div>
{/foreach}
</section>
</div>
{/if}
{/block}
{foreach from=$product.extraContent item=extra key=extraKey}
<div class="tab-pane fade in {$extra.attr.class}" id="extra-{$extraKey}" role="tabpanel" {foreach $extra.attr as $key => $val} {$key}="{$val}"{/foreach}>
{$extra.content nofilter}
</div>
{/foreach}
</div>
</div> </div>
{/block} {/block}
</div> </div>
@ -148,9 +235,9 @@
{block name='product_accessories'} {block name='product_accessories'}
{if $accessories} {if $accessories}
<section class="product-accessories flex flex-col gap-8 mt-24"> <section class="product-accessories clearfix">
<p class="text-2xl font-bold">{l s='Related Products' d='Shop.Theme.Catalog'}</p> <p class="h5 text-uppercase">{l s='You might also like' d='Shop.Theme.Catalog'}</p>
<div class="products flex flex-wrap"> <div class="products">
{foreach from=$accessories item="product_accessory"} {foreach from=$accessories item="product_accessory"}
{block name='product_miniature'} {block name='product_miniature'}
{include file='catalog/_partials/miniatures/product.tpl' product=$product_accessory} {include file='catalog/_partials/miniatures/product.tpl' product=$product_accessory}
@ -166,6 +253,7 @@
{/block} {/block}
{block name='product_images_modal'} {block name='product_images_modal'}
{include file='catalog/_partials/product-images-modal.tpl'}
{/block} {/block}
{block name='page_footer_container'} {block name='page_footer_container'}

View File

@ -14,17 +14,16 @@
action="{url entity='order' params=['id_address' => $id_address]}" action="{url entity='order' params=['id_address' => $id_address]}"
data-id-address="{$id_address}" data-id-address="{$id_address}"
data-refresh-url="{url entity='order' params=['ajax' => 1, 'action' => 'addressForm']}" data-refresh-url="{url entity='order' params=['ajax' => 1, 'action' => 'addressForm']}"
class="w-full flex"
> >
{/block} {/block}
{block name='form_fields' append} {block name='form_fields' append}
<input type="hidden" name="saveAddress" value="{$type}"> <input type="hidden" name="saveAddress" value="{$type}">
{if $type === "delivery"} {if $type === "delivery"}
<div class="form-group w-full"> <div class="form-group row">
<div class="col-md-9 col-md-offset-3 flex items-center gap-2 py-2"> <div class="col-md-9 col-md-offset-3">
<input name = "use_same_address" id="use_same_address" type = "checkbox" value = "1" {if $use_same_address} checked {/if}> <input name = "use_same_address" id="use_same_address" type = "checkbox" value = "1" {if $use_same_address} checked {/if}>
<label for="use_same_address" class="font-semibold">{l s='Use this address for invoice too' d='Shop.Theme.Checkout'}</label> <label for="use_same_address">{l s='Use this address for invoice too' d='Shop.Theme.Checkout'}</label>
</div> </div>
</div> </div>
{/if} {/if}
@ -32,15 +31,15 @@
{block name='form_buttons'} {block name='form_buttons'}
{if !$form_has_continue_button} {if !$form_has_continue_button}
<button type="submit" class="btn btn-primary float-xs-right flex-1 uppercase py-2 font-medium text-center bg-blue-950 text-gray-50 hover:text-gray-50 hover:bg-blue-900">{l s='Save' d='Shop.Theme.Actions'}</button> <button type="submit" class="btn btn-primary float-xs-right">{l s='Save' d='Shop.Theme.Actions'}</button>
<a class="js-cancel-address cancel-address float-xs-right flex-1 uppercase py-2 font-medium text-center border border-blue-950 text-blue-950 hover:text-blue-900 hover:border-blue-900" href="{url entity='order' params=['cancelAddress' => {$type}]}">{l s='Cancel' d='Shop.Theme.Actions'}</a> <a class="js-cancel-address cancel-address float-xs-right" href="{url entity='order' params=['cancelAddress' => {$type}]}">{l s='Cancel' d='Shop.Theme.Actions'}</a>
{else} {else}
<form class="w-full flex"> <form>
<button type="submit" class="continue btn btn-primary float-xs-right flex-1 uppercase py-2 font-medium text-center bg-blue-950 text-gray-50 hover:text-gray-50 hover:bg-blue-900" name="confirm-addresses" value="1"> <button type="submit" class="continue btn btn-primary float-xs-right" name="confirm-addresses" value="1">
{l s='Continue' d='Shop.Theme.Actions'} {l s='Continue' d='Shop.Theme.Actions'}
</button> </button>
{if $customer.addresses|count > 0} {if $customer.addresses|count > 0}
<a class="js-cancel-address cancel-address float-xs-right flex-1 uppercase py-2 font-medium text-center border border-blue-950 text-blue-950 hover:text-blue-900 hover:border-blue-900" href="{url entity='order' params=['cancelAddress' => {$type}]}">{l s='Cancel' d='Shop.Theme.Actions'}</a> <a class="js-cancel-address cancel-address float-xs-right" href="{url entity='order' params=['cancelAddress' => {$type}]}">{l s='Cancel' d='Shop.Theme.Actions'}</a>
{/if} {/if}
</form> </form>
{/if} {/if}

View File

@ -24,11 +24,11 @@
*} *}
{block name='address_selector_blocks'} {block name='address_selector_blocks'}
{foreach $addresses as $address} {foreach $addresses as $address}
<div <article
class="address-item{if $address.id == $selected} selected{/if} w-full md:w-1/2 flex justify-between pr-4 md:pr-12 mb-2" class="address-item{if $address.id == $selected} selected{/if}"
id="{$name|classname}-address-{$address.id}" id="{$name|classname}-address-{$address.id}"
> >
<div class="flex gap-2"> <header class="h4">
<label class="radio-block"> <label class="radio-block">
<span class="custom-radio"> <span class="custom-radio">
<input <input
@ -39,35 +39,34 @@
> >
<span></span> <span></span>
</span> </span>
</label> <span class="address-alias h4">{$address.alias}</span>
<div class="flex flex-col gap-1">
<span class="address-alias font-semibold">{$address.alias}</span>
<div class="address">{$address.formatted nofilter}</div> <div class="address">{$address.formatted nofilter}</div>
</div> </label>
</div> </header>
<hr>
<footer class="address-footer">
{if $interactive} {if $interactive}
<div class="flex flex-col justify-center gap-4"> <a
<a class="edit-address text-muted"
class="edit-address text-muted" data-link-action="edit-address"
data-link-action="edit-address" href="{url entity='order' params=['id_address' => $address.id, 'editAddress' => $type, 'token' => $token]}"
href="{url entity='order' params=['id_address' => $address.id, 'editAddress' => $type, 'token' => $token]}" >
> <i class="material-icons edit">&#xE254;</i>{l s='Edit' d='Shop.Theme.Actions'}
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-edit" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M7 7h-1a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-1" /><path d="M20.385 6.585a2.1 2.1 0 0 0 -2.97 -2.97l-8.415 8.385v3h3l8.385 -8.415z" /><path d="M16 5l3 3" /></svg> </a>
</a> <a
<a class="delete-address text-muted"
class="delete-address text-muted" data-link-action="delete-address"
data-link-action="delete-address" href="{url entity='order' params=['id_address' => $address.id, 'deleteAddress' => true, 'token' => $token]}"
href="{url entity='order' params=['id_address' => $address.id, 'deleteAddress' => true, 'token' => $token]}" >
> <i class="material-icons delete">&#xE872;</i>{l s='Delete' d='Shop.Theme.Actions'}
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-trash" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M4 7l16 0" /><path d="M10 11l0 6" /><path d="M14 11l0 6" /><path d="M5 7l1 12a2 2 0 0 0 2 2h8a2 2 0 0 0 2 -2l1 -12" /><path d="M9 7v-3a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v3" /></svg> </a>
</a>
</div>
{/if} {/if}
</div> </footer>
</article>
{/foreach} {/foreach}
{if $interactive} {if $interactive}
<p> <p>
<button class="ps-hidden-by-js form-control-submit center-block flex-1 uppercase py-2 font-medium text-center bg-blue-950 text-gray-50 hover:text-gray-50 hover:bg-blue-900" type="submit">{l s='Save' d='Shop.Theme.Actions'}</button> <button class="ps-hidden-by-js form-control-submit center-block" type="submit">{l s='Save' d='Shop.Theme.Actions'}</button>
</p> </p>
{/if} {/if}
{/block} {/block}

View File

@ -23,21 +23,21 @@
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
{block name='cart_detailed_actions'} {block name='cart_detailed_actions'}
<div class="checkout cart-detailed-actions js-cart-detailed-actions card-block flex flex-col mt-4"> <div class="checkout cart-detailed-actions card-block">
{if $cart.minimalPurchaseRequired} {if $cart.minimalPurchaseRequired}
<div class="alert alert-warning" role="alert"> <div class="alert alert-warning" role="alert">
{$cart.minimalPurchaseRequired} {$cart.minimalPurchaseRequired}
</div> </div>
<div class="flex"> <div class="text-sm-center">
<button type="button" class="flex-1 uppercase py-2 font-medium text-center bg-blue-950 text-gray-50 hover:text-gray-50 hover:bg-blue-900 disabled:bg-gray-600 disabled:text-gray-300" disabled>{l s='Proceed to checkout' d='Shop.Theme.Actions'}</button> <button type="button" class="btn btn-primary disabled" disabled>{l s='Proceed to checkout' d='Shop.Theme.Actions'}</button>
</div> </div>
{elseif empty($cart.products) } {elseif empty($cart.products) }
<div class="flex"> <div class="text-sm-center">
<button type="button" class="flex-1 uppercase py-2 font-medium text-center bg-blue-950 text-gray-50 hover:text-gray-50 hover:bg-blue-900 disabled:bg-gray-600 disabled:text-gray-300" disabled>{l s='Proceed to checkout' d='Shop.Theme.Actions'}</button> <button type="button" class="btn btn-primary disabled" disabled>{l s='Proceed to checkout' d='Shop.Theme.Actions'}</button>
</div> </div>
{else} {else}
<div class="flex"> <div class="text-sm-center">
<a href="{$urls.pages.order}" class="flex-1 uppercase py-2 font-medium text-center bg-blue-950 text-gray-50 hover:text-gray-50 hover:bg-blue-900">{l s='Proceed to checkout' d='Shop.Theme.Actions'}</a> <a href="{$urls.pages.order}" class="btn btn-primary">{l s='Proceed to checkout' d='Shop.Theme.Actions'}</a>
{hook h='displayExpressCheckout'} {hook h='displayExpressCheckout'}
</div> </div>
{/if} {/if}

View File

@ -22,106 +22,154 @@
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
* International Registered Trademark & Property of PrestaShop SA * International Registered Trademark & Property of PrestaShop SA
*} *}
<div class="product-line-grid">
<div class="flex max-md:flex-col flex-1 gap-4 items-center"> <!-- product left content: image-->
<div class="w-40 h-40"> <div class="product-line-grid-left col-md-3 col-xs-4">
<img class="object-cover w-full h-full" src="{$product.cover.bySize.cart_default.url}" alt="{$product.name|escape:'quotes'}"> <span class="product-image media-middle">
<img src="{$product.cover.bySize.cart_default.url}" alt="{$product.name|escape:'quotes'}">
</span>
</div> </div>
<div class="flex flex-1 max-md:items-center flex-col gap-2">
<div class="product-line-info flex flex-col"> <!-- product left body: description -->
<a class="label text-lg font-semibold max-md:text-center" href="{$product.url}" data-id_customization="{$product.id_customization|intval}">{$product.name}</a> <div class="product-line-grid-body col-md-4 col-xs-8">
{if is_array($product.customizations) && $product.customizations|count} <div class="product-line-info">
{block name='cart_detailed_product_line_customization'} <a class="label" href="{$product.url}" data-id_customization="{$product.id_customization|intval}">{$product.name}</a>
{foreach from=$product.customizations item="customization"}
<a href="#product-customizations-modal-{$customization.id_customization}" class="text-blue-900 font-medium max-md:text-center" rel="modal:open" >{l s='Show customizations' d='Shop.Theme.Catalog'}</a>
<div class="modal bg-white p-4" id="product-customizations-modal-{$customization.id_customization}" >
<div class="w-full flex items-center justify-between mb-4">
<h4 class="modal-title text-xl font-bold">{l s='Customizations' d='Shop.Theme.Catalog'}</h4>
</div>
<div class="modal-body flex flex-col gap-2">
{foreach from=$customization.fields item="field"}
<div class="product-customization-line row">
<div class="value">
{if $field.type == 'text'}
{if (int)$field.id_module}
{$field.text nofilter}
{else}
{$field.text}
{/if}
{/if}
</div>
</div>
{/foreach}
</div>
</div>
{/foreach}
{/block}
{/if}
</div> </div>
<div class="flex gap-4 product-line-info product-price h5 {if $product.has_discount}has-discount{/if}">
<div class="product-line-info product-price h5 {if $product.has_discount}has-discount{/if}">
{if $product.has_discount} {if $product.has_discount}
<span class="line-through text-red-400">{$product.regular_price}</span> <div class="product-discount">
<span class="regular-price">{$product.regular_price}</span>
{if $product.discount_type === 'percentage'}
<span class="discount discount-percentage">
-{$product.discount_percentage_absolute}
</span>
{else}
<span class="discount discount-amount">
-{$product.discount_to_display}
</span>
{/if}
</div>
{/if} {/if}
<div class="current-price"> <div class="current-price">
<span class="price font-medium">{$product.price}</span> <span class="price">{$product.price}</span>
{if $product.unit_price_full} {if $product.unit_price_full}
<div class="unit-price-cart">{$product.unit_price_full}</div> <div class="unit-price-cart">{$product.unit_price_full}</div>
{/if} {/if}
</div> </div>
</div> </div>
{foreach from=$product.attributes key="attribute" item="value"}
<div class="product-line-info font-semibold {$attribute|lower}"> <br/>
{foreach from=$product.attributes key="attribute" item="value"}
<div class="product-line-info">
<span class="label">{$attribute}:</span> <span class="label">{$attribute}:</span>
<span class="value">{$value}</span> <span class="value">{$value}</span>
</div> </div>
{/foreach} {/foreach}
<div class="flex items-center font-medium w-max">
<input
class="js-cart-line-product-quantity text-center w-8 border-none active:ring-0 focus:ring-0"
data-down-url="{$product.down_quantity_url}"
data-up-url="{$product.up_quantity_url}"
data-update-url="{$product.update_quantity_url}"
data-product-id="{$product.id_product}"
value="{$product.quantity}"
name="product-quantity-spin"
min="{$product.minimal_quantity}"
/>
</div>
</div>
<div class="flex flex-col gap-4 w-24 items-center">
<span class="product-price text-base font-bold">
{if isset($product.is_gift) && $product.is_gift}
{l s='Gift' d='Shop.Theme.Checkout'}
{else}
{$product.total}
{/if}
</span>
<div class="cart-line-product-actions">
<a
class = "remove-from-cart"
rel = "nofollow"
href = "{$product.remove_from_cart_url}"
data-link-action = "delete-from-cart"
data-id-product = "{$product.id_product|escape:'javascript'}"
data-id-product-attribute = "{$product.id_product_attribute|escape:'javascript'}"
data-id-customization = "{$product.id_customization|escape:'javascript'}"
>
{if !isset($product.is_gift) || !$product.is_gift}
<svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler stroke-gray-700 icon-tabler-trash" width="24" height="24" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round">
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
<path d="M4 7l16 0"></path>
<path d="M10 11l0 6"></path>
<path d="M14 11l0 6"></path>
<path d="M5 7l1 12a2 2 0 0 0 2 2h8a2 2 0 0 0 2 -2l1 -12"></path>
<path d="M9 7v-3a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v3"></path>
</svg>
{/if}
</a>
{block name='hook_cart_extra_product_actions'} {if is_array($product.customizations) && $product.customizations|count}
{hook h='displayCartExtraProductActions' product=$product} <br>
{block name='cart_detailed_product_line_customization'}
{foreach from=$product.customizations item="customization"}
<a href="#" data-toggle="modal" data-target="#product-customizations-modal-{$customization.id_customization}">{l s='Product customization' d='Shop.Theme.Catalog'}</a>
<div class="modal fade customization-modal" id="product-customizations-modal-{$customization.id_customization}" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
<h4 class="modal-title">{l s='Product customization' d='Shop.Theme.Catalog'}</h4>
</div>
<div class="modal-body">
{foreach from=$customization.fields item="field"}
<div class="product-customization-line row">
<div class="col-sm-3 col-xs-4 label">
{$field.label}
</div>
<div class="col-sm-9 col-xs-8 value">
{if $field.type == 'text'}
{if (int)$field.id_module}
{$field.text nofilter}
{else}
{$field.text}
{/if}
{elseif $field.type == 'image'}
<img src="{$field.image.small.url}">
{/if}
</div>
</div>
{/foreach}
</div>
</div>
</div>
</div>
{/foreach}
{/block} {/block}
{/if}
</div>
<!-- product left body: description -->
<div class="product-line-grid-right product-line-actions col-md-5 col-xs-12">
<div class="row">
<div class="col-xs-4 hidden-md-up"></div>
<div class="col-md-10 col-xs-6">
<div class="row">
<div class="col-md-6 col-xs-6 qty">
{if isset($product.is_gift) && $product.is_gift}
<span class="gift-quantity">{$product.quantity}</span>
{else}
<input
class="js-cart-line-product-quantity"
data-down-url="{$product.down_quantity_url}"
data-up-url="{$product.up_quantity_url}"
data-update-url="{$product.update_quantity_url}"
data-product-id="{$product.id_product}"
type="number"
value="{$product.quantity}"
name="product-quantity-spin"
min="{$product.minimal_quantity}"
/>
{/if}
</div>
<div class="col-md-6 col-xs-2 price">
<span class="product-price">
<strong>
{if isset($product.is_gift) && $product.is_gift}
<span class="gift">{l s='Gift' d='Shop.Theme.Checkout'}</span>
{else}
{$product.total}
{/if}
</strong>
</span>
</div>
</div>
</div>
<div class="col-md-2 col-xs-2 text-xs-right">
<div class="cart-line-product-actions">
<a
class = "remove-from-cart"
rel = "nofollow"
href = "{$product.remove_from_cart_url}"
data-link-action = "delete-from-cart"
data-id-product = "{$product.id_product|escape:'javascript'}"
data-id-product-attribute = "{$product.id_product_attribute|escape:'javascript'}"
data-id-customization = "{$product.id_customization|escape:'javascript'}"
>
{if !isset($product.is_gift) || !$product.is_gift}
<i class="material-icons float-xs-left">delete</i>
{/if}
</a>
{block name='hook_cart_extra_product_actions'}
{hook h='displayCartExtraProductActions' product=$product}
{/block}
</div>
</div>
</div> </div>
</div> </div>
<div class="clearfix"></div>
</div> </div>

Some files were not shown because too many files have changed in this diff Show More