Compare commits
274 Commits
Author | SHA1 | Date |
---|---|---|
|
915aff6074 | |
|
a02efb48b2 | |
|
9994587440 | |
|
cdb6ee6b15 | |
|
d410e38714 | |
|
79a29aea2f | |
|
19cbc3eefc | |
|
f6aeae158d | |
|
10fb36a888 | |
|
7df21e3c07 | |
|
85035f2768 | |
|
4417b040d1 | |
|
e2272beca1 | |
|
fc98ddc47c | |
|
50eaf4d138 | |
|
893f5195f7 | |
|
3f160fe2d4 | |
|
2be47bb9bd | |
|
e8ea43a702 | |
|
f027dc66f1 | |
|
105e21dba6 | |
|
f30766bc04 | |
|
b0ddbb6c23 | |
|
d5459b64d2 | |
|
7547d850cc | |
|
58ae059a6e | |
|
9efbfd3852 | |
|
f35d1ac87d | |
|
325de097d0 | |
|
67af6e19bf | |
|
8e2f8aa91f | |
|
ff02287a26 | |
|
8c45f661f8 | |
|
a63d05a30e | |
|
b1fb6f8d02 | |
|
d5361f2120 | |
|
2e2c0259e9 | |
|
28ca0ffb12 | |
|
a36655ef84 | |
|
fbc0ff69c4 | |
|
0a1add6881 | |
|
0d44432e6d | |
|
a9a1c780db | |
|
7a6702dfbf | |
|
6adb6d24e9 | |
|
26ca21d57a | |
|
448196b73f | |
|
a9fe9fe13f | |
|
83bd57bcb2 | |
|
10a02a9aea | |
|
b1c22902e1 | |
|
f049ff98c9 | |
|
fbd64038d5 | |
|
c3aad31794 | |
|
22742e7420 | |
|
eb7f48ff0c | |
|
d970b53502 | |
|
8e2c81f267 | |
|
bdba795292 | |
|
76d5cea40b | |
|
2421b14372 | |
|
48ef5bb6ec | |
|
986a76a716 | |
|
a971a7f12b | |
|
09b8fed5e4 | |
|
637fd09f47 | |
|
8004a70de6 | |
|
7799872499 | |
|
82bcb9eda0 | |
|
354bcc9603 | |
|
1f194bb00e | |
|
ed7c97d210 | |
|
51ea15892d | |
|
73945604ab | |
|
ce4daa4401 | |
|
9a75069ebe | |
|
5b55367824 | |
|
7dbebfb260 | |
|
45bd4a3288 | |
|
2bc3226863 | |
|
6a8b361951 | |
|
1b3ab1de39 | |
|
9b2b69f24b | |
|
bcf8a02213 | |
|
f76e01989c | |
|
624d3c9d4f | |
|
c4a72e0bb7 | |
|
49b1d80b9e | |
|
d8a0130c14 | |
|
abb29ba152 | |
|
7281d23cf8 | |
|
55918f8441 | |
|
cad2d48351 | |
|
ff7c18e35c | |
|
4f7eb431b9 | |
|
a37ce7e027 | |
|
c04d030b58 | |
|
747e385b4c | |
|
059771727e | |
|
55a6da8492 | |
|
6ca1e490f8 | |
|
d93203e68a | |
|
3fe21584c7 | |
|
12e5e9d89d | |
|
a4201ee7d7 | |
|
215d5e32c4 | |
|
1fc7e5a1a7 | |
|
a9218a4d48 | |
|
b404359d9d | |
|
245e0c93dd | |
|
e59b67fc1b | |
|
1805b69840 | |
|
a5dcebc7d9 | |
|
92f5487996 | |
|
7aba8afa0f | |
|
59a7a34670 | |
|
799f3e3f62 | |
|
3a1bcb48cc | |
|
4cdb938483 | |
|
ecce063f4e | |
|
f6d5c5a792 | |
|
3edef5858c | |
|
47dff02012 | |
|
6cd1aad41b | |
|
7b3f1731df | |
|
d636f4c1c1 | |
|
18cc2c1cc0 | |
|
353bdfe820 | |
|
e27b0a0cf5 | |
|
9d9ccbc331 | |
|
d8cf51fd5b | |
|
3b7f88956a | |
|
086352ed5a | |
|
062e5a46d3 | |
|
57225936e4 | |
|
b0c137a7ea | |
|
fdf2bd8199 | |
|
b67831e3e3 | |
|
1cd345090e | |
|
361568a853 | |
|
d6ccccdfa7 | |
|
e81cdd9d00 | |
|
2f71a0f0d7 | |
|
599e9fafb8 | |
|
7f57f035ac | |
|
79c48434bc | |
|
c5fd398c42 | |
|
1d6e2a217a | |
|
02c06a307e | |
|
9a986b625e | |
|
f499d818d1 | |
|
49f81fb95f | |
|
0f44dee241 | |
|
d06e3d8369 | |
|
af0dda90db | |
|
1c4f82f2d4 | |
|
29ad5b7173 | |
|
d975069771 | |
|
e92622b360 | |
|
8be6271f08 | |
|
396fd2c141 | |
|
9348891e8b | |
|
6dbaef394c | |
|
85f4791aee | |
|
944dccb70b | |
|
00eb3abc94 | |
|
5c3be1cc19 | |
|
4e88488ba2 | |
|
0316955017 | |
|
5e612c5b4f | |
|
c72869ec3f | |
|
17e80bd6c3 | |
|
accf657ee6 | |
|
1badadaa3c | |
|
c3124f5ea2 | |
|
54e6b7d13d | |
|
b4a583a57e | |
|
293367ba11 | |
|
1d6f7e98f3 | |
|
c0aad51432 | |
|
33f1d0d99f | |
|
16d5b7f54c | |
|
fd550d0e20 | |
|
874564ab87 | |
|
3e9543a0b7 | |
|
58c4ff0b27 | |
|
8db275f9bd | |
|
f1e44f1de1 | |
|
98c89e4d8d | |
|
2f45a731c1 | |
|
b0436f56b9 | |
|
9b039a52d8 | |
|
d23729846a | |
|
1d40c4f141 | |
|
f07f5ad4e2 | |
|
e707255653 | |
|
202a4a0a38 | |
|
42224b883b | |
|
ac4e31fdf4 | |
|
20aae25995 | |
|
1144cd4758 | |
|
3398569665 | |
|
61979e0b82 | |
|
2d2ea8f10a | |
|
b95409bcd7 | |
|
2c937230bf | |
|
d6c622a60a | |
|
4eae501213 | |
|
3d1ef1b400 | |
|
b7aa9bf7b6 | |
|
bf0238948d | |
|
c3c5380c3b | |
|
70768fe587 | |
|
1147c59fb7 | |
|
aae3c415fc | |
|
e1335d23eb | |
|
49e7942400 | |
|
8b3d7f5b65 | |
|
65c6b8d2a5 | |
|
a9722c6037 | |
|
2278c54cb1 | |
|
12fd0c1038 | |
|
0921021a15 | |
|
b866e6cb47 | |
|
982255b0b4 | |
|
f838fde911 | |
|
7c50dcaae2 | |
|
255a7592a3 | |
|
587c9ce147 | |
|
9abd1621eb | |
|
91726b1ea3 | |
|
5ce5059fac | |
|
41b1d12cbf | |
|
2ab758654b | |
|
7e92214b03 | |
|
c30e5568ba | |
|
440be0218e | |
|
8a849a7941 | |
|
93f15c1620 | |
|
d25067a064 | |
|
dcdf4afeb2 | |
|
e7a24bcdc2 | |
|
464b78793f | |
|
66a727d140 | |
|
9825bb64b6 | |
|
75824cc24a | |
|
db088ec76b | |
|
e2d1a51653 | |
|
6684988922 | |
|
6cafbe1ca5 | |
|
85902f6777 | |
|
fe32610ac6 | |
|
b80661de56 | |
|
8cff94ff99 | |
|
681dff1dbd | |
|
83b50d7c44 | |
|
d1e91c3121 | |
|
83a427381d | |
|
46491a333c | |
|
372a7544c0 | |
|
6b2ec4a5c8 | |
|
85edb09ac3 | |
|
7be614b92a | |
|
5501562c98 | |
|
32fce4c534 | |
|
211582e6c6 | |
|
7056019bcc | |
|
b5f236857c | |
|
03d5f057ec | |
|
0a732ef6e4 | |
|
64f76a536b | |
|
4106adbd65 | |
|
c3bae354aa | |
|
c996722a9a |
|
@ -0,0 +1 @@
|
|||
@import "./node_modules/jquery-offcanvas/dist/jquery-offcanvas.min.css"
|
|
@ -4,13 +4,142 @@
|
|||
|
||||
body {
|
||||
@apply bg-white;
|
||||
@apply text-gray-700;
|
||||
@apply font-medium;
|
||||
@apply text-gray-600;
|
||||
@apply font-light;
|
||||
}
|
||||
|
||||
.icon-tabler {
|
||||
a {
|
||||
@apply text-gray-600;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
@apply text-blue-900;
|
||||
@apply underline;
|
||||
@apply underline-offset-2;
|
||||
}
|
||||
|
||||
.ti, .icon-tabler {
|
||||
stroke-width: 1px;
|
||||
fill: none;
|
||||
@apply text-gray-700;
|
||||
@apply stroke-gray-700;
|
||||
@apply text-gray-500;
|
||||
@apply stroke-gray-500;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,400 @@
|
|||
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;
|
||||
});
|
||||
});
|
|
@ -0,0 +1,83 @@
|
|||
/**
|
||||
* 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();
|
||||
});
|
||||
});
|
|
@ -0,0 +1,91 @@
|
|||
/**
|
||||
* 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,
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
|
@ -1,11 +1,11 @@
|
|||
<?php
|
||||
/**
|
||||
* 2007-2019 PrestaShop and Contributors
|
||||
* 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.txt.
|
||||
* 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
|
||||
|
@ -16,20 +16,18 @@
|
|||
*
|
||||
* 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.
|
||||
* needs please refer to https://devdocs.prestashop.com/ for more information.
|
||||
*
|
||||
* @author PrestaShop SA <contact@prestashop.com>
|
||||
* @copyright 2007-2019 PrestaShop SA and Contributors
|
||||
* @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)
|
||||
* 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");
|
||||
export default function debounce(func, timeout = 300) {
|
||||
let timer;
|
||||
|
||||
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;
|
||||
return (...args) => {
|
||||
clearTimeout(timer);
|
||||
timer = setTimeout(() => { func.apply(this, args); }, timeout);
|
||||
};
|
||||
}
|
|
@ -0,0 +1,59 @@
|
|||
/**
|
||||
* Copyright since 2007 PrestaShop SA and Contributors
|
||||
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
|
||||
* that is bundled with this package in the file LICENSE.md.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* https://opensource.org/licenses/AFL-3.0
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@prestashop.com so we can send you a copy immediately.
|
||||
*
|
||||
* DISCLAIMER
|
||||
*
|
||||
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
|
||||
* versions in the future. If you wish to customize PrestaShop for your
|
||||
* needs please refer to https://devdocs.prestashop.com/ for more information.
|
||||
*
|
||||
* @author PrestaShop SA and Contributors <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();
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
|
@ -0,0 +1,55 @@
|
|||
/**
|
||||
* Copyright since 2007 PrestaShop SA and Contributors
|
||||
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
|
||||
* that is bundled with this package in the file LICENSE.md.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* https://opensource.org/licenses/AFL-3.0
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@prestashop.com so we can send you a copy immediately.
|
||||
*
|
||||
* DISCLAIMER
|
||||
*
|
||||
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
|
||||
* versions in the future. If you wish to customize PrestaShop for your
|
||||
* needs please refer to https://devdocs.prestashop.com/ for more information.
|
||||
*
|
||||
* @author PrestaShop SA and Contributors <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'));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
|
@ -0,0 +1,47 @@
|
|||
/**
|
||||
* Copyright since 2007 PrestaShop SA and Contributors
|
||||
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
|
||||
* that is bundled with this package in the file LICENSE.md.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* https://opensource.org/licenses/AFL-3.0
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@prestashop.com so we can send you a copy immediately.
|
||||
*
|
||||
* DISCLAIMER
|
||||
*
|
||||
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
|
||||
* versions in the future. If you wish to customize PrestaShop for your
|
||||
* needs please refer to https://devdocs.prestashop.com/ for more information.
|
||||
*
|
||||
* @author PrestaShop SA and Contributors <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}`);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
|
@ -0,0 +1,97 @@
|
|||
/**
|
||||
* Copyright since 2007 PrestaShop SA and Contributors
|
||||
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
|
||||
* that is bundled with this package in the file LICENSE.md.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* https://opensource.org/licenses/AFL-3.0
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@prestashop.com so we can send you a copy immediately.
|
||||
*
|
||||
* DISCLAIMER
|
||||
*
|
||||
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
|
||||
* versions in the future. If you wish to customize PrestaShop for your
|
||||
* needs please refer to https://devdocs.prestashop.com/ for more information.
|
||||
*
|
||||
* @author PrestaShop SA and Contributors <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');
|
||||
}
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,80 @@
|
|||
/**
|
||||
* Copyright since 2007 PrestaShop SA and Contributors
|
||||
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
|
||||
* that is bundled with this package in the file LICENSE.md.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* https://opensource.org/licenses/AFL-3.0
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@prestashop.com so we can send you a copy immediately.
|
||||
*
|
||||
* DISCLAIMER
|
||||
*
|
||||
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
|
||||
* versions in the future. If you wish to customize PrestaShop for your
|
||||
* needs please refer to https://devdocs.prestashop.com/ for more information.
|
||||
*
|
||||
* @author PrestaShop SA and Contributors <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();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
/**
|
||||
* Copyright since 2007 PrestaShop SA and Contributors
|
||||
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
|
||||
* that is bundled with this package in the file LICENSE.md.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* https://opensource.org/licenses/AFL-3.0
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@prestashop.com so we can send you a copy immediately.
|
||||
*
|
||||
* DISCLAIMER
|
||||
*
|
||||
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
|
||||
* versions in the future. If you wish to customize PrestaShop for your
|
||||
* needs please refer to https://devdocs.prestashop.com/ for more information.
|
||||
*
|
||||
* @author PrestaShop SA and Contributors <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);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,198 @@
|
|||
/**
|
||||
* Copyright since 2007 PrestaShop SA and Contributors
|
||||
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
|
||||
* that is bundled with this package in the file LICENSE.md.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* https://opensource.org/licenses/AFL-3.0
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@prestashop.com so we can send you a copy immediately.
|
||||
*
|
||||
* DISCLAIMER
|
||||
*
|
||||
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
|
||||
* versions in the future. If you wish to customize PrestaShop for your
|
||||
* needs please refer to https://devdocs.prestashop.com/ for more information.
|
||||
*
|
||||
* @author PrestaShop SA and Contributors <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;
|
|
@ -0,0 +1,43 @@
|
|||
/**
|
||||
* Copyright since 2007 PrestaShop SA and Contributors
|
||||
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
|
||||
* that is bundled with this package in the file LICENSE.md.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* https://opensource.org/licenses/AFL-3.0
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@prestashop.com so we can send you a copy immediately.
|
||||
*
|
||||
* DISCLAIMER
|
||||
*
|
||||
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
|
||||
* versions in the future. If you wish to customize PrestaShop for your
|
||||
* needs please refer to https://devdocs.prestashop.com/ for more information.
|
||||
*
|
||||
* @author PrestaShop SA and Contributors <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);
|
|
@ -0,0 +1 @@
|
|||
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
|
@ -0,0 +1,270 @@
|
|||
/**
|
||||
* 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);
|
||||
});
|
||||
});
|
|
@ -0,0 +1,191 @@
|
|||
/**
|
||||
* Copyright since 2007 PrestaShop SA and Contributors
|
||||
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
|
||||
* that is bundled with this package in the file LICENSE.md.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* https://opensource.org/licenses/AFL-3.0
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@prestashop.com so we can send you a copy immediately.
|
||||
*
|
||||
* DISCLAIMER
|
||||
*
|
||||
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
|
||||
* versions in the future. If you wish to customize PrestaShop for your
|
||||
* needs please refer to https://devdocs.prestashop.com/ for more information.
|
||||
*
|
||||
* @author PrestaShop SA and Contributors <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();
|
||||
});
|
||||
});
|
|
@ -0,0 +1,80 @@
|
|||
/**
|
||||
* Copyright since 2007 PrestaShop SA and Contributors
|
||||
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
|
||||
* that is bundled with this package in the file LICENSE.md.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* https://opensource.org/licenses/AFL-3.0
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@prestashop.com so we can send you a copy immediately.
|
||||
*
|
||||
* DISCLAIMER
|
||||
*
|
||||
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
|
||||
* versions in the future. If you wish to customize PrestaShop for your
|
||||
* needs please refer to https://devdocs.prestashop.com/ for more information.
|
||||
*
|
||||
* @author PrestaShop SA and Contributors <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();
|
||||
}
|
||||
});
|
|
@ -0,0 +1,109 @@
|
|||
/**
|
||||
* Copyright since 2007 PrestaShop SA and Contributors
|
||||
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* This source file is subject to the Academic Free License 3.0 (AFL-3.0)
|
||||
* that is bundled with this package in the file LICENSE.md.
|
||||
* It is also available through the world-wide-web at this URL:
|
||||
* https://opensource.org/licenses/AFL-3.0
|
||||
* If you did not receive a copy of the license and are unable to
|
||||
* obtain it through the world-wide-web, please send an email
|
||||
* to license@prestashop.com so we can send you a copy immediately.
|
||||
*
|
||||
* DISCLAIMER
|
||||
*
|
||||
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
|
||||
* versions in the future. If you wish to customize PrestaShop for your
|
||||
* needs please refer to https://devdocs.prestashop.com/ for more information.
|
||||
*
|
||||
* @author PrestaShop SA and Contributors <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');
|
||||
});
|
|
@ -0,0 +1,77 @@
|
|||
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))
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
|
|
@ -0,0 +1,195 @@
|
|||
/**
|
||||
* 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();
|
||||
});
|
||||
});
|
|
@ -5,11 +5,28 @@
|
|||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"livereload": "^0.9.3",
|
||||
"tailwindcss": "^3.3.5"
|
||||
"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": "yarn run dev:livereload & yarn run dev:tailwind"
|
||||
"dev:js": "vite build --watch",
|
||||
"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"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
module.exports = {
|
||||
plugins: {
|
||||
"postcss-import": {},
|
||||
tailwindcss: {},
|
||||
},
|
||||
};
|
|
@ -1,12 +1,11 @@
|
|||
/** @type {import('tailwindcss').Config} */
|
||||
module.exports = {
|
||||
content: ["../templates/**/*.tpl", "../modules/**/*.tpl"],
|
||||
theme: {
|
||||
fontFamily: {
|
||||
sans: ["Cairo"],
|
||||
serif: ["Cairo"]
|
||||
}
|
||||
content: ["../templates/**/*.tpl", "../modules/**/*.tpl"],
|
||||
theme: {
|
||||
fontFamily: {
|
||||
sans: ["Cairo"],
|
||||
serif: ["Cairo"],
|
||||
},
|
||||
plugins: [],
|
||||
}
|
||||
|
||||
},
|
||||
plugins: [require("@tailwindcss/forms")],
|
||||
};
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
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,
|
||||
},
|
||||
});
|
|
@ -0,0 +1,822 @@
|
|||
Arguments:
|
||||
/Users/dineshsalunke/.local/share/nvm/v16.20.0/bin/node /Users/dineshsalunke/.local/share/nvm/v16.20.0/bin/yarn add update-sources
|
||||
|
||||
PATH:
|
||||
/Users/dineshsalunke/.bun/bin:/Users/dineshsalunke/.local/bin:/Users/dineshsalunke/.local/share/nvm/v16.20.0/bin:/Users/dineshsalunke/.cargo/bin:/opt/homebrew/bin:/bin:/Users/dineshsalunke/go/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/Library/Apple/usr/bin:/usr/local/go/bin
|
||||
|
||||
Yarn version:
|
||||
1.22.19
|
||||
|
||||
Node version:
|
||||
16.20.0
|
||||
|
||||
Platform:
|
||||
darwin arm64
|
||||
|
||||
Trace:
|
||||
Error: https://registry.yarnpkg.com/update-sources: Not found
|
||||
at Request.params.callback [as _callback] (/Users/dineshsalunke/.local/share/nvm/v16.20.0/lib/node_modules/yarn/lib/cli.js:66145:18)
|
||||
at Request.self.callback (/Users/dineshsalunke/.local/share/nvm/v16.20.0/lib/node_modules/yarn/lib/cli.js:140890:22)
|
||||
at Request.emit (node:events:513:28)
|
||||
at Request.<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==
|
220
_dev/yarn.lock
220
_dev/yarn.lock
|
@ -7,6 +7,116 @@
|
|||
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"
|
||||
|
@ -60,6 +170,13 @@
|
|||
"@nodelib/fs.scandir" "2.1.5"
|
||||
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:
|
||||
version "1.3.0"
|
||||
resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
|
||||
|
@ -88,6 +205,11 @@ binary-extensions@^2.0.0:
|
|||
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
|
||||
integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
|
||||
|
||||
bootstrap-touchspin@^4.7.3:
|
||||
version "4.7.3"
|
||||
resolved "https://registry.yarnpkg.com/bootstrap-touchspin/-/bootstrap-touchspin-4.7.3.tgz#0316a3e7a390eb8811996cc14ab13ff0efb647de"
|
||||
integrity sha512-VVyPKI05ybS4ciB0OJ8g4Jx4SU3rlrWa/ItSxIi7BWNVa0jUYt3eujeOiBWpkuEGukECwiAbwuzh3a+xLtxueQ==
|
||||
|
||||
brace-expansion@^1.1.7:
|
||||
version "1.1.11"
|
||||
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
|
||||
|
@ -148,6 +270,39 @@ dlv@^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"
|
||||
|
@ -270,6 +425,31 @@ jiti@^1.19.1:
|
|||
resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d"
|
||||
integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==
|
||||
|
||||
jquery-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:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52"
|
||||
|
@ -308,6 +488,11 @@ micromatch@^4.0.4, micromatch@^4.0.5:
|
|||
braces "^3.0.2"
|
||||
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:
|
||||
version "3.1.2"
|
||||
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
|
||||
|
@ -430,7 +615,7 @@ postcss-value-parser@^4.0.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.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==
|
||||
|
@ -472,6 +657,13 @@ reusify@^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"
|
||||
|
@ -484,6 +676,11 @@ source-map-js@^1.0.2:
|
|||
resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
|
||||
integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
|
||||
|
||||
sprintf-js@^1.1.3:
|
||||
version "1.1.3"
|
||||
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.3.tgz#4914b903a2f8b685d17fdf78a70e917e872e444a"
|
||||
integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==
|
||||
|
||||
sucrase@^3.32.0:
|
||||
version "3.34.0"
|
||||
resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.34.0.tgz#1e0e2d8fcf07f8b9c3569067d92fbd8690fb576f"
|
||||
|
@ -551,6 +748,11 @@ to-regex-range@^5.0.1:
|
|||
dependencies:
|
||||
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:
|
||||
version "0.1.13"
|
||||
resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699"
|
||||
|
@ -561,6 +763,22 @@ util-deprecate@^1.0.2:
|
|||
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
|
||||
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
|
||||
|
||||
velocity-animate@^1.5.2:
|
||||
version "1.5.2"
|
||||
resolved "https://registry.yarnpkg.com/velocity-animate/-/velocity-animate-1.5.2.tgz#5a351d75fca2a92756f5c3867548b873f6c32105"
|
||||
integrity sha512-m6EXlCAMetKztO1ppBhGU1/1MR3IiEevO6ESq6rcrSQ3Q77xYSW13jkfXW88o4xMrkXJhy/U7j4wFR/twMB0Eg==
|
||||
|
||||
vite@^4.5.0:
|
||||
version "4.5.0"
|
||||
resolved "https://registry.yarnpkg.com/vite/-/vite-4.5.0.tgz#ec406295b4167ac3bc23e26f9c8ff559287cff26"
|
||||
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"
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
7147
assets/js/theme.js
7147
assets/js/theme.js
File diff suppressed because one or more lines are too long
|
@ -56,6 +56,9 @@ global_settings:
|
|||
- name: displayAfterWrapper
|
||||
title: 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:
|
||||
displayMainMenu:
|
||||
- ps_mainmenu
|
||||
|
@ -76,10 +79,6 @@ global_settings:
|
|||
- ps_facetedsearch
|
||||
displaySearch:
|
||||
- ps_searchbar
|
||||
displayProductAdditionalInfo:
|
||||
- ps_sharebuttons
|
||||
displayReassurance:
|
||||
- blockreassurance
|
||||
displayOrderConfirmation2:
|
||||
- ps_featuredproducts
|
||||
displayCrossSellingShoppingCart:
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
|
||||
{**
|
||||
* Copyright since 2007 PrestaShop SA and Contributors
|
||||
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* This source file is subject to the Academic Free License 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}
|
||||
</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>
|
|
@ -0,0 +1,26 @@
|
|||
|
||||
{**
|
||||
* 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>
|
|
@ -0,0 +1,25 @@
|
|||
{**
|
||||
* Copyright since 2007 PrestaShop SA and Contributors
|
||||
* PrestaShop is an International Registered Trademark & Property of PrestaShop SA
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
* This source file is subject to the Academic Free License 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>
|
|
@ -22,93 +22,89 @@
|
|||
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
|
||||
* International Registered Trademark & Property of PrestaShop SA
|
||||
*}
|
||||
<section class="contact-form">
|
||||
<form action="{$urls.pages.contact}" method="post" {if $contact.allow_file_upload}enctype="multipart/form-data"{/if}>
|
||||
|
||||
{if $notifications}
|
||||
<div class="col-xs-12 alert {if $notifications.nw_error}alert-danger{else}alert-success{/if}">
|
||||
<ul>
|
||||
{foreach $notifications.messages as $notif}
|
||||
<li>{$notif}</li>
|
||||
{/foreach}
|
||||
</ul>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
<section class="mx-auto max-w-6xl">
|
||||
<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}>
|
||||
{if !$notifications || $notifications.nw_error}
|
||||
<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 class="form-group row">
|
||||
<div class="col-md-9 col-md-offset-3">
|
||||
<h3 class="text-xl font-medium">{l s='Contact us' d='Shop.Theme.Global'}</h3>
|
||||
</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">
|
||||
</div>
|
||||
<section class="form-fields w-full flex max-md:flex-col flex-wrap">
|
||||
<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>
|
||||
<select name="id_contact" class="dropdown-toggle relative py-1 px-4 pr-8 w-full leading-1 border border-gray-300 text-left">
|
||||
{foreach from=$contact.contacts item=contact_elt}
|
||||
<option value="{$contact_elt.id_contact}">{$contact_elt.name}</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group row">
|
||||
<label class="col-md-3 form-control-label">{l s='Email address' d='Shop.Forms.Labels'}</label>
|
||||
<div class="col-md-6">
|
||||
<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='Email address' d='Shop.Forms.Labels'}</label>
|
||||
<input
|
||||
class="form-control"
|
||||
class="form-control px-4 py-1 border border-gray-300 w-full"
|
||||
name="from"
|
||||
type="email"
|
||||
value="{$contact.email}"
|
||||
placeholder="{l s='your@email.com' d='Shop.Forms.Help'}"
|
||||
>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{if $contact.orders}
|
||||
<div class="form-group row">
|
||||
<label class="col-md-3 form-control-label">{l s='Order reference' d='Shop.Forms.Labels'}</label>
|
||||
<div class="col-md-6">
|
||||
<select name="id_order" class="form-control form-control-select">
|
||||
<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='Order reference' d='Shop.Forms.Labels'}
|
||||
|
||||
<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>
|
||||
{foreach from=$contact.orders item=order}
|
||||
<option value="{$order.id_order}">{$order.reference}</option>
|
||||
{/foreach}
|
||||
</select>
|
||||
</div>
|
||||
<span class="col-md-3 form-control-comment">
|
||||
{l s='optional' d='Shop.Forms.Help'}
|
||||
</span>
|
||||
</div>
|
||||
{/if}
|
||||
|
||||
{if $contact.allow_file_upload}
|
||||
<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="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='Message' d='Shop.Forms.Labels'}</label>
|
||||
<div class="col-md-9">
|
||||
<textarea
|
||||
class="form-control"
|
||||
class="form-control px-4 py-1 border border-gray-300 w-full"
|
||||
name="message"
|
||||
placeholder="{l s='How can we help?' d='Shop.Forms.Help'}"
|
||||
rows="3"
|
||||
rows="1"
|
||||
>{if $contact.message}{$contact.message}{/if}</textarea>
|
||||
</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)}
|
||||
<div class="form-group row">
|
||||
<div class="offset-md-3">
|
||||
|
@ -127,9 +123,12 @@
|
|||
</style>
|
||||
<input type="text" name="url" value=""/>
|
||||
<input type="hidden" name="token" value="{$token}" />
|
||||
<input class="btn btn-primary" type="submit" name="submitMessage" value="{l s='Send' d='Shop.Theme.Actions'}">
|
||||
<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'}">
|
||||
</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}
|
||||
|
||||
</form>
|
||||
</section>
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
<h2 class="h2 products-section-title text-uppercase">
|
||||
{l s='Best Sellers' d='Shop.Theme.Catalog'}
|
||||
</h2>
|
||||
<div class="products">
|
||||
<div class="products flex flex-wrap">
|
||||
{foreach from=$products item="product"}
|
||||
{include file="catalog/_partials/miniatures/product.tpl" product=$product}
|
||||
{/foreach}
|
||||
|
|
|
@ -0,0 +1,24 @@
|
|||
{**
|
||||
* 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>
|
|
@ -22,15 +22,15 @@
|
|||
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
|
||||
* International Registered Trademark & Property of PrestaShop SA
|
||||
*}
|
||||
<section class="featured-products clearfix mt-3">
|
||||
<h2>
|
||||
<section class="flex flex-col gap-8 mt-24">
|
||||
<span class="text-2xl font-bold">
|
||||
{if $products|@count == 1}
|
||||
{l s='%s other product in the same category:' sprintf=[$products|@count] d='Shop.Theme.Catalog'}
|
||||
{else}
|
||||
{l s='%s other products in the same category:' sprintf=[$products|@count] d='Shop.Theme.Catalog'}
|
||||
{/if}
|
||||
</h2>
|
||||
<div class="products">
|
||||
</span>
|
||||
<div class="products flex flex-wrap">
|
||||
{foreach from=$products item="product"}
|
||||
{include file="catalog/_partials/miniatures/product.tpl" product=$product}
|
||||
{/foreach}
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
{**
|
||||
* 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>
|
|
@ -24,39 +24,26 @@
|
|||
*}
|
||||
|
||||
<div class="contact-rich">
|
||||
<h4>{l s='Store information' d='Shop.Theme.Global'}</h4>
|
||||
<div class="block">
|
||||
<div class="icon"><i class="material-icons"></i></div>
|
||||
<div class="data">{$contact_infos.address.formatted nofilter}</div>
|
||||
</div>
|
||||
{if $contact_infos.phone}
|
||||
<hr/>
|
||||
<div class="block">
|
||||
<div class="icon"><i class="material-icons"></i></div>
|
||||
<div class="data">
|
||||
{l s='Call us:' d='Shop.Theme.Global'}<br/>
|
||||
<a href="tel:{$contact_infos.phone}">{$contact_infos.phone}</a>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
{if $contact_infos.fax}
|
||||
<hr/>
|
||||
<div class="block">
|
||||
<div class="icon"><i class="material-icons"></i></div>
|
||||
<div class="data">
|
||||
{l s='Fax:' d='Shop.Theme.Global'}<br/>
|
||||
{$contact_infos.fax}
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
{if $contact_infos.email}
|
||||
<hr/>
|
||||
<div class="block">
|
||||
<div class="icon"><i class="material-icons"></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}
|
||||
<h4 class="text-2xl font-bold">{l s='Store information' d='Shop.Theme.Global'}</h4>
|
||||
<div class="mx-auto max-w-6xl">
|
||||
<h4 class="text-xl font-medium mt-6">
|
||||
Our Stylists
|
||||
</h4>
|
||||
<p>
|
||||
Our Stylists are here for you. We have helped dress some of the biggest names in Hollywood and Professional
|
||||
sports. Our staff of highly experienced tailors and stylists understand the demands placed on you to always look
|
||||
your very best.
|
||||
</p>
|
||||
<p class="mt-3">
|
||||
Your personal stylist is ready to assist you in all your clothing needs.
|
||||
</p>
|
||||
<h4 class="text-xl font-medium mt-6">Customer Service</h4>
|
||||
<p> Let us show you how custom works.
|
||||
We will walk you through your first order.
|
||||
Just drop us a line at
|
||||
<a href="mailto:customerservice@brooksbingham.com" class="underline underline-offset-2">customerservice@brooksbingham.com</a>
|
||||
, and we will get in touch with you.
|
||||
</p>
|
||||
</div>
|
||||
<hr class="my-8"/>
|
||||
</div>
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
|
||||
<section class="featured-products clearfix mt-3">
|
||||
<h2>{l s='Customers who bought this product also bought:' d='Shop.Theme.Catalog'}</h2>
|
||||
<div class="products">
|
||||
<div class="products flex flex-wrap">
|
||||
{foreach from=$products item="product"}
|
||||
{include file="catalog/_partials/miniatures/product.tpl" product=$product}
|
||||
{/foreach}
|
||||
|
|
|
@ -23,29 +23,43 @@
|
|||
* International Registered Trademark & Property of PrestaShop SA
|
||||
*}
|
||||
|
||||
<div id="block_myaccount_infos" class="col-md-3 links wrapper">
|
||||
<p class="h3 myaccount-title hidden-sm-down">
|
||||
<a class="text-uppercase" href="{$urls.pages.my_account}" rel="nofollow">
|
||||
{l s='Your account' d='Shop.Theme.Customeraccount'}
|
||||
</a>
|
||||
</p>
|
||||
<div class="title clearfix hidden-md-up" data-target="#footer_account_list" data-toggle="collapse">
|
||||
<span class="h3">{l s='Your account' d='Shop.Theme.Customeraccount'}</span>
|
||||
<span class="float-xs-right">
|
||||
<span class="navbar-toggler collapse-icons">
|
||||
<i class="material-icons add"></i>
|
||||
<i class="material-icons remove"></i>
|
||||
</span>
|
||||
</span>
|
||||
{*Mobile View*}
|
||||
<div id="block_myaccount_infos" class=" md:hidden th-accordion">
|
||||
<div class="flex flex-col gap-4 th-accordion-item">
|
||||
<div class="title clearfix th-accordion-item-trigger flex items-center gap-2" data-target="#footer_account_list" data-toggle="collapse">
|
||||
<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>
|
||||
<span class="font-bold">{l s='Your account' d='Shop.Theme.Customeraccount'}</span>
|
||||
</div>
|
||||
<ul class="account-list th-accordion-item-content pl-6" id="footer_account_list">
|
||||
{foreach from=$my_account_urls item=my_account_url}
|
||||
<li class="flex">
|
||||
<a href="{$my_account_url.url}" class="text-sm font-normal leading-6" title="{$my_account_url.title}" rel="nofollow">
|
||||
{$my_account_url["title"]}
|
||||
</a>
|
||||
</li>
|
||||
{/foreach}
|
||||
<a href="{$logout_url}" class="text-sm font-normal leading-6" title="logout" rel="nofollow">
|
||||
Sign out
|
||||
</a>
|
||||
</ul>
|
||||
</div>
|
||||
<ul class="account-list collapse" id="footer_account_list">
|
||||
</div>
|
||||
|
||||
{*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}
|
||||
<li>
|
||||
<a href="{$my_account_url.url}" title="{$my_account_url.title}" rel="nofollow">
|
||||
{$my_account_url.title}
|
||||
<li class="flex">
|
||||
<a href="{$my_account_url.url}" class="text-sm font-normal leading-6" title="{$my_account_url.title}" rel="nofollow">
|
||||
{$my_account_url["title"]}
|
||||
</a>
|
||||
</li>
|
||||
{/foreach}
|
||||
{hook h='displayMyAccountBlock'}
|
||||
<a href="{$logout_url}" class="text-sm font-normal leading-6" title="logout" rel="nofollow">
|
||||
Sign out
|
||||
</a>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
|
@ -22,16 +22,20 @@
|
|||
* @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_user_info" class="relative">
|
||||
<div class="flex max-w-[200px] justify-end">
|
||||
<div id="_desktop_user_info" class="relative max-md:hidden">
|
||||
<div class="flex max-w-[200px] justify-end mx-4">
|
||||
{if $logged}
|
||||
<a
|
||||
class="logout hidden-sm-down"
|
||||
class="logout hidden-sm-down mr-4"
|
||||
href="{$logout_url}"
|
||||
rel="nofollow"
|
||||
>
|
||||
<i class="material-icons"></i>
|
||||
{l s='Sign out' d='Shop.Theme.Actions'}
|
||||
<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">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<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
|
||||
class="account"
|
||||
|
@ -39,8 +43,12 @@
|
|||
title="{l s='View my customer account' d='Shop.Theme.Customeraccount'}"
|
||||
rel="nofollow"
|
||||
>
|
||||
<i class="material-icons hidden-md-up logged"></i>
|
||||
<span class="hidden-sm-down">{$customerName}</span>
|
||||
<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">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<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>
|
||||
{else}
|
||||
<a
|
||||
|
|
|
@ -26,12 +26,13 @@
|
|||
<h2 class="products-section-title text-2xl font-bold">
|
||||
{l s='Popular Products' d='Shop.Theme.Catalog'}
|
||||
</h2>
|
||||
<div class="products grid grid-cols-1 md:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-8">
|
||||
<div class="products flex flex-wrap">
|
||||
{foreach from=$products item="product"}
|
||||
{include file="catalog/_partials/miniatures/product.tpl" product=$product}
|
||||
{/foreach}
|
||||
</div>
|
||||
<a class="all-product-link text-2xl font-bold" href="{$allProductsLink}">
|
||||
<a class="all-product-link text-2xl font-bold w-full flex items-center justify-end" href="{$allProductsLink}">
|
||||
{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>
|
||||
</section>
|
||||
|
|
|
@ -24,37 +24,11 @@
|
|||
*}
|
||||
|
||||
{if $homeslider.slides}
|
||||
<div id="carousel" data-ride="carousel" class="carousel slide" data-interval="{$homeslider.speed}" data-wrap="{(string)$homeslider.wrap}" data-pause="{$homeslider.pause}">
|
||||
<ul class="carousel-inner" role="listbox">
|
||||
{foreach from=$homeslider.slides item=slide name='homeslider'}
|
||||
<li class="carousel-item {if $smarty.foreach.homeslider.first}active{/if}" role="option" aria-hidden="{if $smarty.foreach.homeslider.first}false{else}true{/if}">
|
||||
<a href="{$slide.url}">
|
||||
<figure class="relative">
|
||||
<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"></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"></i>
|
||||
</span>
|
||||
<span class="sr-only">{l s='Next' d='Shop.Theme.Global'}</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<a href="https://brooksbingham.com/17-custom-made">
|
||||
<div class="mb-12 w-full lg:h-[90vh]" style="clip-path: inset(4px)">
|
||||
<video autoplay muted loop class="w-full h-auto object-cover" style="background-color: rgba(0, 0, 0, 0)">
|
||||
<source src="{$urls.img_ps_url}cms/hero.mp4" type="video/mp4" >
|
||||
</video>
|
||||
</div>
|
||||
</a>
|
||||
{/if}
|
||||
|
|
|
@ -1,49 +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
|
||||
*}
|
||||
<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"></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>
|
|
@ -22,16 +22,35 @@
|
|||
* @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="container">
|
||||
|
||||
{*Mobile View*}
|
||||
<div class="flex flex-wrap flex-1 flex-col md:flex-row th-accordion">
|
||||
{foreach $linkBlocks as $linkBlock}
|
||||
<div class="flex flex-col mb-4">
|
||||
<div class="flex md:hidden flex-col mb-4 md:w-1/3 th-accordion-item">
|
||||
<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">
|
||||
{$linkBlock.title}
|
||||
</div>
|
||||
<ul>
|
||||
<ul class="flex flex-col">
|
||||
{foreach $linkBlock.links as $link}
|
||||
<li>
|
||||
<a id="{$link.id}-{$linkBlock.id}" class="{$link.class}" href="{$link.url}" title="{$link.description}" {if !empty($link.target)} target="{$link.target}" {/if}>
|
||||
<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>
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
{assign var=_counter value=0}
|
||||
{function name="menu" nodes=[] depth=0 parent=null}
|
||||
{if $nodes|count}
|
||||
<ul class="flex flex-1 items-center justify-center top-menu" {if $depth == 0}id="top-menu"{/if} data-depth="{$depth}">
|
||||
<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}">
|
||||
{foreach from=$nodes item=node}
|
||||
<li class="{$node.type}{if $node.current} current {/if} px-2 py-2" id="{$node.page_identifier}">
|
||||
<li class="{$node.type}{if $node.current} current {/if} px-2 py-2 font-medium hover:text-gray-950" id="{$node.page_identifier}">
|
||||
{assign var=_counter value=$_counter+1}
|
||||
<a
|
||||
class="{if $depth >= 0}dropdown-item{/if}{if $depth === 1} dropdown-submenu{/if}"
|
||||
|
@ -13,12 +13,13 @@
|
|||
{$node.label}
|
||||
</a>
|
||||
</li>
|
||||
<hr class=" last:hidden w-full lg:hidden"/>
|
||||
{/foreach}
|
||||
</ul>
|
||||
{/if}
|
||||
{/function}
|
||||
|
||||
<button class="absolute right-4 top-1/2 block -translate-y-1/2 p-3 ring-primary focus:ring-2 lg:hidden">
|
||||
<button class="toggle-main-menu absolute right-4 top-1/2 block -translate-y-1/2 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">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M4 6l16 0"></path>
|
||||
|
@ -26,6 +27,6 @@
|
|||
<path d="M4 18l16 0"></path>
|
||||
</svg>
|
||||
</button>
|
||||
<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">
|
||||
<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">
|
||||
{menu nodes=$menu.children}
|
||||
</nav>
|
||||
|
|
|
@ -22,18 +22,17 @@
|
|||
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
|
||||
* International Registered Trademark & Property of PrestaShop SA
|
||||
*}
|
||||
|
||||
<section class="featured-products clearfix mt-3">
|
||||
<h2 class="h2 products-section-title text-uppercase">
|
||||
<section class="featured-products flex flex-col gap-8">
|
||||
<h2 class="products-section-title text-2xl font-bold">
|
||||
{l s='New products' d='Shop.Theme.Catalog'}
|
||||
</h2>
|
||||
<div class="products">
|
||||
<div class="products flex flex-wrap">
|
||||
{foreach from=$products item="product"}
|
||||
{include file="catalog/_partials/miniatures/product.tpl" product=$product}
|
||||
{/foreach}
|
||||
</div>
|
||||
<a class="all-product-link float-xs-left float-md-right h4" href="{$allNewProductsLink}">
|
||||
{l s='All new products' d='Shop.Theme.Catalog'}<i class="material-icons"></i>
|
||||
<a class="all-product-link text-2xl font-bold" href="{$allNewProductsLink}">
|
||||
{l s='All new products' d='Shop.Theme.Catalog'}
|
||||
</a>
|
||||
</section>
|
||||
|
||||
|
|
|
@ -1,35 +0,0 @@
|
|||
<?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;
|
|
@ -1,35 +0,0 @@
|
|||
<?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;
|
|
@ -1,39 +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
|
||||
*}
|
||||
|
||||
<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>
|
|
@ -1,35 +0,0 @@
|
|||
<?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;
|
|
@ -1,37 +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
|
||||
*}
|
||||
|
||||
{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}
|
|
@ -27,7 +27,7 @@
|
|||
<h2 class="h2 products-section-title text-uppercase">
|
||||
{l s='On sale' d='Shop.Theme.Catalog'}
|
||||
</h2>
|
||||
<div class="products">
|
||||
<div class="products flex flex-wrap">
|
||||
{foreach from=$products item="product"}
|
||||
{include file="catalog/_partials/miniatures/product.tpl" product=$product}
|
||||
{/foreach}
|
||||
|
|
|
@ -22,9 +22,9 @@
|
|||
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
|
||||
* International Registered Trademark & Property of PrestaShop SA
|
||||
*}
|
||||
<section class="featured-products clearfix mt-3">
|
||||
<h2>{l s='Viewed products' d='Shop.Theme.Catalog'}</h2>
|
||||
<div class="products">
|
||||
<section class="featured-products w-full flex flex-col gap-8 mt-24">
|
||||
<h2 class="text-2xl font-bold">{l s='Viewed products' d='Shop.Theme.Catalog'}</h2>
|
||||
<div class="products flex flex-wrap">
|
||||
{foreach from=$products item="product"}
|
||||
{include file="catalog/_partials/miniatures/product.tpl" product=$product}
|
||||
{/foreach}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{**
|
||||
* 2007-2019 PrestaShop and Contributors
|
||||
* 2007-2020 PrestaShop and Contributors
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
|
@ -11,24 +11,20 @@
|
|||
* 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
|
||||
* @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
|
||||
*}
|
||||
|
||||
{block name='block_social'}
|
||||
<div class="block-social col-lg-4 col-md-12 col-sm-12">
|
||||
<ul>
|
||||
{foreach from=$social_links item='social_link'}
|
||||
<li class="{$social_link.class}"><a href="{$social_link.url}" target="_blank">{$social_link.label}</a></li>
|
||||
{/foreach}
|
||||
</ul>
|
||||
</div>
|
||||
{/block}
|
||||
|
||||
<dl>
|
||||
<dt class="font-semibold">{l s='Amount' d='Modules.Wirepayment.Shop'}</dt>
|
||||
<dd class="text-sm mb-3">{$total}</dd>
|
||||
<dt class="font-semibold">{l s='Name of account owner' d='Modules.Wirepayment.Shop'}</dt>
|
||||
<dd class="text-sm mb-3">{$bankwireOwner}</dd>
|
||||
<dt class="font-semibold">{l s='Please include these details' d='Modules.Wirepayment.Shop'}</dt>
|
||||
<dd class="text-sm mb-3">{$bankwireDetails nofilter}</dd>
|
||||
<dt class="font-semibold">{l s='Bank name' d='Modules.Wirepayment.Shop'}</dt>
|
||||
<dd class="text-sm">{$bankwireAddress nofilter}</dd>
|
||||
</dl>
|
|
@ -0,0 +1,32 @@
|
|||
{**
|
||||
* 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>
|
|
@ -0,0 +1,3 @@
|
|||
<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>
|
|
@ -0,0 +1,20 @@
|
|||
<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>
|
|
@ -0,0 +1,24 @@
|
|||
$(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');
|
||||
});
|
||||
});
|
|
@ -0,0 +1,272 @@
|
|||
$(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);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,88 @@
|
|||
{**
|
||||
* 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}
|
|
@ -0,0 +1,7 @@
|
|||
|
||||
<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>
|
|
@ -0,0 +1,17 @@
|
|||
<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>
|
|
@ -0,0 +1,22 @@
|
|||
{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}
|
|
@ -0,0 +1,89 @@
|
|||
|
||||
<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>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -23,7 +23,7 @@
|
|||
* International Registered Trademark & Property of PrestaShop SA
|
||||
*}
|
||||
<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 gap-4">
|
||||
<ol itemscope itemtype="http://schema.org/BreadcrumbList" class="hidden md:flex w-full ">
|
||||
{block name='breadcrumb'}
|
||||
{foreach from=$breadcrumb.links item=path name=breadcrumb}
|
||||
{block name='breadcrumb_item'}
|
||||
|
@ -31,6 +31,9 @@
|
|||
<a itemprop="item" href="{$path.url}">
|
||||
<span itemprop="name">{$path.title}</span>
|
||||
</a>
|
||||
{if !$smarty.foreach.breadcrumb.last}
|
||||
<span class="mx-4">/</span>
|
||||
{/if}
|
||||
<meta itemprop="position" content="{$smarty.foreach.breadcrumb.iteration}">
|
||||
</li>
|
||||
{/block}
|
||||
|
|
|
@ -27,13 +27,30 @@
|
|||
{hook h='displayFooterBefore'}
|
||||
{/block}
|
||||
</div>
|
||||
<div class="container mx-auto">
|
||||
<div class="flex items-center">
|
||||
<div class="w-48 h-48 flex flex-col justify-center">
|
||||
<a class="w-24 h-24" href="{$urls.base_url}">
|
||||
<img class="logo w-full aspect-square object-fit" src="{$shop.logo}" alt="{$shop.name}">
|
||||
<div class="container mx-auto flex flex-col gap-8">
|
||||
<div class="flex flex-col lg:flex-row gap-8">
|
||||
<div class="w-32 max-sm:hidden flex flex-row justify-center items-center">
|
||||
<a class="w-full" href="{$urls.base_url}">
|
||||
<img class="logo w-full" 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>
|
||||
<div class="h-96">
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex">
|
||||
|
@ -41,13 +58,9 @@
|
|||
{hook h='displayFooterAfter'}
|
||||
{/block}
|
||||
</div>
|
||||
<div class="container">
|
||||
<div class="flex justify-center py-8">
|
||||
{block name='copyright_link'}
|
||||
<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 class="flex py-8 max-md:justify-center">
|
||||
<a href="{$urls.base_url}">
|
||||
<span class="text-sm">© 2024 Brooksbingham Clothing</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -23,11 +23,11 @@
|
|||
* International Registered Trademark & Property of PrestaShop SA
|
||||
*}
|
||||
{if $errors|count}
|
||||
<div class="help-block">
|
||||
<div class="help-block mb-4">
|
||||
{block name='form_errors'}
|
||||
<ul>
|
||||
{foreach $errors as $error}
|
||||
<li class="alert alert-danger">{$error|nl2br nofilter}</li>
|
||||
<li class="alert alert-danger px-4 py-2 border border-red-100 bg-red-50 text-red-900">{$error|nl2br nofilter}</li>
|
||||
{/foreach}
|
||||
</ul>
|
||||
{/block}
|
||||
|
|
|
@ -30,18 +30,18 @@
|
|||
|
||||
{else}
|
||||
|
||||
<div class="form-group row {if !empty($field.errors)}has-error{/if}">
|
||||
<label class="col-md-3 form-control-label{if $field.required} required{/if}">
|
||||
<div class="form-group {if !empty($field.errors)}has-error{/if} flex flex-col">
|
||||
<label class="font-medium form-control-label{if $field.required} required{/if} mb-1">
|
||||
{if $field.type !== 'checkbox'}
|
||||
{$field.label}
|
||||
{/if}
|
||||
</label>
|
||||
<div class="col-md-6{if ($field.type === 'radio-buttons')} form-control-valign{/if}">
|
||||
<div class="flex gap-1 {if ($field.type === 'radio-buttons')}flex gap-2 items-center{else}flex-col{/if}">
|
||||
|
||||
{if $field.type === 'select'}
|
||||
|
||||
{block name='form_field_item_select'}
|
||||
<select class="form-control form-control-select" name="{$field.name}" {if $field.required}required{/if}>
|
||||
<select class="form-control form-control-select px-2 py-1 border-gray-300 w-full" name="{$field.name}" {if $field.required}required{/if}>
|
||||
<option value disabled selected>{l s='-- please choose --' d='Shop.Forms.Labels'}</option>
|
||||
{foreach from=$field.availableValues item="label" key="value"}
|
||||
<option value="{$value}" {if $value eq $field.value} selected {/if}>{$label}</option>
|
||||
|
@ -53,7 +53,7 @@
|
|||
|
||||
{block name='form_field_item_country'}
|
||||
<select
|
||||
class="form-control form-control-select js-country"
|
||||
class="form-control form-control-select js-country px-2 py-1 border-gray-300 w-full"
|
||||
name="{$field.name}"
|
||||
{if $field.required}required{/if}
|
||||
>
|
||||
|
@ -87,10 +87,9 @@
|
|||
{elseif $field.type === 'checkbox'}
|
||||
|
||||
{block name='form_field_item_checkbox'}
|
||||
<span class="custom-checkbox">
|
||||
<label>
|
||||
<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"></i></span>
|
||||
<span class="custom-checkbox flex gap-2">
|
||||
<input class="my-0.5" name="{$field.name}" type="checkbox" value="1" {if $field.value}checked="checked"{/if} {if $field.required}required{/if}>
|
||||
<label class="font-light text-sm" for="{$field.name}">
|
||||
{$field.label nofilter}
|
||||
</label>
|
||||
</span>
|
||||
|
@ -132,9 +131,9 @@
|
|||
{elseif $field.type === 'password'}
|
||||
|
||||
{block name='form_field_item_password'}
|
||||
<div class="input-group js-parent-focus">
|
||||
<div class="input-group js-parent-focus relative">
|
||||
<input
|
||||
class="form-control js-child-focus js-visible-password"
|
||||
class="form-control js-child-focus js-visible-password px-2 py-1 border border-gray-300 w-full"
|
||||
name="{$field.name}"
|
||||
title="{l s='At least 5 characters long' d='Shop.Forms.Help'}"
|
||||
type="password"
|
||||
|
@ -142,17 +141,6 @@
|
|||
pattern=".{literal}{{/literal}5,{literal}}{/literal}"
|
||||
{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>
|
||||
{/block}
|
||||
|
||||
|
@ -160,7 +148,7 @@
|
|||
|
||||
{block name='form_field_item_other'}
|
||||
<input
|
||||
class="form-control"
|
||||
class="form-control px-2 py-1 border border-gray-300 w-full"
|
||||
name="{$field.name}"
|
||||
type="{$field.type}"
|
||||
value="{$field.value}"
|
||||
|
@ -183,7 +171,7 @@
|
|||
|
||||
</div>
|
||||
|
||||
<div class="col-md-3 form-control-comment">
|
||||
<div class="col-md-3 form-control-comment text-sm text-gray-600">
|
||||
{block name='form_field_comment'}
|
||||
{if (!$field.required && !in_array($field.type, ['radio-buttons', 'checkbox']))}
|
||||
{l s='Optional' d='Shop.Forms.Labels'}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{**
|
||||
* 2007-2019 PrestaShop and Contributors
|
||||
* 2007-2019 PrestaShop and Contributorslivereload
|
||||
*
|
||||
* NOTICE OF LICENSE
|
||||
*
|
||||
|
@ -58,6 +58,7 @@
|
|||
{block name='stylesheets'}
|
||||
{include file="_partials/stylesheets.tpl" stylesheets=$stylesheets}
|
||||
{/block}
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@2.36.0/tabler-icons.min.css">
|
||||
|
||||
{block name='javascript_head'}
|
||||
{include file="_partials/javascript.tpl" javascript=$javascript.head vars=$js_custom_vars}
|
||||
|
@ -75,13 +76,46 @@
|
|||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
{** TODO: Remove this before going live *}
|
||||
<script>document.write('<script src="http://'
|
||||
+ location.host.split(':')[0]
|
||||
+ ':35729/livereload.js"></'
|
||||
+ 'script>')</script>
|
||||
</script>
|
||||
{literal}
|
||||
<!-- Hotjar Tracking Code for brooksbingham.com -->
|
||||
<script>
|
||||
(function(h,o,t,j,a,r){
|
||||
h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)};
|
||||
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'}
|
||||
{$HOOK_HEADER nofilter}
|
||||
{/block}
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
{block name='header_top'}
|
||||
<div class="container mx-auto">
|
||||
<div class="relative -mx-4 flex items-center justify-between h-24">
|
||||
<div class="w-12 max-w-full ">
|
||||
<div class="w-40 max-md:pl-4 max-w-full ">
|
||||
<a class="block w-full " href="{$urls.base_url}">
|
||||
<img class="w-full" src="{$shop.logo}" alt="{$shop.name}"/>
|
||||
</a>
|
||||
|
@ -35,7 +35,7 @@
|
|||
<div class="w-full">
|
||||
{hook h='displayMainMenu'}
|
||||
</div>
|
||||
<div class="relative right-16 hidden items-center justify-end sm:flex lg:right-0">
|
||||
<div class="relative right-12 items-center justify-end sm:flex lg:right-0">
|
||||
{hook h='displayTop'}
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
|
||||
* International Registered Trademark & Property of PrestaShop SA
|
||||
*}
|
||||
<nav class="pagination flex justify-between">
|
||||
<nav class="pagination flex justify-between mt-16">
|
||||
<div class="flex">
|
||||
{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]}
|
||||
|
@ -34,14 +34,17 @@
|
|||
{if $pagination.should_be_displayed}
|
||||
<ul class="flex gap-4">
|
||||
{foreach from=$pagination.pages item="page"}
|
||||
<li {if $page.current} class="current" {/if}>
|
||||
<li {if $page.current} class="current font-bold" {/if}>
|
||||
<a
|
||||
rel="{if $page.type === 'previous'}prev{elseif $page.type === 'next'}next{else}nofollow{/if}"
|
||||
href="{$page.url}"
|
||||
class="flex items-center {if $page.type === 'previous'}previous {elseif $page.type === 'next'}next {/if}{['disabled' => !$page.clickable, 'js-search-link' => true]|classnames}"
|
||||
disabled
|
||||
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'}
|
||||
{l s='Previous' d='Shop.Theme.Actions'}
|
||||
{elseif $page.type === 'spacer'}
|
||||
...
|
||||
{elseif $page.type === 'next'}
|
||||
{l s='Next' d='Shop.Theme.Actions'}
|
||||
{else}
|
||||
|
|
|
@ -26,6 +26,8 @@
|
|||
<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 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}
|
||||
<link rel="stylesheet" href="{$stylesheet.uri}" type="text/css" media="{$stylesheet.media}">
|
||||
{/foreach}
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
{**
|
||||
* 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>
|
|
@ -22,20 +22,11 @@
|
|||
* @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="js-product-list-header">
|
||||
{if $listing.pagination.items_shown_from == 1}
|
||||
<div class="block-category card card-block">
|
||||
<h1 class="h1">{$category.name}</h1>
|
||||
<div class="block-category-inner">
|
||||
{if $category.description}
|
||||
<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 id="js-product-list-header" class="mb-8 flex flex-col gap-4">
|
||||
{if isset($subcategories) && $subcategories|@count> 0}
|
||||
<div class="flex">
|
||||
<h2 class="tex-4xl font-bold">Categories</h2>
|
||||
</div>
|
||||
{include file='catalog/_partials/subcategories.tpl' subcategories=$subcategories}
|
||||
{/if}
|
||||
</div>
|
||||
|
|
|
@ -24,145 +24,56 @@
|
|||
*}
|
||||
{if $facets|count}
|
||||
<div id="search_filters">
|
||||
{block name='facets_title'}
|
||||
<p class="text-uppercase h6 hidden-sm-down">{l s='Filter By' d='Shop.Theme.Actions'}</p>
|
||||
{/block}
|
||||
|
||||
{block name='facets_clearall_button'}
|
||||
{if $activeFilters|count}
|
||||
<div id="_desktop_search_filters_clear_all" class="hidden-sm-down clear-all-wrapper">
|
||||
<button data-search-url="{$clear_all_link}" class="btn btn-tertiary js-search-filters-clear-all">
|
||||
<i class="material-icons"></i>
|
||||
{l s='Clear all' d='Shop.Theme.Actions'}
|
||||
</button>
|
||||
</div>
|
||||
{/if}
|
||||
{/block}
|
||||
|
||||
{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"></i>
|
||||
<i class="material-icons remove"></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"></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>
|
||||
<div class="th-accordion">
|
||||
{foreach from=$facets item="facet"}
|
||||
{if !$facet.displayed}
|
||||
{continue}
|
||||
{/if}
|
||||
{if $facet.widgetType === 'dropdown'}
|
||||
<div class="th-accordion-item border-t border-gray-200 px-4 py-4">
|
||||
<h3 class="-mx-2 -my-3 flow-root">
|
||||
<!-- Expand/collapse section button -->
|
||||
<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">
|
||||
<span class="font-medium text-gray-900">
|
||||
{$active_found = false}
|
||||
{foreach from=$facet.filters item="filter"}
|
||||
{if $filter.active}
|
||||
{$filter.label}
|
||||
{$active_found = true}
|
||||
{/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
|
||||
href="{$filter.nextEncodedFacetsURL}"
|
||||
class="_gray-darker search-link js-search-link"
|
||||
rel="nofollow"
|
||||
href="{$filter.nextEncodedFacetsURL}"
|
||||
class="select-list text-sm w-1/2 p-2 text-center"
|
||||
>
|
||||
{$filter.label}
|
||||
{if $filter.magnitude}
|
||||
<span class="magnitude">({$filter.magnitude})</span>
|
||||
{/if}
|
||||
</a>
|
||||
</label>
|
||||
</li>
|
||||
{/foreach}
|
||||
</ul>
|
||||
{/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"></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}
|
||||
{/foreach}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
</section>
|
||||
{/foreach}
|
||||
{/foreach}
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
|
|
@ -23,70 +23,40 @@
|
|||
* International Registered Trademark & Property of PrestaShop SA
|
||||
*}
|
||||
{block name='product_miniature_item'}
|
||||
<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">
|
||||
<div class="thumbnail-container flex flex-col gap-4">
|
||||
{block name='product_thumbnail'}
|
||||
{if $product.cover}
|
||||
<a href="{$product.url}" class="thumbnail product-thumbnail w-full aspect-[342/513] bg-gray-100">
|
||||
<img
|
||||
src="{$product.cover.bySize.home_default.url}"
|
||||
alt="{if !empty($product.cover.legend)}{$product.cover.legend}{else}{$product.name|truncate:30:'...'}{/if}"
|
||||
data-full-size-image-url="{$product.cover.large.url}"
|
||||
class="object-cover w-full h-full"
|
||||
/>
|
||||
</a>
|
||||
{else}
|
||||
<a href="{$product.url}" class="thumbnail product-thumbnail w-full aspect-[342/513]">
|
||||
<img class="object-fit w-full h-full" src="{$urls.no_picture_image.bySize.home_default.url}" />
|
||||
</a>
|
||||
<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">
|
||||
{block name='product_thumbnail'}
|
||||
{if $product.cover}
|
||||
<div class="thumbnail product-thumbnail w-full aspect-[342/513] bg-gray-100">
|
||||
<img
|
||||
src="{$product.cover.bySize.home_default.url}"
|
||||
alt="{if !empty($product.cover.legend)}{$product.cover.legend}{else}{$product.name|truncate:30:'...'}{/if}"
|
||||
data-full-size-image-url="{$product.cover.large.url}"
|
||||
class="object-cover w-full h-full"
|
||||
/>
|
||||
</div>
|
||||
{else}
|
||||
<div class="thumbnail product-thumbnail w-full aspect-[342/513]">
|
||||
<img class="object-fit w-full h-full" src="{$urls.no_picture_image.bySize.home_default.url}" />
|
||||
</div>
|
||||
{/if}
|
||||
{/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 $product.show_price}
|
||||
<div class="font-bold text-lg">
|
||||
<span>{$product.price}</span>
|
||||
</div>
|
||||
{/if}
|
||||
{/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}
|
||||
{block name='product_name'}
|
||||
<span class="text-lg font-light" itemprop="name">{$product.name|truncate:30:'...'}</span>
|
||||
{/block}
|
||||
</div>
|
||||
</a>
|
||||
{/block}
|
||||
|
||||
|
|
|
@ -22,57 +22,65 @@
|
|||
* @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="product-add-to-cart">
|
||||
<div class="product-add-to-cart flex flex-col gap-3 mt-8 mb-4">
|
||||
{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'}
|
||||
<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="flex w-full flex-col gap-4">
|
||||
<div class="add">
|
||||
<button
|
||||
class="btn btn-primary add-to-cart"
|
||||
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"
|
||||
data-button-action="add-to-cart"
|
||||
type="submit"
|
||||
{if !$product.add_to_cart_url}
|
||||
disabled
|
||||
{/if}
|
||||
>
|
||||
<i class="material-icons shopping-cart"></i>
|
||||
{l s='Add to cart' d='Shop.Theme.Actions'}
|
||||
{l s='ADD TO CART' d='Shop.Theme.Actions'}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{hook h='displayCustomProductActions'}
|
||||
{hook h='displayProductActions' product=$product}
|
||||
</div>
|
||||
{/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"></i>
|
||||
{elseif $product.availability == 'last_remaining_items'}
|
||||
<i class="material-icons product-last-items"></i>
|
||||
{else}
|
||||
<i class="material-icons product-unavailable"></i>
|
||||
{/if}
|
||||
{$product.availability_message}
|
||||
{/if}
|
||||
</span>
|
||||
{/block}
|
||||
|
||||
{block name='product_minimal_quantity'}
|
||||
<p class="product-minimal-quantity">
|
||||
{if $product.minimal_quantity > 1}
|
||||
|
|
|
@ -22,6 +22,6 @@
|
|||
* @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="product-additional-info">
|
||||
<div class="product-additional-info flex flex-col">
|
||||
{hook h='displayProductAdditionalInfo' product=$product}
|
||||
</div>
|
||||
|
|
|
@ -22,25 +22,18 @@
|
|||
* @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="images-container">
|
||||
<div class="images-container flex w-full flex-row-reverse justify-center gap-6 flex-wrap lg:flex-nowrap">
|
||||
{block name='product_cover'}
|
||||
<div class="product-cover">
|
||||
{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"></i>
|
||||
</div>
|
||||
{else}
|
||||
<img src="{$urls.no_picture_image.bySize.large_default.url}" style="width:100%;">
|
||||
{/if}
|
||||
<div class="product-cover w-full">
|
||||
<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">
|
||||
</div>
|
||||
{/block}
|
||||
|
||||
{block name='product_images'}
|
||||
<div class="js-qv-mask mask">
|
||||
<ul class="product-images js-qv-product-images">
|
||||
<div class="js-qv-mask mask" >
|
||||
<ul class="product-images js-qv-product-images flex flex-row lg:flex-col gap-6">
|
||||
{foreach from=$product.images item=image}
|
||||
<li class="thumb-container">
|
||||
<li class="thumb-container w-14 md:w-24">
|
||||
<img
|
||||
class="thumb js-thumb {if $image.id_image == $product.cover.id_image} selected {/if}"
|
||||
data-image-medium-src="{$image.bySize.medium_default.url}"
|
||||
|
@ -48,7 +41,6 @@
|
|||
src="{$image.bySize.home_default.url}"
|
||||
alt="{$image.legend}"
|
||||
title="{$image.legend}"
|
||||
width="100"
|
||||
itemprop="image"
|
||||
>
|
||||
</li>
|
||||
|
|
|
@ -1,91 +1,19 @@
|
|||
<div class="tab-pane fade{if !$product.description} in active{/if}"
|
||||
id="product-details"
|
||||
data-product="{$product.embedded_attributes|json_encode}"
|
||||
role="tabpanel"
|
||||
>
|
||||
{block name='product_reference'}
|
||||
{if isset($product_manufacturer->id)}
|
||||
<div class="product-manufacturer">
|
||||
{if isset($manufacturer_image_url)}
|
||||
<a href="{$product_brand_url}">
|
||||
<img src="{$manufacturer_image_url}" class="img img-thumbnail manufacturer-logo" alt="{$product_manufacturer->name}">
|
||||
</a>
|
||||
{else}
|
||||
<label class="label">{l s='Brand' d='Shop.Theme.Catalog'}</label>
|
||||
<span>
|
||||
<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}
|
||||
{block name='product_features'}
|
||||
{if $product.grouped_features}
|
||||
<div class='w-full flex items-center flex-col gap-3'>
|
||||
<h1 class='text-lg font-bold text-gray-600'>
|
||||
Description
|
||||
</h1>
|
||||
<ul class="product-features list-[square] w-full flex flex-col gap-1 justify-center">
|
||||
{foreach from=$product.grouped_features item=feature}
|
||||
<div class="flex gap-2">
|
||||
<li class="w-44 shrink-0">
|
||||
<span class="name font-semibold">{$feature.name}</span>
|
||||
</li>
|
||||
<span class="value">{$feature.value|escape:'htmlall'|nl2br nofilter}</span>
|
||||
</div>
|
||||
{/foreach}
|
||||
</ul>
|
||||
</div>
|
||||
{/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>
|
||||
{/if}
|
||||
{/block}
|
||||
|
|
|
@ -23,12 +23,12 @@
|
|||
* International Registered Trademark & Property of PrestaShop SA
|
||||
*}
|
||||
{if $product.show_price}
|
||||
<div class="product-prices">
|
||||
<div class="product-prices flex flex-col">
|
||||
{block name='product_discount'}
|
||||
{if $product.has_discount}
|
||||
<div class="product-discount">
|
||||
{hook h='displayProductPriceBlock' product=$product type="old_price"}
|
||||
<span class="regular-price">{$product.regular_price}</span>
|
||||
<span class="regular-price line-through text-red-400 leading-none">{$product.regular_price}</span>
|
||||
</div>
|
||||
{/if}
|
||||
{/block}
|
||||
|
@ -43,14 +43,14 @@
|
|||
<link itemprop="availability" href="{$product.seo_availability}"/>
|
||||
<meta itemprop="priceCurrency" content="{$currency.iso_code}">
|
||||
|
||||
<div class="current-price">
|
||||
<span itemprop="price" content="{$product.price_amount}">{$product.price}</span>
|
||||
<div class="current-price flex gap-2 items-baseline">
|
||||
<span itemprop="price" class="text-2xl font-normal" content="{$product.price_amount}">{$product.price}</span>
|
||||
|
||||
{if $product.has_discount}
|
||||
{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>
|
||||
{else}
|
||||
<span class="discount discount-amount">
|
||||
<span class="discount discount-amount text-sm">
|
||||
{l s='Save %amount%' d='Shop.Theme.Catalog' sprintf=['%amount%' => $product.discount_to_display]}
|
||||
</span>
|
||||
{/if}
|
||||
|
@ -92,8 +92,6 @@
|
|||
<div class="tax-shipping-delivery-label">
|
||||
{if !$configuration.taxes_enabled}
|
||||
{l s='No tax' d='Shop.Theme.Catalog'}
|
||||
{elseif $configuration.display_taxes_label}
|
||||
{$product.labels.tax_long}
|
||||
{/if}
|
||||
{hook h='displayProductPriceBlock' product=$product type="price"}
|
||||
{hook h='displayProductPriceBlock' product=$product type="after_price"}
|
||||
|
|
|
@ -26,10 +26,10 @@
|
|||
{foreach from=$groups key=id_attribute_group item=group}
|
||||
{if !empty($group.attributes)}
|
||||
<div class="clearfix product-variants-item">
|
||||
<span class="control-label">{$group.name}</span>
|
||||
<span class="control-label font-semibold pr-2">{$group.name}:</span>
|
||||
{if $group.group_type == 'select'}
|
||||
<select
|
||||
class="form-control form-control-select"
|
||||
class="form-control form-control-select p-2 w-14"
|
||||
id="group_{$id_attribute_group}"
|
||||
data-product-attribute="{$id_attribute_group}"
|
||||
name="group[{$id_attribute_group}]">
|
||||
|
|
|
@ -22,35 +22,50 @@
|
|||
* @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="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'}
|
||||
{include file='catalog/_partials/sort-orders.tpl' sort_orders=$listing.sort_orders}
|
||||
{/block}
|
||||
|
||||
{if !empty($listing.rendered_facets)}
|
||||
<div class="col-sm-3 col-xs-4 hidden-md-up filter-button">
|
||||
<button id="search_filter_toggler" class="btn btn-secondary">
|
||||
{l s='Filter' d='Shop.Theme.Actions'}
|
||||
</button>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-12 hidden-md-up text-sm-center showing">
|
||||
{l s='Showing %from%-%to% of %total% item(s)' d='Shop.Theme.Catalog' sprintf=[
|
||||
'%from%' => $listing.pagination.items_shown_from ,
|
||||
'%to%' => $listing.pagination.items_shown_to,
|
||||
'%total%' => $listing.pagination.total_items
|
||||
]}
|
||||
|
||||
<!-- Off Screen Canvas Menu For Filters -->
|
||||
<div id="product-list-top-filters" class="offcanvas fixed inset-0 flex w-64 hidden" role="dialog" aria-modal="true">
|
||||
<div class="relative mr-auto flex h-full flex-col overflow-y-auto bg-white py-4 pb-12 shadow-xl">
|
||||
<div class="flex items-center justify-between px-4">
|
||||
<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>
|
||||
</div>
|
||||
<form class="mt-4 border-t border-gray-200">
|
||||
{if !empty($listing.rendered_facets)}
|
||||
{include file='catalog/_partials/facets.tpl'}
|
||||
{else}
|
||||
<div></div>
|
||||
{/if}
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -22,8 +22,8 @@
|
|||
* @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="js-product-list flex flex-col">
|
||||
<div class="products grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
|
||||
<div id="js-product-list" class="flex flex-col">
|
||||
<div class="products flex flex-wrap">
|
||||
{foreach from=$listing.products item="product"}
|
||||
{block name='product_miniature'}
|
||||
{include file='catalog/_partials/miniatures/product.tpl' product=$product}
|
||||
|
@ -35,8 +35,8 @@
|
|||
{include file='_partials/pagination.tpl' pagination=$listing.pagination}
|
||||
{/block}
|
||||
|
||||
<div class="flex justify-center md:hidden my-4">
|
||||
<a href="#header" class="btn btn-secondary">
|
||||
<div class="flex justify-center md:hidden my-8">
|
||||
<a href="#js-product-list-header" class="btn btn-secondary font-semibold">
|
||||
{l s='Back to top' d='Shop.Theme.Actions'}
|
||||
</a>
|
||||
</div>
|
||||
|
|
|
@ -22,26 +22,31 @@
|
|||
* @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0)
|
||||
* 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="{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">
|
||||
|
||||
<div class="relative flex-1 w-full max-w-[240px] group">
|
||||
<button
|
||||
class="btn-unstyle select-title"
|
||||
class="dropdown-toggle relative px-4 pr-6 leading-1 w-full text-left"
|
||||
type="button"
|
||||
rel="nofollow"
|
||||
data-toggle="dropdown"
|
||||
aria-haspopup="true"
|
||||
aria-expanded="false">
|
||||
{if isset($listing.sort_selected)}{$listing.sort_selected}{else}{l s='Select' d='Shop.Theme.Actions'}{/if}
|
||||
<i class="material-icons float-xs-right"></i>
|
||||
<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">
|
||||
<path stroke="none" d="M0 0h24v24H0z" fill="none"></path>
|
||||
<path d="M6 9l6 6l6 -6"></path>
|
||||
</svg>
|
||||
</button>
|
||||
<div class="dropdown-menu">
|
||||
{foreach from=$listing.sort_orders item=sort_order}
|
||||
<a
|
||||
rel="nofollow"
|
||||
href="{$sort_order.url}"
|
||||
class="select-list {['current' => $sort_order.current, 'js-search-link' => true]|classnames}"
|
||||
>
|
||||
{$sort_order.label}
|
||||
</a>
|
||||
{/foreach}
|
||||
<div class="dropdown-menu hidden group-hover:flex absolute top-full right-0 bg-white z-10 shadow-lg">
|
||||
<div class="flex flex-col whitespace-nowrap">
|
||||
{foreach from=$listing.sort_orders item=sort_order}
|
||||
<a
|
||||
rel="nofollow"
|
||||
href="{$sort_order.url}"
|
||||
class="px-4 py-1 hover:text-yellow-700 select-list {['current' => $sort_order.current, 'js-search-link' => true]|classnames}"
|
||||
>
|
||||
{$sort_order.label}
|
||||
</a>
|
||||
{/foreach}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -0,0 +1,52 @@
|
|||
{**
|
||||
* 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}
|
|
@ -25,4 +25,9 @@
|
|||
{extends file='catalog/listing/product-list.tpl'}
|
||||
|
||||
{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}
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
<h2 id="js-product-list-header" class="h2">{$listing.label}</h2>
|
||||
{/block}
|
||||
|
||||
<section id="products" class="flex flex-col gap-4">
|
||||
<section id="products" class="flex flex-col gap-8">
|
||||
{if $listing.products|count}
|
||||
|
||||
{block name='product_list_top'}
|
||||
|
|
|
@ -52,36 +52,29 @@
|
|||
<section id="main" itemscope itemtype="https://schema.org/Product">
|
||||
<meta itemprop="url" content="{$product.url}">
|
||||
|
||||
<div class="row product-container">
|
||||
<div class="col-md-6">
|
||||
<div class="flex gap-8 flex-wrap lg:flex-nowrap">
|
||||
{block name='page_content_container'}
|
||||
<section class="page-content" id="content">
|
||||
<section class="flex w-full" id="content">
|
||||
{block name='page_content'}
|
||||
<!-- @todo: use include file='catalog/_partials/product-flags.tpl'} -->
|
||||
{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 name='product_cover_thumbnails'}
|
||||
{include file='catalog/_partials/product-cover-thumbnails.tpl'}
|
||||
{/block}
|
||||
<div class="scroll-box-arrows">
|
||||
<i class="material-icons left"></i>
|
||||
<i class="material-icons right"></i>
|
||||
</div>
|
||||
|
||||
{/block}
|
||||
</section>
|
||||
{/block}
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="flex flex-col w-full gap-3">
|
||||
{block name='page_header_container'}
|
||||
{block name='page_header'}
|
||||
<h1 class="h1" itemprop="name">{block name='page_title'}{$product.name}{/block}</h1>
|
||||
<div class='flex flex-col gap-2'>
|
||||
<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 name='product_prices'}
|
||||
|
@ -89,10 +82,6 @@
|
|||
{/block}
|
||||
|
||||
<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)}
|
||||
{block name='product_customization'}
|
||||
{include file="catalog/_partials/product-customization.tpl" customizations=$product.customizations}
|
||||
|
@ -127,14 +116,14 @@
|
|||
{include file='catalog/_partials/product-discounts.tpl'}
|
||||
{/block}
|
||||
|
||||
{block name='product_add_to_cart'}
|
||||
{include file='catalog/_partials/product-add-to-cart.tpl'}
|
||||
{/block}
|
||||
|
||||
{block name='product_additional_info'}
|
||||
{include file='catalog/_partials/product-additional-info.tpl'}
|
||||
{/block}
|
||||
|
||||
{block name='product_add_to_cart'}
|
||||
{include file='catalog/_partials/product-add-to-cart.tpl'}
|
||||
{/block}
|
||||
|
||||
{* Input to refresh product HTML removed, block kept for compatibility with themes *}
|
||||
{block name='product_refresh'}{/block}
|
||||
</form>
|
||||
|
@ -147,86 +136,10 @@
|
|||
{/block}
|
||||
|
||||
{block name='product_tabs'}
|
||||
<div class="tabs">
|
||||
<ul class="nav nav-tabs" role="tablist">
|
||||
{if $product.description}
|
||||
<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 class='w-full flex items-center flex-col mt-12'>
|
||||
{block name='product_details'}
|
||||
{include file='catalog/_partials/product-details.tpl'}
|
||||
{/block}
|
||||
</div>
|
||||
{/block}
|
||||
</div>
|
||||
|
@ -235,9 +148,9 @@
|
|||
|
||||
{block name='product_accessories'}
|
||||
{if $accessories}
|
||||
<section class="product-accessories clearfix">
|
||||
<p class="h5 text-uppercase">{l s='You might also like' d='Shop.Theme.Catalog'}</p>
|
||||
<div class="products">
|
||||
<section class="product-accessories flex flex-col gap-8 mt-24">
|
||||
<p class="text-2xl font-bold">{l s='Related Products' d='Shop.Theme.Catalog'}</p>
|
||||
<div class="products flex flex-wrap">
|
||||
{foreach from=$accessories item="product_accessory"}
|
||||
{block name='product_miniature'}
|
||||
{include file='catalog/_partials/miniatures/product.tpl' product=$product_accessory}
|
||||
|
@ -253,7 +166,6 @@
|
|||
{/block}
|
||||
|
||||
{block name='product_images_modal'}
|
||||
{include file='catalog/_partials/product-images-modal.tpl'}
|
||||
{/block}
|
||||
|
||||
{block name='page_footer_container'}
|
||||
|
|
|
@ -14,16 +14,17 @@
|
|||
action="{url entity='order' params=['id_address' => $id_address]}"
|
||||
data-id-address="{$id_address}"
|
||||
data-refresh-url="{url entity='order' params=['ajax' => 1, 'action' => 'addressForm']}"
|
||||
class="w-full flex"
|
||||
>
|
||||
{/block}
|
||||
|
||||
{block name='form_fields' append}
|
||||
<input type="hidden" name="saveAddress" value="{$type}">
|
||||
{if $type === "delivery"}
|
||||
<div class="form-group row">
|
||||
<div class="col-md-9 col-md-offset-3">
|
||||
<div class="form-group w-full">
|
||||
<div class="col-md-9 col-md-offset-3 flex items-center gap-2 py-2">
|
||||
<input name = "use_same_address" id="use_same_address" type = "checkbox" value = "1" {if $use_same_address} checked {/if}>
|
||||
<label for="use_same_address">{l s='Use this address for invoice too' d='Shop.Theme.Checkout'}</label>
|
||||
<label for="use_same_address" class="font-semibold">{l s='Use this address for invoice too' d='Shop.Theme.Checkout'}</label>
|
||||
</div>
|
||||
</div>
|
||||
{/if}
|
||||
|
@ -31,15 +32,15 @@
|
|||
|
||||
{block name='form_buttons'}
|
||||
{if !$form_has_continue_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" href="{url entity='order' params=['cancelAddress' => {$type}]}">{l s='Cancel' d='Shop.Theme.Actions'}</a>
|
||||
<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>
|
||||
<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>
|
||||
{else}
|
||||
<form>
|
||||
<button type="submit" class="continue btn btn-primary float-xs-right" name="confirm-addresses" value="1">
|
||||
<form class="w-full flex">
|
||||
<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">
|
||||
{l s='Continue' d='Shop.Theme.Actions'}
|
||||
</button>
|
||||
{if $customer.addresses|count > 0}
|
||||
<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>
|
||||
<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>
|
||||
{/if}
|
||||
</form>
|
||||
{/if}
|
||||
|
|
|
@ -24,11 +24,11 @@
|
|||
*}
|
||||
{block name='address_selector_blocks'}
|
||||
{foreach $addresses as $address}
|
||||
<article
|
||||
class="address-item{if $address.id == $selected} selected{/if}"
|
||||
<div
|
||||
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"
|
||||
id="{$name|classname}-address-{$address.id}"
|
||||
>
|
||||
<header class="h4">
|
||||
<div class="flex gap-2">
|
||||
<label class="radio-block">
|
||||
<span class="custom-radio">
|
||||
<input
|
||||
|
@ -39,34 +39,35 @@
|
|||
>
|
||||
<span></span>
|
||||
</span>
|
||||
<span class="address-alias h4">{$address.alias}</span>
|
||||
<div class="address">{$address.formatted nofilter}</div>
|
||||
</label>
|
||||
</header>
|
||||
<hr>
|
||||
<footer class="address-footer">
|
||||
<div class="flex flex-col gap-1">
|
||||
<span class="address-alias font-semibold">{$address.alias}</span>
|
||||
<div class="address">{$address.formatted nofilter}</div>
|
||||
</div>
|
||||
</div>
|
||||
{if $interactive}
|
||||
<a
|
||||
class="edit-address text-muted"
|
||||
data-link-action="edit-address"
|
||||
href="{url entity='order' params=['id_address' => $address.id, 'editAddress' => $type, 'token' => $token]}"
|
||||
>
|
||||
<i class="material-icons edit"></i>{l s='Edit' d='Shop.Theme.Actions'}
|
||||
</a>
|
||||
<a
|
||||
class="delete-address text-muted"
|
||||
data-link-action="delete-address"
|
||||
href="{url entity='order' params=['id_address' => $address.id, 'deleteAddress' => true, 'token' => $token]}"
|
||||
>
|
||||
<i class="material-icons delete"></i>{l s='Delete' d='Shop.Theme.Actions'}
|
||||
</a>
|
||||
<div class="flex flex-col justify-center gap-4">
|
||||
<a
|
||||
class="edit-address text-muted"
|
||||
data-link-action="edit-address"
|
||||
href="{url entity='order' params=['id_address' => $address.id, 'editAddress' => $type, 'token' => $token]}"
|
||||
>
|
||||
<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
|
||||
class="delete-address text-muted"
|
||||
data-link-action="delete-address"
|
||||
href="{url entity='order' params=['id_address' => $address.id, 'deleteAddress' => true, 'token' => $token]}"
|
||||
>
|
||||
<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>
|
||||
</div>
|
||||
{/if}
|
||||
</footer>
|
||||
</article>
|
||||
</div>
|
||||
{/foreach}
|
||||
{if $interactive}
|
||||
<p>
|
||||
<button class="ps-hidden-by-js form-control-submit center-block" type="submit">{l s='Save' d='Shop.Theme.Actions'}</button>
|
||||
<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>
|
||||
</p>
|
||||
{/if}
|
||||
{/block}
|
||||
|
|
|
@ -23,21 +23,21 @@
|
|||
* International Registered Trademark & Property of PrestaShop SA
|
||||
*}
|
||||
{block name='cart_detailed_actions'}
|
||||
<div class="checkout cart-detailed-actions card-block">
|
||||
<div class="checkout cart-detailed-actions js-cart-detailed-actions card-block flex flex-col mt-4">
|
||||
{if $cart.minimalPurchaseRequired}
|
||||
<div class="alert alert-warning" role="alert">
|
||||
{$cart.minimalPurchaseRequired}
|
||||
</div>
|
||||
<div class="text-sm-center">
|
||||
<button type="button" class="btn btn-primary disabled" disabled>{l s='Proceed to checkout' d='Shop.Theme.Actions'}</button>
|
||||
<div class="flex">
|
||||
<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>
|
||||
</div>
|
||||
{elseif empty($cart.products) }
|
||||
<div class="text-sm-center">
|
||||
<button type="button" class="btn btn-primary disabled" disabled>{l s='Proceed to checkout' d='Shop.Theme.Actions'}</button>
|
||||
<div class="flex">
|
||||
<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>
|
||||
</div>
|
||||
{else}
|
||||
<div class="text-sm-center">
|
||||
<a href="{$urls.pages.order}" class="btn btn-primary">{l s='Proceed to checkout' d='Shop.Theme.Actions'}</a>
|
||||
<div class="flex">
|
||||
<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>
|
||||
{hook h='displayExpressCheckout'}
|
||||
</div>
|
||||
{/if}
|
||||
|
|
|
@ -22,154 +22,106 @@
|
|||
* @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="product-line-grid">
|
||||
<!-- product left content: image-->
|
||||
<div class="product-line-grid-left col-md-3 col-xs-4">
|
||||
<span class="product-image media-middle">
|
||||
<img src="{$product.cover.bySize.cart_default.url}" alt="{$product.name|escape:'quotes'}">
|
||||
</span>
|
||||
|
||||
<div class="flex max-md:flex-col flex-1 gap-4 items-center">
|
||||
<div class="w-40 h-40">
|
||||
<img class="object-cover w-full h-full" src="{$product.cover.bySize.cart_default.url}" alt="{$product.name|escape:'quotes'}">
|
||||
</div>
|
||||
|
||||
<!-- product left body: description -->
|
||||
<div class="product-line-grid-body col-md-4 col-xs-8">
|
||||
<div class="product-line-info">
|
||||
<a class="label" href="{$product.url}" data-id_customization="{$product.id_customization|intval}">{$product.name}</a>
|
||||
</div>
|
||||
|
||||
<div class="product-line-info product-price h5 {if $product.has_discount}has-discount{/if}">
|
||||
{if $product.has_discount}
|
||||
<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}
|
||||
<div class="current-price">
|
||||
<span class="price">{$product.price}</span>
|
||||
{if $product.unit_price_full}
|
||||
<div class="unit-price-cart">{$product.unit_price_full}</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<br/>
|
||||
|
||||
{foreach from=$product.attributes key="attribute" item="value"}
|
||||
<div class="product-line-info">
|
||||
<span class="label">{$attribute}:</span>
|
||||
<span class="value">{$value}</span>
|
||||
</div>
|
||||
{/foreach}
|
||||
|
||||
<div class="flex flex-1 max-md:items-center flex-col gap-2">
|
||||
<div class="product-line-info flex flex-col">
|
||||
<a class="label text-lg font-semibold max-md:text-center" href="{$product.url}" data-id_customization="{$product.id_customization|intval}">{$product.name}</a>
|
||||
{if is_array($product.customizations) && $product.customizations|count}
|
||||
<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">×</span>
|
||||
</button>
|
||||
<h4 class="modal-title">{l s='Product customization' d='Shop.Theme.Catalog'}</h4>
|
||||
<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>
|
||||
<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>
|
||||
{/foreach}
|
||||
</div>
|
||||
</div>
|
||||
{/foreach}
|
||||
{/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 class="flex gap-4 product-line-info product-price h5 {if $product.has_discount}has-discount{/if}">
|
||||
{if $product.has_discount}
|
||||
<span class="line-through text-red-400">{$product.regular_price}</span>
|
||||
{/if}
|
||||
<div class="current-price">
|
||||
<span class="price font-medium">{$product.price}</span>
|
||||
{if $product.unit_price_full}
|
||||
<div class="unit-price-cart">{$product.unit_price_full}</div>
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
||||
{foreach from=$product.attributes key="attribute" item="value"}
|
||||
<div class="product-line-info font-semibold {$attribute|lower}">
|
||||
<span class="label">{$attribute}:</span>
|
||||
<span class="value">{$value}</span>
|
||||
</div>
|
||||
{/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>
|
||||
|
||||
<div class="clearfix"></div>
|
||||
{block name='hook_cart_extra_product_actions'}
|
||||
{hook h='displayCartExtraProductActions' product=$product}
|
||||
{/block}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -23,13 +23,12 @@
|
|||
* International Registered Trademark & Property of PrestaShop SA
|
||||
*}
|
||||
{block name='cart_detailed_totals'}
|
||||
<div class="cart-detailed-totals">
|
||||
|
||||
<div class="card-block">
|
||||
<div class="cart-defaild-totals js-cart-detailed-totals flex flex-col gap-4">
|
||||
<div class="flex flex-col gap-8">
|
||||
{foreach from=$cart.subtotals item="subtotal"}
|
||||
{if $subtotal.value && $subtotal.type !== 'tax'}
|
||||
<div class="cart-summary-line" id="cart-subtotal-{$subtotal.type}">
|
||||
<span class="label{if 'products' === $subtotal.type} js-subtotal{/if}">
|
||||
{if $subtotal && $subtotal.value|count_characters > 0 && $subtotal.type !== 'tax'}
|
||||
<div class="cart-summary-line flex font-medium" id="cart-subtotal-{$subtotal.type}">
|
||||
<span class="flex-1 label{if 'products' === $subtotal.type} js-subtotal{/if}">
|
||||
{if 'products' == $subtotal.type}
|
||||
{$cart.summary_string}
|
||||
{else}
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue