${(function(){
const get_random_six_digits = () => {
return Math.random().toString().slice(-6)
};
const wholesale_enabled = false;
const setting_product_image_display = "133.33%";
const product_image = data.image;
const secondary_image = data.secondImage;
const image_width = product_image.width;
let image_height = product_image.height;
if(setting_product_image_display == '100%'){
image_height = image_width
}else if(setting_product_image_display == '133.33%'){
image_height = image_width * 1.3333;
};
const product_image_hover_on = true && !!secondary_image.src;
const has_save_label = true && ((+data.compare_at_price) > (+data.price));
const is_single_variant = data.variants.length == 1;
const min_price_variant_href = (data.min_price_variant && data.min_price_variant.available) ? data.min_price_variant.withinUrl : data.withinUrl;
const retail_price_max = data.retail_price_max || data.compare_at_price_max;
const THUMBNAILS_MAX_SIZE = 3;
const thumbnails = data.thumbVariants.slice(0, THUMBNAILS_MAX_SIZE);
const image_wrap_id = 'image_wrap_' + get_random_six_digits();
const image_carousel_id = 'image_carousel_' + get_random_six_digits();
const thumbnails_selector_id = 'thumbnails_selector_' + get_random_six_digits();
const form_id = 'form_' + get_random_six_digits();
return `
${
data.price_min != data.price_max
? `من
`
: `
`
}
+${data.remainInvisibleThumbCount}
`
})()}
اشتري الآن
${function() {
let { prices } = data.data
const total_price = (prices && prices.total_price) || 0;
const subtotal_price = (prices && prices.subtotal_price) || 0;
return `
`
}()}
🥰رحبي بأناقة الصيف مع فستاننا المحبوك المزود بأزرار والذي يغطي الوركين. بفضل نسيجه الناعم وتصميمه الفضفاض، تضيف الزخارف الرقيقة بالأزرار لمسة من التألق إلى مظهرك اليومي. هذه المجموعة أكثر من مجرد ملابس، فهي رمز لإشراقك الداخلي وأسلوبك السهل.
تحديد:
المواد: البوليستر
الحرفة: ضبط درجة الحرارة العالية
اللون: كما هو موضح في الصورة
المقاس: XS-3XL
خط العنق: رقبة على شكل حرف V
طول الأكمام: كم طويل
نوع الخصر: وسط الخصر
طول الفستان: طويل
نوع الفستان: حزمة الورك
العنصر الشائع: الزر
النمط: كاجوال/موضة
الموسم: الخريف، الربيع، الصيف
المناسبة: كاجوال يومي / عمل / حفلة / كوكتيل / مساء
نوع المقاس: عادي
من المناسب جدًا ارتداؤه كقطعة ملابس للتنقل إلى العمل، مما يسمح لك بالحفاظ على أسلوب مريح في العمل.
جدول المقاسات
الحجم (بوصة)
اعتقال
وَسَط
خاصرة
XS
34.65
26.77
38.58
S
36.22
28.35
40.16
M
37.80
29.92
41.73
L
39.37
31.50
43.31
XL
40.94
33.07
44.88
2XL
42.52
34.65
46.46
3XL
44.10
36.22
48.03
ملحوظة:
1. يرجى السماح باختلاف طفيف قدره 1-3 سم (0.4-1.18 بوصة) بسبب القياس اليدوي واختلاف بسيط في اللون لإعدادات العرض المختلفة.
2. المقاس لا يناسب الجميع، يرجى التحقق بعناية من جدول المقاسات واختيار المقاس بناءً على مقاسك الحقيقي
3. نظرًا لحجم الطلب الكبير، سيتم تمديد دورة إنتاج الملابس وقد يتأخر طلبك. نسعى جاهدين لتحقيق أعلى جودة في كل التفاصيل، نأمل أن تتفهم وتتحلى بالصبر. وقت إنتاج الملابس: 10-15 يومًا، وقت اللوجستيات: 10-15 يومًا.
1
حدد المنتج
محدد 0 العنصر (s)
1
حدد المنتج
محدد
${ (data && data.data && (data.data.items || data.data.line_items) || (data && data.data && data.data.data && (data.data.data.items || data.data.data.line_items)) || []).reduce((acc, cur) => acc + cur.quantity, 0) || 0 }
العنصر (s)
1
حدد المنتج
محدد 0 العنصر (s)
1
حدد المنتج
محدد
${(data && data.data && (data.data.items || data.data.line_items) || (data && data.data && data.data.data && (data.data.data.items || data.data.data.line_items || (data.data.data.order && data.data.data.order.line_items))) || []).reduce((acc, cur) => acc + cur.quantity, 0) || 0 }
العنصر (s)
class SpzCheckoutNotificationHandler extends SPZ.BaseElement {
constructor(element) {
super(element);
this.timer_ = null;
}
isLayoutSupported(layout) {
return layout == SPZCore.Layout.LOGIC;
}
sendVariantListUpdateEvent_(data) {
const messageData = { type: "theme_variant_list_update", data: { orderToken: data.order_token || data.order_id } };
clearInterval(this.timer_);
if(!window.CheckoutAPI) {
this.timer_ = setInterval(() => {
if(window.CheckoutAPI) {
clearInterval(this.timer_);
postMessage && postMessage(messageData);
}
}, 500);
} else {
postMessage && postMessage(messageData);
}
}
buildCallback() {
this.action_ = SPZServices.actionServiceForDoc(this.element);
this.registerAction('sendVariantListUpdateEvent', (param) => {
this.sendVariantListUpdateEvent_(param.args.data);
});
}
}
SPZ.defineElement('spz-custom-checkout-notification-handler', SpzCheckoutNotificationHandler);
function handleGetOrderInfo(data) {
if (data.order_id) {
let api = `/api/checkout/order/info?order_id=${data.order_id}`;
return Promise.resolve(api);
}
return Promise.reject({});
}
function addEventListenerKickItems(data) {
if (data.type === 'checkout_kick_items') {
return Promise.resolve(data);
}
return Promise.reject({});
}
exportFunction('handleGetOrderInfo', handleGetOrderInfo)
exportFunction('addEventListenerKickItems', addEventListenerKickItems)
الأحدث
الأكثر إعجابا
أعلى التصنيفات
أدنى التصنيفات
الأكثر إعجابا
أعلى التصنيفات
أدنى التصنيفات
×
${function(){
const limit = typeof data === 'number' ? data : 0;
return `
صور/فيديو (${limit || 0}/5 )
` }()}
${(function(){
const closeIcon =
'
';
if (item.type === 'image') {
return `
${closeIcon}
`
}
return `
${closeIcon}
`
})()}
إرسال التعليقات بشكل مجهول
class SpzCustomFileUpload extends SPZ.BaseElement {
constructor(element) {
super(element);
this.uploadCount_ = 0;
this.fileList_ = [];
}
buildCallback() {
this.action = SPZServices.actionServiceForDoc(this.element);
this.registerAction('upload', (data) => {
this.handleFileUpload_(data.event?.detail?.data || []);
});
this.registerAction('delete', (data) => {
this.handleFileDelete_(data?.args?.data);
});
this.registerAction('preview', (data) => {
this.handleFilePreview_(data?.args?.data);
});
this.registerAction('limit', (data) => {
this.handleFileLimit_();
});
this.registerAction('sizeLimit', (data) => {
this.handleFileSizeLimit_();
});
}
isLayoutSupported(layout) {
return layout == SPZCore.Layout.LOGIC;
}
setData_(count, file) {
this.uploadCount_ = count;
this.fileList_ = file;
}
handleFileUpload_(data) {
data.forEach(i => {
if(this.fileList_.some(j => j.url === i.url)) return;
this.fileList_.push(i);
})
this.uploadCount_++;
sessionStorage.setItem('fileList', JSON.stringify(this.fileList_));
this.triggerEvent_("handleFileUpload", { count: this.uploadCount_, files: this.fileList_});
if(this.fileList_.length >= 5){
document.querySelector('#review_upload').style.display = 'none';
}
if(this.fileList_.length > 0){
document.querySelector('.apps-reviews-write-anonymous-box').style.marginTop = '8px';
}
}
handleFileDelete_(index) {
this.fileList_.splice(index, 1);
this.uploadCount_--;
sessionStorage.setItem('fileList', JSON.stringify(this.fileList_));
this.triggerEvent_("handleFileDelete", { count: this.uploadCount_, files: this.fileList_});
document.querySelector('#review_upload').style.display = 'block';
if(this.fileList_?.length === 0){
document.querySelector('.apps-reviews-write-anonymous-box').style.marginTop = '132px';
}
}
handleFilePreview_(index) {
const finalPreviewData = this.fileList_[index];
const filePreviewModal = document.getElementById('filePreviewModal');
const fullScreenVideo = document.getElementById('fullScreenVideo');
const fullScreenImage = document.getElementById('fullScreenImage');
const previewModalClose = document.getElementById('previewModalClose');
const previewLoading = document.getElementById('previewLoading');
filePreviewModal.style.display = 'block';
previewLoading.style.display = 'flex';
if(finalPreviewData?.type === 'video'){
const media = this.mediaParse_(this.fileList_[index]?.url);
fullScreenVideo.addEventListener('canplaythrough', function() {
previewLoading.style.display = 'none';
});
fullScreenImage.src = '';
fullScreenImage.style.display = 'none';
fullScreenVideo.style.display = 'block';
fullScreenVideo.src = media.mp4 || '';
} else {
fullScreenImage.onload = function() {
previewLoading.style.display = 'none';
};
fullScreenVideo.src = '';
fullScreenVideo.style.display = 'none';
fullScreenImage.style.display = 'block';
fullScreenImage.src = finalPreviewData.url;
}
previewModalClose.addEventListener('click', function() {
filePreviewModal.style.display = 'none';
});
}
handleFileLimit_() {
alert(window.AppReviewsLocale.comment_file_limit || 'please do not upload files more than 5');
this.triggerEvent_("handleFileLimit");
}
handleFileSizeLimit_() {
alert(window.AppReviewsLocale.comment_file_size_limit || 'File size does not exceed 10M');
}
clear(){
this.fileList_ = [];
this.uploadCount_ = 0;
sessionStorage.setItem('fileList', JSON.stringify(this.fileList_));
this.triggerEvent_("handleClear", { count: this.uploadCount_, files: this.fileList_});
document.querySelector('#review_upload').style.display = 'block';
}
mediaParse_(url) {
var result = {};
try {
url.replace(/[?&]+([^=&]+)=([^&]*)/gi, function (str, key, value) {
try {
result[key] = decodeURIComponent(value);
} catch (e) {
result[key] = value;
}
});
result.preview_image = url.split('?')[0];
} catch (e) {};
return result;
}
triggerEvent_(name, data) {
const event = SPZUtils.Event.create(this.win, name, data);
this.action.trigger(this.element, name, event);
}
}
SPZ.defineElement('spz-custom-file-upload', SpzCustomFileUpload);
The review would not show in product details on storefront since it does not support to.
const TAG = 'spz-custom-painter-button-animation';
const MAX_ITERATION_COUNT = 99999999;
const SITE = (window.C_SETTINGS && window.C_SETTINGS.routes && window.C_SETTINGS.routes.root) || '';
const ADD_TO_CART_ANIMATION_SETTING =
`${SITE}/api/marketing_atmosphere_app/add_to_cart_btn_animation/setting`;
class SpzCustomPainterButtonAnimation extends SPZ.BaseElement {
/**@override */
static deferredMount() {
return false;
}
/** @param {!SpzElement} element */
constructor(element) {
super(element);
/** @private {!../../src/service/xhr-impl.Xhr} */
this.xhr_ = SPZServices.xhrFor(this.win);
/** @private {Object} */
this.data_ = null;
/** @private {Element} */
this.addToCartButton_ = null;
/** @private {boolean} */
this.productAvailable_ = true;
/** @private {number} */
this.timerId_ = null;
/** @private {number} */
this.animationExecutionCount_ = 0;
/** @private {boolean} */
this.selectedVariantAvailable_ = true;
/** @private {number} */
this.delay_ = 5000;
/** @private {number} */
this.iterationCount_ = 5;
/** @private {string} */
this.animationClass_ = '';
}
/** @override */
isLayoutSupported(layout) {
return layout == SPZCore.Layout.LOGIC;
}
/** @override */
buildCallback() {
this.productAvailable_ = this.element.hasAttribute('product-available');
this.selectedVariantAvailable_ = this.element.hasAttribute('selected-variant-available');
}
/** @override */
mountCallback() {
this.render_();
}
/** @private */
render_() {
if (!this.productAvailable_) {
return;
}
this.fetch_().then((data) => {
if (!data) {
return;
}
this.data_ = data;
this.animationClass_ = `painter-${data.animation_name}-animation`;
this.iterationCount_ =
data.animation_iteration_count === 'infinite'
? MAX_ITERATION_COUNT
: data.animation_iteration_count;
const animationDuration = 1;
const animationDelay = data.animation_delay || 5;
this.delay_ = (animationDuration + animationDelay) * 1000;
this.handleButtonEffect_();
});
}
/**
* @param {JsonObject} data
* @return {(null|Object)}
* @private
*/
parseJson_(data) {
try {
return JSON.parse(data);
} catch (e) {
return null;
}
}
/**
* @return {Promise}
* @private
*/
fetch_() {
return this.xhr_.fetchJson(ADD_TO_CART_ANIMATION_SETTING).then((data) => {
if (!data || !data.enabled) {
return null;
}
return this.parseJson_(data.detail);
});
}
/** @private */
getAddToCartButton_() {
this.addToCartButton_ = SPZCore.Dom.scopedQuerySelector(
document.body,
'[data-section-type="product"] [role="addToCart"], [data-section-type="product_detail"] [role="addToCart"], [data-section-type="product_detail"] [data-click="addToCart"], [data-section-type="product"] [data-click="addToCart"]'
);
}
/** @private */
restartAnimation_() {
this.addToCartButton_.classList.remove(this.animationClass_);
this.addToCartButton_./* OK */ offsetWidth;
this.addToCartButton_.classList.add(this.animationClass_);
this.animationExecutionCount_++;
}
/** @private */
clearTimer_() {
this.win.clearInterval(this.timerId_);
this.timerId_ = null;
}
/** @private */
setupTimer_() {
this.timerId_ = this.win.setInterval(() => {
this.restartAnimation_();
if (this.animationExecutionCount_ >= this.iterationCount_) {
this.removeAnimationClass_();
this.clearTimer_();
}
}, this.delay_);
}
/** @private */
restartTimer_() {
if (this.animationExecutionCount_ >= this.iterationCount_) {
this.removeAnimationClass_();
return;
}
this.setupTimer_();
}
/** @private */
listenVariantChange_() {
SPZUtils.Event.listen(self.document, 'dj.variantChange', (e) => {
const selectedVariant = e.detail && e.detail.selected;
if (!selectedVariant) {
return;
}
const {available} = selectedVariant;
if (this.selectedVariantAvailable_ !== available) {
this.selectedVariantAvailable_ = available;
this.clearTimer_();
if (available) {
this.restartTimer_();
}
}
});
}
/** @private */
removeAnimationClass_() {
this.win.setTimeout(() => {
this.addToCartButton_.classList.remove(this.animationClass_);
}, 1000);
}
/** @private */
handleButtonEffect_() {
this.getAddToCartButton_();
if (!this.addToCartButton_) {
return;
}
if (this.selectedVariantAvailable_) {
++this.animationExecutionCount_;
this.addToCartButton_.classList.add(this.animationClass_);
if (this.iterationCount_ === 1) {
this.removeAnimationClass_();
return;
}
this.setupTimer_();
}
this.listenVariantChange_();
}
}
SPZ.defineElement(TAG, SpzCustomPainterButtonAnimation);