264 lines
13 KiB
JavaScript
Executable File
264 lines
13 KiB
JavaScript
Executable File
var EcommScripts = (function () {
|
|
var defines = {};
|
|
var entry = [null];
|
|
function define(name, dependencies, factory) {
|
|
defines[name] = { dependencies: dependencies, factory: factory };
|
|
entry[0] = name;
|
|
}
|
|
define("require", ["exports"], function (exports) {
|
|
Object.defineProperty(exports, "__cjsModule", { value: true });
|
|
Object.defineProperty(exports, "default", { value: function (name) { return resolve(name); } });
|
|
});
|
|
define("buybox-modal", ["require", "exports"], function (require, exports) {
|
|
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.BuyboxModal = void 0;
|
|
var BuyboxModal = /** @class */ (function () {
|
|
function BuyboxModal(modalID) {
|
|
var _this = this;
|
|
this.shiftKeyPressed = false;
|
|
this.open = function () {
|
|
document.documentElement.style.overflow = "hidden";
|
|
document.documentElement.style.height = "auto";
|
|
document.body.style.overflow = "hidden";
|
|
document.body.style.height = "100%";
|
|
_this.domEl.style.display = "flex";
|
|
siblings(_this.domEl).map(function (el) { return el.setAttribute("aria-hidden", "true"); });
|
|
_this.addKeyboardSupportCloseModal();
|
|
_this.addKeyboardSupportShiftDown();
|
|
_this.addKeyboardSupportShiftUp();
|
|
_this.addFocusTrap();
|
|
_this.focusFirst();
|
|
};
|
|
this.close = function () {
|
|
document.documentElement.style.removeProperty("overflow");
|
|
document.documentElement.style.removeProperty("height");
|
|
document.body.style.removeProperty("overflow");
|
|
document.body.style.removeProperty("height");
|
|
_this.domEl.style.display = "none";
|
|
siblings(_this.domEl).map(function (el) { return el.removeAttribute("aria-hidden"); });
|
|
_this.removeKeyboardSupportCloseModal();
|
|
_this.removeKeyboardSupportShiftDown();
|
|
_this.removeKeyboardSupportShiftUp();
|
|
_this.removeFocusTrap();
|
|
_this.domEl.dispatchEvent(new Event("close"));
|
|
};
|
|
this.trapFocus = function (event) {
|
|
/* istanbul ignore next */ // as it's not possible to simulate with `user-event` atm
|
|
if ((event.target instanceof HTMLElement) && !_this.domEl.contains(event.target)) {
|
|
_this.focusNext();
|
|
}
|
|
};
|
|
this.focusNext = function () {
|
|
if (_this.shiftKeyPressed) {
|
|
_this.focusLast();
|
|
}
|
|
else {
|
|
_this.focusFirst();
|
|
}
|
|
};
|
|
this.focusFirst = function () {
|
|
var focusable = _this.domEl.querySelectorAll(focusableElements);
|
|
var firstFocusable = focusable[1];
|
|
if (firstFocusable instanceof HTMLElement)
|
|
firstFocusable.focus();
|
|
};
|
|
this.focusLast = function () {
|
|
var focusable = _this.domEl.querySelectorAll(focusableElements);
|
|
var lastFocusable = focusable[focusable.length - 2];
|
|
if (lastFocusable instanceof HTMLElement)
|
|
lastFocusable.focus();
|
|
};
|
|
this.updateShiftKeyDown = function (event) {
|
|
if ((event instanceof KeyboardEvent) && contains("shift")(event.key.toLowerCase()))
|
|
_this.shiftKeyPressed = true;
|
|
};
|
|
this.updateShiftKeyUp = function (event) {
|
|
if ((event instanceof KeyboardEvent) && contains("shift")(event.key.toLowerCase()))
|
|
_this.shiftKeyPressed = false;
|
|
};
|
|
this.closeModalViaESC = function (event) {
|
|
if ((event instanceof KeyboardEvent) && contains("escape")(event.key.toLowerCase()))
|
|
_this.close();
|
|
};
|
|
this.addFocusTrap = function () {
|
|
document.addEventListener("focus", _this.trapFocus, true);
|
|
};
|
|
this.removeFocusTrap = function () {
|
|
document.removeEventListener("focus", _this.trapFocus, true);
|
|
};
|
|
this.addKeyboardSupportShiftDown = function () {
|
|
document.addEventListener("keydown", _this.updateShiftKeyDown, true);
|
|
};
|
|
this.removeKeyboardSupportShiftDown = function () {
|
|
document.removeEventListener("keydown", _this.updateShiftKeyDown, true);
|
|
};
|
|
this.addKeyboardSupportShiftUp = function () {
|
|
document.addEventListener("keyup", _this.updateShiftKeyUp, true);
|
|
};
|
|
this.removeKeyboardSupportShiftUp = function () {
|
|
document.removeEventListener("keyup", _this.updateShiftKeyUp, true);
|
|
};
|
|
this.addKeyboardSupportCloseModal = function () {
|
|
document.addEventListener("keyup", _this.closeModalViaESC, true);
|
|
};
|
|
this.removeKeyboardSupportCloseModal = function () {
|
|
document.removeEventListener("keyup", _this.closeModalViaESC, true);
|
|
};
|
|
this.modalID = modalID;
|
|
var modal = document.createElement("div");
|
|
var modalBody = document.createElement("div");
|
|
modalBody.setAttribute("style", "\n width: 500px;\n box-shadow: 0 4px 24px rgb(0 0 0 / 10%), 0px 6px 4px rgb(0 0 0 / 8%);\n ");
|
|
modalBody.setAttribute("role", "alertdialog");
|
|
// modalBody.setAttribute("aria-modal", "true") // browsers and assistive tech currently lacking support
|
|
this.modalLabelID = modalID + "_label";
|
|
modalBody.setAttribute("aria-labelledby", this.modalLabelID);
|
|
modal.setAttribute("id", modalID);
|
|
modal.setAttribute("style", "\n display: none;\n position: fixed;\n z-index: 9999;\n left: 0;\n top: 0;\n right: 0;\n bottom: 0;\n background-color: rgba(0,0,0,0.3);\n align-items: center;\n justify-content: center;\n ");
|
|
modal.appendChild(modalBody);
|
|
var focusGuardStart = document.createElement("div");
|
|
focusGuardStart.tabIndex = 0;
|
|
modal.insertBefore(focusGuardStart, modalBody);
|
|
focusGuardStart.addEventListener("focus", function () {
|
|
_this.focusNext();
|
|
}, false);
|
|
var focusGuardEnd = document.createElement("div");
|
|
focusGuardEnd.tabIndex = 0;
|
|
modal.insertBefore(focusGuardEnd, modalBody.nextSibling);
|
|
focusGuardEnd.addEventListener("focus", function () {
|
|
_this.focusNext();
|
|
}, false);
|
|
modal.addEventListener("click", function (event) {
|
|
if (event.target === modal) {
|
|
_this.close();
|
|
}
|
|
}, false);
|
|
this.domEl = modal;
|
|
this.modalBodyEl = modalBody;
|
|
}
|
|
return BuyboxModal;
|
|
}());
|
|
exports.BuyboxModal = BuyboxModal;
|
|
var siblings = function (el) {
|
|
if (!el.parentElement)
|
|
throw Error("Element does not have a parent");
|
|
return Array.from(el.parentElement.children).filter(function (c) { return c != el; });
|
|
};
|
|
var contains = function (p) { return function (s) { return s.indexOf(p) !== -1; }; };
|
|
var focusableElements = "button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])";
|
|
});
|
|
define("buybox", ["require", "exports", "buybox-modal"], function (require, exports, buybox_modal_1) {
|
|
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.Buybox = exports.Modal = void 0;
|
|
exports.Modal = buybox_modal_1.BuyboxModal;
|
|
var Buybox;
|
|
(function (Buybox) {
|
|
Buybox.interceptFormSubmit = function (task, onAddToCartSuccess, onAddToCartFailure) { return function (event) {
|
|
var form = event.target;
|
|
if (!(form instanceof HTMLFormElement))
|
|
throw Error("Not a form element");
|
|
var url = form.getAttribute("action") || "/";
|
|
event.preventDefault();
|
|
return task(url, form)
|
|
.then(onAddToCartSuccess)
|
|
.catch(onAddToCartFailure);
|
|
}; };
|
|
Buybox.fetchFormAction = function (fetch) { return function (url, form) {
|
|
return fetch(url, {
|
|
method: "post",
|
|
credentials: "include",
|
|
body: Buybox.urlSearchParamsReimplementation(form)
|
|
}).then(function (res) { return res.text(); });
|
|
}; };
|
|
Buybox.triggerModalAfterAddToCartSuccess = function (modal) {
|
|
return function (responseBody) {
|
|
Buybox.augmentModalBody(modal, responseBody);
|
|
modal.open();
|
|
};
|
|
};
|
|
Buybox.augmentModalBody = function (modal, responseBody) {
|
|
var modalBody = modal.modalBodyEl;
|
|
var modalMessage = responseBody.split("<!-- modal message -->")[1] || responseBody;
|
|
// dangerously set innerHTML; `body` considered safe, no user input
|
|
modalBody.innerHTML = modalMessage;
|
|
var modalTitle = modalBody.querySelector(".message-title");
|
|
var modalCloseLink = modalBody.querySelector(".close-modal");
|
|
if ((modalTitle instanceof HTMLParagraphElement) && (modalCloseLink instanceof HTMLAnchorElement)) {
|
|
modalTitle.setAttribute("id", modal.modalLabelID);
|
|
modalCloseLink.addEventListener("click", function (event) {
|
|
event.preventDefault();
|
|
modal.close();
|
|
});
|
|
}
|
|
};
|
|
Buybox.urlSearchParamsReimplementation = function (form) {
|
|
/**
|
|
* Reimplementing the wheel here to compile the `requestBody` to retain
|
|
* IE11 compatibility (accessibility, JAWS) for as long as possible.
|
|
*
|
|
* - only polyfill dependency: `Array.from`
|
|
* - form data only consists of simple text input fields
|
|
*
|
|
* the preferred 2021 way would be:
|
|
* `const requestBody = new URLSearchParams([...(new FormData(form))])`
|
|
*/
|
|
var formData = Array.from(form.elements).reduce(function (acc, el) {
|
|
if (!(el instanceof HTMLInputElement))
|
|
return acc;
|
|
return acc.concat([[el.name, el.value]]);
|
|
}, []);
|
|
var requestBody = formData.map(function (record) {
|
|
return [encodeURIComponent(record[0]), encodeURIComponent(record[1])].join("=");
|
|
}).join("&");
|
|
return requestBody;
|
|
};
|
|
})(Buybox = exports.Buybox || (exports.Buybox = {}));
|
|
});
|
|
|
|
'marker:resolver';
|
|
|
|
function get_define(name) {
|
|
if (defines[name]) {
|
|
return defines[name];
|
|
}
|
|
else if (defines[name + '/index']) {
|
|
return defines[name + '/index'];
|
|
}
|
|
else {
|
|
var dependencies = ['exports'];
|
|
var factory = function (exports) {
|
|
try {
|
|
Object.defineProperty(exports, "__cjsModule", { value: true });
|
|
Object.defineProperty(exports, "default", { value: require(name) });
|
|
}
|
|
catch (_a) {
|
|
throw Error(['module "', name, '" not found.'].join(''));
|
|
}
|
|
};
|
|
return { dependencies: dependencies, factory: factory };
|
|
}
|
|
}
|
|
var instances = {};
|
|
function resolve(name) {
|
|
if (instances[name]) {
|
|
return instances[name];
|
|
}
|
|
if (name === 'exports') {
|
|
return {};
|
|
}
|
|
var define = get_define(name);
|
|
if (typeof define.factory !== 'function') {
|
|
return define.factory;
|
|
}
|
|
instances[name] = {};
|
|
var dependencies = define.dependencies.map(function (name) { return resolve(name); });
|
|
define.factory.apply(define, dependencies);
|
|
var exports = dependencies[define.dependencies.indexOf('exports')];
|
|
instances[name] = (exports['__cjsModule']) ? exports.default : exports;
|
|
return instances[name];
|
|
}
|
|
if (entry[0] !== null) {
|
|
return resolve(entry[0]);
|
|
}
|
|
})(); |