DIY Diamond Embroidery Mosaic Pen Painting Cross Stitch Crafts Tool Kits
DIY Diamond Embroidery Mosaic Pen Painting Cross Stitch Crafts Tool Kits
DIY Diamond Embroidery Mosaic Pen Painting Cross Stitch Crafts Tool Kits
DIY Diamond Embroidery Mosaic Pen Painting Cross Stitch Crafts Tool Kits
DIY Diamond Embroidery Mosaic Pen Painting Cross Stitch Crafts Tool Kits
DIY Diamond Embroidery Mosaic Pen Painting Cross Stitch Crafts Tool Kits
1 / 6
DIY Diamond Embroidery Mosaic Pen Painting Cross Stitch Crafts Tool Kits
DIY Diamond Embroidery Mosaic Pen Painting Cross Stitch Crafts Tool Kits
DIY Diamond Embroidery Mosaic Pen Painting Cross Stitch Crafts Tool Kits
DIY Diamond Embroidery Mosaic Pen Painting Cross Stitch Crafts Tool Kits
DIY Diamond Embroidery Mosaic Pen Painting Cross Stitch Crafts Tool Kits
DIY Diamond Embroidery Mosaic Pen Painting Cross Stitch Crafts Tool Kits
0% OFF
SOD

DIY Diamond Embroidery Mosaic Pen Painting Cross Stitch Crafts Tool Kits

163325

$9.99
1 sold
Qty 61 in stock

Specifications:

Material: plastic + copper pen head

Size: clay: 23 x 20mm/0.91 x 0.79in, tray: 50 x 90mm/1.97 x 3.54in, point drill pen length 125mm/4.92in
Color: clay red, tray green, point drill pen pink
Weight: 8g

Package Content:
1 X Clay
1 X Point drill pen
1 X Tray
/** @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-1736477762476').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);