Firstgr Gradient Color PBT Keycap Set
Firstgr
${function() {
const variantData = data.variant || {"id":"de65ba60-74de-4ef9-aa3e-365a13322978","product_id":"b76f8a49-2b24-4039-aa78-7f30a5271b71","title":"","weight_unit":"kg","inventory_quantity":0,"sku":"Firstgr--A0011939","barcode":"","position":1,"option1":"","option2":"","option3":"","note":"","image":null,"wholesale_price":[{"price":46.99,"min_quantity":1}],"weight":"0.36","compare_at_price":"63.99","price":"46.99","retail_price":"63.99","available":true,"url":"\/products\/firstgr-gradient-color-pbt-keycap-set-osrd?variant=de65ba60-74de-4ef9-aa3e-365a13322978","available_quantity":999999999,"options":[],"off_ratio":27,"flashsale_info":[],"sales":1};
const saveType = "amount";
const productLabelDiscountOn = true;
return `
-
${saveType == 'percentage'
? `-${variantData.off_ratio}%`
: `- `
}
`;
}()}
Free shipping on orders over $99
Add to cart
$46.99
${function(){
const wholesale_enabled = false;
const qty = data.quantity || 1;
const currentSelectVariant = data.variant;
const defaultVariant = (data.product && data.product.variants && data.product.variants[0]);
const productVariant = {"id":"de65ba60-74de-4ef9-aa3e-365a13322978","product_id":"b76f8a49-2b24-4039-aa78-7f30a5271b71","title":"","weight_unit":"kg","inventory_quantity":0,"sku":"Firstgr--A0011939","barcode":"","position":1,"option1":"","option2":"","option3":"","note":"","image":null,"wholesale_price":[{"price":46.99,"min_quantity":1}],"weight":"0.36","compare_at_price":"63.99","price":"46.99","retail_price":"63.99","available":true,"url":"\/products\/firstgr-gradient-color-pbt-keycap-set-osrd?variant=de65ba60-74de-4ef9-aa3e-365a13322978","available_quantity":999999999,"options":[],"off_ratio":27,"flashsale_info":[],"sales":1};
const variantData = currentSelectVariant || defaultVariant || productVariant;
const wholesale_price = variantData.wholesale_price || [];
if(wholesale_enabled && wholesale_price.length > 0) {
let wholesaleIndex = wholesale_price.findIndex(item => {
return item.min_quantity > qty;
});
if(wholesaleIndex < 0){
wholesaleIndex = wholesale_price.length - 1;
}else if(wholesaleIndex > 0){
wholesaleIndex = wholesaleIndex - 1;
}
const wholesalePrice = wholesale_price[wholesaleIndex] || '';
return `
`
}else {
const price = variantData && variantData.price;
return price != undefined ? `
` : ' ';
}
}()}
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
|| 46.99;
const requiresShipping = productDetail?.product?.requires_shipping;
const expressCheckoutList = {
sdkErrorList: [],
paymentChannelList: [],
disabledChannelList: [],
showChannelList: [],
blockChannelList: [],
extraChannelList: [],
}
const moreButtonConfig = {
firstClick: true,
maxSize: isNaN(0) ? 1 : 0
}
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-8');
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-8');
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-8');
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-8');
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-8-${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-8');
if (!isPreview()) {
return;
}
if (!tipsDom) {
return;
}
tipsDom.style.display = 'block';
const id = 'pm-payment-express-error-tips-1539149753700-8-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-8');
const moreButtonDOM = document.getElementById('pm-payment-express-more-button-1539149753700-8');
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-8');
containerDOM.addEventListener('Payment_EC_Core_first', core, false);
} catch (e) {
}
try {
const core = () => {
const containerDOM = document.getElementById('pm-payment-express-button-container-1539149753700-8');
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-8`,
stripe: `${prefix}${providerEnums.STRIPE}${domIDSuffix}-1539149753700-8`,
shoplazza: `${prefix}${providerEnums.SHOPLAZZA}${domIDSuffix}-1539149753700-8`,
};
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-8`);
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-8`);
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-8');
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'));
${function(){
const variantData = data.variant || {"id":"de65ba60-74de-4ef9-aa3e-365a13322978","product_id":"b76f8a49-2b24-4039-aa78-7f30a5271b71","title":"","weight_unit":"kg","inventory_quantity":0,"sku":"Firstgr--A0011939","barcode":"","position":1,"option1":"","option2":"","option3":"","note":"","image":null,"wholesale_price":[{"price":46.99,"min_quantity":1}],"weight":"0.36","compare_at_price":"63.99","price":"46.99","retail_price":"63.99","available":true,"url":"\/products\/firstgr-gradient-color-pbt-keycap-set-osrd?variant=de65ba60-74de-4ef9-aa3e-365a13322978","available_quantity":999999999,"options":[],"off_ratio":27,"flashsale_info":[],"sales":1};
return `
`
}()}
All orders are hand inspected at our warehouse before shipping. If any of your items are defective or of low quality, please contact us and we will replace them immediately!
Compatible with conventional ANSI layouts as well as ISO