Looking for a custom kit or quote? Email us at [email protected]

Create account

Already have an account? Log in here

'; const targetWrapper = getBundleRenderTarget(); if(targetWrapper){ targetWrapper.innerHTML = ""; targetWrapper.appendChild(bundleWrapperDiv); }else{ document.body.appendChild(bundleWrapperDiv); } }catch(err){ debugConsole("error in buildDummyProductHtmlForBundles", err); } } async function getBundleDataFromS3() { try { const parentProductsData = window?.shopifyLiquidValuesApp4Ext?.product?.bundleProductConfiguration; if(!parentProductsData?.bundleId) return null; const shopName = window.Shopify.shop; const s3Url = `https://gift-box-builder-app4.s3.us-east-2.amazonaws.com/public/backup-config/${shopName}/${parentProductsData?.bundleId}.json` const fetchResponse = await fetch(s3Url); const data = await fetchResponse.json(); return data || null; } catch (error) { debugConsole("Error in getBundleDataFromS3:", error); return null; } } // { errorMsg } sentinel: written when a metafield exceeds ~1.8 MB. function isOverflowed(value) { if ( value !== null && typeof value === 'object' && !Array.isArray(value) && value.errorMsg !== undefined && value.errorMsg !== null ) { return true; } return false; } function isForceCdn(){ try { return new URLSearchParams(location.search).get('gbbForceCdn') === 'true' || localStorage.getItem('gbbForceCdn') === 'true'; } catch(_){ return false; } } // R2-first, 3s timeout; failure memoized so later loads skip R2; null when both fail. async function fetchOverflowedDataFromCDN(s3Key, memoKey){ const shouldSkipR2 = (function(){ try { return localStorage.getItem('gbbSdk.' + memoKey) === 'true'; } catch(_){ return false; } })(); const buster = '?nocache=' + Date.now(); const r2Url = 'https://giftbox.giftkartcdn.app/' + s3Key + buster; const s3Url = 'https://gift-box-builder-app4.s3.us-east-2.amazonaws.com/' + s3Key + buster; if (!shouldSkipR2) { try { const r2Resp = await Promise.race([ fetch(r2Url), new Promise(function(_, rej){ setTimeout(function(){ rej(new Error('r2-timeout')); }, 3000); }) ]); if (r2Resp.ok) { const data = await r2Resp.json(); if (data) return data; } } catch (e) { debugConsole('R2 fetch failed for ' + memoKey + ', falling back to S3:', e); try { localStorage.setItem('gbbSdk.' + memoKey, 'true'); } catch(_){} } } try { const s3Resp = await fetch(s3Url); if (!s3Resp.ok) return null; return (await s3Resp.json()) || null; } catch (e) { debugConsole('S3 fetch failed for ' + memoKey + ':', e); return null; } } async function getSdkBundleDataFromCDN(offerId){ if (!offerId) return null; const shopName = window.Shopify.shop; return fetchOverflowedDataFromCDN('public/backup-config/' + shopName + '/' + offerId + '.json', 'useS3ForBundleConfig'); } async function getUpsellIndexFromCDN(){ const shopName = window.Shopify.shop; return fetchOverflowedDataFromCDN('public/sdk-bundle-upsell-index/' + shopName + '.json', 'useS3ForUpsellIndex'); } function initializeShopifyValues() { const productDetails = getProductData() window.shopifyLiquidValuesApp4Ext = { product: productDetails, cartData: {"note":null,"attributes":{},"original_total_price":0,"total_price":0,"total_discount":0,"total_weight":0.0,"item_count":0,"items":[],"requires_shipping":false,"currency":"MDL","items_subtotal_price":0,"cart_level_discount_applications":[],"checkout_charge_amount":0}, selected_or_first_available_variant: productDetails.selected_or_first_available_variant }; let ext_data = {"userData":{"shopName":"different-roads.myshopify.com","countryCode":"US","countryName":"United States","currency":"USD","currencyInfo":{"code":"USD","symbol":"$","thousandsSeparator":",","decimalSeparator":".","symbolOnLeft":true,"spaceBetweenAmountAndSymbol":false,"decimalDigits":2},"customSettings":{"initialModalPopupCnt":0,"disableCartSettings":false,"addToCartBtnSelectors":null,"checkoutBtnSelectors":null,"customStyle":null,"addAfterAddTocartBtn":false,"addAftercheckoutBtn":false,"disableApp":false,"loadingGif":"https:\/\/gift-box-builder-app4.s3.us-east-2.amazonaws.com\/public\/icons\/loadingGif.gif","stackDiscounts":true,"showOnlyAdminSelectedVariants":true,"overWriteCheckoutBtn":false,"addGiftMessageToNote":true},"bundleSettings":{"allowMultipleBoxesFromSameBundle":true,"showCompareAtPrice":true,"dontIndexGiftboxBuilderPages_onGoogle":false,"isValidateInventoryEnabled":false,"calculateAutomaticDiscountInPercentage":true},"isAppLevelMetafieldCreated":true,"storefrontAccessToken":"30dc3effe0240e23be727396cda72a9b","createdAt":"2023-08-09T15:47:16.712Z","multipleCurrenciesInfo":{"USD":{"code":"USD","symbol":"$","thousandsSeparator":",","decimalSeparator":".","symbolOnLeft":true,"spaceBetweenAmountAndSymbol":false,"decimalDigits":2}}},"languageData":{"_id":"64d3b505dd2fb15e39c866d7","shopName":"different-roads.myshopify.com","__v":0,"createdAt":"2023-08-09T15:47:17.009Z","en":{"landingPage":{"bannerText":{"id":"bannerText","label":"Banner Text","type":"text","value":"Build your own Bundle in just a few clicks!"},"bannerSubtext":{"id":"bannerSubtext","label":"Banner Subtext","type":"text","value":"Send a custom bundle to your loved one in just a few steps"},"bannerButtonText":{"id":"bannerButtonText","label":"Banner Button Text","type":"text","value":"Start Building your Bundle"},"selectPreCuratedBoxLabel":{"id":"selectPreCuratedBoxLabel","label":"Select Pre-Curated Box Label","type":"text","value":"Or select from a range of pre-curated Gift Boxes"}},"navigationSteps":{"productPageStepText":{"id":"productPageStepText","label":"Product Page Step Text","type":"text","value":"Add Products"},"giftBoxStepText":{"id":"giftBoxStepText","label":"Bundle Step Text","type":"text","value":"Add Gift Box"},"personalizeStepText":{"id":"personalizeStepText","label":"Personalize Step Text","type":"text","value":"Personalize"},"multipleCategoriesStepText":{"id":"multipleCategoriesStepText","label":"Multiple Categories Step Text","type":"text","value":"Multiple Categories"}},"productPage":{"selectProductsLabel":{"id":"selectProductsLabel","label":"Select Products Label","type":"text","value":"Select Products"},"productPageSubtext":{"id":"productPageSubtext","label":"Product Page Subtext","type":"text","value":""}},"giftBoxPage":{"selectGiftBoxLabel":{"id":"selectGiftBoxLabel","label":"Select Bundle Label","type":"text","value":"Select a Bundle Box"},"giftBoxPageSubtext":{"id":"giftBoxPageSubtext","label":"Gift Box Page Subtext","type":"text","value":""}},"videoMessage":{"permissionDenied":{"id":"permissionDenied","label":"Permission Denied","type":"text","value":"Permission Denied"},"uploadConfirmation":{"id":"uploadConfirmation","label":"Upload Confirmation","type":"text","value":"Your video has been successfully uploaded!"},"pressToRecord":{"id":"pressToRecord","label":"Press to record","type":"text","value":"Press to record"},"recording":{"id":"recording","label":"Recording","type":"text","value":"Recording...."},"errorMessage":{"id":"errorMessage","label":"Error Message","type":"text","value":"An error occured, Please try again!"},"loading":{"id":"loading","label":"Loading","type":"text","value":"Loading...."},"uploading":{"id":"uploading","label":"Uploading","type":"text","value":"Uploading...."},"sendVideoMessageText":{"id":"sendVideoMessageText","label":"Send Video Message Text","type":"text","value":"Send Video Message"},"giftMessageDeliveryInfo":{"id":"giftMessageDeliveryInfo","label":"Message Delivery Info","type":"text","value":"The message will be sent to the recipient via email as soon as the order is placed"},"saveVideoText":{"id":"saveVideoText","label":"Save Video Text","type":"text","value":"Save Video"},"reRecordVideoText":{"id":"reRecordVideoText","label":"Re-Record Video Text","type":"text","value":"Re-Record Video"}},"personalizePage":{"selectGreetingCardLabel":{"id":"selectGreetingCardLabel","label":"Select Greeting Card Label","type":"text","value":"Select A Greeting Card"},"clearSelectionButton":{"id":"clearSelectionButton","label":"Clear Selection label","type":"text","value":"Clear Selection"},"noImagesAvailable":{"id":"noImagesAvailable","label":"No Images Available label","type":"text","value":"No Images Available"},"messageLabel":{"id":"messageLabel","label":"Message Label","type":"text","value":"Message"},"senderNamePlaceholder":{"id":"senderNamePlaceholder","label":"Sender Name Placeholder","type":"text","value":"From"},"recipientNamePlaceholder":{"id":"recipientNamePlaceholder","label":"Recipient Name Placeholder","type":"text","value":"To"},"messagePlaceholder":{"id":"messagePlaceholder","label":"Message Placeholder","type":"text","value":"Enter a message here..."},"emailAddressLabel":{"id":"emailAddressLabel","label":"Recipient Email Address Label","type":"text","value":"Recipient Email Address"},"emailAddressPlaceholder":{"id":"emailAddressPlaceholder","label":"Recipient Email Address Placeholder","type":"text","value":"Enter a recipient email address here..."},"emailValidationMessage":{"id":"emailValidationMessage","label":"Email Validation Message","type":"text","value":"Please enter a valid email address"},"sendNow":{"id":"sendNow","label":"Send Now Label","type":"text","value":"Send Now"},"sendLater":{"id":"sendLater","label":"Send Later Label","type":"text","value":"Send Later"},"personalizePageSubtext":{"id":"personalizePageSubtext","label":"Personalize Page Subtext","type":"text","value":""},"messageIsRequiredError":{"id":"messageIsRequiredError","label":"Message is required warning","type":"text","value":"Please enter a message"}},"reviewPage":{"reviewPageBannerText":{"id":"reviewPageBannerText","label":"Review Page Banner Text","type":"text","value":"You’ve made the Right Choice!"},"reviewPageBannerSubtext":{"id":"reviewPageBannerSubtext","label":"Review Page Banner Subtext","type":"text","value":"Review your bundle and proceed to checkout"},"addOnsLabel":{"id":"addOnsLabel","label":"Add Ons Label","type":"text","value":"Add Ons"},"totalValueLabel":{"id":"totalValueLabel","label":"Total Value Label","type":"text","value":"Total Value"},"totalLabel":{"id":"totalLabel","label":"Total Label","type":"text","value":"Total"},"productLabel":{"id":"productLabel","label":"Product Header Label","type":"text","value":"Product"},"priceLabel":{"id":"priceLabel","label":"Price Header Text","type":"text","value":"Price"},"quantityLabel":{"id":"quantityLabel","label":"Quantity Header Text","type":"text","value":"Quantity"},"deliveryDateLabel":{"id":"deliveryDateLabel","label":"Delivery Date Label","type":"text","value":"Delivery Date"},"productsLabelText":{"id":"productsLabelText","label":"Products Label Text","type":"text","value":"Products"},"messagesLabelText":{"id":"messagesLabelText","label":"Messages Label Text","type":"text","value":"Messages"},"discountAppliedLabel":{"id":"discountAppliedLabel","label":"Discount Applied Label","type":"text","value":"Discount"},"subtotalLabel":{"id":"subtotalLabel","label":"Sub Total Label","type":"text","value":"Subtotal"},"orderDetailsLabel":{"id":"orderDetailsLabel","label":"Order Details Label","type":"text","value":"Order Details"},"itemsLabel":{"id":"itemsLabel","label":"No. of Items Label","type":"text","value":"Item(s)"},"oneTimePurchaseLabel":{"id":"oneTimePurchaseLabel","label":"One-Time Purchase label","type":"text","value":"One-Time Purchase"},"subscribeAndSaveLabel":{"id":"subscribeAndSaveLabel","label":"Subscribe and Save label","type":"text","value":"Subscribe and Save"},"noSubscriptionFoundLabel":{"id":"noSubscriptionFoundLabel","label":"No Subscription plans found label","type":"text","value":"Oops! No Subscription plans were found"},"deliveryFrequencyLabel":{"id":"deliveryFrequencyLabel","label":"Delivery Frequency Label","type":"text","value":"Delivery Frequency"},"createNewBoxLabel":{"id":"createNewBoxLabel","label":"Create New Box Label","type":"text","value":"Create new Box"},"editButtonText":{"id":"editButtonText","label":"Edit Label","type":"text","value":"Edit"},"deliverySchedulerPlaceholderText":{"id":"deliverySchedulerPlaceholderText","label":"Delivery Scheduler Placeholder Text","type":"text","value":"Select a date"}},"general":{"noProductsAvailable":{"id":"noProductsAvailable","label":"No Products Available label","type":"text","value":"No Products Available"},"filtersLabel":{"id":"filtersLabel","label":"Filters Label","type":"text","value":"Filters"},"clearSelection":{"id":"clearSelection","label":"Clear Filters Selection","type":"text","value":"Clear Selection"},"searchLabel":{"id":"searchLabel","label":"Search Label","type":"text","value":"Search"},"addToBoxButtonText":{"id":"addToBoxButtonText","label":"Add To Box Button","type":"text","value":"Add To Box"},"chooseOptionsButtonText":{"id":"chooseOptionsButtonText","label":"Choose Options Button","type":"text","value":"Choose Options"},"loadMoreProductsButtonText":{"id":"loadMoreProductsButtonText","label":"Load More Products Button","type":"text","value":"Load More Products"},"loadingCheckoutButtonText":{"id":"loadingCheckoutButtonText","label":"Loading Checkout Button","type":"text","value":"Loading Checkout..."},"addedText":{"id":"addedText","label":"Added Label","type":"text","value":"Added"},"addButtonText":{"id":"addButtonText","label":"Add Button Text","type":"text","value":"Add"},"nextButtonText":{"id":"nextButtonText","label":"Next Button Text","type":"text","value":"Next"},"addToCartButtonText":{"id":"addToCartButtonText","label":"Add To Cart Button Text","type":"text","value":"Add To Cart"},"backButtonText":{"id":"backButtonText","label":"Back Button Text","type":"text","value":"Back"},"checkoutButtonText":{"id":"checkoutButtonText","label":"Checkout Button Text","type":"text","value":"Checkout"},"removeButtonText":{"id":"removeButtonText","label":"Remove Button Text","type":"text","value":"Remove"},"reviewButtonText":{"id":"reviewButtonText","label":"Review Button Text","type":"text","value":"Review"},"combinationNotAvailable":{"id":"combinationNotAvailable","label":"Combination Not Available","type":"text","value":"Combination Not Available"},"quantity":{"id":"quantity","label":"Quantity Label","type":"text","value":"Quantity"},"viewCartProductsLabel":{"id":"viewCartProductsLabel","label":"View Cart Products Label","type":"text","value":"View Selected Products"},"selectedProductsLabel":{"id":"selectedProductsLabel","label":"Selected Products Label","type":"text","value":"Selected Products"},"selectBundleProductsText":{"id":"selectBundleProductsText","label":"Select Bundle Products label","type":"text","value":"Select Bundle Products"},"redirectingText":{"id":"redirectingText","label":"Redirecting label","type":"text","value":"Redirecting..."},"preparingBundleText":{"id":"preparingBundleText","label":"Preparing Bundle Label","type":"text","value":"Preparing Bundle..."},"productsNotAvailableText":{"id":"productsNotAvailableText","label":"Products Not Available Label","type":"text","value":"Oops! Some Products are not available"},"discountsMayNotApplyText":{"id":"discountsMayNotApplyText","label":"Discounts may not be applied Label","type":"text","value":"discounts may not be applied"},"removeAllBoxProducts":{"id":"removeAllBoxProducts","label":"Remove all Box Products Label (Cart Page Popup)","type":"text","value":"This is a Box Product. Removing this will remove all the products from box"},"cartPageCheckoutButtonLoadingText":{"id":"cartPageCheckoutButtonLoadingText","label":"Cart Page Checkout Button Loading Text","type":"text","value":"Loading Checkout..."},"inventoryInStockText":{"id":"inventoryInStockText","label":"Inventory in Stock Label","type":"text","value":"in Stock"},"inventoryLimitReachedText":{"id":"inventoryLimitReachedText","label":"Inventory Limit Reached Label","type":"text","value":"No More Stock"},"productAddedBtnText":{"id":"productAddedBtnText","label":"Product Added label","type":"text","value":"Added"},"boxSelectionEligibilityToast":{"id":"boxSelectionEligibilityToast","label":"Box Selection Eligibility Toast","type":"text","value":"Remove {{boxSelectionDifference}} item(s) to select this box"},"discountRibbonSuffix":{"id":"discountRibbonSuffix","label":"Discount Badge Suffix","type":"text","value":"off"},"itemsInCartLabel":{"id":"itemsInCartLabel","label":"Cart Inclusion Title","type":"text","value":"item(s)"},"removeFooterProductFrom":{"id":"removeFooterProductFrom","label":"Remove Product from Footer Text","type":"text","value":"Remove This Product From {{stepName}}"},"selectSubscriptionPlanButtonText":{"id":"selectSubscriptionPlanButtonText","label":"Subscription Selection Label","type":"text","value":"Select Subscription Plan"}},"discountRules":{"rule1":{"amount":{"id":"amount","label":"Amount","type":"text","value":""},"text":{"id":"text","label":"Text","type":"text","value":""}},"rule2":{"amount":{"id":"amount","label":"Amount","type":"text","value":""},"text":{"id":"text","label":"Text","type":"text","value":""}},"rule3":{"amount":{"id":"amount","label":"Amount","type":"text","value":""},"text":{"id":"text","label":"Text","type":"text","value":""}},"rule4":{"amount":{"id":"amount","label":"Amount","type":"text","value":""},"text":{"id":"text","label":"Text","type":"text","value":""}},"rule5":{"amount":{"id":"amount","label":"Amount","type":"text","value":""},"text":{"id":"text","label":"Text","type":"text","value":""}}},"sortBy":{"sortLabel":{"id":"sortLabel","label":"Sort Label","type":"text","value":"Sort"},"alphabeticalAToZ":{"id":"alphabeticalAToZ","label":"Alphabetical, A-Z Label","value":"Alphabetical, A-Z"},"alphabeticalZToA":{"id":"alphabeticalZToA","label":"Alphabetical, Z-A Label","value":"Alphabetical, Z-A"},"priceHighToLow":{"id":"priceHighToLow","label":"Price, High to Low Label","value":"Price, High to Low"},"priceLowToHigh":{"id":"priceLowToHigh","label":"Price, Low to High Label","value":"Price, Low to High"},"featured":{"id":"featured","label":"Featured Label","type":"text","value":"Featured"}},"conditions":{"amount":{"greaterThanOrEqualTo":{"id":"greaterThanOrEqualTo","label":"Greater than condition message","type":"text","value":"Add products worth at least {{conditionAmount}} on this step"},"lessThanOrEqualTo":{"id":"lessThanOrEqualTo","label":"Less than condition message","type":"text","value":"Add products worth maximum of {{conditionAmount}} on this step"},"equalTo":{"id":"equalTo","label":"Equal to condition message","type":"text","value":"Add products worth {{conditionAmount}} on this step"}},"quantity":{"greaterThanOrEqualTo":{"id":"greaterThanOrEqualTo","label":"Greater than condition message","type":"text","value":"Add at least {{conditionQuantity}} products on this step"},"lessThanOrEqualTo":{"id":"lessThanOrEqualTo","label":"Less than condition message","type":"text","value":"Add a maximum of {{conditionQuantity}} products to continue"},"equalTo":{"id":"equalTo","label":"Equal to condition message","type":"text","value":"Add exactly {{conditionQuantity}} products on this step"}},"weight":{"greaterThanOrEqualTo":{"id":"greaterThanOrEqualTo","label":"Greater than condition message","type":"text","value":"Add products weighing at least {{conditionWeight}} on this step"},"lessThanOrEqualTo":{"id":"lessThanOrEqualTo","label":"Less than condition message","type":"text","value":"Add products weighing maximum of {{conditionWeight}} on this step"},"equalTo":{"id":"equalTo","label":"Equal to condition message","type":"text","value":"Add products weighing {{conditionWeight}} on this step"}}},"multipleCategoriesPage":{"multipleCategoriesSubtext":{"id":"multipleCategoriesSubtext","label":"Multiple Categories Page Subtext","type":"text","value":""}},"multipleCategories":{},"addons":{"maxAddonProductsAllowed":{"id":"maxAddonProductsAllowed","label":"Max Addon Products Allowed message","type":"text","value":" add maximum {{maxAllowedAddons}} products to continue"},"addonProductsMandatory":{"id":"addonProductsMandatory","label":"Addon Products Mandatory message","type":"text","value":"Please add atleast one product"},"firstBundleInteraction":{"id":"firstBundleInteraction","label":"Mobile Add On Notification","type":"text","value":"Additional offers to be unlocked"}},"modals":{"clearCart":{"cancelButtonText":{"id":"cancelButtonText","label":"Modal - Cancel Button Text","type":"text","value":"Cancel"},"confirmButtonText":{"id":"confirmButtonText","label":"Modal - Confirm Button Text","type":"text","value":"Clear Cart"},"description":{"id":"description","label":"Modal - Description","type":"text","value":"Are you sure you want to clear all items from your cart? This action cannot be undone..."},"title":{"id":"title","label":"Modal - Title","type":"text","value":"Are you sure?"},"triggerButtonText":{"id":"triggerButtonText","label":"Clear Cart Button Text","type":"text","value":"Clear"}}}},"languageMode":"SINGLE","updatedAt":"2026-06-29T08:44:28.980Z","mixAndMatchTextData":{"en":{"conditions":{"amount":{"greaterThanOrEqualTo":{"id":"greaterThanOrEqualTo","label":"Greater than condition message","type":"text","value":"Add products worth at least {{conditionAmount}} on this step"},"lessThanOrEqualTo":{"id":"lessThanOrEqualTo","label":"Less than condition message","type":"text","value":"Add products worth maximum of {{conditionAmount}} on this step"},"equalTo":{"id":"equalTo","label":"Equal to condition message","type":"text","value":"Add products worth {{conditionAmount}} on this step"}},"quantity":{"greaterThanOrEqualTo":{"id":"greaterThanOrEqualTo","label":"Greater than condition message","type":"text","value":"Add at least {{conditionQuantity}} products on this step"},"lessThanOrEqualTo":{"id":"lessThanOrEqualTo","label":"Less than condition message","type":"text","value":"Add a maximum of {{conditionQuantity}} products to continue"},"equalTo":{"id":"equalTo","label":"Equal to condition message","type":"text","value":"Add exactly {{conditionQuantity}} products on this step"}},"weight":{"greaterThanOrEqualTo":{"id":"greaterThanOrEqualTo","label":"Greater than condition message","type":"text","value":"Add products weighing at least {{conditionWeight}} on this step"},"lessThanOrEqualTo":{"id":"lessThanOrEqualTo","label":"Less than condition message","type":"text","value":"Add products weighing maximum of {{conditionWeight}} on this step"},"equalTo":{"id":"equalTo","label":"Equal to condition message","type":"text","value":"Add products weighing {{conditionWeight}} on this step"}}},"general":{"noProductsAvailable":{"id":"noProductsAvailable","label":"No Products Available label","type":"text","value":"No Products Available"},"addBundleToCartBtnText":{"id":"addBundleToCartBtnText","label":"Add Bundle Cart label","type":"text","value":"Add Bundle to Cart"},"addBundleToCartLoadingBtnText":{"id":"addBundleToCartLoadingBtnText","label":"Add Bundle Loading label","type":"text","value":"Adding Bundle..."},"inventoryLimitReachedText":{"id":"inventoryLimitReachedText","label":"Inventory Limit Reached Label","type":"text","value":"No More Stock"},"emptyCardText":{"id":"emptyCardText","label":"Add Product Card Text","type":"text","value":"Add Product"},"boxSelectionEligibilityToast_inPage":{"id":"boxSelectionEligibilityToast_inPage","label":"Box Selection Eligibility Toast","type":"text","value":"Remove {{boxSelectionDifference}} item(s) to select this box"},"subtotalLabelText_inPage":{"id":"subtotalLabelText_inPage","label":"Subtotal Text","type":"text","value":"Subtotal"},"boxConditionInitialText_inPage":{"id":"boxConditionInitialText_inPage","label":"Inline Add To Cart Button - Quantity Selection message","type":"text","value":"Select {{quantityDifference}} Items"},"stepsDrawerPillText":{"id":"stepsDrawerPillText","label":"Steps Drawer Pill Text","type":"text","value":"Show all steps"}},"footer":{"footerPrevBtnText":{"id":"footerPrevBtnText","label":"Footer Previous Button","type":"text","value":"Prev"},"footerNextBtnText":{"id":"footerNextBtnText","label":"Footer Next Button","type":"text","value":"Next"},"footerFinishBtnText":{"id":"footerFinishBtnText","label":"Footer Finish Button","type":"text","value":"Done"}},"productCard":{"productCardAddBtnText":{"id":"productCardAddBtnText","label":"Product Add to Cart Button","type":"text","value":"Add to Cart"},"productVariantLabelText":{"id":"productVariantLabelText","label":"Product Variant Label","type":"text","value":"Select variant"},"productCardAddBtnText_inPage":{"id":"productCardAddBtnText_inPage","label":"Inline Product - Add Button Text","type":"text","value":"Add +"}}}},"productBundle":{"en":{"general":{"title":{"id":"title","label":"Title","type":"text","value":"Bundle"},"subTitle":{"id":"subTitle","label":"Sub Title","type":"text","value":"Select the products you want to add to your bundle"},"unSelectedOptionLabel":{"id":"unSelectedOptionLabel","label":"Unselected Option Label","type":"text","value":"Select {{option_name}}"}},"validation":{"unselectedOption":{"id":"unselectedOption","label":"Unselected Option","type":"text","value":"{{option_name}} selection required"},"outOfStockOption":{"id":"outOfStockOption","label":"Out Of Stock Option","type":"text","value":"currently not available"}},"footer":{"atcButtonText":{"id":"atcButtonText","label":"Add to Cart Button Text","type":"text","value":"Add to Cart"},"atcButtonOutOfStockText":{"id":"atcButtonOutOfStockText","label":"Add to Cart Out of Stock Text","type":"text","value":"Out of Stock"},"priceLabel":{"id":"priceLabel","label":"Price Label","type":"text","value":"Total Price"},"savingsBadgeText":{"id":"savingsBadgeText","label":"Savings Badge Text","type":"text","value":"You save {{amount_saved}}"}}}}},"pageCustomizationData":{"_id":"64d3b505dd2fb15e39c866d6","shopName":"different-roads.myshopify.com","__v":0,"banners":{"landingPageImageSrc":"https:\/\/d3ks0ngva6go34.cloudfront.net\/public\/banners\/landing_page_bannerv2.png","pageBannerImageSrc":"https:\/\/d3ks0ngva6go34.cloudfront.net\/public\/banners\/page_banner_temp.png","productReviewImageSrc":"https:\/\/d3ks0ngva6go34.cloudfront.net\/public\/banners\/landing_page_bannerv2.png"},"cartFooter":{"cartFooterBgColor":"#f1f2f3","cartFooterTextColor":"#000000","cartFooterNextButtonColor":"#000000","cartFooterNextButtonTextColor":"#ffffff","cartFooterBackButtonColor":"#6d7175","cartFooterBackButtonTextColor":"#ffffff","cartFooterDiscountTextColor":"#000000"},"colors":{"disabledColor":"gray","primaryColor":"blue","productBox":"blue","secondaryColor":"aqua","textColor":"black"},"createdAt":"2023-08-09T15:47:17.009Z","landingPage":{"landingPageTextColor":"#000000","landingPageButtonBgColor":"#C8102E","landingPageButtonTextColor":"#ffffff"},"navigationBanner":{"navigationBannerTitleColor":"#ffffff","navigationBannerTextColor":"#ffffff","navigationBannerStepCompletionColor":"#E0C6AD","navigationBannerStepDoneColor":"#ffffff","navigationBannerStepTextColor":"#C8102E"},"previewPage":{"bannerTextColor":"#ffffff"},"primaryFont":"","productCard":{"productCardBgColor":"#F2F2F2","productCardTextColor":"#252525","productCardButtonColor":"#470A68","productCardButtonTextColor":"#ffffff"},"quickSettings":{"isQuickSettingsEnabled":false,"colors":{"primaryColor":"#000000","buttonBgColor":"#000000","buttonTextColor":"#ffffff"}},"summaryBlock":{"summaryBlockAddToCartButtonColor":"#C8102E","summaryBlockAddToCartButtonTextColor":"#ffffff"},"updatedAt":"2026-06-29T08:44:32.683Z","categoryBlock":{"categoryBgColor":"#FFFFFF"},"generalSettings":{"scrollBar":{"scrollBarColor":"#000000"},"conditionToast":{"conditionToastBgColor":"#000000","conditionToastTextColor":"#ffffff"},"icon":{"iconBgColor":"#000000","iconTextColor":"#ffffff"},"productPage":{"productPageTitleColor":"#000000"}},"productBundle":{"designSettings":{},"globalSettings":{"general":{"autoShiftToAvailableVariant":true,"hideOutOfStockOptions":false,"unselectOptionsByDefault":true,"showProductCardImageBorder":true,"footerSavingPillPosition":"BEFORE_PRICE","metafieldNameSpaceAndKeys":[],"isB2BCatalogPricingEnabled":false,"allowPartialLocaleMatching":false,"productImageTransformConfig":{"isEnabled":true,"options":"{ maxHeight: 400, maxWidth: 400, scale: 1 }"},"customCss":"","customJs":""},"devMode":{"useNativeCartRefresh":true,"useWidgetATCButton":true,"useShadowRoot":false,"useAcceleratedCheckoutUrlRedirect":true,"useFormOnlyCartAdd":false},"selectorConfig":{"productFormSubmitSelector":null,"customVariantPickerSelectors":null,"quantityBtnSelectors":null,"addToCartBtnSelectors":null,"checkoutBtnSelector":null,"nativeDiscountedPriceSelector":null,"nativeOriginalPriceSelector":null,"nativePriceBadgeSelector":null},"postDecisionAddToCartConfig":{"executeDefaultSideCartUpdate":false,"redirectToCheckoutEnabled":true,"redirectToCartEnabled":false,"executeScriptAfterAddToCart":""}}}},"bundleLinkData":[{"_id":"64d3b6c6dd2fb15e39c8d4dd","bundleId":"1","bundleName":"Build an ABA Bundle","createdAt":"2023-08-09T15:54:46.390Z","bundleImg":"https:\/\/d3ks0ngva6go34.cloudfront.net\/giftBox\/different-roads.myshopify.com\/1692645014784.png","productsForBundleLink":[{"productId":"8566704865574","graphqlId":"gid:\/\/shopify\/Product\/8566704865574","handle":"different-roads-build-an-aba-bundle","variants":[{"variantId":"46258956599590","variantGraphqlId":"gid:\/\/shopify\/ProductVariant\/46258956599590"}],"hasOnlyDefaultVariant":true,"images":[{"originalSrc":"https:\/\/cdn.shopify.com\/s\/files\/1\/1788\/7187\/files\/DRK403VB-MappStartUpSetCropped.png?v=1692645654"},{"originalSrc":"https:\/\/cdn.shopify.com\/s\/files\/1\/1788\/7187\/files\/DRB034AWorkinProgressTheCurriculumAssessmentandDatasheets_94d68767-64c8-4246-b9c8-3ef5681356bc.png?v=1692645654"}],"title":"Different Roads Build an ABA Bundle","order":0}]}],"bundleUpsellData":{},"mixAndMatchData":[]}; if (ext_data && !ext_data?.errorMsg) { window.easybundles_ext_data = ext_data; } let sdk_bundle_upsell_index = []; window.__gbbOverflow = window.__gbbOverflow || {}; window.__gbbOverflow.upsellIndexRaw = sdk_bundle_upsell_index; if (window.easybundles_ext_data && Array.isArray(sdk_bundle_upsell_index)) { window.easybundles_ext_data.sdkBundleUpsellIndex = sdk_bundle_upsell_index; const matchedRaw = JSON.parse("{}") || {}; const matchedSdkUpsells = {}; for (const offerId of Object.keys(matchedRaw)) { const { entry, bundleData } = matchedRaw[offerId]; matchedSdkUpsells[offerId] = bundleData ? { ...entry, bundleData } : entry; } window.easybundles_ext_data.matchedSdkUpsells = matchedSdkUpsells; } let full_page_ext_data = {"userData":{"_id":"64d3b504dd2fb15e39c866bc","shopName":"different-roads.myshopify.com","brandName":"Different Roads","bundleSettings":{"allowMultipleBoxesFromSameBundle":true,"showCompareAtPrice":true,"dontIndexGiftboxBuilderPages_onGoogle":false,"isValidateInventoryEnabled":false,"calculateAutomaticDiscountInPercentage":true},"counters":{"reviewModal":100,"themeExtensionModal":5,"instructionsModalCnt":1,"viewBundleModalCnt":0,"createBundleModalCnt":0},"countryCode":"US","countryName":"United States","createdAt":"2023-08-09T15:47:16.712Z","currency":"USD","currencyInfo":{"code":"USD","symbol":"$","thousandsSeparator":",","decimalSeparator":".","symbolOnLeft":true,"spaceBetweenAmountAndSymbol":false,"decimalDigits":2},"customSettings":{"initialModalPopupCnt":0,"disableCartSettings":false,"addToCartBtnSelectors":null,"checkoutBtnSelectors":null,"customStyle":null,"addAfterAddTocartBtn":false,"addAftercheckoutBtn":false,"disableApp":false,"loadingGif":"https:\/\/gift-box-builder-app4.s3.us-east-2.amazonaws.com\/public\/icons\/loadingGif.gif","stackDiscounts":true,"showOnlyAdminSelectedVariants":true,"overWriteCheckoutBtn":false,"addGiftMessageToNote":true},"isAppFree":false,"isSubscription":{"id":30174970150,"name":"Monthly-Starter-July23","price":"19.00","billing_on":"2023-08-30","status":"active","created_at":"2023-08-09T11:47:53-04:00","updated_at":"2023-08-09T11:48:02-04:00","activated_on":"2023-08-09","return_url":"https:\/\/different-roads.myshopify.com\/admin\/apps\/10b4272bede142b02924feec498b4009","test":false,"cancelled_on":null,"trial_days":21,"trial_ends_on":"2023-08-30","api_client_id":3918921729,"decorated_return_url":"https:\/\/different-roads.myshopify.com\/admin\/apps\/10b4272bede142b02924feec498b4009?charge_id=30174970150","capped_amount":"199.00","balance_used":0,"balance_remaining":199,"risk_level":0.009460937499999999,"currency":"USD"},"multipleCurrenciesInfo":{"USD":{"code":"USD","symbol":"$","thousandsSeparator":",","decimalSeparator":".","symbolOnLeft":true,"spaceBetweenAmountAndSymbol":false,"decimalDigits":2}},"otherInfo":[],"planId":"","status":"1","timezone":"America\/New_York","updatedAt":"2026-07-16T14:49:33.914Z","isOnBoardingCompleted":true,"lastVisitTime":"2026-07-16T14:49:33.910Z","totalBundleRevenue":14609.499999999998,"totalOrdersCount":15,"reviewData":{"lastShownAt":"2024-10-23T19:42:06.452Z"},"shopDomain":"difflearn.com","mantleApiToken":"4cbb27f3-5125-49e1-8209-25f9c14f5522","storefrontAccessToken":"30dc3effe0240e23be727396cda72a9b","loginData":{"lastLoggedInAt":"2026-07-16T14:49:33.912Z"},"isAppLevelMetafieldCreated":true,"trackEvents":{"OB Welcome page visited":true,"OB Welcome page button click":true},"pageId":"cf709d2c-c1a1-46e9-a397-d9c8c7dda26d","isAppLevelMetafieldForFullPageBundlesCreated":true,"crispCustomerUrl":"https:\/\/app.crisp.chat\/website\/b3910a47-66c1-43ab-b044-8b97762f4a6b\/inbox\/session_998d0a62-913c-4a03-b80b-c5bd80b7aadf","mantleCustomerData":{"id":"a362c566-4237-47a0-b30b-a01156b00863","customerId":"e20269b1-8905-418e-9a88-1b9fd6b070e1","name":"Different Roads","test":false,"preferredCurrency":"USD","shopify":{"id":"17887187","myshopifyDomain":"different-roads.myshopify.com","planName":"Advanced"},"apiId":"84f442a1-2d4a-4012-85da-b4a4b38fc795","profileUrl":"https:\/\/app.heymantle.com\/apps\/84f442a1-2d4a-4012-85da-b4a4b38fc795\/customers\/e20269b1-8905-418e-9a88-1b9fd6b070e1"},"orderSummary":{"last30Days":{"totalOrderValue":0,"totalOrderValueUSD":0,"totalBundlesValue":0,"totalBundlesValueUSD":0,"totalBundlesSold":0,"totalOrderCount":0,"dateRange":{"from":"2026-06-16T00:00:00.000Z","to":"2026-07-16T00:00:00.000Z"},"lastUpdatedAt":"2026-07-16T14:49:33.755Z"},"shopOrderDataBeforeInstall":{"previousMonthRevenue":null,"previousMonthRevenueUSD":0,"previousMonthOrderCount":0}},"cancelledOrderWebhookRegistered":"success","webhooksCount":5,"webhooksLastAttempted":"2025-10-04T09:51:54.852Z","webhooksRegistered":["orders\/cancelled","app\/uninstalled","orders\/create","app\/uninstalled","themes\/publish"],"reRegisterCron":"success","webhooksLastUpdated":"2025-10-04T12:42:30.995Z","SERVER_URL":"https:\/\/prod.backend.giftbox.giftkart.app"},"languageData":{"_id":"64d3b505dd2fb15e39c866d7","shopName":"different-roads.myshopify.com","__v":0,"createdAt":"2023-08-09T15:47:17.009Z","en":{"landingPage":{"bannerText":{"id":"bannerText","label":"Banner Text","type":"text","value":"Build your own Bundle in just a few clicks!"},"bannerSubtext":{"id":"bannerSubtext","label":"Banner Subtext","type":"text","value":"Send a custom bundle to your loved one in just a few steps"},"bannerButtonText":{"id":"bannerButtonText","label":"Banner Button Text","type":"text","value":"Start Building your Bundle"},"selectPreCuratedBoxLabel":{"id":"selectPreCuratedBoxLabel","label":"Select Pre-Curated Box Label","type":"text","value":"Or select from a range of pre-curated Gift Boxes"}},"navigationSteps":{"productPageStepText":{"id":"productPageStepText","label":"Product Page Step Text","type":"text","value":"Add Products"},"giftBoxStepText":{"id":"giftBoxStepText","label":"Bundle Step Text","type":"text","value":"Add Gift Box"},"personalizeStepText":{"id":"personalizeStepText","label":"Personalize Step Text","type":"text","value":"Personalize"},"multipleCategoriesStepText":{"id":"multipleCategoriesStepText","label":"Multiple Categories Step Text","type":"text","value":"Multiple Categories"}},"productPage":{"selectProductsLabel":{"id":"selectProductsLabel","label":"Select Products Label","type":"text","value":"Select Products"},"productPageSubtext":{"id":"productPageSubtext","label":"Product Page Subtext","type":"text","value":""}},"giftBoxPage":{"selectGiftBoxLabel":{"id":"selectGiftBoxLabel","label":"Select Bundle Label","type":"text","value":"Select a Bundle Box"},"giftBoxPageSubtext":{"id":"giftBoxPageSubtext","label":"Gift Box Page Subtext","type":"text","value":""}},"videoMessage":{"permissionDenied":{"id":"permissionDenied","label":"Permission Denied","type":"text","value":"Permission Denied"},"uploadConfirmation":{"id":"uploadConfirmation","label":"Upload Confirmation","type":"text","value":"Your video has been successfully uploaded!"},"pressToRecord":{"id":"pressToRecord","label":"Press to record","type":"text","value":"Press to record"},"recording":{"id":"recording","label":"Recording","type":"text","value":"Recording...."},"errorMessage":{"id":"errorMessage","label":"Error Message","type":"text","value":"An error occured, Please try again!"},"loading":{"id":"loading","label":"Loading","type":"text","value":"Loading...."},"uploading":{"id":"uploading","label":"Uploading","type":"text","value":"Uploading...."},"sendVideoMessageText":{"id":"sendVideoMessageText","label":"Send Video Message Text","type":"text","value":"Send Video Message"},"giftMessageDeliveryInfo":{"id":"giftMessageDeliveryInfo","label":"Message Delivery Info","type":"text","value":"The message will be sent to the recipient via email as soon as the order is placed"},"saveVideoText":{"id":"saveVideoText","label":"Save Video Text","type":"text","value":"Save Video"},"reRecordVideoText":{"id":"reRecordVideoText","label":"Re-Record Video Text","type":"text","value":"Re-Record Video"}},"personalizePage":{"selectGreetingCardLabel":{"id":"selectGreetingCardLabel","label":"Select Greeting Card Label","type":"text","value":"Select A Greeting Card"},"clearSelectionButton":{"id":"clearSelectionButton","label":"Clear Selection label","type":"text","value":"Clear Selection"},"noImagesAvailable":{"id":"noImagesAvailable","label":"No Images Available label","type":"text","value":"No Images Available"},"messageLabel":{"id":"messageLabel","label":"Message Label","type":"text","value":"Message"},"senderNamePlaceholder":{"id":"senderNamePlaceholder","label":"Sender Name Placeholder","type":"text","value":"From"},"recipientNamePlaceholder":{"id":"recipientNamePlaceholder","label":"Recipient Name Placeholder","type":"text","value":"To"},"messagePlaceholder":{"id":"messagePlaceholder","label":"Message Placeholder","type":"text","value":"Enter a message here..."},"emailAddressLabel":{"id":"emailAddressLabel","label":"Recipient Email Address Label","type":"text","value":"Recipient Email Address"},"emailAddressPlaceholder":{"id":"emailAddressPlaceholder","label":"Recipient Email Address Placeholder","type":"text","value":"Enter a recipient email address here..."},"emailValidationMessage":{"id":"emailValidationMessage","label":"Email Validation Message","type":"text","value":"Please enter a valid email address"},"sendNow":{"id":"sendNow","label":"Send Now Label","type":"text","value":"Send Now"},"sendLater":{"id":"sendLater","label":"Send Later Label","type":"text","value":"Send Later"},"personalizePageSubtext":{"id":"personalizePageSubtext","label":"Personalize Page Subtext","type":"text","value":""},"messageIsRequiredError":{"id":"messageIsRequiredError","label":"Message is required warning","type":"text","value":"Please enter a message"}},"reviewPage":{"reviewPageBannerText":{"id":"reviewPageBannerText","label":"Review Page Banner Text","type":"text","value":"You’ve made the Right Choice!"},"reviewPageBannerSubtext":{"id":"reviewPageBannerSubtext","label":"Review Page Banner Subtext","type":"text","value":"Review your bundle and proceed to checkout"},"addOnsLabel":{"id":"addOnsLabel","label":"Add Ons Label","type":"text","value":"Add Ons"},"totalValueLabel":{"id":"totalValueLabel","label":"Total Value Label","type":"text","value":"Total Value"},"totalLabel":{"id":"totalLabel","label":"Total Label","type":"text","value":"Total"},"productLabel":{"id":"productLabel","label":"Product Header Label","type":"text","value":"Product"},"priceLabel":{"id":"priceLabel","label":"Price Header Text","type":"text","value":"Price"},"quantityLabel":{"id":"quantityLabel","label":"Quantity Header Text","type":"text","value":"Quantity"},"deliveryDateLabel":{"id":"deliveryDateLabel","label":"Delivery Date Label","type":"text","value":"Delivery Date"},"productsLabelText":{"id":"productsLabelText","label":"Products Label Text","type":"text","value":"Products"},"messagesLabelText":{"id":"messagesLabelText","label":"Messages Label Text","type":"text","value":"Messages"},"discountAppliedLabel":{"id":"discountAppliedLabel","label":"Discount Applied Label","type":"text","value":"Discount"},"subtotalLabel":{"id":"subtotalLabel","label":"Sub Total Label","type":"text","value":"Subtotal"},"orderDetailsLabel":{"id":"orderDetailsLabel","label":"Order Details Label","type":"text","value":"Order Details"},"itemsLabel":{"id":"itemsLabel","label":"No. of Items Label","type":"text","value":"Item(s)"},"oneTimePurchaseLabel":{"id":"oneTimePurchaseLabel","label":"One-Time Purchase label","type":"text","value":"One-Time Purchase"},"subscribeAndSaveLabel":{"id":"subscribeAndSaveLabel","label":"Subscribe and Save label","type":"text","value":"Subscribe and Save"},"noSubscriptionFoundLabel":{"id":"noSubscriptionFoundLabel","label":"No Subscription plans found label","type":"text","value":"Oops! No Subscription plans were found"},"deliveryFrequencyLabel":{"id":"deliveryFrequencyLabel","label":"Delivery Frequency Label","type":"text","value":"Delivery Frequency"},"createNewBoxLabel":{"id":"createNewBoxLabel","label":"Create New Box Label","type":"text","value":"Create new Box"},"editButtonText":{"id":"editButtonText","label":"Edit Label","type":"text","value":"Edit"},"deliverySchedulerPlaceholderText":{"id":"deliverySchedulerPlaceholderText","label":"Delivery Scheduler Placeholder Text","type":"text","value":"Select a date"}},"general":{"noProductsAvailable":{"id":"noProductsAvailable","label":"No Products Available label","type":"text","value":"No Products Available"},"filtersLabel":{"id":"filtersLabel","label":"Filters Label","type":"text","value":"Filters"},"clearSelection":{"id":"clearSelection","label":"Clear Filters Selection","type":"text","value":"Clear Selection"},"searchLabel":{"id":"searchLabel","label":"Search Label","type":"text","value":"Search"},"addToBoxButtonText":{"id":"addToBoxButtonText","label":"Add To Box Button","type":"text","value":"Add To Box"},"chooseOptionsButtonText":{"id":"chooseOptionsButtonText","label":"Choose Options Button","type":"text","value":"Choose Options"},"loadMoreProductsButtonText":{"id":"loadMoreProductsButtonText","label":"Load More Products Button","type":"text","value":"Load More Products"},"loadingCheckoutButtonText":{"id":"loadingCheckoutButtonText","label":"Loading Checkout Button","type":"text","value":"Loading Checkout..."},"addedText":{"id":"addedText","label":"Added Label","type":"text","value":"Added"},"addButtonText":{"id":"addButtonText","label":"Add Button Text","type":"text","value":"Add"},"nextButtonText":{"id":"nextButtonText","label":"Next Button Text","type":"text","value":"Next"},"addToCartButtonText":{"id":"addToCartButtonText","label":"Add To Cart Button Text","type":"text","value":"Add To Cart"},"backButtonText":{"id":"backButtonText","label":"Back Button Text","type":"text","value":"Back"},"checkoutButtonText":{"id":"checkoutButtonText","label":"Checkout Button Text","type":"text","value":"Checkout"},"removeButtonText":{"id":"removeButtonText","label":"Remove Button Text","type":"text","value":"Remove"},"reviewButtonText":{"id":"reviewButtonText","label":"Review Button Text","type":"text","value":"Review"},"combinationNotAvailable":{"id":"combinationNotAvailable","label":"Combination Not Available","type":"text","value":"Combination Not Available"},"quantity":{"id":"quantity","label":"Quantity Label","type":"text","value":"Quantity"},"viewCartProductsLabel":{"id":"viewCartProductsLabel","label":"View Cart Products Label","type":"text","value":"View Selected Products"},"selectedProductsLabel":{"id":"selectedProductsLabel","label":"Selected Products Label","type":"text","value":"Selected Products"},"selectBundleProductsText":{"id":"selectBundleProductsText","label":"Select Bundle Products label","type":"text","value":"Select Bundle Products"},"redirectingText":{"id":"redirectingText","label":"Redirecting label","type":"text","value":"Redirecting..."},"preparingBundleText":{"id":"preparingBundleText","label":"Preparing Bundle Label","type":"text","value":"Preparing Bundle..."},"productsNotAvailableText":{"id":"productsNotAvailableText","label":"Products Not Available Label","type":"text","value":"Oops! Some Products are not available"},"discountsMayNotApplyText":{"id":"discountsMayNotApplyText","label":"Discounts may not be applied Label","type":"text","value":"discounts may not be applied"},"removeAllBoxProducts":{"id":"removeAllBoxProducts","label":"Remove all Box Products Label (Cart Page Popup)","type":"text","value":"This is a Box Product. Removing this will remove all the products from box"},"cartPageCheckoutButtonLoadingText":{"id":"cartPageCheckoutButtonLoadingText","label":"Cart Page Checkout Button Loading Text","type":"text","value":"Loading Checkout..."},"inventoryInStockText":{"id":"inventoryInStockText","label":"Inventory in Stock Label","type":"text","value":"in Stock"},"inventoryLimitReachedText":{"id":"inventoryLimitReachedText","label":"Inventory Limit Reached Label","type":"text","value":"No More Stock"},"productAddedBtnText":{"id":"productAddedBtnText","label":"Product Added label","type":"text","value":"Added"},"boxSelectionEligibilityToast":{"id":"boxSelectionEligibilityToast","label":"Box Selection Eligibility Toast","type":"text","value":"Remove ##boxSelectionDifference## item(s) to select this box"},"discountRibbonSuffix":{"id":"discountRibbonSuffix","label":"Discount Badge Suffix","type":"text","value":"off"},"itemsInCartLabel":{"id":"itemsInCartLabel","label":"Cart Inclusion Title","type":"text","value":"item(s)"},"removeFooterProductFrom":{"id":"removeFooterProductFrom","label":"Remove Product from Footer Text","type":"text","value":"Remove This Product From ##stepName##"},"selectSubscriptionPlanButtonText":{"id":"selectSubscriptionPlanButtonText","label":"Subscription Selection Label","type":"text","value":"Select Subscription Plan"}},"discountRules":{"rule1":{"amount":{"id":"amount","label":"Amount","type":"text","value":""},"text":{"id":"text","label":"Text","type":"text","value":""}},"rule2":{"amount":{"id":"amount","label":"Amount","type":"text","value":""},"text":{"id":"text","label":"Text","type":"text","value":""}},"rule3":{"amount":{"id":"amount","label":"Amount","type":"text","value":""},"text":{"id":"text","label":"Text","type":"text","value":""}},"rule4":{"amount":{"id":"amount","label":"Amount","type":"text","value":""},"text":{"id":"text","label":"Text","type":"text","value":""}},"rule5":{"amount":{"id":"amount","label":"Amount","type":"text","value":""},"text":{"id":"text","label":"Text","type":"text","value":""}}},"sortBy":{"sortLabel":{"id":"sortLabel","label":"Sort Label","type":"text","value":"Sort"},"alphabeticalAToZ":{"id":"alphabeticalAToZ","label":"Alphabetical, A-Z Label","value":"Alphabetical, A-Z"},"alphabeticalZToA":{"id":"alphabeticalZToA","label":"Alphabetical, Z-A Label","value":"Alphabetical, Z-A"},"priceHighToLow":{"id":"priceHighToLow","label":"Price, High to Low Label","value":"Price, High to Low"},"priceLowToHigh":{"id":"priceLowToHigh","label":"Price, Low to High Label","value":"Price, Low to High"},"featured":{"id":"featured","label":"Featured Label","type":"text","value":"Featured"}},"conditions":{"amount":{"greaterThanOrEqualTo":{"id":"greaterThanOrEqualTo","label":"Greater than condition message","type":"text","value":"Add products worth at least ##conditionAmount## on this step"},"lessThanOrEqualTo":{"id":"lessThanOrEqualTo","label":"Less than condition message","type":"text","value":"Add products worth maximum of ##conditionAmount## on this step"},"equalTo":{"id":"equalTo","label":"Equal to condition message","type":"text","value":"Add products worth ##conditionAmount## on this step"}},"quantity":{"greaterThanOrEqualTo":{"id":"greaterThanOrEqualTo","label":"Greater than condition message","type":"text","value":"Add at least ##conditionQuantity## products on this step"},"lessThanOrEqualTo":{"id":"lessThanOrEqualTo","label":"Less than condition message","type":"text","value":"Add a maximum of ##conditionQuantity## products to continue"},"equalTo":{"id":"equalTo","label":"Equal to condition message","type":"text","value":"Add exactly ##conditionQuantity## products on this step"}},"weight":{"greaterThanOrEqualTo":{"id":"greaterThanOrEqualTo","label":"Greater than condition message","type":"text","value":"Add products weighing at least ##conditionWeight## on this step"},"lessThanOrEqualTo":{"id":"lessThanOrEqualTo","label":"Less than condition message","type":"text","value":"Add products weighing maximum of ##conditionWeight## on this step"},"equalTo":{"id":"equalTo","label":"Equal to condition message","type":"text","value":"Add products weighing ##conditionWeight## on this step"}}},"multipleCategoriesPage":{"multipleCategoriesSubtext":{"id":"multipleCategoriesSubtext","label":"Multiple Categories Page Subtext","type":"text","value":""}},"multipleCategories":{},"addons":{"maxAddonProductsAllowed":{"id":"maxAddonProductsAllowed","label":"Max Addon Products Allowed message","type":"text","value":" add maximum ##maxAllowedAddons## products to continue"},"addonProductsMandatory":{"id":"addonProductsMandatory","label":"Addon Products Mandatory message","type":"text","value":"Please add atleast one product"},"firstBundleInteraction":{"id":"firstBundleInteraction","label":"Mobile Add On Notification","type":"text","value":"Additional offers to be unlocked"}},"modals":{"clearCart":{"cancelButtonText":{"id":"cancelButtonText","label":"Modal - Cancel Button Text","type":"text","value":"Cancel"},"confirmButtonText":{"id":"confirmButtonText","label":"Modal - Confirm Button Text","type":"text","value":"Clear Cart"},"description":{"id":"description","label":"Modal - Description","type":"text","value":"Are you sure you want to clear all items from your cart? This action cannot be undone..."},"title":{"id":"title","label":"Modal - Title","type":"text","value":"Are you sure?"},"triggerButtonText":{"id":"triggerButtonText","label":"Clear Cart Button Text","type":"text","value":"Clear"}}}},"languageMode":"SINGLE","updatedAt":"2026-06-29T08:44:28.980Z","mixAndMatchTextData":{"en":{"conditions":{"amount":{"greaterThanOrEqualTo":{"id":"greaterThanOrEqualTo","label":"Greater than condition message","type":"text","value":"Add products worth at least ##conditionAmount## on this step"},"lessThanOrEqualTo":{"id":"lessThanOrEqualTo","label":"Less than condition message","type":"text","value":"Add products worth maximum of ##conditionAmount## on this step"},"equalTo":{"id":"equalTo","label":"Equal to condition message","type":"text","value":"Add products worth ##conditionAmount## on this step"}},"quantity":{"greaterThanOrEqualTo":{"id":"greaterThanOrEqualTo","label":"Greater than condition message","type":"text","value":"Add at least ##conditionQuantity## products on this step"},"lessThanOrEqualTo":{"id":"lessThanOrEqualTo","label":"Less than condition message","type":"text","value":"Add a maximum of ##conditionQuantity## products to continue"},"equalTo":{"id":"equalTo","label":"Equal to condition message","type":"text","value":"Add exactly ##conditionQuantity## products on this step"}},"weight":{"greaterThanOrEqualTo":{"id":"greaterThanOrEqualTo","label":"Greater than condition message","type":"text","value":"Add products weighing at least ##conditionWeight## on this step"},"lessThanOrEqualTo":{"id":"lessThanOrEqualTo","label":"Less than condition message","type":"text","value":"Add products weighing maximum of ##conditionWeight## on this step"},"equalTo":{"id":"equalTo","label":"Equal to condition message","type":"text","value":"Add products weighing ##conditionWeight## on this step"}}},"general":{"noProductsAvailable":{"id":"noProductsAvailable","label":"No Products Available label","type":"text","value":"No Products Available"},"addBundleToCartBtnText":{"id":"addBundleToCartBtnText","label":"Add Bundle Cart label","type":"text","value":"Add Bundle to Cart"},"addBundleToCartLoadingBtnText":{"id":"addBundleToCartLoadingBtnText","label":"Add Bundle Loading label","type":"text","value":"Adding Bundle..."},"inventoryLimitReachedText":{"id":"inventoryLimitReachedText","label":"Inventory Limit Reached Label","type":"text","value":"No More Stock"},"emptyCardText":{"id":"emptyCardText","label":"Add Product Card Text","type":"text","value":"Add Product"},"boxSelectionEligibilityToast_inPage":{"id":"boxSelectionEligibilityToast_inPage","label":"Box Selection Eligibility Toast","type":"text","value":"Remove ##boxSelectionDifference## item(s) to select this box"},"subtotalLabelText_inPage":{"id":"subtotalLabelText_inPage","label":"Subtotal Text","type":"text","value":"Subtotal"},"boxConditionInitialText_inPage":{"id":"boxConditionInitialText_inPage","label":"Inline Add To Cart Button - Quantity Selection message","type":"text","value":"Select {{quantityDifference}} Items"},"stepsDrawerPillText":{"id":"stepsDrawerPillText","label":"Steps Drawer Pill Text","type":"text","value":"Show all steps"}},"footer":{"footerPrevBtnText":{"id":"footerPrevBtnText","label":"Footer Previous Button","type":"text","value":"Prev"},"footerNextBtnText":{"id":"footerNextBtnText","label":"Footer Next Button","type":"text","value":"Next"},"footerFinishBtnText":{"id":"footerFinishBtnText","label":"Footer Finish Button","type":"text","value":"Done"}},"productCard":{"productCardAddBtnText":{"id":"productCardAddBtnText","label":"Product Add to Cart Button","type":"text","value":"Add to Cart"},"productVariantLabelText":{"id":"productVariantLabelText","label":"Product Variant Label","type":"text","value":"Select variant"},"productCardAddBtnText_inPage":{"id":"productCardAddBtnText_inPage","label":"Inline Product - Add Button Text","type":"text","value":"Add +"}}}},"productBundle":{"en":{"general":{"title":{"id":"title","label":"Title","type":"text","value":"Bundle"},"subTitle":{"id":"subTitle","label":"Sub Title","type":"text","value":"Select the products you want to add to your bundle"},"unSelectedOptionLabel":{"id":"unSelectedOptionLabel","label":"Unselected Option Label","type":"text","value":"Select {{option_name}}"}},"validation":{"unselectedOption":{"id":"unselectedOption","label":"Unselected Option","type":"text","value":"{{option_name}} selection required"},"outOfStockOption":{"id":"outOfStockOption","label":"Out Of Stock Option","type":"text","value":"currently not available"}},"footer":{"atcButtonText":{"id":"atcButtonText","label":"Add to Cart Button Text","type":"text","value":"Add to Cart"},"atcButtonOutOfStockText":{"id":"atcButtonOutOfStockText","label":"Add to Cart Out of Stock Text","type":"text","value":"Out of Stock"},"priceLabel":{"id":"priceLabel","label":"Price Label","type":"text","value":"Total Price"},"savingsBadgeText":{"id":"savingsBadgeText","label":"Savings Badge Text","type":"text","value":"You save {{amount_saved}}"}}}}},"pageCustomizationData":{"_id":"64d3b505dd2fb15e39c866d6","shopName":"different-roads.myshopify.com","__v":0,"banners":{"landingPageImageSrc":"https:\/\/d3ks0ngva6go34.cloudfront.net\/public\/banners\/landing_page_bannerv2.png","pageBannerImageSrc":"https:\/\/d3ks0ngva6go34.cloudfront.net\/public\/banners\/page_banner_temp.png","productReviewImageSrc":"https:\/\/d3ks0ngva6go34.cloudfront.net\/public\/banners\/landing_page_bannerv2.png"},"cartFooter":{"cartFooterBgColor":"#f1f2f3","cartFooterTextColor":"#000000","cartFooterNextButtonColor":"#000000","cartFooterNextButtonTextColor":"#ffffff","cartFooterBackButtonColor":"#6d7175","cartFooterBackButtonTextColor":"#ffffff","cartFooterDiscountTextColor":"#000000"},"colors":{"disabledColor":"gray","primaryColor":"blue","productBox":"blue","secondaryColor":"aqua","textColor":"black"},"createdAt":"2023-08-09T15:47:17.009Z","landingPage":{"landingPageTextColor":"#000000","landingPageButtonBgColor":"#C8102E","landingPageButtonTextColor":"#ffffff"},"navigationBanner":{"navigationBannerTitleColor":"#ffffff","navigationBannerTextColor":"#ffffff","navigationBannerStepCompletionColor":"#E0C6AD","navigationBannerStepDoneColor":"#ffffff","navigationBannerStepTextColor":"#C8102E"},"previewPage":{"bannerTextColor":"#ffffff"},"primaryFont":"","productCard":{"productCardBgColor":"#F2F2F2","productCardTextColor":"#252525","productCardButtonColor":"#470A68","productCardButtonTextColor":"#ffffff"},"quickSettings":{"isQuickSettingsEnabled":false,"colors":{"primaryColor":"#000000","buttonBgColor":"#000000","buttonTextColor":"#ffffff"}},"summaryBlock":{"summaryBlockAddToCartButtonColor":"#C8102E","summaryBlockAddToCartButtonTextColor":"#ffffff"},"updatedAt":"2026-06-29T08:44:32.683Z","categoryBlock":{"categoryBgColor":"#FFFFFF"},"generalSettings":{"scrollBar":{"scrollBarColor":"#000000"},"conditionToast":{"conditionToastBgColor":"#000000","conditionToastTextColor":"#ffffff"},"icon":{"iconBgColor":"#000000","iconTextColor":"#ffffff"},"productPage":{"productPageTitleColor":"#000000"}},"productBundle":{"designSettings":{},"globalSettings":{"general":{"autoShiftToAvailableVariant":true,"hideOutOfStockOptions":false,"unselectOptionsByDefault":true,"showProductCardImageBorder":true,"footerSavingPillPosition":"BEFORE_PRICE","metafieldNameSpaceAndKeys":[],"isB2BCatalogPricingEnabled":false,"allowPartialLocaleMatching":false,"productImageTransformConfig":{"isEnabled":true,"options":"{ maxHeight: 400, maxWidth: 400, scale: 1 }"},"customCss":"","customJs":""},"devMode":{"useNativeCartRefresh":true,"useWidgetATCButton":true,"useShadowRoot":false,"useAcceleratedCheckoutUrlRedirect":true,"useFormOnlyCartAdd":false},"selectorConfig":{"productFormSubmitSelector":null,"customVariantPickerSelectors":null,"quantityBtnSelectors":null,"addToCartBtnSelectors":null,"checkoutBtnSelector":null,"nativeDiscountedPriceSelector":null,"nativeOriginalPriceSelector":null,"nativePriceBadgeSelector":null},"postDecisionAddToCartConfig":{"executeDefaultSideCartUpdate":false,"redirectToCheckoutEnabled":true,"redirectToCartEnabled":false,"executeScriptAfterAddToCart":""}}}}}; let parent_product_data = null; if(full_page_ext_data && !full_page_ext_data?.errorMsg) { window.easybundle_user_ext_data = full_page_ext_data.userData || {} } if (parent_product_data && !parent_product_data?.errorMsg) { window.shopifyLiquidValuesApp4Ext.product.bundleProductConfiguration = parent_product_data; const isAutoPlaceFullPageBundleEnabled = full_page_ext_data?.userData?.customSettings?.isAutoPlaceFullPageBundleEnabled ?? true let bundle_data = null; const keys = ["SDK", "PB"]; const keyPrefix = parent_product_data.appLevelMetafieldKey?.split('-')[0]; const isSdkBundle = keys.includes(keyPrefix); const bundleDesignTemplate = parent_product_data.bundleDesignTemplate || ''; const isPdpBundleBuilder = bundleDesignTemplate.startsWith('PDP_') || bundleDesignTemplate === 'CUSTOM_TEMPLATE'; const isPbBundleBuilder = bundleDesignTemplate.startsWith('PB_'); const isQbBundleBuilder = bundleDesignTemplate.startsWith('QB_'); const isPdpBundle = isPdpBundleBuilder || isPbBundleBuilder || isQbBundleBuilder; if(full_page_ext_data && bundle_data){ if (!isPdpBundle){ isAutoPlaceFullPageBundleEnabled && removeProductHtmlForBundles(); isAutoPlaceFullPageBundleEnabled && buildDummyProductHtmlForBundles(); } const discountsConfiguration = bundle_data?.discountsData; delete bundle_data.discountsData; let active_bundle_data = { ...full_page_ext_data, stepsConfigurationData: bundle_data, discountsData: discountsConfiguration || {}, } if (isSdkBundle) { active_bundle_data.bundleType = parent_product_data.bundleType, active_bundle_data.bundleDesignTemplate = parent_product_data.bundleDesignTemplate, active_bundle_data._preResolvedBundle = true, active_bundle_data._bundleData = bundle_data, delete active_bundle_data.stepsConfigurationData; } // easybundle_full_page_ext_data is a legacy alias. window.easybundle_active_bundle_data = active_bundle_data; window.easybundle_full_page_ext_data = active_bundle_data; } } } function checkIfShouldImportMixAndMatchAssets(allMixAndMatchBundles) { try{ const currentProductId = window.shopifyLiquidValuesApp4Ext?.product?.productData?.id; if(!currentProductId || allMixAndMatchBundles?.length <= 0){ return false; } const isThisParentProductPage = allMixAndMatchBundles.some(bundle => bundle.parentProductShopifyData?.id == currentProductId); if(isThisParentProductPage) return true; const currentProductCollections = window.shopifyLiquidValuesApp4Ext?.product?.collections?.map(collection => collection.id); for(let bundle of allMixAndMatchBundles){ const bundleUpsellConfig = bundle.bundleUpsellConfig; const isBundleUpsellEmbedEnabled = bundleUpsellConfig?.upsellConfiguration?.isEnabled; const isBundleUpsellWidgetEnabled = bundleUpsellConfig?.widgetConfiguration?.isEnabled; if(!isBundleUpsellEmbedEnabled && !isBundleUpsellWidgetEnabled) continue; const widgetDisplayConfig = bundleUpsellConfig?.widgetConfiguration?.displayConfiguration; const upsellDisplayConfig = bundleUpsellConfig?.upsellConfiguration?.displayConfiguration; let showOnAllBundleProducts = false; let productIdsToCheck = []; let collectionIdsToCheck = []; if(isBundleUpsellEmbedEnabled){ showOnAllBundleProducts = upsellDisplayConfig?.showOnAllBundleProducts; productIdsToCheck = upsellDisplayConfig?.showOnSpecificProductPages?.map(product => product?.productId) || [] collectionIdsToCheck = upsellDisplayConfig?.showOnSpecificCollectionPages?.map(collection => collection?.collectionId) || [] } if(isBundleUpsellWidgetEnabled){ showOnAllBundleProducts = showOnAllBundleProducts || widgetDisplayConfig?.showOnAllBundleProducts; const productIds = widgetDisplayConfig?.showOnSpecificProductPages?.map(product => product?.productId) || []; const collectionIds = widgetDisplayConfig?.showOnSpecificCollectionPages?.map(collection => collection?.collectionId) || []; productIdsToCheck = [ ...productIdsToCheck, ...productIds ]; collectionIdsToCheck = [ ...collectionIdsToCheck, ...collectionIds ]; } if(showOnAllBundleProducts){ Object.keys(bundle ?? {}).filter(key => key?.startsWith('productsData')).forEach(stepKey => { const stepData = bundle?.[stepKey]; Object.values(stepData?.categories ?? {}).forEach(category => { const productIds = category?.products?.map(product => product.productId) || []; const collectionIds = category?.collectionsSelectedData?.map(collection => collection.id?.replace("gid://shopify/Collection/", "")) || []; productIdsToCheck = [ ...productIdsToCheck, ...productIds ]; collectionIdsToCheck = [ ...collectionIdsToCheck, ...collectionIds ]; }) }) } const isThisProductRelevant = productIdsToCheck?.some(productId => productId == currentProductId); const isThisProductCollectionsRelevant = collectionIdsToCheck?.some(collectionId => currentProductCollections?.includes(collectionId)); if(isThisProductRelevant || isThisProductCollectionsRelevant) return true; } return false; }catch(err){ debugConsole("error in checkIfShouldImportMixAndMatchAssets",err) return false; } } window.gbbExtEmbed.f.checkIfShouldImportMixAndMatchAssets = checkIfShouldImportMixAndMatchAssets; // Fallback only; the primary match runs server-side in sdk-upsell-matches.liquid. // Two blocks declare two products, but the page-wide globals hold one (seeded with ??=). function getMatchContexts(){ const contexts = []; const pageProduct = window.shopifyLiquidValuesApp4Ext?.product; if(pageProduct?.productData?.id){ contexts.push({ productId: pageProduct.productData.id, collectionIds: pageProduct.collections?.map(c => c.id) ?? [], }); } for(const block of document.querySelectorAll('.gbbPbProductBundleWrapper[data-block-product-id]')){ contexts.push({ productId: block.dataset.blockProductId, collectionIds: block.dataset.blockCollectionIds ? block.dataset.blockCollectionIds.split(',') : [], }); } return contexts; } function checkIfShouldImportSDKAssets(allSdkBundles){ try{ const matched = []; const contexts = getMatchContexts(); if(!contexts.length || !Array.isArray(allSdkBundles) || allSdkBundles.length <= 0){ return matched; } const matchesSurface = (surface, ctx) => { if((surface?.productIds ?? []).some(id => id == ctx.productId)){ return true; } if((surface?.collectionIds ?? []).some(cid => ctx.collectionIds.includes(cid))){ return true; } return false; }; const matchesContext = (bundle, ctx) => { if(bundle?.productId && bundle.productId == ctx.productId) return true; const cfg = bundle?.bundleUpsellConfig; if(!cfg) return false; return matchesSurface(cfg?.upsellConfiguration?.showOn, ctx) || matchesSurface(cfg?.widgetConfiguration?.showOn, ctx); }; for(const bundle of allSdkBundles){ if(bundle?.bundleStatus && bundle.bundleStatus !== 'ACTIVE') continue; if(contexts.some(ctx => matchesContext(bundle, ctx))) matched.push(bundle); } return matched; }catch(err){ debugConsole("error in checkIfShouldImportSDKAssets", err); return []; } } window.gbbExtEmbed.f.checkIfShouldImportSDKAssets = checkIfShouldImportSDKAssets; function loadAssetFiles(assets){ try{ assets.forEach(({ id, tag, attrs, onload }) => { if (!document.getElementById(id)) { const el = Object.assign(document.createElement(tag), { id, ...attrs }); const rewriteAssetUrl = window.__ebAssetUrlRewriter; // preview-only hook; undefined in prod → no-op if (rewriteAssetUrl) { if (el.src) el.src = rewriteAssetUrl(el.src); if (el.href) el.href = rewriteAssetUrl(el.href); } if (onload) el.onload = () => onload(el); document.head.appendChild(el); } }); }catch(err){ debugConsole("error in loadAssetFiles",err) } } // Theme assets hold only .min; unminified ships to S3/CloudFront. const STOREFRONT_CDN = 'https://d1712zxri13o2p.cloudfront.net'; const CDN_ENV = new URLSearchParams(location.search).get('env') === 'staging' ? 'staging' : 'production'; // All three SDKs nest under sdk//; keep in step with storefrontAssets.registry.js. const cdn = (dir, file) => `${STOREFRONT_CDN}/${dir}/${CDN_ENV}/active/${file}`; async function importAppEmbedAssets (loadUnminifiedFiles){ try{ const jsBaseUrl = loadUnminifiedFiles ? `${STOREFRONT_CDN}/app-embed/${CDN_ENV}/active/giftBoxLogicv1.js` : 'https://cdn.shopify.com/extensions/01a10bc7-19c5-7d11-8258-7cdf8cbb8ac9/gift-box-builder-1-474/assets/easy-bundle-min.js'; const cssBaseUrl = loadUnminifiedFiles ? `${STOREFRONT_CDN}/app-embed/${CDN_ENV}/active/giftBoxv1.css` : 'https://cdn.shopify.com/extensions/01a10bc7-19c5-7d11-8258-7cdf8cbb8ac9/gift-box-builder-1-474/assets/easy-bundle-min.css'; const assets = [ { id: 'gbbExt-bundle-embed-css', tag: 'link', attrs: { href: cssBaseUrl, rel: 'stylesheet', media: 'all' }, onload: (el) => el.media = 'all' }, { id: 'gbbExt-bundle-embed-js', tag: 'script', attrs: { src: jsBaseUrl, async: false } } ]; loadAssetFiles(assets); }catch(err){ debugConsole("error in importAppEmbedAssets",err) } } async function importMixAndMatchAssets (loadUnminifiedFiles){ try{ const customSettings = window.easybundles_ext_data?.userData?.customSettings ?? window.easybundle_user_ext_data?.customSettings ?? {}; const isAutoPlacementEnabled = customSettings?.isLoadMixAndMatchAssetsFromS3Enabled ?? false; if(!isAutoPlacementEnabled) return; const allMixAndMatchBundles = window.easybundles_ext_data?.mixAndMatchData ?? []; const shouldImportMixAndMatchAssets = checkIfShouldImportMixAndMatchAssets(allMixAndMatchBundles); if(!shouldImportMixAndMatchAssets) return; const baseURL = loadUnminifiedFiles ? `${STOREFRONT_CDN}/product-page-bundle/${CDN_ENV}/active/mixAndMatchBundle` : 'https://cdn.shopify.com/extensions/01a10bc7-19c5-7d11-8258-7cdf8cbb8ac9/gift-box-builder-1-474/assets/easy-bundle-product-page-min'; const assets = [ { id: 'gbbMix-bundle-embed-css', tag: 'link', attrs: { href: baseURL + '.css', rel: 'stylesheet', media: 'all' }, onload: (el) => el.media = 'all' }, { id: 'gbbMix-bundle-embed-js', tag: 'script', attrs: { src: baseURL + '.js', async: false } } ]; loadAssetFiles(assets); }catch(err){ debugConsole("error in checkAndImportMixAndMatchScript",err) } } async function importFullPageAssets (loadUnminifiedFiles){ try{ const activeBundleData = window.easybundle_active_bundle_data ?? window.easybundle_full_page_ext_data; const customSettings = activeBundleData?.userData?.customSettings ?? window.easybundle_user_ext_data?.customSettings ?? {}; const isAutoPlaceFullPageBundleEnabled = customSettings && (customSettings?.isAutoPlaceFullPageBundleEnabled ?? true); if(!isAutoPlaceFullPageBundleEnabled) return; const forceCdn = isForceCdn(); if(forceCdn || !activeBundleData?.stepsConfigurationData || activeBundleData?.stepsConfigurationData?.errorMsg){ debugConsole(forceCdn ? "importFullPageAssets => gbbForceCdn flag set, fetching from backup S3" : "importFullPageAssets => bundleData metafield limit exceeded, fetching from backup S3"); const data = await getBundleDataFromS3(); if(!data || !data?.stepsConfigurationData){ debugConsole("error in importFullPageAssets => Failed to load the backup bundle data from s3."); return; } activeBundleData.stepsConfigurationData = data?.stepsConfigurationData; activeBundleData.discountsData = data?.discountsData; } // giftboxbuilderLogic self-loads jQuery (gbbUtils.f.loadJquery:137), so no prepend needed. const baseURL = loadUnminifiedFiles ? `${STOREFRONT_CDN}/full-page-bundle/${CDN_ENV}/active/giftboxbuilderLogic` : 'https://cdn.shopify.com/extensions/01a10bc7-19c5-7d11-8258-7cdf8cbb8ac9/gift-box-builder-1-474/assets/easy-bundle-full-page-min'; const assets = [ { id: 'gbb-bundle-embed-css', tag: 'link', attrs: { href: baseURL + '.css', rel: 'stylesheet', media: 'all' }, onload: (el) => el.media = 'all' }, { id: 'gbb-bundle-embed-js', tag: 'script', attrs: { src: baseURL + '.js', async: false } } ]; loadAssetFiles(assets); }catch(err){ debugConsole("error in importFullPageAssets",err) } } const SDK_TEMPLATE_URLS = { PDP_INPAGE: { jsMin: 'https://cdn.shopify.com/extensions/01a10bc7-19c5-7d11-8258-7cdf8cbb8ac9/gift-box-builder-1-474/assets/inline-bundle.min.js', cssMin: 'https://cdn.shopify.com/extensions/01a10bc7-19c5-7d11-8258-7cdf8cbb8ac9/gift-box-builder-1-474/assets/inline-bundle.min.css', js: cdn('product-page-templates/inline', 'inline-bundle.js'), css: cdn('product-page-templates/inline', 'inline-bundle.css') }, PDP_MODAL: { jsMin: 'https://cdn.shopify.com/extensions/01a10bc7-19c5-7d11-8258-7cdf8cbb8ac9/gift-box-builder-1-474/assets/expandable-bundle.min.js', cssMin: 'https://cdn.shopify.com/extensions/01a10bc7-19c5-7d11-8258-7cdf8cbb8ac9/gift-box-builder-1-474/assets/expandable-bundle.min.css', js: cdn('product-page-templates/expandable', 'expandable-bundle.js'), css: cdn('product-page-templates/expandable', 'expandable-bundle.css') }, PDP_OVERLAY: { jsMin: 'https://cdn.shopify.com/extensions/01a10bc7-19c5-7d11-8258-7cdf8cbb8ac9/gift-box-builder-1-474/assets/overlay-bundle.min.js', cssMin: 'https://cdn.shopify.com/extensions/01a10bc7-19c5-7d11-8258-7cdf8cbb8ac9/gift-box-builder-1-474/assets/overlay-bundle.min.css', js: cdn('product-page-templates/overlay', 'overlay-bundle.js'), css: cdn('product-page-templates/overlay', 'overlay-bundle.css') }, FBP_SIDE_FOOTER: { jsMin: 'https://cdn.shopify.com/extensions/01a10bc7-19c5-7d11-8258-7cdf8cbb8ac9/gift-box-builder-1-474/assets/side-footer-bundle.min.js', cssMin: 'https://cdn.shopify.com/extensions/01a10bc7-19c5-7d11-8258-7cdf8cbb8ac9/gift-box-builder-1-474/assets/side-footer-bundle.min.css', js: cdn('full-page-templates/sideFooter', 'side-footer-bundle.js'), css: cdn('full-page-templates/sideFooter', 'side-footer-bundle.css') }, PB_CLASSIC_INLINE: { jsMin: 'https://cdn.shopify.com/extensions/01a10bc7-19c5-7d11-8258-7cdf8cbb8ac9/gift-box-builder-1-474/assets/inset-bundle.min.js', cssMin: 'https://cdn.shopify.com/extensions/01a10bc7-19c5-7d11-8258-7cdf8cbb8ac9/gift-box-builder-1-474/assets/inset-bundle.min.css', js: cdn('product-bundle-templates/inset', 'inset-bundle.js'), css: cdn('product-bundle-templates/inset', 'inset-bundle.css') }, CUSTOM_TEMPLATE: { jsMin: `https://d1712zxri13o2p.cloudfront.net/customTemplates/${window.Shopify.shop}/###TEMPLATE_ID###/bundle.js`, cssMin: `https://d1712zxri13o2p.cloudfront.net/customTemplates/${window.Shopify.shop}/###TEMPLATE_ID###/bundle.css`, js: `https://d1712zxri13o2p.cloudfront.net/customTemplates/${window.Shopify.shop}/###TEMPLATE_ID###/bundle.js`, css: `https://d1712zxri13o2p.cloudfront.net/customTemplates/${window.Shopify.shop}/###TEMPLATE_ID###/bundle.css` } }; window.SDK_TEMPLATE_URLS = {...(window.SDK_TEMPLATE_URLS ?? {}), ...SDK_TEMPLATE_URLS}; // async:false preserves SDK-before-template order; template-keyed ids let types coexist. async function importSDKAssets(bundleContext, loadUnminifiedFiles){ try{ const parentProductData = window.shopifyLiquidValuesApp4Ext?.product?.bundleProductConfiguration; const offerId = bundleContext?.offerId ?? parentProductData?.offerId; const bundleDesignTemplate = bundleContext?.bundleDesignTemplate ?? parentProductData?.bundleDesignTemplate; const templateId = bundleContext?.templateId ?? parentProductData?.templateId; const bundleType = bundleContext?.bundleType ?? parentProductData?.bundleType; if(!offerId){ debugConsole("importSDKAssets: no offerId found in product metafield"); return; } const templateConfig = SDK_TEMPLATE_URLS[bundleDesignTemplate]; if(!templateConfig){ debugConsole("importSDKAssets: no template registered for bundleDesignTemplate", bundleDesignTemplate); return; } let templateJs = loadUnminifiedFiles ? templateConfig.js : templateConfig.jsMin; let templateCss = loadUnminifiedFiles ? templateConfig.css : templateConfig.cssMin; if (bundleDesignTemplate === 'CUSTOM_TEMPLATE') { if (!templateId) { debugConsole("importSDKAssets: CUSTOM_TEMPLATE selected but no templateId in product metafield"); return; } templateJs = templateJs.replace('###TEMPLATE_ID###', templateId); templateCss = templateCss.replace('###TEMPLATE_ID###', templateId); } // First matching rule wins; last is the default (mix SDK). const SDK_RUNTIME_RULES = [ { match: (type) => (type || '').includes('PRODUCT_BUNDLE'), id: 'gbb-precurated-sdk-js', url: loadUnminifiedFiles ? cdn('sdk/pb-sdk', 'easy-bundle-pb-sdk.js') : 'https://cdn.shopify.com/extensions/01a10bc7-19c5-7d11-8258-7cdf8cbb8ac9/gift-box-builder-1-474/assets/easy-bundle-pb-sdk.min.js' }, { match: () => true, id: 'gbb-sdk-js', url: loadUnminifiedFiles ? cdn('sdk/eb-sdk', 'easy-bundle-sdk.js') : 'https://cdn.shopify.com/extensions/01a10bc7-19c5-7d11-8258-7cdf8cbb8ac9/gift-box-builder-1-474/assets/easy-bundle-sdk.min.js' } ]; const sdkRuntime = SDK_RUNTIME_RULES.find((rule) => rule.match(bundleType)); const assets = [ { id: 'gbb-sdk-template-css-' + bundleDesignTemplate, tag: 'link', attrs: { href: templateCss, rel: 'stylesheet', media: 'all', className: 'gbb-sdk-template-css' }, onload: (el) => el.media = 'all' }, { id: sdkRuntime.id, tag: 'script', attrs: { src: sdkRuntime.url, async: false } }, { id: 'gbb-sdk-template-js-' + bundleDesignTemplate, tag: 'script', attrs: { src: templateJs, async: false } } ]; loadAssetFiles(assets); }catch(err){ debugConsole("error in importSDKAssets",err) } } window.gbbExtEmbed.f.importSDKAssets = importSDKAssets; function importAssets(isDevMode){ const customSettings = window.easybundles_ext_data?.userData?.customSettings ?? window.easybundle_active_bundle_data?.userData?.customSettings ?? {}; const loadUnminifiedFiles = isDevMode || (customSettings.loadUnminifiedStorefrontFiles ?? false); const bundleConfig = window.shopifyLiquidValuesApp4Ext?.product?.bundleProductConfiguration; const bundleKey = bundleConfig?.appLevelMetafieldKey || ''; const keyPrefix = bundleKey.split('-')[0]; const seenTemplates = new Set(); if (keyPrefix === 'SDK') { importSDKAssets(undefined, loadUnminifiedFiles); if (bundleConfig?.bundleDesignTemplate) { seenTemplates.add(bundleConfig.bundleDesignTemplate); } } else if(keyPrefix === 'PB'){ importSDKAssets(undefined, loadUnminifiedFiles); if (bundleConfig?.bundleDesignTemplate) { seenTemplates.add(bundleConfig.bundleDesignTemplate); } } else { importMixAndMatchAssets(loadUnminifiedFiles); importFullPageAssets(loadUnminifiedFiles); } // The SDK runtime is a singleton; per-offer state lives on gbbSdkTemplate.bundles. const matchedSdkUpsells = window.easybundles_ext_data?.matchedSdkUpsells ?? {}; for(const entry of Object.values(matchedSdkUpsells)){ if(!entry?.bundleDesignTemplate) continue; if(seenTemplates.has(entry.bundleDesignTemplate)) continue; seenTemplates.add(entry.bundleDesignTemplate); importSDKAssets(entry, loadUnminifiedFiles); } // Block-seeded bundles: routing is in the seeded data, so no DOM marker is needed. const blockBundles = window.easybundle_pb_block_bundles ?? {}; for (const [offerId, bundleData] of Object.entries(blockBundles)) { const bundleDesignTemplate = bundleData?.bundleDesignTemplate; if (!bundleDesignTemplate || seenTemplates.has(bundleDesignTemplate)) continue; seenTemplates.add(bundleDesignTemplate); importSDKAssets({ offerId: offerId, bundleType: 'PRODUCT_BUNDLE', bundleDesignTemplate: bundleDesignTemplate, templateId: bundleData?.bundleDesignTemplateData?.templateId, }, loadUnminifiedFiles); } importAppEmbedAssets(loadUnminifiedFiles); } // Must write recovered globals BEFORE importAssets loads the JS that reads them. async function resolveOverflows(){ const bundleConfig = window.shopifyLiquidValuesApp4Ext?.product?.bundleProductConfiguration; const recomputedFromCDN = await resolveUpsellIndexAndMatches(bundleConfig); const fetches = []; queueParentSdkConfigFetchIfOverflowed(fetches, bundleConfig); queueMatchedUpsellBundleDataFetches(fetches, recomputedFromCDN); queueBlockBundleDataFetches(fetches); if (fetches.length === 0) return; debugConsole("resolveOverflows => " + fetches.length + " parallel fetch(es)"); await Promise.all(fetches); } async function resolveUpsellIndexAndMatches(bundleConfig){ const upsellIndexRaw = window.__gbbOverflow?.upsellIndexRaw; const forceCdn = isForceCdn(); let upsellIndex = null; if (forceCdn || isOverflowed(upsellIndexRaw)) { debugConsole(forceCdn ? "resolveOverflows => gbbForceCdn flag set, fetching upsell index from CDN" : "resolveOverflows => upsell index overflowed, fetching from CDN"); upsellIndex = await getUpsellIndexFromCDN(); } else if (Array.isArray(upsellIndexRaw) && !window.easybundles_ext_data?.matchedSdkUpsells) { debugConsole("resolveOverflows => matchedSdkUpsells missing (likely ext_data overflow), recomputing from inline index"); upsellIndex = upsellIndexRaw; } if (!Array.isArray(upsellIndex)) return false; // Empty shell survives ext_data overflow: getSettings recovery Object.assigns onto it. window.easybundles_ext_data = window.easybundles_ext_data || {}; window.easybundles_ext_data.sdkBundleUpsellIndex = upsellIndex; const parentOfferId = bundleConfig?.offerId; const matchedMap = {}; for (const bundle of checkIfShouldImportSDKAssets(upsellIndex)) { if (!bundle?.offerId) continue; if (bundle.offerId === parentOfferId) continue; matchedMap[bundle.offerId] = bundle; } window.easybundles_ext_data.matchedSdkUpsells = matchedMap; return true; } function queueParentSdkConfigFetchIfOverflowed(fetches, bundleConfig){ const keyPrefix = (bundleConfig?.appLevelMetafieldKey || '').split('-')[0]; const keys = ["SDK", "PB"]; if (!keys.includes(keyPrefix)) return; if (!isForceCdn() && !isOverflowed(window.easybundle_active_bundle_data?._bundleData)) return; fetches.push( getSdkBundleDataFromCDN(bundleConfig?.offerId).then(function(fresh){ if (fresh && window.easybundle_active_bundle_data) { window.easybundle_active_bundle_data._bundleData = fresh; } }) ); } // Overflowed block bundles land as an { errorMsg } sentinel; same CDN recovery. function queueBlockBundleDataFetches(fetches){ const blockBundles = window.easybundle_pb_block_bundles ?? {}; const forceCdn = isForceCdn(); for (const [offerId, bundleData] of Object.entries(blockBundles)) { if (!isOverflowed(bundleData) && !forceCdn) continue; fetches.push( getSdkBundleDataFromCDN(offerId).then(function(fresh){ if (!fresh) return; // matchedForProductId is stamped on the seeded blob, not the CDN document; carry it across. window.easybundle_pb_block_bundles[offerId] = bundleData?.matchedForProductId != null ? Object.assign(fresh, { matchedForProductId: bundleData.matchedForProductId }) : fresh; }) ); } } function queueMatchedUpsellBundleDataFetches(fetches, recomputedFromCDN){ const matchedSdkUpsells = window.easybundles_ext_data?.matchedSdkUpsells ?? {}; const shouldHaveBundleData = window.easybundles_ext_data?.userFlags?.shouldGetBundleDataForWidgets !== false; const forceCdn = isForceCdn(); for (const [offerId, entry] of Object.entries(matchedSdkUpsells)) { const isSentinel = isOverflowed(entry?.bundleData); const isMissingAfterRecompute = recomputedFromCDN && shouldHaveBundleData && !entry?.bundleData; if (!isSentinel && !isMissingAfterRecompute && !forceCdn) continue; fetches.push( getSdkBundleDataFromCDN(offerId).then(function(fresh){ if (fresh) matchedSdkUpsells[offerId].bundleData = fresh; }) ); } } async function armPreviewIfRequested(urlParams){ const previewToken = urlParams.get('ebPreview'); if (!previewToken || !/^pr-\d+-[a-f0-9]{12}$/.test(previewToken)) return; let abortTimeout; try { const abortController = new AbortController(); abortTimeout = setTimeout(function(){ abortController.abort(); }, 5000); const bootUrl = 'https://d1712zxri13o2p.cloudfront.net/previews/preview-boot.min.js'; const response = await fetch(bootUrl, { signal: abortController.signal }); if (response.ok) await new Function('previewToken', await response.text())(previewToken); } catch (err) { debugConsole("preview boot failed", err); } finally { if (abortTimeout) clearTimeout(abortTimeout); } } // Phase order: initializeShopifyValues → resolveOverflows → importAssets. async function initialize(){ const urlParams = new URLSearchParams(window.location.search); const isDevMode = urlParams.get('dev') == 'true'; const isDebugMode = urlParams.get('debug') == 'true'; if (isDebugMode) { debugger; } initializeShopifyValues(); await resolveOverflows(); importAssets(isDevMode); } initialize(); })();