๐Ÿงต Great American Journey Collection —— DIY Build Five Timeless Worlds, One Bead At A Time โœจ

$29.98 $29.99 Save $0.01
/** * ไผ˜ๆƒ ็ ็ป„ไปถๆจกๅž‹็ฑป * ๅค„็†ไผ˜ๆƒ ็ ็š„ๆ˜พ็คบๅ’Œไบคไบ’้€ป่พ‘ */ 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 = "68b72b0a-fafb-4068-b8a1-1d6e5d32a87b"; // 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 == 'c35c1671-cd60-498a-ba5d-2ffa32eb0ba7' && 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: "c35c1671-cd60-498a-ba5d-2ffa32eb0ba7", 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);
Style:  ๐Ÿš‚ Railway AdventureTM
Quantity
Share the love
Free worldwide shipping
Free returns
Sustainably made
Secure payments
Description

Description

SHIPPING WORLDWIDE.
๐Ÿ’ฏPayments Via PayPal® and CreditCard.
โญFast refund Guarantee>> Partial or full refund depends on the situation.

๐ŸŽDon't forget to buy some for your family or friends as it's a unique gift idea.โค๏ธโค๏ธโค๏ธ


 ๐ŸŒพ Heartland Farm

๐ŸŒพ Not just a single piece, but an entire farm story.
Bring your own miniature farm to life with this DIY beaded kit. Create tractors, hay wagons, grain carts, barns, farmhouses, windmills, animals, trees, and fences—all combining into a cozy farm scene.

๐Ÿšœ Each model has its own role.
The tractor plows the fields, hay wagons transport the harvest, the barn stores grains, the windmill oversees the farm, and chickens, cows, and sheep bring the scene to life. When complete, it’s more than decoration—it’s a miniature countryside world you built yourself.

๐ŸŽ Perfect for beginners and collectors alike.
The kit includes colorful beads, step-by-step instructions, and essential tools. Ideal for craft hobbies, farmhouse-style home decor, family activities, birthday or holiday gifts.

What’s Included in the Box

  • ๐Ÿšœ Tractor
  • ๐Ÿšš There's a Wagon
  • ๐Ÿ›’ Grain Cart
  • ๐Ÿš Red Barn
  • ๐Ÿ  Farmhouse
  • ๐ŸŒฌ Windmill
  • ๐Ÿ” Chicken Family
  • ๐Ÿ„ Dairy Cow
  • ๐Ÿ‘ Sheep
  • ๐ŸŒณ Apple Tree
  • ๐Ÿชต Fence Set
  • ๐ŸŒพ Hay Bale Stack

๐ŸŽIncludes all 12 models to assemble a full farm story scene.


๐Ÿš‚ Railway Adventure

The Romance Of Travel

A tribute to the golden era of rail travel.

Build the symbols that once connected cities, families, and dreams across the country.

Included:

๐Ÿš‚ Steam Train

๐Ÿ•ฐ Station Clock

๐Ÿงณ Luggage Cart

๐ŸŽŸ Ticket Booth

Perfect For:

Train lovers • History enthusiasts • Vintage decor fans


๐Ÿš— Main Street America

Classic Roads • Timeless Memories

Step back into the golden age of motoring.

From a stylish roadster to a classic taxi, a vintage police cruiser, and a heroic fire truck, this collection celebrates the vehicles that shaped everyday life in early America.

Included:

๐Ÿš— Classic Roadster

๐Ÿš• Vintage Taxi

๐Ÿš“ Retro Police Car

๐Ÿš’ Vintage Fire Truck

Perfect For:

Vintage car lovers • Road trip enthusiasts • Americana collectors


๐Ÿ›ฃ Route 66 Road Trip

The Great American Road Trip

Celebrate one of the most famous highways in the world.

Every piece captures the freedom, adventure, and nostalgia of the legendary Route 66.

Included:

๐Ÿš Camper Van

โ›ฝ Vintage Gas Pump

๐Ÿ›ฃ Route 66 Sign

๐ŸŒต Desert Cactus

Perfect For:

Road trip lovers • RV owners • Route 66 collectors


๐Ÿ Race Day Legends

Feel The Speed

A tribute to motorsport legends.

Build iconic racing symbols and bring the excitement of the racetrack to your display shelf.

Included:

๐ŸŽ Open Wheel Racer

๐Ÿ Checkered Flag

๐Ÿ›ž Racing Tire

๐Ÿ† Champion Trophy

Perfect For:

Racing fans • Formula enthusiasts • Motorsport collectors


๐Ÿ“ฆ What's Included

โœ… Premium Glass Beads

โœ… Step-by-Step Instructions

โœ… Threading Tools

โœ… Display Pieces

โœ… Keychain Accessories

โœ… Collector Packaging


๐ŸŽ Why Customers Love It

โœจ Beginner Friendly

๐Ÿง˜ Relaxing Craft Experience

๐Ÿ  Beautiful Display Pieces

๐ŸŽ Meaningful Gift Idea

๐Ÿ“š Collectible Story-Driven Series

โญ High Completion Rate

Safety Notes:

  • Not suitable for children under 6 โš ๏ธ
  • Adult supervision recommended

BUY NOW →

๐ŸŽDon't forget to buy some for your family or friends as it's a unique gift idea.โค๏ธโค๏ธโค๏ธ

HOW TO PAY

โœ…Payments Via PayPal®Debit and CreditCard.Add to cart first, and Check out, then select Shipping method and Payment method.
โœ…If you checkout with a Debit / Credit Card, just enter your * Card Number, * Expiration Date, and * Secure Code.

Certification

โœˆWORLDWIDE SHIPPINGโœˆ

๐Ÿ’– No Extra Tax, Shipping Calculated at Checkout.
๐Ÿšข Shipping>>Worldwide Express Shipping Available.

WHY US?

  • We have Quality Control department which help us to keep our promise!

  • Price is Always Competitive.

  • Awesome Customer Service.

  • Amazing products along with High Quality.

  • Read reviews from our lovely customers.

OUR GUARANTEE

๐Ÿ“ฆInsured Worldwide Shipping: Each order includes real-time tracking details and insurance coverage in the unlikely event that a package gets lost or stolen in transit.

โœ‰๏ธ24/7 Customer Support: We have a team of live reps ready to help and answer any questions you have within a 24-hour time frame, 7 days a week.

๐Ÿ”’Safe & Secure Checkouts: We use state-of-the-art SSL Secure encryption to keep your personal and financial information 100% protected.

๐Ÿ”’100% Risk-Free Purchase: If you bought it and felt that it is not for you, don't worry. Just hit the Contact us button and send us a message, and we will make it right by offering you a replacement or refund. 100% Simple & Risk-Free process.