{"product_id":"mini-christmas-gift-tote-bag-holiday-party-favor-gift-card-bag-2","title":"🎄 Mini Christmas Gift Tote Bags – Cute Holiday Treat Holders \u0026 Gift Card Bags","description":"\u003cstyle\u003e\n  #aj-tote-unwrapping {\n    position: fixed;\n    inset: 0;\n    z-index: 9998;\n    overflow: hidden;\n    pointer-events: none;\n  }\n\n  #aj-tote-unwrapping[hidden] {\n    display: none !important;\n  }\n\n  #aj-tote-unwrapping .tote-ribbon {\n    position: absolute;\n    top: 9%;\n    width: min(33vw, 350px);\n    height: 48%;\n    border: 3px solid rgba(160, 53, 70, .58);\n    border-left-color: transparent;\n    border-bottom-color: transparent;\n    border-radius: 50%;\n    box-shadow: 2px -3px 0 -1px rgba(196, 150, 73, .62);\n    animation: aj-tote-ribbon-sweep 12s ease-in-out infinite both;\n  }\n\n  #aj-tote-unwrapping .tote-ribbon-left {\n    left: -13%;\n    --ribbon-angle: 28deg;\n  }\n\n  #aj-tote-unwrapping .tote-ribbon-right {\n    top: 37%;\n    right: -13%;\n    border-top-color: rgba(49, 105, 77, .62);\n    border-right-color: rgba(49, 105, 77, .62);\n    --ribbon-angle: 205deg;\n    animation-delay: -3s;\n  }\n\n  #aj-tote-unwrapping .tote-gift {\n    --gift-width: clamp(76px, 12vw, 142px);\n    --bag: #aa3e50;\n    --edge: #762736;\n    --entry: -20px;\n    --tilt: -8deg;\n    --offset: 0s;\n    position: absolute;\n    top: 66%;\n    left: clamp(8px, 4vw, 60px);\n    width: var(--gift-width);\n    aspect-ratio: 1.1;\n    animation: aj-tote-gift-arrive 12s ease-in-out infinite both;\n    animation-delay: var(--offset);\n  }\n\n  #aj-tote-unwrapping .tote-gift-green {\n    --bag: #39765b;\n    --edge: #224d3a;\n    --entry: 20px;\n    --tilt: 8deg;\n    --offset: -6s;\n    top: 35%;\n    left: auto;\n    right: clamp(8px, 4vw, 60px);\n  }\n\n  #aj-tote-unwrapping .tote-bag {\n    position: absolute;\n    z-index: 2;\n    inset: 30% 4% 0;\n    display: grid;\n    place-items: center;\n    border: 1px solid var(--edge);\n    border-radius: 7px 7px 15px 15px;\n    background:\n      repeating-linear-gradient(\n        90deg,\n        transparent 0 5px,\n        rgba(255, 255, 255, .05) 5px 6px\n      ),\n      linear-gradient(145deg, var(--bag), var(--edge));\n    box-shadow: 0 8px 18px rgba(52, 27, 27, .21);\n    color: #f6d997;\n    font: 27px\/1 Georgia, serif;\n  }\n\n  #aj-tote-unwrapping .tote-bag::after {\n    content: \"\";\n    position: absolute;\n    inset: 6px;\n    border: 1px dashed rgba(255, 237, 204, .65);\n    border-radius: 4px 4px 10px 10px;\n  }\n\n  #aj-tote-unwrapping .tote-handle {\n    position: absolute;\n    z-index: 3;\n    top: 5%;\n    left: 30%;\n    width: 40%;\n    height: 30%;\n    box-sizing: border-box;\n    border: 4px solid var(--edge);\n    border-bottom: 0;\n    border-radius: 50% 50% 0 0;\n  }\n\n  #aj-tote-unwrapping .tote-card {\n    position: absolute;\n    z-index: 1;\n    top: 32%;\n    left: 13%;\n    width: 74%;\n    box-sizing: border-box;\n    padding: 8px 4px;\n    border: 1px solid #d7b36d;\n    border-radius: 5px;\n    background: linear-gradient(135deg, #fffdf2, #f7e3b7);\n    box-shadow: 0 4px 10px rgba(60, 40, 23, .2);\n    color: #62401f;\n    font: 700 clamp(10px, 1.3vw, 15px)\/1.15 Georgia, serif;\n    text-align: center;\n    animation: aj-tote-card-reveal 12s ease-in-out infinite both;\n    animation-delay: var(--offset);\n  }\n\n  #aj-tote-unwrapping .tote-star {\n    position: absolute;\n    top: var(--y);\n    left: var(--x);\n    color: var(--color);\n    font: var(--size)\/1 Georgia, serif;\n    text-shadow: 0 0 6px #fff0cb;\n    animation: aj-tote-star-drift 12s ease-out infinite both;\n    animation-delay: var(--delay);\n  }\n\n  #aj-tote-unwrapping .tote-close {\n    position: absolute;\n    top: calc(76px + env(safe-area-inset-top, 0px));\n    right: calc(12px + env(safe-area-inset-right, 0px));\n    min-height: 44px;\n    padding: 7px 12px;\n    border: 1px solid #decfb7;\n    border-radius: 24px;\n    background: #fffbf1;\n    color: #514333;\n    font: 600 12px\/1.3 Arial, sans-serif;\n    cursor: pointer;\n    pointer-events: auto;\n  }\n\n  #aj-tote-unwrapping .tote-close:focus-visible {\n    outline: 2px solid #34644e;\n    outline-offset: 3px;\n  }\n\n  #aj-tote-unwrapping[data-paused] * {\n    animation-play-state: paused;\n  }\n\n  @keyframes aj-tote-ribbon-sweep {\n    0% {\n      opacity: 0;\n      transform: translateY(-24px) rotate(var(--ribbon-angle)) scale(.8);\n    }\n    10% { opacity: .78; }\n    28%, 100% {\n      opacity: 0;\n      transform: translateY(32px) rotate(var(--ribbon-angle)) scale(1.15);\n    }\n  }\n\n  @keyframes aj-tote-gift-arrive {\n    0%, 7% {\n      opacity: 0;\n      transform: translate(var(--entry), 24px) rotate(var(--tilt)) scale(.88);\n    }\n    17%, 39% {\n      opacity: 1;\n      transform: translate(0, 0) rotate(var(--tilt)) scale(1);\n    }\n    49%, 100% {\n      opacity: 0;\n      transform: translate(0, 13px) rotate(var(--tilt)) scale(.95);\n    }\n  }\n\n  @keyframes aj-tote-card-reveal {\n    0%, 17% { opacity: 0; transform: translateY(0); }\n    22% { opacity: 1; }\n    27%, 37% {\n      opacity: 1;\n      transform: translateY(calc(var(--gift-width) * -.64)) rotate(5deg);\n    }\n    47%, 100% { opacity: 0; transform: translateY(-12px); }\n  }\n\n  @keyframes aj-tote-star-drift {\n    0%, 22% { opacity: 0; transform: translate(0, 12px) scale(.65); }\n    29% { opacity: .86; }\n    45%, 100% {\n      opacity: 0;\n      transform: translate(var(--drift), -40px) rotate(32deg) scale(1.05);\n    }\n  }\n\n  @media (max-width: 600px) {\n    #aj-tote-unwrapping .tote-ribbon { width: 38vw; }\n    #aj-tote-unwrapping .tote-ribbon-left { left: -20%; }\n    #aj-tote-unwrapping .tote-ribbon-right { right: -20%; }\n    #aj-tote-unwrapping .tote-gift { left: 5px; }\n    #aj-tote-unwrapping .tote-gift-green { left: auto; right: 5px; }\n    #aj-tote-unwrapping .tote-bag { font-size: 20px; }\n  }\n\n  @media (prefers-reduced-motion: reduce) {\n    #aj-tote-unwrapping { display: none !important; }\n  }\n\u003c\/style\u003e\n\n\u003cdiv id=\"aj-tote-unwrapping\" hidden\u003e\n  \u003cdiv aria-hidden=\"true\"\u003e\n    \u003cspan class=\"tote-ribbon tote-ribbon-left\"\u003e\u003c\/span\u003e\n    \u003cspan class=\"tote-ribbon tote-ribbon-right\"\u003e\u003c\/span\u003e\n\n    \u003cdiv class=\"tote-gift\"\u003e\n      \u003cspan class=\"tote-handle\"\u003e\u003c\/span\u003e\n      \u003cspan class=\"tote-card\"\u003eFor You\u003c\/span\u003e\n      \u003cspan class=\"tote-bag\"\u003e✦\u003c\/span\u003e\n    \u003c\/div\u003e\n\n    \u003cdiv class=\"tote-gift tote-gift-green\"\u003e\n      \u003cspan class=\"tote-handle\"\u003e\u003c\/span\u003e\n      \u003cspan class=\"tote-card\"\u003eMerry\u003cbr\u003eChristmas\u003c\/span\u003e\n      \u003cspan class=\"tote-bag\"\u003e✦\u003c\/span\u003e\n    \u003c\/div\u003e\n\n    \u003cdiv data-tote-stars\u003e\u003c\/div\u003e\n  \u003c\/div\u003e\n\n  \u003cbutton type=\"button\" class=\"tote-close\"\u003eHide animation ×\u003c\/button\u003e\n\u003c\/div\u003e\n\n\u003cscript\u003e\n  (() =\u003e {\n    const productPath = '\/products\/mini-christmas-gift-tote-bag-holiday-party-favor-gift-card-bag-2';\n    const path = location.pathname.replace(\/\\\/+$\/, '');\n    const layer = document.getElementById('aj-tote-unwrapping');\n    const motion = matchMedia('(prefers-reduced-motion: reduce)');\n    const storageKey = 'alasjoy:tote-unwrapping:closed';\n    const editor = Boolean(window.Shopify?.designMode);\n\n    if (!layer || !path.endsWith(productPath) || motion.matches || layer.dataset.started) return;\n\n    try {\n      if (!editor \u0026\u0026 sessionStorage.getItem(storageKey) === '1') return;\n    } catch {\n      \/\/ Session storage is optional.\n    }\n\n    const section = layer.closest('.shopify-section');\n    const listeners = new AbortController();\n    const options = { signal: listeners.signal };\n    const compact = matchMedia('(max-width: 600px)').matches;\n    const starCount = compact ? 12 : 22;\n    const stars = document.createDocumentFragment();\n\n    for (let index = 0; index \u003c starCount; index += 1) {\n      const star = document.createElement('span');\n      const right = index % 2 === 1;\n      const edge = 2 + Math.random() * (compact ? 12 : 19);\n      const stagger = (Math.floor(index \/ 2) % 5) * 0.16;\n\n      star.className = 'tote-star';\n      star.textContent = index % 3 === 0 ? '✧' : '✦';\n      star.style.setProperty('--x', `${right ? 100 - edge : edge}%`);\n      star.style.setProperty('--y', `${14 + Math.random() * 70}%`);\n      star.style.setProperty('--size', `${8 + Math.random() * (compact ? 5 : 9)}px`);\n      star.style.setProperty('--color', index % 4 === 0 ? '#dca9a4' : '#c59448');\n      star.style.setProperty('--delay', `${(right ? -6 : 0) + stagger}s`);\n      star.style.setProperty('--drift', `${right ? -19 : 19}px`);\n      stars.appendChild(star);\n    }\n\n    layer.querySelector('[data-tote-stars]').appendChild(stars);\n\n    function syncVisibility() {\n      layer.toggleAttribute('data-paused', document.hidden);\n    }\n\n    function stop() {\n      listeners.abort();\n      layer.remove();\n    }\n\n    layer.querySelector('.tote-close').addEventListener('click', () =\u003e {\n      try {\n        if (!editor) sessionStorage.setItem(storageKey, '1');\n      } catch {\n        \/\/ The effect can still close on this page.\n      }\n      stop();\n    }, options);\n\n    document.addEventListener('visibilitychange', syncVisibility, options);\n    motion.addEventListener('change', (event) =\u003e {\n      if (event.matches) stop();\n    }, options);\n    document.addEventListener('shopify:section:unload', (event) =\u003e {\n      if (event.target === section) stop();\n    }, options);\n\n    layer.dataset.started = 'true';\n    document.body.appendChild(layer);\n    syncVisibility();\n    layer.hidden = false;\n  })();\n\u003c\/script\u003e","brand":"zhidou","offers":[{"title":"Red","offer_id":68292065820909,"sku":"DX3760223-Red","price":14.99,"currency_code":"USD","in_stock":true},{"title":"Green","offer_id":68292065853677,"sku":"DX3760223-Green","price":14.99,"currency_code":"USD","in_stock":true},{"title":"Red+Green","offer_id":68292065886445,"sku":"DX3760223-Red+DX3760223-Green","price":24.99,"currency_code":"USD","in_stock":true}],"thumbnail_url":"\/\/cdn.shopify.com\/s\/files\/1\/0841\/9354\/2381\/files\/bbea685583103c0de2d4d24a97ae63a76a5597d5.webp?v=1794536987","url":"https:\/\/alasjoy.com\/products\/mini-christmas-gift-tote-bag-holiday-party-favor-gift-card-bag-2","provider":"alasjoy","version":"1.0","type":"link"}