1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories
1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories

1 Yard 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories

Price

$4.99 $2.99
Save $2.00
Free shipping on orders over 69.9

color

Please select a color

Quantity

Free returns
Sustainably made
Secure payments

2Y 3D Flower Lace Fabric Embroidered Lace Trim Ribbon DIY Wedding Garment Sewing Craft Accessories

Occasion:Anniversary, Engagement, Gift, Wedding DIY

Gender:Children's, Women's

Size:45*33CM

Weight:22g

Dear Customer,

If satisfied, kindly give us 5 stars feedback; if not, please feel free to contact us in time, we will try our best to solve your problem until you are satistied.

Note:Due to the difference between different monitors, the picture may not reflect the actual color of the item. We guarantee the style is the same as shown in the pictures. Thank you!

Please note that due to the low price of this product, please purchase multiple items totaling more than $10 at one time or we will not be able to ship to you.Free shipping on orders over 69.99!

The following pictures were taken by the customer







/** @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-1718252090972').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);
class SpzSmartBlockComponent extends SPZ.BaseElement { constructor(element) { super(element); this.templates_ = null; this.container_ = null; this.i18n_ = {}; this.config_ = {}; this.show_type_ = 3; this.product_resource_id_ = ''; this.collection_resource_id_ = ''; this.cart_items_ = []; this.customer_id_ = ''; this.order_id_ = ''; } static deferredMount() { return false; } isLayoutSupported(layout) { return layout == SPZCore.Layout.CONTAINER; } buildCallback() { const template_type = window.SHOPLAZZA.meta.page.template_type; if (template_type === 1) { this.show_type_ = 3; this.product_resource_id_ = window.SHOPLAZZA.meta.page.resource_id; } else if (template_type === 2) { this.show_type_ = 4; this.collection_resource_id_ = window.SHOPLAZZA.meta.page.resource_id; } else if (template_type === 15){ this.show_type_ = 5; } else if (template_type === 13){ this.show_type_ = 6; } else if (template_type === 20){ this.show_type_ = 7; this.customer_id_ = window.SHOPLAZZA.customer.customer_id; } else if (template_type === 35){ this.show_type_ = 8; this.order_id_ = window.location.pathname.split('/').pop(); } this.templates_ = SPZServices.templatesForDoc(this.element); this.setAction_(); } mountCallback() { console.log('smart mounted'); const that = this; const themeName = window.SHOPLAZZA.theme.merchant_theme_name; const isGeek = /Geek/.test(themeName); this.fetchRules().then((res) => { if (res && res.rules && res.rules.length) { const blockEl = document.getElementById('smart_recommend_block'); SPZ.whenApiDefined(blockEl).then((api) => { api.render({data: res}, true).then(() => { if (isGeek && that.show_type_ === 6) { blockEl.querySelector('.plugin_container_wrpper').style.padding = '30px 0'; } const recommendStyle = document.createElement('style'); recommendStyle.innerHTML = ` .plugin__recommend_container,.app-recommend-card { display: none !important; } `; document.head.appendChild(recommendStyle); const fetchList = []; res.rules.forEach((rule) => { fetchList.push(this.fetchRuleProductList(rule.id)); }); const fetchAll = Promise.all(fetchList); fetchAll.then((p_res) => { res.rules.forEach((rule, index) => { rule.products = p_res[index] && p_res[index].products; const ruleEl = document.getElementById('smart_recommend_rule_' + rule.id); SPZ.whenApiDefined(ruleEl).then((api) => { api.render({data: rule}, true).then(() => { that.impressListen(`#smart_recommend_rule_ul_${rule.id}`, function(){ that.trackRuleImpress(rule); }); const btnElList = document.querySelectorAll(`#smart_recommend_rule_ul_${rule.id} button`); btnElList.forEach((btnEl) => { if (btnEl && rule.config && rule.config.quick_shop_button_bg_color && rule.config.quick_shop_button_text_color) { btnEl.style.backgroundColor = rule.config.quick_shop_button_bg_color; btnEl.style.color = rule.config.quick_shop_button_text_color; } }) }); }); }); }); }) }) } else { if (window.top !== window.self) { const template_type = window.SHOPLAZZA.meta.page.template_type; const holderEl = document.getElementById('smart_recommend_preview_no_data_placeholder'); SPZ.whenApiDefined(holderEl).then((api) => { api.render({data: { isCart: template_type === 13, isCollection: template_type === 2, isProduct: template_type === 1, isIndex: template_type === 15 }}, true); }); } } }); } setAction_() { this.registerAction('quickShop', (data) => { const that = this; const product_id = data.args.product_id; const productIndex = data.args.productIndex; const rule_id = data.args.rule_id; const ssp = data.args.ssp; const scm = data.args.scm; const cfb = data.args.cfb; const ifb = data.args.ifb; const modalRender = document.getElementById('smart_recommend_product_modal_render'); if (product_id) { this.fetchProductData(product_id).then((res) => { const product = res.products && res.products.length && res.products[0] || {}; product.cfb = cfb; product.ifb = ifb; SPZ.whenApiDefined(modalRender).then((api) => { api.render({product: product, productIndex: productIndex, rule_id: rule_id, ssp: ssp, scm: scm, show_type: that.show_type_}, true).then(() => { const modalEl = document.getElementById('smart_recommend_product_modal'); SPZ.whenApiDefined(modalEl).then((modal) => { that.impressListen('#smart_recommend_product_modal', function(){ that.trackQuickShop({ rule_id: rule_id, product_id: product_id }); }); modal.open(); }); const formEl = document.getElementById('smart_recommend_product_form'); SPZ.whenApiDefined(formEl).then((form) => { form.setProduct(product); }); const variantEl = document.getElementById('smart_recommend_product_variants'); SPZ.whenApiDefined(variantEl).then((variant) => { variant.handleRender(product); }); }); }) }); } }); this.registerAction('handleScroll', (data) => { this.directTo(data.args.rule_id, data.args.direction); }); this.registerAction('handleProductChange', (data) => { const variant = data.args.data.variant; const product = data.args.data.product; const imageRenderEl = document.getElementById('smart_recommend_product_image'); SPZ.whenApiDefined(imageRenderEl).then((api) => { api.render({ variant: variant, product: product }, true); }); }); this.registerAction('handleAtcSuccess', (detail) => { const data = detail.args; data.data.product = data.data.product || {}; data.data.variant = data.data.variant || {}; const product_id = data.data.product.id; const product_title = data.data.product.title; const variant_id = data.data.variant.id; const price = data.data.variant.price; const rule_id = data.rule_id; const aid = `smart_recommend.${this.show_type_}.${rule_id}`; const ifb = data.data.product.ifb; const cfb = data.data.product.cfb; const ssp = data.ssp; const scm = data.scm; const spm = `smart_recommend_${this.show_type_}.${data.spmIndex}`; const params = { id: product_id, product_id: product_id, number: 1, name: product_title, variant_id: variant_id, childrenId: variant_id, item_price: price, source: 'add_to_cart', _extra: { aid: aid, ifb: ifb, cfb: cfb, scm: scm, spm: `..${window.SHOPLAZZA.meta.page.template_name}.${spm}`, ssp: ssp, } }; this.tranckAddToCart(params); }); this.registerAction('addATCHook', (data) => { const params = data.args; const spm = `smart_recommend_${this.show_type_}.${params.spmIndex}`; this.myInterceptor_ = window.djInterceptors && window.djInterceptors.track.use({ event: 'dj.addToCart', params: { aid: `smart_recommend.${this.show_type_}.` + params.rule_id, ssp: params.ssp, scm: params.scm, cfb: params.cfb, spm: `..${window.SHOPLAZZA.meta.page.template_name}.${spm}`, }, once: true }); }); } tranckAddToCart(detail) { if (window.$) { window.$(document.body).trigger('dj.addToCart', detail); } } fetchRules() { const payload = { show_type: this.show_type_, }; let that = this; if (this.show_type_ === 6) { let line_items = []; return this.fetchCart().then((res) => { if (res && res.cart && res.cart.line_items) { line_items = res.cart.line_items.map((item) => { return { product_id: item.product_id, variant_id: item.variant_id, quantity: item.quantity, price: item.price } }); } payload.line_items = line_items; that.cart_items_ = line_items; return that.fetchRulesRequest(payload); }); } else { if (this.show_type_ === 3) { payload.line_items = [{ product_id: this.product_resource_id_ }]; } else if (this.show_type_ === 4) { payload.collection_id = this.collection_resource_id_; } else if (this.show_type_ === 7) { payload.customer_id = this.customer_id_; } else if (this.show_type_ === 8) { payload.order_id = this.order_id_; } return this.fetchRulesRequest(payload); } } fetchRulesRequest(payload) { return fetch(window.SHOPLAZZA.routes.root + "/api/possum/recommend_query", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload) }).then(function(res){ if(res.ok){ return res.json(); } }); } fetchCart() { return fetch(`/api/cart/cart-select?r=${Math.random().toString(36).slice(-4)}`) .then((res) => { if (res.ok) { return res.json(); } }); } fetchRuleProductList(rule_id) { const payload = { page: 1, limit: 100, fields: ["title", "url", "image", "min_price_variant.price", "min_price_variant.compare_at_price"], rule_id: rule_id, }; if (this.show_type_ === 3) { payload.line_items = [{ product_id: this.product_resource_id_ }]; } else if (this.show_type_ === 4) { payload.collection_id = this.collection_resource_id_; } else if (this.show_type_ === 6) { payload.line_items = this.cart_items_; } else if (this.show_type_ === 7) { payload.customer_id = this.customer_id_; } else if (this.show_type_ === 8) { payload.order_id = this.order_id_; } return fetch(window.SHOPLAZZA.routes.root + "/api/possum/recommend_products", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload) }).then(function(res){ if(res.ok){ return res.json(); } }).catch(function(err){ console.log(err); }); } fetchProductData(product_id) { return fetch(window.SHOPLAZZA.routes.root + "/api/possum/products", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ product_ids: [product_id], fields: [ "images", "options", "min_price_variant", "variants"] }) }).then(function(res){ if(res.ok){ return res.json(); } }).catch(function(err){ console.log(err); const loadingEl = document.getElementById('smart_recommend_loading'); if (loadingEl) { loadingEl.style.display = 'none'; } }); } getStyle(ele, style) { if (!ele) return; if (window.getComputedStyle) { return window.getComputedStyle(ele)[style]; } return ele.currentStyle[style]; } directTo(id, direction) { const scrollElement = document.getElementById(`smart_recommend_rule_ul_${id}`); const blockWidth = parseInt(this.getStyle(scrollElement, 'width')); const scrollLength = (blockWidth * 0.19 - 12) * 5; const scrollPoint = scrollElement.scrollWidth - scrollElement.clientWidth; if (!scrollElement) return; if (direction === 'left') { if (document.dir === 'rtl') { scrollElement.scrollTo({ left: Math.abs(scrollElement.scrollLeft) >= scrollPoint - 100 ? 0 : scrollElement.scrollLeft - scrollLength, behavior: 'smooth' }); return; } scrollElement.scrollTo({ left: Math.max(scrollElement.scrollLeft - scrollLength, 0), behavior: 'smooth' }); } else { if (document.dir === 'rtl') { scrollElement.scrollTo({ left: Math.abs(scrollElement.scrollLeft) >= scrollPoint + 100 ? 0 : scrollElement.scrollLeft + scrollLength, behavior: 'smooth' }); return; } scrollElement.scrollTo({ left: scrollElement.scrollLeft >= scrollPoint - 100 ? 0 : scrollElement.scrollLeft + scrollLength, behavior: 'smooth' }); } } trackRuleImpress(rule) { if (window.sa && window.sa.track) { window.sa.track("plugin_common", { plugin_name: "upsell", event_type: "impressions", rule_id: rule.id, ssp: rule.ssp, scm: rule.scm, show_type: this.show_type_, support_app_block: window.SHOPLAZZA.theme.support_app_block }); window.sa.track("module_impressions", { aid: `smart_recommend.${this.show_type_}.${rule.id}`, support_app_block: window.SHOPLAZZA.theme.support_app_block }); } } trackQuickShop(data) { window.sa && sa.track && sa.track("plugin_common", { plugin_name: "upsell", event_type: "quick_shop", rule_id: data.rule_id, product_id: data.product_id, show_type: this.show_type_, }); } impressListen(selector, cb) { const el = document.querySelector(selector); const onImpress = (e) => { if (e) { e.stopPropagation(); } cb(); }; if (el && !el.getAttribute('imprsd')) { el.addEventListener('impress', onImpress) } else if (el) { onImpress(); } } } SPZ.defineElement('spz-custom-smart-block', SpzSmartBlockComponent);