Ready for Christmas - DIY Gift Card Holder – Hand

$19.99  - $29.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 = "22ba557c-e041-4078-b17c-69c49e363f59"; // 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 == 'eed533d6-9566-43cb-b4ec-10a116a6bc2a' && 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: "eed533d6-9566-43cb-b4ec-10a116a6bc2a", 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:  🎅Santa Claus
Qty:  Buy 1 Set
Quantity
$59.99 全球免运费
Free returns
Sustainably made
Secure payments

Description

🎄 Turn Gift Cards Into 12 Christmas Surprises

Transform ordinary gift cards into a thoughtful Christmas experience filled with surprises, memories, photos, handwritten notes, and personal messages.

This charming 5 × 7-inch spiral-bound Christmas Gift Card Album features 12 festive pages ready for you to personalize.

🎁 One Album. Twelve Pages. Endless Possibilities.

Instead of handing someone a gift card inside an envelope, create a gift they can flip through, discover, laugh about, and remember.

🎁 Turn Gift Cards Into a Real Christmas Experience

Gift cards are practical—but they don't have to feel impersonal.

  • Turn multiple gift cards into one thoughtful presentation
  • Create anticipation with every page
  • Add personal messages and surprises
  • Make practical gifts feel more meaningful
  • Create a memorable unwrapping experience

Same gift cards. A completely different experience.

🎄 12 Pages = 12 Opportunities to Surprise

Why stop at one surprise when you can create twelve?

  • 12 festive decorative pages
  • Space for gift cards or messages
  • Mix photos, notes, cash and memories
  • Create a surprise on every page
  • Design your own holiday gifting experience

Coffee on one page. Dinner on another. Shopping on the next.

💌 Make Every Page Personal

This isn't just a gift you buy. It's a gift you finish yourself.

  • Add handwritten Christmas messages
  • Include meaningful family photos
  • Write favorite memories and inside jokes
  • Add holiday wishes
  • Decorate with stickers or drawings

The result is a gift that couldn't come from anyone else.

📖 Smooth Easy-Flip Spiral Binding

The metal spiral binding makes every page easy to turn while giving the album a charming handmade scrapbook feel.

  • Smooth page turning
  • Easy to decorate
  • Comfortable to browse
  • Compact mini-album design
  • Convenient for gifting and storage

Flip. Discover. Smile. Repeat. 🎄

✂️ DIY It Your Way

Every album can be completely different.

  • 🎁 Gift Cards
  • 💵 Cash
  • 📸 Family Photos
  • 💌 Handwritten Messages
  • 😂 Inside Jokes
  • 🎟 Experience Vouchers
  • 🎨 Drawings
  • ❤️ Favorite Memories
  • 🎄 Christmas Wishes

No two finished albums ever need to look the same.

🎓 Perfect for Students & Graduates

Practical gifts become more meaningful when combined with encouragement and personal memories.

  • Great for college students
  • Fun graduation surprise
  • Add useful everyday gift cards
  • Include encouraging messages
  • Perfect for students moving away from home

Gas. Coffee. Food. Shopping.

Student survival—but make it festive. 🎓

❤️ A Keepsake After the Gift Cards Are Gone

The gift cards may eventually be spent—but the memories can stay.

  • Save handwritten notes
  • Keep favorite photos
  • Preserve Christmas memories
  • Store small paper keepsakes
  • Revisit messages years later

What starts as a gift card holder can become a treasured memory book.

💬 What Customers Are Saying

★★★★★

"I made this for my daughter in college and filled it with coffee, grocery and restaurant gift cards. She laughed at my notes almost as much as she loved the cards."

— Jennifer, Austin, TX
★★★★★

"So much better than putting gift cards in envelopes. I added family pictures between the cards and it ended up feeling like a really personal gift."

— Melissa, Columbus, OH
★★★★★

"I used this for our Secret Santa exchange and everyone wanted to know where the little album came from."

— Ashley, Nashville, TN
★★★★★

"The 12 pages were perfect. Some had notes, photos and little jokes. My son actually kept the album afterward."

— Karen, Denver, CO

📏 Product Specifications

Product Type
Christmas Gift Card Album
Size
Approx. 5 × 7 in / 12.7 × 17.8 cm
Pages
12 Decorative Pages
Binding
Metal Spiral Binding
Material
Quality Paper + Metal Spiral
Style
Christmas / Holiday

📦 Package Includes

✔ 1 × Christmas Gift Card Album

✔ 12 × Decorative Pages

Please Note: Gift cards, cash, photos, and decorative accessories shown in examples are not included.

✂️ Create Your Own Gift Experience

1️⃣ Choose Your Recipient

Think about what they enjoy and what would make them smile.

2️⃣ Gather Your Surprises

Prepare gift cards, photos, notes, cash or other lightweight surprises.

3️⃣ Personalize Each Page

Add messages, memories, drawings or decorations.

4️⃣ Arrange Your Surprise Order

Create a fun sequence so every page reveals something new.

5️⃣ Wrap & Gift

Place it under the tree and enjoy watching them flip through all 12 pages.

💡 Fun Ideas for All 12 Pages

1. ☕ Coffee Treat
2. 💌 Personal Message
3. 🍕 Favorite Restaurant
4. 📸 Family Photo
5. 🛍 Shopping Surprise
6. 😂 Inside Joke
7. 🎬 Movie Night
8. ❤️ Favorite Memory
9. ⛽ Everyday Essential
10. 🎟 Experience Voucher
11. 💵 Cash Surprise
12. 🎄 Final Christmas Message

❓ Frequently Asked Questions

How many pages are included?

The album includes 12 decorative pages for gift cards, notes, photos and surprises.

What size is the album?

Approximately 5 × 7 inches, making it compact and easy to gift.

Are gift cards included?

No. Gift cards are not included so you can choose cards specifically for your recipient.

Do I need to put a gift card on every page?

No. Mix gift cards with photos, messages, cash, jokes and memories.

Can I write directly on the pages?

Yes. The album is designed for personalization with messages, names and holiday wishes.

Can it be kept as a memory album?

Yes. After the gift cards are used, the album can still hold photos, notes and memories.

🛡 Shop With Confidence

✔ Secure Checkout

✔ Quality Checked Before Shipping

✔ Carefully Prepared for Delivery

✔ Helpful Customer Support

🎁 Ready to Turn Gift Cards Into Something Unforgettable?

Gift cards don't have to feel impersonal.

Add 12 pages of surprises, handwritten messages, photos, memories and little moments that could only come from you.

They'll enjoy spending the gift cards.

But the album may be the part they keep.

🛒 ADD TO CART & CREATE A GIFT THEY'LL NEVER FORGET