Easel Color Blocked Rounded Neck Loose Fit Exposed Seaming Pullover Top
${function() {
const variantData = data.variant || {"id":"c0b68823-2cb1-49ea-ae88-8d4498e58b6b","product_id":"2013cef6-474f-43c2-b1c8-52773552d156","title":"S-Latte","weight_unit":"kg","inventory_quantity":1000,"sku":"ET17914","barcode":"","position":4,"option1":"S","option2":"Latte","option3":"","note":"","image":{"src":"\/\/img.staticdj.com\/9088c790615c53e17f8b5d99517ab7c3.jpeg","path":"9088c790615c53e17f8b5d99517ab7c3.jpeg","width":799,"height":1200,"alt":"","aspect_ratio":0.6658333333333334},"wholesale_price":[{"price":49.88,"min_quantity":1}],"weight":"0.45","compare_at_price":"0","price":"49.88","retail_price":"0","available":true,"url":"\/products\/easel-color-blocked-rounded-neck-loose-fit-exposed-seaming-pullover-top?variant=c0b68823-2cb1-49ea-ae88-8d4498e58b6b","available_quantity":1000,"options":[{"name":"Size","value":"S"},{"name":"Color","value":"Latte"}],"off_ratio":0,"flashsale_info":[],"sales":0};
const saveType = "amount";
const productLabelDiscountOn = true;
return `
-
${saveType == 'percentage'
? `-${variantData.off_ratio}%`
: `-`
}
`;
}()}
${function(){
const tipText = "Please select a {{ name }}".replace(/\{\{\s+name\s+\}\}/g, data);
return `${tipText}
`
}()}
${function(){
const tipText = "Please select a {{ name }}".replace(/\{\{\s+name\s+\}\}/g, data);
return `${tipText}
`
}()}
people are viewing this right now
${function() {
const minDays = parseInt('7');
const maxDays = parseInt('10');
const customText = "Estimated Delivery\uff1a{min_date} - {max_date}";
const minDate = new Date(Date.now() + (minDays * 86400000));
const maxDate = new Date(Date.now() + (maxDays * 86400000));
const formatDate = (minDate.getFullYear() == maxDate.getFullYear() && minDate.getFullYear() == new Date().getFullYear())
? new Intl.DateTimeFormat('en', { month: 'short', day: '2-digit' })
: new Intl.DateTimeFormat('en', { month: 'short', day: '2-digit', year: 'numeric' });
const tipText = customText.replace(/\{min_date\}/g, '' + formatDate.format(minDate) + '')
.replace(/\{max_date\}/g, '' + formatDate.format(maxDate) + '');
return `
${tipText}
`;
}()}
${function() {
const postageFreeAmount = 39;
const custom_text = "Buy {amount} more to enjoy FREE Shipping";
const totalPrice = +data.total_price;
const diffPrice = postageFreeAmount - totalPrice;
const percentDiff = (diffPrice > 0 ? (totalPrice / postageFreeAmount * 100) : 100) + '%';
let tipText = "Your order is free delivery";
if (diffPrice > 0) {
tipText = custom_text.replace('{amount}', `
`);
}
return `
`;
}()}
Product was out of stock.
Product is unavailable.
try {
const main = (coreEvent) => {
try {
const {
ecGlobalVarEnums,
getProduct,
getProductFormData,
getOrderFetchParams,
multiply,
removeChildrenDOM,
addChildrenDOM,
loadScript,
getAttributeConfig,
getBlockChannel,
ecEvent,
req,
containerDomId,
channel2ProviderEnums,
showChannelNotOpenTips,
channelEnums,
track,
isPreview,
getExtUrl
} = coreEvent.detail;
window.PaymentEC = {};
let ecConfig;
const shopCurrencyCode = "USD";
let productDetail = getProduct();
let productPrice = productDetail?.selected?.price
|| 49.88;
const requiresShipping = productDetail?.product?.requires_shipping;
const expressCheckoutList = {
sdkErrorList: [],
paymentChannelList: [],
disabledChannelList: [],
showChannelList: [],
blockChannelList: [],
extraChannelList: [],
}
const moreButtonConfig = {
firstClick: true,
maxSize: isNaN(1) ? 1 : 1
}
const setBlockChannel = () => {
expressCheckoutList.blockChannelList = getBlockChannel();
track('setBlockChannel', expressCheckoutList);
}
const filterECButton = ({type, domID}) => {
const showChannelList = expressCheckoutList.paymentChannelList.filter((ecName) =>
!expressCheckoutList.sdkErrorList.includes(ecName) && !expressCheckoutList.disabledChannelList.includes(ecName) &&
!expressCheckoutList.extraChannelList.includes(ecName)) || [];
expressCheckoutList.showChannelList = showChannelList.filter((ecName) => ecName !== type) || [];
removeChildrenDOM(domID);
track('filterECButton', expressCheckoutList);
};
const showECButton = () => {
const showChannelList = expressCheckoutList.paymentChannelList.filter((ecName) =>
!expressCheckoutList.sdkErrorList.includes(ecName) && !expressCheckoutList.disabledChannelList.includes(ecName) &&
!expressCheckoutList.extraChannelList.includes(ecName)) || [];
expressCheckoutList.showChannelList = showChannelList;
track('showECButton', expressCheckoutList);
expressCheckoutList.showChannelList.forEach((ecName, index) => {
const disableShow = moreButtonConfig.firstClick && index >= moreButtonConfig.maxSize;
addChildrenDOM(containerDomId[channel2ProviderEnums[ecName]], !disableShow);
showMoreButton();
});
if (expressCheckoutList.showChannelList.length === 0) {
showMoreButton();
}
}
const disabledChannelListEvent = (checkoutData = {}) => {
expressCheckoutList.disabledChannelList = expressCheckoutList.paymentChannelList.filter(ecName => {
let mustDisable = false;
if (!requiresShipping && ecName !== channelEnums.PAYPAL) {
mustDisable = true;
}
if (!productDetail?.selected?.available) {
mustDisable = true;
}
const {payment_due} = checkoutData?.prices;
const paymentDueNum = Number(payment_due || 0) * 100;
const showFlag = paymentDueNum > 0;
if (mustDisable || !showFlag) {
filterECButton({type: ecName, domID: containerDomId[channel2ProviderEnums[ecName]]})
}
return mustDisable || !showFlag;
})
track('disabledChannelListEvent', expressCheckoutList);
}
const showMoreButton = () => {
const dom = document.getElementById('pm-payment-express-more-button-1539149753700-9');
if (!dom) {
return;
}
const showLength = expressCheckoutList.showChannelList.length;
const {firstClick, maxSize} = moreButtonConfig;
dom.style.display = (firstClick && showLength > 0 && showLength > maxSize) ? 'block' : 'none';
dom.onclick = moreButtonEvent;
}
const moreButtonEvent = () => {
const dom = document.getElementById('pm-payment-express-more-button-1539149753700-9');
if (!dom) {
return;
}
dom.style.display = 'none';
moreButtonConfig.firstClick = false;
showECButton();
}
const loadErrorEvent = (type) => {
if (!containerDomId[type]) {
return;
}
filterECButton({type: type, domID: containerDomId[type]});
expressCheckoutList.sdkErrorList.push(type);
showMoreButton();
};
const getECConfig = async () => {
if (window.PaymentEC?.settings) {
return window.PaymentEC?.settings;
}
const result = await req.get('/api/payment/settings');
ecConfig = result?.settings?.express_checkout_config || {};
expressCheckoutList.paymentChannelList = expressCheckoutList.blockChannelList.filter(ecName =>
ecConfig?.express_channels?.includes(ecName)) || [];
window.PaymentEC.settings = {...ecConfig, currencyCode: shopCurrencyCode};
return window.PaymentEC.settings;
}
async function renderEC(data = {}) {
ecConfig = await getECConfig();
track('renderEC', expressCheckoutList);
if (data?.detail?.selected?.price) {
productDetail = data?.detail;
productPrice = data?.detail?.selected?.price;
}
// 初始化时没有事件推送
const formData = getProductFormData(data?.detail || productDetail);
const totalPrice = multiply(productPrice, formData?.[0]?.quantity || 0);
if (ecConfig) {
const checkoutData = {
prices: {payment_due: totalPrice, subtotal_price: totalPrice},
orderParams: getOrderFetchParams(formData),
containerDOMIdEnums: containerDomId,
ecGlobalVarEnums
}
const notOpenChannel = expressCheckoutList.blockChannelList.filter(ecName =>
!expressCheckoutList.paymentChannelList.includes(ecName));
showChannelNotOpenTips(notOpenChannel);
disabledChannelListEvent(checkoutData);
showECButton();
window.PaymentEC.handleEcPluginsLoad = ({
channelInfos = [],
loadedCbFn = () => {
}
}) => {
const expressCheckoutLoadList = [];
channelInfos.map((channelInfo) => {
const {ecGlobalVar, ecName = '', sdkPath = '', datasets} = channelInfo;
if (!document.getElementById(containerDomId[ecName])) {
return;
}
const attributeConfig = getAttributeConfig(channelInfo) || {};
expressCheckoutLoadList.push(
loadScript(() => window[ecGlobalVar], ecGlobalVar, sdkPath, datasets, () => {
loadErrorEvent(ecName);
}, attributeConfig)
);
});
Promise.all(expressCheckoutLoadList).then(() => {
loadedCbFn(checkoutData);
});
};
// 通知外部数据变更
ecEvent.emit('tc_payment_ec_data_change', {
ecGlobalVarEnums,
containerDOMIdEnums: containerDomId
});
}
}
const extraFilterEvent = (e) => {
const {channel, domId, allowShow} = e?.detail || {};
if (channel && domId) {
if (allowShow) {
expressCheckoutList.extraChannelList = expressCheckoutList.extraChannelList.filter(ecName => ecName !== channel);
track('extraFilterEvent_show', expressCheckoutList);
showECButton();
} else {
expressCheckoutList.extraChannelList.push(channel);
filterECButton({type: channel, domID: domId});
track('extraFilterEvent_hide', expressCheckoutList);
showECButton();
}
}
}
const init = () => {
ecEvent.on('shoplazza_express_channels_change', extraFilterEvent, isPreview() ? {once: true} : false);
ecEvent.on('shoplazza_express_channels_change_ready', extraFilterEvent, isPreview() ? {once: true} : false);
document.addEventListener('dj.variantChange', renderEC);
renderEC();
}
const loadFilly = (tag) => {
if (!tag) {
return
}
const script = document.createElement('script');
script.type = 'text/javaScript';
script.src = `//static.staticdj.com/${tag}`;
script.onload = init;
document.getElementsByTagName('head')[0].appendChild(script);
}
const callback = () => {
const fillyTag = getExtUrl('filly');
if (fillyTag) {
setBlockChannel();
loadFilly(fillyTag);
}
}
const delayCallback = () => {
window.requestIdleCallback ? requestIdleCallback(callback, {timeout: 50}) : setTimeout(callback, 50);
}
if (document.readyState === 'complete') {
delayCallback();
return;
}
window.addEventListener('load', delayCallback, false);
} catch (e) {
console.error('payment-sdk-express-checkout:', e)
}
}
const containerDOM = document.getElementById('pm-payment-express-button-container-1539149753700-9');
containerDOM.addEventListener('paymentChannelList', main, false);
} catch (e) {
}
try {
const core = (coreEvent) => {
try {
const {isChrome, isSafari, isPreview, channelEnums} = coreEvent?.detail;
const {getPluginI18nMessages} = window?.payment_plugin_message || {};
/**
* 获取script标签自定义参数
* @param channelInfo 渠道信息
* @return {object|{}}
*/
const getAttributeConfig = (channelInfo) => {
const {ecGlobalVar, ecName} = channelInfo;
const config = {
paypal: {
'data-namespace': ecGlobalVar
}
};
return config[ecName] || {};
};
const getBlockChannel = () => {
const block_googlePay = false &&
"shoplazzagoogle";
const block_applePay = false &&
"shoplazzaapple";
const block_credit = true &&
"paypal";
const blockChannel = {
googlepay: isChrome() && block_googlePay,
applepay: isSafari() && block_applePay,
credit: block_credit
};
const sortList = ['credit', 'googlepay', 'applepay'];
const methodSort = Object.keys(blockChannel).filter(key => blockChannel[key] && key).sort((a, b) => {
const indexA = sortList.indexOf(a);
const indexB = sortList.indexOf(b);
return indexA - indexB;
}).map(key => blockChannel[key]);
return methodSort;
}
const showChannelNotOpenTips = (channelList) => {
const tipsDom = document.getElementById('pm-payment-express-error-tips-1539149753700-9');
if (!isPreview()) {
return;
}
if (!tipsDom) {
return;
}
tipsDom.style.display = channelList.length > 0 ? 'block' : 'none';
const channelName = {
[channelEnums.SHOPLAZZA_GOOGLE]: "ShoplazzaPayments - GooglePay",
[channelEnums.SHOPLAZZA_APPLE]: "ShoplazzaPayments - ApplePay",
[channelEnums.PAYPAL]: "PayPal",
}
channelList.forEach(ecName => {
const id = `pm-payment-express-error-tips-1539149753700-9-${ecName}`;
const hasDom = document.getElementById(id)
if (!hasDom) {
const dom = document.createElement('div');
dom.id = id;
dom.innerHTML = getPluginI18nMessages('ec.not_active_channel', {channelName: channelName[ecName]});
tipsDom.appendChild(dom);
}
})
}
const isAllowTheme = () => {
const allowThemeList = ['Nova 2023', 'Dropshiping', 'Geek', 'Wind', 'Flash'];
const currentTheme = window?.C_SETTINGS?.theme?.merchant_theme_name;
return allowThemeList.includes(currentTheme);
}
const disabledThemTips = () => {
const tipsDom = document.getElementById('pm-payment-express-error-tips-1539149753700-9');
if (!isPreview()) {
return;
}
if (!tipsDom) {
return;
}
tipsDom.style.display = 'block';
const id = 'pm-payment-express-error-tips-1539149753700-9-theme';
const hasDom = document.getElementById(id);
if (!hasDom) {
const dom = document.createElement('div');
dom.id = id;
dom.innerHTML = getPluginI18nMessages('ec.not_support_theme');
tipsDom.appendChild(dom);
}
}
const coreMethod = {
...coreEvent.detail,
getAttributeConfig,
getBlockChannel,
showChannelNotOpenTips,
isAllowTheme,
disabledThemTips
};
if (!isAllowTheme()) {
disabledThemTips();
} else {
const containerDOM = document.getElementById('pm-payment-express-button-container-1539149753700-9');
const moreButtonDOM = document.getElementById('pm-payment-express-more-button-1539149753700-9');
moreButtonDOM.innerHTML = getPluginI18nMessages('ec.more_button');
containerDOM.dispatchEvent(new CustomEvent('paymentChannelList', {detail: coreMethod}));
}
} catch (e) {
}
}
const containerDOM = document.getElementById('pm-payment-express-button-container-1539149753700-9');
containerDOM.addEventListener('Payment_EC_Core_first', core, false);
} catch (e) {
}
try {
const core = () => {
const containerDOM = document.getElementById('pm-payment-express-button-container-1539149753700-9');
if (containerDOM?.getPluginI18nMessages && !window?.payment_plugin_message?.getPluginI18nMessages) {
return;
}
containerDOM.getPluginI18nMessages = window?.payment_plugin_message?.getPluginI18nMessages
try {
const domIDSuffix = '-express-button-container';
const prefix = 'pm-';
const ecGlobalVarEnums = {
paypal: 'pluginPaypalEC'
};
const providerEnums = {
SHOPLAZZA: 'shoplazza',
STRIPE: 'stripe',
PAYPAL: 'paypal'
};
const channelEnums = {
SHOPLAZZA_GOOGLE: 'shoplazzagoogle',
SHOPLAZZA_APPLE: 'shoplazzaapple',
PAYPAL: 'paypal'
}
const containerDomId = {
paypal: `${prefix}${providerEnums.PAYPAL}${domIDSuffix}-1539149753700-9`,
stripe: `${prefix}${providerEnums.STRIPE}${domIDSuffix}-1539149753700-9`,
shoplazza: `${prefix}${providerEnums.SHOPLAZZA}${domIDSuffix}-1539149753700-9`,
};
const channel2ProviderEnums = {
[channelEnums.PAYPAL]: providerEnums.PAYPAL,
[channelEnums.SHOPLAZZA_GOOGLE]: providerEnums.SHOPLAZZA,
[channelEnums.SHOPLAZZA_APPLE]: providerEnums.SHOPLAZZA,
stripegoogle: providerEnums.STRIPE,
stripeapple: providerEnums.STRIPE,
};
const getProduct = () => {
const productJson = document.querySelector('#product-json');
if (productJson?.textContent) {
return JSON.parse(productJson.textContent);
}
if (window.jQuery) {
const $product = window.jQuery?.(document)?.data('djproduct');
const productData = JSON.parse(JSON.stringify($product || {}));
return productData || {};
}
return {};
};
const isChrome = () => {
return navigator?.userAgent?.indexOf('Chrome') > -1 || navigator?.userAgent?.indexOf('CriOS') > -1;
};
const isSafari = () => {
let userAgentString = navigator.userAgent;
let chromeAgent = userAgentString.indexOf('Chrome') > -1 || navigator?.userAgent?.indexOf('CriOS') > -1;
let safariAgent = userAgentString.indexOf('Safari') > -1;
if (chromeAgent && safariAgent) {
safariAgent = false;
}
return safariAgent;
};
const isPreview = () => {
return !!window?.C_EDITING_SETTINGS?.oseid;
}
const getProductFormData = (data) => {
const product_id = data?.product_id || data?.product?.id;
const variant_id = data?.variant_id || data?.variant?.id || data?.selected?.id;
const quantity = data?.quantity || 1;
return [{
product_id,
variant_id,
quantity
}];
}
const getOrderFetchParams = (data) => {
if (!data) {
return {};
}
return {
line_items: data.map((item) => ({
note: '',
quantity: item.quantity || 1,
product_id: item?.product_id,
variant_id: item?.variant_id,
properties: item?.properties,
})),
refer_info: {
source: 'buy_now',
},
customer_note: '',
};
}
const multiply = (a, b) => {
const precision = 2; // 保留两位小数
return Number((a * b).toFixed(precision));
}
/**
* 移除EC节点
* @param id EC容器-div的id
*/
const removeChildrenDOM = (id) => {
if (!id) {
return;
}
const paymentEl = document.querySelector(`#pm-payment-express-button-container-1539149753700-9`);
const childrenEL = document.getElementById(id);
if (paymentEl && childrenEL) {
// childrenEL.remove();
childrenEL.style.display = 'none';
}
};
const addChildrenDOM = (id, allowShow) => {
if (!id) {
return;
}
const paymentEl = document.querySelector(`#pm-payment-express-button-container-1539149753700-9`);
const childrenEL = document.getElementById(id);
if (paymentEl && childrenEL) {
childrenEL.style.display = allowShow ? 'block' : 'none';
return;
}
if (paymentEl && !childrenEL) {
const dom = document.createElement('div');
dom.id = id;
dom.style.display = allowShow ? 'block' : 'none';
paymentEl.appendChild(dom);
}
}
const loadScript = (fnReady, id, src, datasets, onError, attributeConfig = {}) => {
const sdkDomId = id + '-sdk';
if (fnReady() || document.getElementById(sdkDomId)) {
return Promise.resolve({id: true});
}
return new Promise((resolve) => {
const s = document.createElement('script');
s.id = sdkDomId;
s.src = src;
s.defer = true;
if (datasets) {
Object.keys(datasets).map((item) => {
s.dataset[item] = datasets[item];
});
}
s.onload = function () {
window.dispatchEvent(new CustomEvent(`${id}-loaded`));
resolve({id: true});
};
s.onerror = function () {
resolve({id: false});
onError && onError();
};
Object.keys(attributeConfig).forEach((key) => {
s.setAttribute(key, attributeConfig[key]);
});
document.head.appendChild(s);
});
};
const track = (eventName, data) => {
window.sa && window?.sa?.track('pm_' + eventName, data);
}
const eventListeners = {};
const ecEvent = {
on: (eventName, listener, useCapture) => {
eventListeners[eventName] = listener;
window.addEventListener(eventName, listener, useCapture);
},
emit: (eventName, data) => window.dispatchEvent(new CustomEvent(eventName, {detail: data})),
};
const req = {
ROOT_URL: (C_SETTINGS && C_SETTINGS.routes && C_SETTINGS.routes.root) || '',
post: async (url, data = {}) => {
try {
const response = await fetch(req.ROOT_URL + url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
...data,
body: JSON.stringify(data.body),
});
const result = await response.json();
return result
} catch (error) {
throw new Error('post request error' + error);
}
},
get: async (url, data = {}) => {
try {
const response = await fetch(req.ROOT_URL + url);
const result = await response.json();
return result
} catch (error) {
throw new Error('get request error' + error);
}
}
};
const getExtUrl = (name) => {
const url = document.cookie.match(new RegExp('\\b' + name.replace(/_/g, '-') + '-(v[s0-9]+)'));
if (url && url[1]) {
return `${name}.${url[1]}.js`;
} else {
return window?.exts?.filly;
}
}
const coreMethod = {
domIDSuffix,
prefix,
ecGlobalVarEnums,
providerEnums,
channelEnums,
containerDomId,
channel2ProviderEnums,
getProduct,
isChrome,
isSafari,
isPreview,
getProductFormData,
getOrderFetchParams,
multiply,
removeChildrenDOM,
addChildrenDOM,
loadScript,
track,
eventListeners,
ecEvent,
req,
getExtUrl
}
const containerDOM = document.getElementById('pm-payment-express-button-container-1539149753700-9');
if (containerDOM) {
containerDOM.dispatchEvent(new CustomEvent('Payment_EC_Core_first', {detail: coreMethod}));
}
} catch (e) {
}
}
document.addEventListener('payment_plugin_message_reader', core, {once: true});
} catch (e) {
}
const getPluginI18nMessages = (message, replaceObj = {}) => {
const lang = document.documentElement.lang || "en-US";
const [form, key] = message.split('.')
let text = window.payment_plugin_message['en-US'][form][key];
if (window.payment_plugin_message[lang][form].hasOwnProperty(key)) {
text = window.payment_plugin_message[lang][form][key];
}
Object.keys(replaceObj).forEach(key => {
text = text.replace(new RegExp(`\{${key}\}`, 'gi'), replaceObj[key]);
})
return text;
}
const zhCN = {
ec: {
not_active_channel: "请到收款设置中{channelName}或在「快捷支付按钮」设置中选择其他的服务提供方,否则按钮将无法展示",
not_support_theme: "当前主题不支持添加「快捷支付按钮」",
more_button: "更多支付方式",
}
};
const zhTW = {
ec: {
not_active_channel: "请到收款设置中{channelName}或在「快捷支付按钮」设置中选择其他的服务提供方,否则按钮将无法展示",
not_support_theme: "当前主题不支持添加「快捷支付按钮」",
more_button: "更多付款方式",
}
};
const arSA = {
ec: {
not_active_channel: "Please activate {channelName} on B Admin or select another provider in the「Express checkout button」 settings, otherwise it will not display.",
not_support_theme: "This Theme doesn't support adding「Express checkout button」",
more_button: "المزيد من خيارات الدفع",
}
};
const deDE = {
ec: {
not_active_channel: "Please activate {channelName} on B Admin or select another provider in the「Express checkout button」 settings, otherwise it will not display.",
not_support_theme: "This Theme doesn't support adding「Express checkout button」",
more_button: "Weitere Bezahlmöglichkeiten",
}
};
const esES = {
ec: {
not_active_channel: "Please activate {channelName} on B Admin or select another provider in the「Express checkout button」 settings, otherwise it will not display.",
not_support_theme: "This Theme doesn't support adding「Express checkout button」",
more_button: "Más opciones de pago",
}
};
const frFR = {
ec: {
not_active_channel: "Please activate {channelName} on B Admin or select another provider in the「Express checkout button」 settings, otherwise it will not display.",
not_support_theme: "This Theme doesn't support adding「Express checkout button」",
more_button: "Plus d'options de paiement",
}
};
const idID = {
ec: {
not_active_channel: "Please activate {channelName} on B Admin or select another provider in the「Express checkout button」 settings, otherwise it will not display.",
not_support_theme: "This Theme doesn't support adding「Express checkout button」",
more_button: "Opsi pembayaran lainnya",
}
};
const itIT = {
ec: {
not_active_channel: "Please activate {channelName} on B Admin or select another provider in the「Express checkout button」 settings, otherwise it will not display.",
not_support_theme: "This Theme doesn't support adding「Express checkout button」",
more_button: "Altre opzioni di pagamento",
}
};
const jaJP = {
ec: {
not_active_channel: "Please activate {channelName} on B Admin or select another provider in the「Express checkout button」 settings, otherwise it will not display.",
not_support_theme: "This Theme doesn't support adding「Express checkout button」",
more_button: "その他の支払いオプション",
}
};
const koKR = {
ec: {
not_active_channel: "Please activate {channelName} on B Admin or select another provider in the「Express checkout button」 settings, otherwise it will not display.",
not_support_theme: "This Theme doesn't support adding「Express checkout button」",
more_button: "더 많은 결제 옵션",
}
};
const enUS = {
ec: {
not_active_channel: "Please activate {channelName} on B Admin or select another provider in the「Express checkout button」 settings, otherwise it will not display.",
not_support_theme: "This Theme doesn't support adding「Express checkout button」",
more_button: "More payment options",
}
};
const nlNL = {
ec: {
not_active_channel: "Please activate {channelName} on B Admin or select another provider in the「Express checkout button」 settings, otherwise it will not display.",
not_support_theme: "This Theme doesn't support adding「Express checkout button」",
more_button: "Meer betalingsmogelijkheden",
}
};
const plPL = {
ec: {
not_active_channel: "Please activate {channelName} on B Admin or select another provider in the「Express checkout button」 settings, otherwise it will not display.",
not_support_theme: "This Theme doesn't support adding「Express checkout button」",
more_button: "Więcej Opcji Płatności",
}
};
const ptPT = {
ec: {
not_active_channel: "Please activate {channelName} on B Admin or select another provider in the「Express checkout button」 settings, otherwise it will not display.",
not_support_theme: "This Theme doesn't support adding「Express checkout button」",
more_button: "Mais opções de pagamento",
}
};
const ruRU = {
ec: {
not_active_channel: "Please activate {channelName} on B Admin or select another provider in the「Express checkout button」 settings, otherwise it will not display.",
not_support_theme: "This Theme doesn't support adding「Express checkout button」",
more_button: "Другие варианты оплаты",
}
};
const thTH = {
ec: {
not_active_channel: "Please activate {channelName} on B Admin or select another provider in the「Express checkout button」 settings, otherwise it will not display.",
not_support_theme: "This Theme doesn't support adding「Express checkout button」",
more_button: "ตัวเลือกการชำระเงินเพิ่มเติม",
}
};
window.payment_plugin_message = {
getPluginI18nMessages,
"zh-CN": zhCN,
"zh-TW": zhTW,
"ar-SA": arSA,
"de-DE": deDE,
"es-ES": esES,
"fr-FR": frFR,
"id-ID": idID,
"it-IT": itIT,
"ja-JP": jaJP,
"ko-KR": koKR,
"en-US": enUS,
"nl-NL": nlNL,
"pl-PL": plPL,
"pt-PT": ptPT,
"ru-RU": ruRU,
"th-TH": thTH,
}
document.dispatchEvent(new CustomEvent('payment_plugin_message_reader'));
Sku : ET17914
Weight : 0.45kg
${function(){
const variantData = data.variant || {"id":"c0b68823-2cb1-49ea-ae88-8d4498e58b6b","product_id":"2013cef6-474f-43c2-b1c8-52773552d156","title":"S-Latte","weight_unit":"kg","inventory_quantity":1000,"sku":"ET17914","barcode":"","position":4,"option1":"S","option2":"Latte","option3":"","note":"","image":{"src":"\/\/img.staticdj.com\/9088c790615c53e17f8b5d99517ab7c3.jpeg","path":"9088c790615c53e17f8b5d99517ab7c3.jpeg","width":799,"height":1200,"alt":"","aspect_ratio":0.6658333333333334},"wholesale_price":[{"price":49.88,"min_quantity":1}],"weight":"0.45","compare_at_price":"0","price":"49.88","retail_price":"0","available":true,"url":"\/products\/easel-color-blocked-rounded-neck-loose-fit-exposed-seaming-pullover-top?variant=c0b68823-2cb1-49ea-ae88-8d4498e58b6b","available_quantity":1000,"options":[{"name":"Size","value":"S"},{"name":"Color","value":"Latte"}],"off_ratio":0,"flashsale_info":[],"sales":0};
return `
Sku : ${variantData && variantData.sku}
Weight : ${variantData && variantData.weight}${variantData && variantData.weight_unit}
Barcode : ${variantData && variantData.barcode}
`
}()}
/** @private {string} */
class SpzCustomAnchorScroll extends SPZ.BaseElement {
static deferredMount() {
return false;
}
constructor(element) {
super(element);
/** @private {Element} */
this.scrollableContainer_ = null;
}
isLayoutSupported(layout) {
return layout == SPZCore.Layout.LOGIC;
}
buildCallback() {
this.viewport_ = this.getViewport();
this.initActions_();
}
setTarget(containerId, targetId) {
this.containerId = '#' + containerId;
this.targetId = '#' + targetId;
}
scrollToTarget() {
const container = document.querySelector(this.containerId);
const target = container.querySelector(this.targetId);
const {scrollTop} = container;
const eleOffsetTop = this.getOffsetTop_(target, container);
this.viewport_
.interpolateScrollIntoView_(
container,
scrollTop,
scrollTop + eleOffsetTop
);
}
initActions_() {
this.registerAction(
'scrollToTarget',
(invocation) => this.scrollToTarget(invocation?.caller)
);
this.registerAction(
'setTarget',
(invocation) => this.setTarget(invocation?.args?.containerId, invocation?.args?.targetId)
);
}
/**
* @param {Element} element
* @param {Element} container
* @return {number}
* @private
*/
getOffsetTop_(element, container) {
if (!element./*OK*/ getClientRects().length) {
return 0;
}
const rect = element./*OK*/ getBoundingClientRect();
if (rect.width || rect.height) {
return rect.top - container./*OK*/ getBoundingClientRect().top;
}
return rect.top;
}
}
SPZ.defineElement('spz-custom-anchor-scroll', SpzCustomAnchorScroll);
const STRENGTHEN_TRUST_URL = "/api/strengthen_trust/settings";
class SpzCustomStrengthenTrust extends SPZ.BaseElement {
constructor(element) {
super(element);
this.renderElement_ = null;
}
isLayoutSupported(layout) {
return layout == SPZCore.Layout.CONTAINER;
}
buildCallback() {
this.xhr_ = SPZServices.xhrFor(this.win);
const renderId = this.element.getAttribute('render-id');
SPZCore.Dom.waitForChild(
document.body,
() => !!document.getElementById(renderId),
() => {
this.renderElement_ = SPZCore.Dom.scopedQuerySelector(
document.body,
`#${renderId}`
);
if (this.renderElement_) {
this.render_();
}
this.registerAction('track', (invocation) => {
this.track_(invocation.args);
});
}
);
}
render_() {
this.fetchData_().then((data) => {
if (!data) {
return;
}
SPZ.whenApiDefined(this.renderElement_).then((apis) => {
apis?.render(data);
document.querySelector('#strengthen-trust-render-1539149753700').addEventListener('click',(event)=>{
if(event.target.nodeName == 'A'){
this.track_({type: 'trust_content_click'});
}
})
});
});
}
track_(data = {}) {
const track = window.sa && window.sa.track;
if (!track) {
return;
}
track('trust_enhancement_event', data);
}
parseJSON_(string) {
let result = {};
try {
result = JSON.parse(string);
} catch (e) {}
return result;
}
fetchData_() {
return this.xhr_
.fetchJson(STRENGTHEN_TRUST_URL)
.then((responseData) => {
if (!responseData || !responseData.data) {
return null;
}
const data = responseData.data;
const moduleSettings = (data.module_settings || []).reduce((result, moduleSetting) => {
return result.concat(Object.assign(moduleSetting, {
logos: (moduleSetting.logos || []).map((item) => {
return moduleSetting.logos_type == 'custom' ? this.parseJSON_(item) : item;
})
}));
}, []);
return Object.assign(data, {
module_settings: moduleSettings,
isEditor: window.self !== window.top,
});
});
}
}
SPZ.defineElement('spz-custom-strengthen-trust', SpzCustomStrengthenTrust);
${data.module_title}
To display this card to customers, you need to go to "Booster & Store Conversion" to turn on the trust enhancement feature.
${item.content.replaceAll("{store_name}","vwvwv")}
To display this card to customers, you need to go to "Booster & Store Conversion" to turn on the trust enhancement feature.
Easel Color Blocked Rounded Neck Loose Fit Exposed Seaming Pullover Top
-Rounded Neckline
-Relaxed And Loose Fit
-Dropped Shoulders
-Exposed Seaming
65% Polyester
32% Cotton
3% Spandex
We offer the best selection of EASEL tops for women. Easel Clothing is a brand that has been a customer favorite for years! Check out our extensive collection of EASEL Tops. We are so excited to show you new styles. EASEL is known for its soft fabrics and ease of wear. EASEL is not limited to any specific season or trend and can be worn year-round. We like to imagine a woman cleaning out her closet, and the only pieces remaining are from EASEL.
A woman can never have enough cute and trendy tops by EASEL! Whether you are in the mood for EASEL maxi tops, EASEL midi tops, or EASEL mini tops, Roulhac Fashion Boutique has you covered, boutique brand tops for women are comfortable, versatile, and fun. With so many styles and choices, you're sure to find your favorite new dress. Our Roulhac Fashion Boutique style tops are fashionable and of the best quality at a great price and designed to meet your budget. Our EASEL fashion tops fit well with gorgeous styles designed to make you look and feel your very best. Our large collection of different styles of boutique tops for women will meet all your needs.