🐉 Beginner-Friendly DIY Enchanted Dragon Spiral Hanging Ornament Kit | Complete Kit with All Tools & Step-by-Step Guide Included 💕

$32.99 $44.98 Save $11.99
/** * 优惠码组件模型类 * 处理优惠码的显示和交互逻辑 */ class SpzCustomDiscountCodeModel extends SPZ.BaseElement { constructor(element) { super(element); // 复制按钮和内容的类名 this.copyBtnClass = "discount_code_btn" this.copyClass = "discount_code_value" } isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } buildCallback() { // 初始化服务 this.action_ = SPZServices.actionServiceForDoc(this.element); this.templates_ = SPZServices.templatesForDoc(this.element); this.xhr_ = SPZServices.xhrFor(this.win); } /** * 渲染优惠码组件 * @param {Object} data - 渲染数据 */ doRender_(data) { return this.templates_ .findAndRenderTemplate(this.element, Object.assign(this.getDefaultData(), data) ) .then((el) => { this.clearDom(); this.element.appendChild(el); // 绑定复制代码功能 this.copyCode(el, data); }); } /** * 获取渲染模板 * @param {Object} data - 渲染数据 */ getRenderTemplate(data) { const renderData = Object.assign(this.getDefaultData(), data); return this.templates_ .findAndRenderTemplate(this.element, renderData) .then((el) => { this.clearDom(); return el; }); } /** * 清除DOM内容 */ clearDom() { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); } /** * 获取默认数据 * @returns {Object} 默认数据对象 */ getDefaultData() { return { isMobile: appDiscountUtils.judgeMobile(), isRTL: appDiscountUtils.judgeRTL(), image_domain: this.win.SHOPLAZZA.image_domain, copyBtnClass: this.copyBtnClass, copyClass: this.copyClass } } /** * 复制优惠码功能 * @param {Element} el - 当前元素 */ copyCode(el) { const copyBtnList = el.querySelectorAll(`.${this.copyBtnClass}`); if (copyBtnList.length > 0) { copyBtnList.forEach(item => { item.onclick = async () => { // 确保获取正确的元素和内容 const codeElement = item.querySelector(`.${this.copyClass}`); if (!codeElement) return; // 获取纯文本内容 const textToCopy = codeElement.innerText.trim(); // 尝试使用现代API,如果失败则使用备用方案 try { if (navigator.clipboard && navigator.clipboard.writeText) { await navigator.clipboard.writeText(textToCopy); } else { throw new Error('Clipboard API not available'); } // 显示复制成功提示 this.showCopySuccessToast(textToCopy, el); } catch (err) { console.error('Modern clipboard API failed, trying fallback...', err); // 使用备用复制方案 this.fallbackCopy(textToCopy, el); } const discountId = item.dataset["discountId"]; // 跳转决策: is_redirection + link(可选覆盖) const setting = { is_redirection: item.dataset["redirection"] === "true", link: item.dataset["link"], }; const landingUrl = `/promotions/discount-default/${discountId}`; const finalUrl = appDiscountUtils.resolveDiscountHref(setting, landingUrl); if (finalUrl && appDiscountUtils.inProductBody(this.element)) { this.win.open(finalUrl, '_blank', 'noopener'); } } }) } } /** * 使用 execCommand 的复制方案 * @param {string} codeText - 要复制的文本 * @param {Element} el - 当前元素 */ fallbackCopy(codeText, el) { const textarea = this.win.document.createElement('textarea'); textarea.value = codeText; // 设置样式使文本框不可见 textarea.style.position = 'fixed'; textarea.style.left = '-9999px'; textarea.style.top = '0'; // 添加 readonly 属性防止移动端虚拟键盘弹出 textarea.setAttribute('readonly', 'readonly'); this.win.document.body.appendChild(textarea); textarea.focus(); textarea.select(); try { this.win.document.execCommand('copy'); // 显示复制成功提示 this.showCopySuccessToast(codeText, el); } catch (err) { console.error('Copy failed:', err); } this.win.document.body.removeChild(textarea); } /** * 创建 Toast 元素 * @returns {Element} 创建的 Toast 元素 */ createToastEl_() { const toast = document.createElement('ljs-toast'); toast.setAttribute('layout', 'nodisplay'); toast.setAttribute('hidden', ''); toast.setAttribute('id', 'discount-code-toast'); toast.style.zIndex = '1051'; return toast; } /** * 挂载 Toast 元素到 body * @returns {Element} 挂载的 Toast 元素 */ mountToastToBody_() { const existingToast = this.win.document.getElementById('discount-code-toast'); if (existingToast) { return existingToast; } const toast = this.createToastEl_(); this.win.document.body.appendChild(toast); return toast; } /** * 复制成功的提醒 * @param {string} codeText - 要复制的文本 * @param {Element} el - 当前元素 */ showCopySuccessToast(codeText, el) { const $toast = this.mountToastToBody_(); SPZ.whenApiDefined($toast).then(toast => { toast.showToast("Discount code copied !"); this.codeCopyInSessionStorage(codeText); }); } /** * 复制优惠码成功后要存一份到本地存储中,购物车使用 * @param {string} codeText - 要复制的文本 */ codeCopyInSessionStorage(codeText) { try { sessionStorage.setItem('other-copied-coupon', codeText); } catch (error) { console.error(error) } } } // 注册自定义元素 SPZ.defineElement('spz-custom-discount-code-model', SpzCustomDiscountCodeModel);
/** * Custom discount code component that handles displaying and managing discount codes * @extends {SPZ.BaseElement} */ class SpzCustomDiscountCode extends SPZ.BaseElement { constructor(element) { super(element); // API endpoint for fetching discount codes this.getDiscountCodeApi = "\/api\/storefront\/promotion\/code\/list"; // Debounce timer for resize events this.timer = null; // Current variant ID this.variantId = "fd47ef4d-1cae-479f-91d1-eb113912fc87"; // Store discount code data this.discountCodeData = {} } /** * Check if layout is supported * @param {string} layout - Layout type * @return {boolean} */ isLayoutSupported(layout) { return layout == SPZCore.Layout.LOGIC; } /** * Initialize component after build */ buildCallback() { this.templates_ = SPZServices.templatesForDoc(); this.viewport_ = this.getViewport(); // Bind methods to maintain context this.render = this.render.bind(this); this.resize = this.resize.bind(this); this.switchVariant = this.switchVariant.bind(this); } /** * Setup component when mounted */ mountCallback() { this.getData(); // Add event listeners this.viewport_.onResize(this.resize); this.win.document.addEventListener('dj.variantChange', this.switchVariant); } /** * Cleanup when component is unmounted */ unmountCallback() { this.viewport_.removeResize(this.resize); this.win.document.removeEventListener('dj.variantChange', this.switchVariant); // 清除定时器 if (this.timer) { clearTimeout(this.timer); this.timer = null; } } /** * Handle resize events with debouncing */ resize() { if (this.timer) { clearTimeout(this.timer) this.timer = null; } this.timer = setTimeout(() => { if (appDiscountUtils.inProductBody(this.element)) { this.render(); } else { this.renderSkeleton(); } }, 200); } /** * Handle variant changes * @param {Event} event - Variant change event */ switchVariant(event) { const variant = event.detail.selected; if (variant.product_id == 'eaa0afbc-de5d-4f1b-a007-8259cadee322' && variant.id != this.variantId) { this.variantId = variant.id; this.getData(); } } /** * Fetch discount code data from API */ getData() { if (appDiscountUtils.inProductBody(this.element)) { const reqBody = { product_id: "eaa0afbc-de5d-4f1b-a007-8259cadee322", variant_id: this.variantId, product_type: "default", } if (!reqBody.product_id || !reqBody.variant_id) return; this.discountCodeData = {}; this.win.fetch(this.getDiscountCodeApi, { method: "POST", body: JSON.stringify(reqBody), headers: { "Content-Type": "application/json" } }).then(async (response) => { if (response.ok) { let data = await response.json(); if (data.list && data.list.length > 0) { data.list[0].product_setting.template_config = JSON.parse(data.list[0].product_setting.template_config); // Format timestamps to local timezone const zone = this.win.SHOPLAZZA.shop.time_zone; data.list = data.list.map(item => { if(+item.ends_at !== -1) { item.ends_at = appDiscountUtils.convertTimestampToFormat(+item.ends_at, zone); } item.starts_at = appDiscountUtils.convertTimestampToFormat(+item.starts_at, zone); return item; }); } this.discountCodeData = data; this.render(); } else { this.clearDom(); } }).catch(err => { console.error("discount_code", err) this.clearDom(); }); } else { this.renderSkeleton(); } } /** * Clear component DOM except template */ clearDom() { const children = this.element.querySelector('*:not(template)'); children && SPZCore.Dom.removeElement(children); } /** * Render discount codes with formatted dates */ render() { // Render using discount code model SPZ.whenApiDefined(document.querySelector('#spz_custom_discount_code_model')).then(renderApi => { renderApi.doRender_({ discountCodeData: this.discountCodeData }) }).catch(err => { this.clearDom(); }) } renderSkeleton() { // Render template for non-product pages this.templates_ .findAndRenderTemplate(this.element, { isMobile: appDiscountUtils.judgeMobile() }) .then((el) => { this.clearDom(); this.element.appendChild(el); }) .catch(err => { this.clearDom(); }); } } // Register custom element SPZ.defineElement('spz-custom-discount-code', SpzCustomDiscountCode);
🎁 A Magical Handmade Keepsake:  🪡 DIY Crochet Kit - Create Your Own
Style📦Free Express Shipping Over $40!!:  🔥 Fire Dragon ❤🐉
Quantity
Share the love
Free worldwide shipping
Free returns
Sustainably made
Secure payments
Description

Crochet a Little Magic Into Every Day ✨

Some projects decorate a room. Others fill it with personality.

The DIY Dragon Spiral Hanging Ornament Kit lets you create an adorable fantasy dragon with soft yarn, magical details, colorful beads, and a playful spiral body.

With every stitch, simple materials slowly become a cheerful dragon that feels personal, meaningful, and completely handmade.

Magical to create. Charming to display. Thoughtful to gift.


Create Your Own Enchanted Dragon Collection

Each dragon is inspired by a different magical world, with its own colors, wings, decorations, and personality.

🔥 Fire Dragon Twirl
Warm red and orange tones with bold horns, fiery wings, and glowing accents.

❄️ Frost Dragon Twirl
Icy blue yarn, shimmering wings, crystal-style beads, and snowflake details.

🌿 Forest Dragon Twirl
Soft green and cream colors with leafy wings, woodland beads, and botanical accents.

🌙 Moon Dragon Twirl
Deep purple and midnight tones with crescent moons, stars, and celestial details.

☀️ Sun Dragon Twirl
Golden yellow yarn with warm wings, glowing beads, and cheerful sun-inspired decorations.

☁️ Cloud Dragon Twirl
Pastel mint, pink, and white colors with soft cloud wings and dreamy star accents.

 Aurora Dragon Twirl
Dreamy aqua and lavender tones with crystal wings, iridescent beads, and glowing aurora-inspired details.

🍬 Candy Dragon Twirl
Sweet pink, cream, and mint colors with candy wings, playful sprinkles, and charming lollipop accents.

Every finished dragon features a smiling handmade face, dimensional horns and wings, a flexible spiral body, decorative beads, and fluffy pom-poms.

Perfect for fantasy lovers, crochet enthusiasts, collectors, and anyone who wants to add a little imagination to everyday spaces.


Relax, Crochet, and Watch Your Dragon Come to Life

Enjoy the peaceful rhythm of yarn, stitches, and small creative details.

Follow the included pattern through each stage of the project:

🧶 Crochet the Dragon
Create the head, face, horns, wings, and other character details.

🌀 Shape the Spiral
Build the soft spiral body that gives the ornament its playful hanging form.

 Add the Magic
Attach beads, stars, moons, leaves, snowflakes, and coordinating decorations.

🎀 Assemble and Hang
Connect each section, add the pom-poms, and finish with the hanging cord.

Work on it during a quiet afternoon, a creative weekend, or a relaxing evening away from screens.

Every completed step brings your little dragon closer to life.


A Gift Filled With Time, Care, and Imagination 💝

Many gifts are enjoyed for a moment.

A handmade project creates an experience before it becomes a keepsake.

This dragon crochet kit combines relaxing creative time with a finished decoration that can be displayed and treasured.

It makes a thoughtful gift for:

🎁 Birthdays
🎁 Christmas and holidays
🎁 Fantasy and dragon lovers
🎁 Crochet enthusiasts
🎁 Creative friends and family
🎁 Daughters and granddaughters
🎁 Housewarming celebrations
🎁 Relaxing weekend projects

Gift the complete kit to someone who loves making things, or finish the dragon yourself and give them something created with your own hands.

Once completed, the ornament can brighten bedrooms, nurseries, windows, craft rooms, reading corners, and fantasy-themed spaces.


Product Details

Kit Includes

  • Coordinated yarn for one selected dragon
  • Filling material
  • Facial-detail components
  • Decorative beads and charms
  • Wing and horn materials
  • Hanging cord and connectors
  • Pom-pom materials
  • Crochet pattern
  • Assembly instructions

Available Designs

  • Fire Dragon Twirl
  • Frost Dragon Twirl
  • Forest Dragon Twirl
  • Moon Dragon Twirl
  • Sun Dragon Twirl
  • Cloud Dragon Twirl

Craft Information

Product Type: DIY crochet hanging ornament kit
Craft Technique: Crochet and assembly
Skill Level: Basic crochet familiarity recommended
Finished Style: Three-dimensional spiral dragon ornament
Display Method: Indoor hanging decoration
Quantity: One selected dragon design per kit

Colors, decorative pieces, and component quantities vary according to the selected design. Finished size and shape may vary slightly depending on individual crochet tension.

 Crochet your dragon. Create your magic. Keep the wonder close.