2 In 1 Needle Threader Seam Ripper
2 In 1 Needle Threader Seam Ripper
2 In 1 Needle Threader Seam Ripper
2 In 1 Needle Threader Seam Ripper
2 In 1 Needle Threader Seam Ripper
2 In 1 Needle Threader Seam Ripper
2 In 1 Needle Threader Seam Ripper
2 In 1 Needle Threader Seam Ripper
2 In 1 Needle Threader Seam Ripper
2 In 1 Needle Threader Seam Ripper
2 In 1 Needle Threader Seam Ripper
2 In 1 Needle Threader Seam Ripper
2 In 1 Needle Threader Seam Ripper
2 In 1 Needle Threader Seam Ripper
1/14
2 In 1 Needle Threader Seam Ripper
2 In 1 Needle Threader Seam Ripper
2 In 1 Needle Threader Seam Ripper
2 In 1 Needle Threader Seam Ripper
2 In 1 Needle Threader Seam Ripper
2 In 1 Needle Threader Seam Ripper
2 In 1 Needle Threader Seam Ripper
2 In 1 Needle Threader Seam Ripper
2 In 1 Needle Threader Seam Ripper
2 In 1 Needle Threader Seam Ripper
2 In 1 Needle Threader Seam Ripper
2 In 1 Needle Threader Seam Ripper
2 In 1 Needle Threader Seam Ripper
2 In 1 Needle Threader Seam Ripper
1/14

2 In 1 Needle Threader Seam Ripper

$25.99
$59.99
Save $34.00
Color
Please select a color
Quantity
Please select a quantity
Quantity
/** @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);

FEATURES

  • Our new 2-in-1 kit makes needle threading and seam removal a breeze, and it's the perfect tool for sewing enthusiasts.😍

  • 2-in-1 Double Head Design

  • Our newest gadget features a 2-in-1 dual-ended design that allows you to thread your needle and remove seam threads with ease, making it a reliable companion for sewing!

  • People-friendly Scalable Design

  • It boasts a scalable storage design, safeguarding both ends, for easy storage when not in use. Its compact design allows for convenient carrying, quick repair, and adjustment, resulting in an extended service life.

  • High-Quality Material

  • Made of durable material and solid construction, these seam rippers offer comfortable operation and ensure accuracy in every stitching. They are resistant to wear and tear and can be used for long-term reliability in daily use.

  • Small, Exquisite, Easy to Carry

  • Ensure ready use of our 2-in-1 Needle Threader Seam Ripper by placing it in any sewing toolbox or pocket. Its small size allows for easy storage, making it perfect for carrying around. Simplify seam removal at home or on the road with this portable and convenient tool!

  • The Perfect Gift for Sewing Lovers

  • Our new 2-in-1 Needle Threader Seam Ripper is easy to use and perfect for sewing, crafting, embroidery, and other craft projects, making it a great gift for sewing enthusiasts.

 

SPECIFICATIONS

  • Material: ABS+Steel Wire

  • Size: about 10.5x1.8x1.5cm/4.13x0.71x0.59 inches

  • Package List: 1*2 In 1 Needle Threader Seam Ripper


PACKAGE INCLUDES

  • 1/3/6 x 2 In 1 Needle Threader Seam Ripper


NOTES

  • There may be a slight color difference due to different monitors/brightness. Thank you for your understanding.
  • Please allow a tiny difference due to manual measurement.