{
  "version": 3,
  "sources": ["/cdn/shop/t/133/assets/wonderbiotics-subscriptions-integration.js?wb_stack=20260707_3"],
  "sourcesContent": ["/**\n * Wonderbiotics \u4EA7\u54C1\u8BA2\u9605\u96C6\u6210 JavaScript\n * \u4E13\u95E8\u4E3A https://wonderbiotics.com/products/wonderbiotics-easyshape-proboitic \u8BBE\u8BA1\n * \n * \u529F\u80FD\uFF1A\n * - \u76F4\u63A5\u663E\u793A\u6240\u6709\u53D8\u4F53\u7684\u8BA2\u9605\u9009\u9879\n * - \u5904\u7406\u8BA2\u9605\u9009\u62E9\u903B\u8F91\n * - \u96C6\u6210 Appstle Subscriptions API\n * - \u66F4\u65B0\u4EF7\u683C\u548C\u8D2D\u7269\u8F66\u6309\u94AE\n */\n\n(function() {\n  'use strict';\n\n  // \u9875\u9762\u7EA7\u8FD0\u884C\u65F6\uFF1A\u5168\u9875\u53EA\u7ED1\u5B9A\u4E00\u7EC4 Appstle/cart \u5168\u5C40\u4E8B\u4EF6\uFF0C\u5E76\u5171\u4EAB\u4E00\u6B21 Appstle \u5C31\u7EEA\u7B49\u5F85\u3002\n  // \u5373\u4F7F\u811A\u672C\u6216 section \u751F\u547D\u5468\u671F\u91CD\u590D\u89E6\u53D1\uFF0Cdocument \u4E8B\u4EF6\u4E5F\u53EA\u7ED1\u5B9A\u4E00\u6B21\uFF0C\u518D\u5206\u53D1\u7ED9\u5F53\u524D\u6709\u6548\u5B9E\u4F8B\u3002\n  const runtime = window.__wbSubscriptionRuntime || {\n    instances: new Set(),\n    eventsBound: false,\n    appstleReadyTimer: null,\n    appstleAttempts: 0\n  };\n  window.__wbSubscriptionRuntime = runtime;\n\n  function bindRuntimeEvents() {\n    if (runtime.eventsBound) return;\n    runtime.eventsBound = true;\n    const dispatch = (method, event) => {\n      runtime.instances.forEach((instance) => {\n        if (typeof instance[method] === 'function') instance[method](event);\n      });\n    };\n    document.addEventListener('AppstleSubscription:SubscriptionWidget:SellingPlanSelected', (event) => dispatch('handleAppstleSelection', event));\n    document.addEventListener('AppstleSubscription:SubscriptionWidget:SellingPlanDeSelected', (event) => dispatch('handleAppstleDeselection', event));\n    document.addEventListener('AppstleSubscription:PriceUpdated', (event) => dispatch('handleAppstlePriceUpdated', event));\n    document.addEventListener('cart:add', (event) => dispatch('handleCartSignal', event));\n    document.addEventListener('cart:updated', (event) => dispatch('handleCartSignal', event));\n    document.addEventListener('cart:refresh', (event) => dispatch('handleCartSignal', event));\n    document.addEventListener('click', (event) => {\n      if (event.target instanceof Element && event.target.closest('[data-cart-toggle], .cart-toggle, [aria-controls*=\"cart\"]')) {\n        dispatch('handleCartButtonClick', event);\n      }\n    });\n  }\n\n  function registerRuntimeInstance(instance) {\n    runtime.instances.add(instance);\n    bindRuntimeEvents();\n  }\n\n  function requestAppstleReady(instance) {\n    // Appstle \u53EF\u80FD\u665A\u4E8E\u672C\u811A\u672C\u52A0\u8F7D\uFF1B\u4F7F\u7528\u9875\u9762\u7EA7\u3001\u6700\u591A 8 \u6B21\u7684\u6709\u754C\u7B49\u5F85\uFF0C\u4E0D\u4E3A\u6BCF\u4E2A\u5B9E\u4F8B\u5EFA\u7ACB\u8F6E\u8BE2\u3002\n    if (typeof window.appstleInit === 'function') {\n      if (!runtime.appstleInitialized) {\n        try {\n          window.appstleInit();\n          runtime.appstleInitialized = true;\n        } catch (error) { /* Appstle remains optional. */ }\n      }\n      instance.appstleInitialized = Boolean(runtime.appstleInitialized);\n      return;\n    }\n    if (runtime.appstleReadyTimer) return;\n    runtime.appstleAttempts = 0;\n    const check = () => {\n      runtime.appstleReadyTimer = null;\n      runtime.appstleAttempts += 1;\n      if (typeof window.appstleInit === 'function') {\n        try {\n          window.appstleInit();\n          runtime.appstleInitialized = true;\n          runtime.instances.forEach((registered) => { registered.appstleInitialized = true; });\n        } catch (error) { /* Appstle remains optional. */ }\n        return;\n      }\n      if (runtime.appstleAttempts < 8) runtime.appstleReadyTimer = setTimeout(check, 1000);\n    };\n    runtime.appstleReadyTimer = setTimeout(check, 250);\n  }\n\n  class WonderbioticsSubscriptions {\n    constructor(container) {\n      this.container = container;\n      this.productId = container.dataset.productId;\n      this.productHandle = container.dataset.productHandle;\n      this.oneTimeMode = container.dataset.oneTimeMode || 'dropdown';\n      \n      // DOM \u5143\u7D20\n      this.variantCards = container.querySelectorAll('.variant-subscription-card:not(.one-time-purchase-card)');\n      this.planRadios = container.querySelectorAll('.plan-radio:not(.one-time-radio)');\n      this.variantIdInput = container.querySelector('#wonderbiotics-variant-id');\n      this.sellingPlanInput = container.querySelector('#wonderbiotics-selling-plan');\n      this.addToCartBtn = container.querySelector('#wonderbiotics-add-to-cart');\n      this.cartPriceDisplay = container.querySelector('#wonderbiotics-cart-price');\n      \n      // \u4E00\u6B21\u6027\u8D2D\u4E70\u76F8\u5173\u5143\u7D20\n      this.oneTimeCard = container.querySelector('.one-time-purchase-card');\n      this.oneTimeSelector = container.querySelector('.one-time-variant-selector');\n      this.oneTimeRadio = container.querySelector('.one-time-radio');\n      this.oneTimeInfo = container.querySelector('#selected-variant-info');\n      this.oneTimePriceDisplay = container.querySelector('#one-time-price-display');\n      \n      // Shopify \u539F\u751F\u8868\u5355\u548C\u6309\u94AE\n      this.shopifyForm = this.findShopifyProductForm();\n      this.shopifyVariantInput = this.findShopifyVariantInput();\n      this.shopifySellingPlanInput = this.findShopifySellingPlanInput();\n      this.shopifyAddToCartBtn = this.findShopifyAddToCartButton();\n      \n      // \u72B6\u6001\n      this.selectedVariant = null;\n      this.selectedSellingPlan = null;\n      this.appstleInitialized = false;\n      this.discountRemovedVerified = false;\n      this.defaultDiscountCode = '';\n      this.subscriptionAllowedDiscountCodes = [];\n      this.cartWatchInterval = null;\n      this.lastCartCheck = 0;\n      this.cartCheckThrottle = 5000; // 5\u79D2\u5185\u6700\u591A\u68C0\u67E5\u4E00\u6B21\n      this.initialVariantId = '';\n      this.lastTrackedSelectionKey = '';\n      this.isSyncingAppstle = false;\n      this.instanceTimers = new Set();\n      this.instanceObservers = new Set();\n      this.cartSignalTimer = null;\n      this.discountWatchStarted = false;\n      \n      this.init();\n    }\n\n    // \u5B9E\u4F8B\u4EA7\u751F\u7684\u5EF6\u8FDF\u4EFB\u52A1\u7EDF\u4E00\u767B\u8BB0\uFF0CShopify section \u5378\u8F7D\u65F6\u53EF\u5B8C\u6574\u6E05\u7406\u3002\n    schedule(callback, delay) {\n      const timer = setTimeout(() => {\n        this.instanceTimers.delete(timer);\n        callback();\n      }, delay);\n      this.instanceTimers.add(timer);\n      return timer;\n    }\n\n    cancelScheduled(timer) {\n      if (!timer) return;\n      clearTimeout(timer);\n      this.instanceTimers.delete(timer);\n    }\n\n    observe(observer, target, options) {\n      observer.observe(target, options);\n      this.instanceObservers.add(observer);\n      return observer;\n    }\n\n    // \u4E3B\u9898\u7F16\u8F91\u5668\u66FF\u6362 section \u65F6\u91CA\u653E\u8BA1\u65F6\u5668\u3001Observer \u548C runtime \u6CE8\u518C\uFF0C\u9632\u6B62\u65E7\u5B9E\u4F8B\u7EE7\u7EED\u54CD\u5E94\u4E8B\u4EF6\u3002\n    destroy() {\n      this.instanceTimers.forEach((timer) => clearTimeout(timer));\n      this.instanceTimers.clear();\n      this.instanceObservers.forEach((observer) => observer.disconnect());\n      this.instanceObservers.clear();\n      if (this.cartWatchInterval) clearInterval(this.cartWatchInterval);\n      if (this.cartSignalTimer) clearTimeout(this.cartSignalTimer);\n      runtime.instances.delete(this);\n      this.cartWatchInterval = null;\n      this.cartSignalTimer = null;\n    }\n\n    isLinkedOneTimeMode() {\n      return this.oneTimeMode === 'linked-variant';\n    }\n\n    init() {\n      // console.log('\u521D\u59CB\u5316 Wonderbiotics \u8BA2\u9605\u7EC4\u4EF6');\n      \n      // \u7ED1\u5B9A\u4E8B\u4EF6\n      this.bindEvents();\n      \n      // \u62E6\u622A\u8868\u5355\u63D0\u4EA4\uFF0C\u786E\u4FDD selling_plan \u88AB\u5305\u542B\n      this.interceptFormSubmit();\n      \n      // \u76D1\u542C\u8D2D\u7269\u8F66\u66F4\u65B0\uFF0C\u68C0\u6D4B\u5E76\u79FB\u9664\u81EA\u52A8\u5E94\u7528\u7684\u6298\u6263\u7801\n      this.watchCartForAutoDiscounts();\n      \n      // \u963B\u6B62\u81EA\u52A8\u5E94\u7528\u6298\u6263\u7801\n      this.preventAutoDiscountOnAdd();\n      \n      registerRuntimeInstance(this);\n      // \u521D\u59CB\u5316 Appstle\n      this.initAppstle();\n      \n      // \u8BBE\u7F6E\u9ED8\u8BA4\u9009\u62E9\n      this.setDefaultSelection();\n      this.initialVariantId = this.selectedVariant || this.variantIdInput?.value || '';\n      \n      // \u76D1\u542C\u9875\u9762\u53D8\u4F53\u9009\u62E9\u5668\n      this.watchPageVariantSelector();\n      \n      // \u4ECE URL \u53C2\u6570\u8BFB\u53D6\u53D8\u4F53\n      this.readVariantFromURL();\n    }\n\n    getTrackingContext() {\n      return {\n        pageType: this.container.dataset.ga4PageType,\n        moduleName: this.container.dataset.ga4ModuleName || 'pdp_subscription_options',\n        productId: this.container.dataset.ga4ProductId || this.productId || '',\n        productTitle: this.container.dataset.ga4ProductTitle || '',\n        currency: this.container.dataset.ga4Currency || 'USD'\n      };\n    }\n\n    getTrackingPrice(priceCents) {\n      const cents = Number.parseInt(priceCents, 10);\n      if (!Number.isFinite(cents)) return 0;\n      return Number((cents / 100).toFixed(2));\n    }\n\n    getSubscriptionTrackingData(radio) {\n      if (!radio) return null;\n\n      const context = this.getTrackingContext();\n      const card = radio.closest('.variant-subscription-card');\n      const label = radio.closest('.plan-label');\n\n      return {\n        ...context,\n        variantId: radio.dataset.ga4VariantId || radio.dataset.variantId || card?.dataset.ga4VariantId || card?.dataset.variantId || '',\n        variantName: radio.dataset.ga4VariantName || card?.dataset.ga4VariantName || card?.dataset.variantTitle || '',\n        variantPosition: radio.dataset.ga4VariantPosition || label?.dataset.planPosition || card?.dataset.ga4VariantPosition || card?.dataset.planPosition || '',\n        purchaseType: card?.dataset.ga4PurchaseType || 'subscription',\n        sellingPlanId: radio.dataset.ga4SellingPlanId || radio.dataset.sellingPlanId || '',\n        price: this.getTrackingPrice(radio.dataset.ga4PriceCents)\n      };\n    }\n\n    getOneTimeTrackingData(select, variantIdOverride) {\n      const context = this.getTrackingContext();\n      const variantId = variantIdOverride || select?.value || this.oneTimeRadio?.dataset.variantId || '';\n      const option = this.findOneTimeOptionByVariantId(variantId) || select?.options?.[select.selectedIndex];\n\n      if (!option) return null;\n\n      return {\n        ...context,\n        variantId: option.dataset.ga4VariantId || option.dataset.variantId || option.value || variantId,\n        variantName: option.dataset.ga4VariantName || option.dataset.variantTitle || option.textContent.trim(),\n        variantPosition: option.dataset.ga4VariantPosition || '',\n        purchaseType: this.oneTimeCard?.dataset.ga4PurchaseType || 'one_time',\n        sellingPlanId: '',\n        price: this.getTrackingPrice(option.dataset.ga4PriceCents || option.dataset.variantPriceCents)\n      };\n    }\n\n    getVariantJourney(productId) {\n      const storageKey = `wb_variant_journey:${productId}`;\n      const fallback = {\n        initial_variant_id: this.initialVariantId || this.selectedVariant || '',\n        first_selected_variant_id: '',\n        last_selected_variant_id: '',\n        selection_count: 0,\n        unique_variant_ids: [],\n        steps: [],\n        last_selection_key: ''\n      };\n\n      try {\n        const stored = window.sessionStorage?.getItem(storageKey);\n        if (!stored) return fallback;\n        return { ...fallback, ...JSON.parse(stored) };\n      } catch (error) {\n        return fallback;\n      }\n    }\n\n    saveVariantJourney(productId, journey) {\n      try {\n        window.sessionStorage?.setItem(`wb_variant_journey:${productId}`, JSON.stringify(journey));\n      } catch (error) {\n        // Tracking storage must not block product selection.\n      }\n    }\n\n    buildEcommercePayload(data) {\n      return {\n        currency: data.currency,\n        value: data.price,\n        items: [\n          {\n            item_id: data.variantId,\n            item_name: data.productTitle,\n            item_brand: 'WONDERBIOTICS',\n            item_variant: data.variantName,\n            price: data.price,\n            quantity: 1\n          }\n        ]\n      };\n    }\n\n    pushSubscriptionOptionSelect(data, source) {\n      if (!data || !data.pageType || !data.productId || !data.variantId) return;\n\n      const selectionKey = [\n        data.variantId,\n        data.sellingPlanId || '',\n        data.purchaseType || ''\n      ].join('|');\n      const journey = this.getVariantJourney(data.productId);\n\n      if (this.lastTrackedSelectionKey === selectionKey || journey.last_selection_key === selectionKey) {\n        return;\n      }\n\n      const previousStep = Array.isArray(journey.steps) ? journey.steps[journey.steps.length - 1] : null;\n      const uniqueVariantIds = new Set(Array.isArray(journey.unique_variant_ids) ? journey.unique_variant_ids : []);\n      uniqueVariantIds.add(data.variantId);\n\n      const selectionIndex = Number(journey.selection_count || 0) + 1;\n      const step = {\n        variant_id: data.variantId,\n        variant_name: data.variantName,\n        purchase_type: data.purchaseType,\n        selling_plan_id: data.sellingPlanId || '',\n        selection_source: source || '',\n        selected_at: Date.now()\n      };\n\n      journey.initial_variant_id = journey.initial_variant_id || this.initialVariantId || '';\n      journey.first_selected_variant_id = journey.first_selected_variant_id || data.variantId;\n      journey.last_selected_variant_id = data.variantId;\n      journey.selection_count = selectionIndex;\n      journey.unique_variant_ids = Array.from(uniqueVariantIds);\n      journey.steps = [...(Array.isArray(journey.steps) ? journey.steps : []), step].slice(-20);\n      journey.last_selection_key = selectionKey;\n\n      this.lastTrackedSelectionKey = selectionKey;\n      this.saveVariantJourney(data.productId, journey);\n\n      window.dataLayer = window.dataLayer || [];\n      // \u6E05\u7A7A\u4E0A\u4E00\u6761\u7535\u5546\u6570\u636E\uFF0C\u907F\u514D GTM \u8BFB\u53D6\u5230\u65E7\u7684 items\u3002\n      window.dataLayer.push({ ecommerce: null });\n      window.dataLayer.push({\n        event: 'subscription_option_select',\n        page_type: data.pageType,\n        module_name: data.moduleName,\n        product_id: data.productId,\n        product_title: data.productTitle,\n        variant_id: data.variantId,\n        variant_name: data.variantName,\n        purchase_type: data.purchaseType,\n        selling_plan_id: data.sellingPlanId || '',\n        selection_source: source || '',\n        selection_index: selectionIndex,\n        variant_position: data.variantPosition,\n        is_first_explicit_selection: selectionIndex === 1,\n        previous_variant_id: previousStep?.variant_id || null,\n        previous_purchase_type: previousStep?.purchase_type || null,\n        currency: data.currency,\n        price: data.price,\n        ecommerce: this.buildEcommercePayload(data)\n      });\n    }\n    \n    // \u62E6\u622A\u8868\u5355\u63D0\u4EA4\uFF0C\u786E\u4FDD selling_plan \u88AB\u5305\u542B\n    interceptFormSubmit() {\n      if (!this.shopifyForm) return;\n      \n      // \u76D1\u542C\u8868\u5355\u63D0\u4EA4\u4E8B\u4EF6\n      this.shopifyForm.addEventListener('submit', (e) => {\n        // \u68C0\u67E5\u662F\u5426\u6B63\u5728\u63D0\u4EA4\uFF08\u9632\u6B62\u91CD\u590D\u63D0\u4EA4\uFF09\n        if (this.shopifyForm.getAttribute('data-submitting') === 'true') {\n          // console.warn('\u8868\u5355\u6B63\u5728\u63D0\u4EA4\u4E2D\uFF0C\u963B\u6B62\u91CD\u590D\u63D0\u4EA4');\n          e.preventDefault();\n          e.stopPropagation();\n          return false;\n        }\n        \n        // \u6807\u8BB0\u6B63\u5728\u63D0\u4EA4\n        this.shopifyForm.setAttribute('data-submitting', 'true');\n        \n        // \u786E\u4FDD selling_plan \u5DF2\u8BBE\u7F6E\n        if (this.selectedSellingPlan) {\n          // \u79FB\u9664\u6240\u6709\u91CD\u590D\u5B57\u6BB5\n          this.ensureSellingPlanInForm();\n          this.verifySellingPlanBeforeSubmit();\n\n          // console.log('\u8868\u5355\u63D0\u4EA4\u524D\u9A8C\u8BC1 - selling_plan:', this.selectedSellingPlan);\n\n          // \u68C0\u67E5\u8868\u5355\u6570\u636E\n          const formData = new FormData(this.shopifyForm);\n          const sellingPlanValue = formData.get('selling_plan');\n          const variantValue = formData.get('id');\n          \n          // console.log('\u8868\u5355\u63D0\u4EA4\u6570\u636E:', {\n          //   variant: variantValue,\n          //   selling_plan: sellingPlanValue,\n          //   expected_selling_plan: this.selectedSellingPlan\n          // });\n          \n          if (sellingPlanValue !== this.selectedSellingPlan) {\n            // console.warn('\u8868\u5355\u4E2D\u7684 selling_plan \u503C\u4E0D\u6B63\u786E\uFF0C\u6B63\u5728\u4FEE\u590D...');\n            const sellingPlanInput = this.shopifyForm.querySelector('[name=\"selling_plan\"]');\n            if (sellingPlanInput) {\n              sellingPlanInput.value = this.selectedSellingPlan;\n            }\n          }\n          \n          // \u786E\u4FDD\u6CA1\u6709\u5176\u4ED6\u53EF\u80FD\u5F71\u54CD\u4EF7\u683C\u7684\u5B57\u6BB5\n          this.cleanupFormForSubscription();\n        } else {\n          // \u5982\u679C\u6CA1\u6709\u9009\u62E9\u8BA2\u9605\uFF0C\u786E\u4FDD selling_plan \u5B57\u6BB5\u4E3A\u7A7A\u6216\u4E0D\u5B58\u5728\n          const sellingPlanInput = this.shopifyForm.querySelector('[name=\"selling_plan\"]');\n          if (sellingPlanInput) {\n            sellingPlanInput.value = '';\n          }\n        }\n        \n        // \u63D0\u4EA4\u5B8C\u6210\u540E\u91CD\u7F6E\u72B6\u6001\n        this.schedule(() => {\n          this.shopifyForm.removeAttribute('data-submitting');\n          this.resetFormState();\n        }, 1000);\n      }, true); // \u4F7F\u7528\u6355\u83B7\u9636\u6BB5\uFF0C\u786E\u4FDD\u5728\u5176\u4ED6\u76D1\u542C\u5668\u4E4B\u524D\u6267\u884C\n    }\n    \n    // \u6E05\u7406\u8868\u5355\uFF0C\u786E\u4FDD\u8BA2\u9605\u6B63\u786E\u4F20\u9012\n    cleanupFormForSubscription() {\n      if (!this.shopifyForm) return;\n      \n      // \u79FB\u9664\u53EF\u80FD\u51B2\u7A81\u7684\u5B57\u6BB5\n      const conflictingInputs = this.shopifyForm.querySelectorAll(\n        '[name=\"selling_plan_id\"]:not([data-keep]), ' +\n        '[name=\"properties[_selling_plan]\"]:not([data-keep])'\n      );\n      \n      conflictingInputs.forEach(input => {\n        input.remove();\n        // console.log('\u79FB\u9664\u4E86\u53EF\u80FD\u51B2\u7A81\u7684\u5B57\u6BB5:', input.name);\n      });\n      \n      // \u786E\u4FDD\u53EA\u6709\u4E00\u4E2A selling_plan \u5B57\u6BB5\n      const sellingPlanInputs = this.shopifyForm.querySelectorAll('[name=\"selling_plan\"]');\n      if (sellingPlanInputs.length > 1) {\n        sellingPlanInputs.forEach((input, index) => {\n          if (index > 0) {\n            input.remove();\n            // console.log('\u79FB\u9664\u4E86\u91CD\u590D\u7684 selling_plan \u5B57\u6BB5');\n          }\n        });\n      }\n    }\n\n    bindEvents() {\n      // \u8BA2\u9605\u8BA1\u5212\u9009\u62E9\n      this.planRadios.forEach(radio => {\n        radio.addEventListener('change', (e) => {\n          this.handlePlanSelection(e.target, { track: true, source: 'radio' });\n        });\n        \n        // \u4E5F\u76D1\u542C click \u4E8B\u4EF6\uFF0C\u786E\u4FDD\u7ACB\u5373\u6E05\u9664\u5176\u4ED6\u9009\u4E2D\u72B6\u6001\n        radio.addEventListener('click', (e) => {\n          // \u5982\u679C\u8FD9\u4E2Aradio\u8FD8\u6CA1\u88AB\u9009\u4E2D\uFF0C\u5148\u6E05\u9664\u6240\u6709\u5176\u4ED6\u9009\u4E2D\u72B6\u6001\n          if (!e.target.checked) {\n            this.clearAllSelections();\n          }\n        });\n      });\n      \n      // \u4E00\u6B21\u6027\u8D2D\u4E70\u5361\u7247\u70B9\u51FB\u4E8B\u4EF6 - \u70B9\u51FB\u6574\u4E2A\u5361\u7247\u65F6\u6253\u5F00\u4E0B\u62C9\u9009\u62E9\u5668\n      if (this.oneTimeCard) {\n        this.oneTimeCard.addEventListener('click', (e) => {\n          // \u5982\u679C\u70B9\u51FB\u7684\u662F select \u5143\u7D20\u6216\u5176\u7236\u5143\u7D20\uFF0C\u4E0D\u5904\u7406\uFF08\u8BA9 select \u81EA\u5DF1\u5904\u7406\uFF09\n          if (e.target.closest('.one-time-variant-selector') || \n              e.target.closest('.variant-selector-wrapper')) {\n            return;\n          }\n          \n          // \u963B\u6B62\u4E8B\u4EF6\u5192\u6CE1\n          e.stopPropagation();\n          \n          // \u89E6\u53D1\u4E0B\u62C9\u9009\u62E9\u5668\u6253\u5F00\n          this.handleOneTimeCardClick({ track: true, source: 'card' });\n        });\n        \n        // \u6DFB\u52A0\u9F20\u6807\u6837\u5F0F\u63D0\u793A\n        this.oneTimeCard.style.cursor = 'pointer';\n      }\n      \n      // \u4E00\u6B21\u6027\u8D2D\u4E70\u53D8\u4F53\u9009\u62E9\u5668\n      if (this.oneTimeSelector) {\n        // \u963B\u6B62 select \u7684\u70B9\u51FB\u4E8B\u4EF6\u5192\u6CE1\u5230\u5361\u7247\n        this.oneTimeSelector.addEventListener('click', (e) => {\n          e.stopPropagation();\n        });\n        \n        // \u76D1\u542C change \u4E8B\u4EF6\n        this.oneTimeSelector.addEventListener('change', (e) => {\n          this.handleOneTimeVariantChange(e.target, { track: true, source: 'dropdown' });\n        });\n        \n        // \u76D1\u542C blur \u4E8B\u4EF6\uFF08\u4E0B\u62C9\u5173\u95ED\u65F6\uFF09\uFF0C\u786E\u4FDD\u5373\u4F7F\u9009\u62E9\u76F8\u540C\u7684\u503C\u4E5F\u80FD\u5904\u7406\n        let previousValue = this.oneTimeSelector.value;\n        this.oneTimeSelector.addEventListener('focus', () => {\n          previousValue = this.oneTimeSelector.value;\n        });\n        \n        this.oneTimeSelector.addEventListener('blur', (e) => {\n          // \u4E0B\u62C9\u5173\u95ED\u65F6\uFF0C\u5982\u679C\u503C\u5B58\u5728\u4E14\u4E0E\u4E4B\u524D\u4E0D\u540C\uFF0C\u6216\u8005\u9700\u8981\u786E\u4FDD\u72B6\u6001\u6B63\u786E\n          const currentValue = this.oneTimeSelector.value;\n          if (currentValue && currentValue !== '') {\n            // \u5373\u4F7F\u503C\u76F8\u540C\uFF0C\u4E5F\u786E\u4FDD\u72B6\u6001\u6B63\u786E\uFF08\u5904\u7406\u9996\u6B21\u9009\u62E9\u9ED8\u8BA4\u9009\u9879\u7684\u60C5\u51B5\uFF09\n            if (currentValue !== previousValue || !this.oneTimeRadio?.checked) {\n              this.handleOneTimeVariantChange(e.target, { track: true, source: 'dropdown' });\n            }\n          }\n        });\n      }\n      \n      // \u4E00\u6B21\u6027\u8D2D\u4E70\u5355\u9009\u6309\u94AE\n      if (this.oneTimeRadio) {\n        this.oneTimeRadio.addEventListener('change', (e) => {\n          this.handleOneTimeSelection(e.target, { track: true, source: 'radio' });\n        });\n      }\n      \n      // \u6DFB\u52A0\u5230\u8D2D\u7269\u8F66\u6309\u94AE\uFF08\u5DF2\u9690\u85CF\uFF0C\u4E0D\u518D\u4F7F\u7528\uFF09\n      // \u5982\u679C\u7528\u6237\u70B9\u51FB\u4E86\u6211\u4EEC\u7684\u6309\u94AE\uFF08\u867D\u7136\u5DF2\u9690\u85CF\uFF09\uFF0C\u4ECD\u7136\u89E6\u53D1\u4E3B\u9898\u81EA\u5E26\u6309\u94AE\n      if (this.addToCartBtn) {\n        this.addToCartBtn.addEventListener('click', (e) => {\n          e.preventDefault();\n          // \u76F4\u63A5\u89E6\u53D1\u4E3B\u9898\u81EA\u5E26\u6309\u94AE\n          if (this.shopifyAddToCartBtn) {\n            this.addToCart();\n          }\n        });\n      }\n      \n      // \u76D1\u542C\u4E3B\u9898\u81EA\u5E26\u6309\u94AE\u7684\u70B9\u51FB\uFF0C\u786E\u4FDD\u6570\u636E\u540C\u6B65\n      if (this.shopifyAddToCartBtn) {\n        this.shopifyAddToCartBtn.addEventListener('click', (e) => {\n          // \u5728\u4E3B\u9898\u6309\u94AE\u70B9\u51FB\u524D\uFF0C\u786E\u4FDD\u6570\u636E\u5DF2\u540C\u6B65\n          if (this.selectedVariant) {\n            this.syncToShopifyForm(this.selectedVariant, this.selectedSellingPlan);\n            this.ensureSellingPlanInForm();\n            this.verifySellingPlanBeforeSubmit();\n            \n            // console.log('\u4E3B\u9898\u81EA\u5E26\u6309\u94AE\u70B9\u51FB\uFF0C\u5DF2\u540C\u6B65\u6570\u636E:', {\n            //   variant: this.selectedVariant,\n            //   selling_plan: this.selectedSellingPlan || '(\u4E00\u6B21\u6027\u8D2D\u4E70)'\n            // });\n          }\n        }, true); // \u4F7F\u7528\u6355\u83B7\u9636\u6BB5\uFF0C\u5728\u5176\u4ED6\u76D1\u542C\u5668\u4E4B\u524D\u6267\u884C\n      }\n    }\n    \n    // \u5904\u7406\u4E00\u6B21\u6027\u8D2D\u4E70\u5361\u7247\u70B9\u51FB - \u6253\u5F00\u4E0B\u62C9\u9009\u62E9\u5668\n    handleOneTimeCardClick(trackingOptions = {}) {\n      // console.log('\u4E00\u6B21\u6027\u8D2D\u4E70\u5361\u7247\u88AB\u70B9\u51FB\uFF0C\u6253\u5F00\u4E0B\u62C9\u9009\u62E9\u5668');\n      \n      if (!this.oneTimeSelector) {\n        // console.warn('\u65E0\u6CD5\u627E\u5230\u4E00\u6B21\u6027\u8D2D\u4E70\u9009\u62E9\u5668');\n        return;\n      }\n\n      if (this.isLinkedOneTimeMode()) {\n        const variantId = this.selectedVariant || this.oneTimeSelector.value;\n        if (!variantId || !this.oneTimeRadio) return;\n\n        const selectedOption = this.updateOneTimeVariantDisplay(variantId);\n        this.oneTimeRadio.dataset.variantId = selectedOption?.value || variantId;\n        this.handleOneTimeSelection(this.oneTimeRadio, trackingOptions);\n        return;\n      }\n      \n      // \u68C0\u67E5\u5F53\u524D\u662F\u5426\u5DF2\u7ECF\u6709\u9009\u4E2D\u7684\u503C\n      const currentValue = this.oneTimeSelector.value;\n      const currentIndex = this.oneTimeSelector.selectedIndex;\n      \n      // \u5982\u679C\u7B2C\u4E00\u4E2A\u9009\u9879\u5DF2\u7ECF\u88AB\u9009\u4E2D\uFF0C\u5148\u624B\u52A8\u89E6\u53D1\u4E00\u6B21\u9009\u62E9\u5904\u7406\n      // \u8FD9\u6837\u5373\u4F7F\u7528\u6237\u518D\u6B21\u9009\u62E9\u7B2C\u4E00\u4E2A\u9009\u9879\uFF0C\u4E5F\u80FD\u6B63\u786E\u54CD\u5E94\n      if (currentValue && currentIndex >= 0) {\n        // \u5148\u89E6\u53D1\u4E00\u6B21\u9009\u62E9\u5904\u7406\uFF0C\u786E\u4FDD\u72B6\u6001\u6B63\u786E\n        this.handleOneTimeVariantChange(this.oneTimeSelector, trackingOptions);\n      }\n      \n      // \u89E6\u53D1\u4E0B\u62C9\u9009\u62E9\u5668\u6253\u5F00\n      // \u4E0B\u4E00\u4EFB\u52A1\u6253\u5F00\u539F\u751F\u9009\u62E9\u5668\uFF0C\u907F\u514D\u4E0E\u5F53\u524D click \u4E8B\u4EF6\u51B2\u7A81\u3002\n      this.schedule(() => {\n        // \u65B9\u6CD51: \u5982\u679C\u6D4F\u89C8\u5668\u652F\u6301 showPicker() API\uFF08\u73B0\u4EE3\u6D4F\u89C8\u5668\uFF09\n        if (this.oneTimeSelector.showPicker && typeof this.oneTimeSelector.showPicker === 'function') {\n          try {\n            this.oneTimeSelector.showPicker();\n            return;\n          } catch (e) {\n            // console.log('showPicker() \u4E0D\u53EF\u7528\uFF0C\u5C1D\u8BD5\u5176\u4ED6\u65B9\u6CD5');\n          }\n        }\n        \n        // \u65B9\u6CD52: \u805A\u7126\u5E76\u89E6\u53D1\u70B9\u51FB\u4E8B\u4EF6\n        this.oneTimeSelector.focus();\n        \n        // \u521B\u5EFA\u4E00\u4E2A\u9F20\u6807\u4E8B\u4EF6\u6765\u6A21\u62DF\u70B9\u51FB\n        const mouseEvent = new MouseEvent('mousedown', {\n          view: window,\n          bubbles: true,\n          cancelable: true,\n          buttons: 1\n        });\n        \n        this.oneTimeSelector.dispatchEvent(mouseEvent);\n        \n        // \u4E5F\u89E6\u53D1 click \u4E8B\u4EF6\n        this.schedule(() => {\n          const clickEvent = new MouseEvent('click', {\n            view: window,\n            bubbles: true,\n            cancelable: true,\n            buttons: 1\n          });\n          this.oneTimeSelector.dispatchEvent(clickEvent);\n        }, 10);\n      }, 10);\n    }\n\n    findOneTimeOptionByVariantId(variantId) {\n      if (!this.oneTimeSelector || !variantId) return null;\n      const variantIdString = variantId.toString();\n\n      return Array.from(this.oneTimeSelector.options).find(option => {\n        return option.value === variantIdString || option.dataset.variantId === variantIdString;\n      }) || null;\n    }\n\n    clearLinkedOneTimeVariant() {\n      this.container.querySelectorAll('.plan-label.one-time-linked-variant').forEach(label => {\n        label.classList.remove('one-time-linked-variant');\n      });\n    }\n\n    markLinkedOneTimeVariant(variantId) {\n      if (!this.isLinkedOneTimeMode() || !variantId) return;\n\n      this.clearLinkedOneTimeVariant();\n\n      const variantIdString = variantId.toString();\n      const matchingRadio = Array.from(this.planRadios).find(radio => {\n        return radio.dataset.variantId === variantIdString;\n      });\n      const matchingLabel = matchingRadio?.closest('.plan-label');\n\n      if (matchingLabel) {\n        matchingLabel.classList.add('one-time-linked-variant');\n      }\n    }\n\n    renderOneTimeOptionPrice(option) {\n      if (!option || !this.oneTimePriceDisplay) return;\n\n      const formattedPrice = option.dataset.variantDisplayPrice || option.dataset.variantPrice;\n      const dailyPrice = option.dataset.variantDisplayDailyPrice || '';\n\n      if (formattedPrice) {\n        this.oneTimePriceDisplay.innerHTML = `<span class=\"one-time-monthly-stack\" style=\"display:inline-flex!important;flex-direction:column!important;align-items:flex-end!important;justify-content:center!important;gap:4px!important;text-align:right!important;white-space:nowrap!important;\"><span class=\"one-time-monthly-price\" style=\"display:inline-flex!important;align-items:baseline!important;justify-content:flex-end!important;gap:4px!important;white-space:nowrap!important;\">${formattedPrice}<span class=\"price-suffix\">/mo</span></span>${dailyPrice ? `<span class=\"one-time-daily-price\" style=\"display:inline-flex!important;align-items:baseline!important;justify-content:flex-end!important;gap:4px!important;white-space:nowrap!important;\">${dailyPrice}<span class=\"price-suffix\">/day</span></span>` : ''}</span>`;\n      } else {\n        const priceCents = option.dataset.variantPriceCents;\n        const fallback = this.formatMoney(priceCents);\n        if (fallback) {\n          this.oneTimePriceDisplay.innerHTML = `<span class=\"one-time-monthly-stack\" style=\"display:inline-flex!important;flex-direction:column!important;align-items:flex-end!important;justify-content:center!important;gap:4px!important;text-align:right!important;white-space:nowrap!important;\"><span class=\"one-time-monthly-price\" style=\"display:inline-flex!important;align-items:baseline!important;justify-content:flex-end!important;gap:4px!important;white-space:nowrap!important;\">${fallback}<span class=\"price-suffix\">/mo</span></span></span>`;\n        }\n      }\n    }\n\n    updateOneTimeVariantDisplay(variantId) {\n      const selectedOption = this.findOneTimeOptionByVariantId(variantId);\n      if (!selectedOption || !this.oneTimeSelector) return null;\n\n      this.oneTimeSelector.value = selectedOption.value;\n      this.renderOneTimeOptionPrice(selectedOption);\n\n      if (this.oneTimeInfo) {\n        this.oneTimeInfo.style.display = 'block';\n      }\n\n      if (this.oneTimeRadio) {\n        this.oneTimeRadio.dataset.variantId = selectedOption.value;\n      }\n\n      this.markLinkedOneTimeVariant(selectedOption.value);\n\n      return selectedOption;\n    }\n    \n    // \u5904\u7406\u4E00\u6B21\u6027\u8D2D\u4E70\u53D8\u4F53\u9009\u62E9\n    handleOneTimeVariantChange(select, trackingOptions = {}) {\n      const variantId = select.value;\n      const selectedOption = select.options[select.selectedIndex];\n      \n      if (variantId && selectedOption && variantId !== '') {\n        this.renderOneTimeOptionPrice(selectedOption);\n        \n        // \u663E\u793A\u53D8\u4F53\u4FE1\u606F\n        if (this.oneTimeInfo) {\n          this.oneTimeInfo.style.display = 'block';\n        }\n        \n        // \u9009\u4E2D\u4E00\u6B21\u6027\u8D2D\u4E70\u9009\u9879\n        if (this.oneTimeRadio) {\n          this.oneTimeRadio.checked = true;\n          this.oneTimeRadio.dataset.variantId = variantId;\n          this.handleOneTimeSelection(this.oneTimeRadio, trackingOptions);\n        }\n      } else {\n        // \u5982\u679C\u6CA1\u6709\u9009\u62E9\uFF0C\u9690\u85CF\u4FE1\u606F\n        if (this.oneTimeInfo) {\n          this.oneTimeInfo.style.display = 'none';\n        }\n        if (this.oneTimeRadio) {\n          this.oneTimeRadio.checked = false;\n        }\n      }\n    }\n    \n    // \u5904\u7406\u4E00\u6B21\u6027\u8D2D\u4E70\u9009\u62E9\n    handleOneTimeSelection(radio, trackingOptions = {}) {\n      const variantId = radio.dataset.variantId || this.oneTimeSelector?.value;\n      \n      if (!variantId) {\n        return;\n      }\n      \n      // console.log('\u5904\u7406\u4E00\u6B21\u6027\u8D2D\u4E70\u9009\u62E9:', { variantId });\n      \n      // \u6E05\u9664\u6240\u6709\u8BA2\u9605\u9009\u9879\u7684\u9009\u4E2D\u72B6\u6001\n      this.clearAllSelections();\n\n      radio.checked = true;\n      radio.dataset.variantId = variantId;\n      this.markLinkedOneTimeVariant(variantId);\n      \n      // \u66F4\u65B0\u72B6\u6001\n      this.selectedVariant = variantId;\n      this.selectedSellingPlan = '';\n      \n      // \u66F4\u65B0\u9690\u85CF\u8F93\u5165\n      if (this.variantIdInput) {\n        this.variantIdInput.value = variantId;\n      }\n      if (this.sellingPlanInput) {\n        this.sellingPlanInput.value = '';\n      }\n      \n      // \u91CD\u7F6E\u8868\u5355\u72B6\u6001\uFF08\u91CD\u8981\uFF1A\u786E\u4FDD\u8868\u5355\u53EF\u4EE5\u518D\u6B21\u63D0\u4EA4\uFF09\n      this.resetFormState();\n      \n      // \u540C\u6B65\u5230 Shopify \u539F\u751F\u8868\u5355\n      this.syncToShopifyForm(variantId, '');\n      \n      // \u66F4\u65B0\u4EF7\u683C\u663E\u793A\uFF08\u8D2D\u7269\u8F66\u6309\u94AE\uFF09\n      const selectedOption = this.oneTimeSelector?.options[this.oneTimeSelector.selectedIndex];\n      if (selectedOption && this.cartPriceDisplay) {\n        // \u4F18\u5148\u4F7F\u7528\u683C\u5F0F\u5316\u540E\u7684\u4EF7\u683C\n        const formattedPrice = selectedOption.dataset.variantPrice;\n        if (formattedPrice) {\n          this.cartPriceDisplay.textContent = formattedPrice;\n        } else {\n          // [2026-05-26] \u515C\u5E95\u8D70\u7EDF\u4E00\u7684 formatMoney\uFF0C\u4E0D\u518D\u786C\u7F16\u7801 '$'\n          const fallback = this.formatMoney(selectedOption.dataset.variantPriceCents);\n          if (fallback) {\n            this.cartPriceDisplay.textContent = fallback;\n          }\n        }\n      }\n      \n      // \u542F\u7528\u6DFB\u52A0\u5230\u8D2D\u7269\u8F66\u6309\u94AE\n      this.enableAddToCart();\n      \n      // \u9AD8\u4EAE\u4E00\u6B21\u6027\u8D2D\u4E70\u5361\u7247\n      if (this.oneTimeCard) {\n        this.variantCards.forEach(card => {\n          card.classList.remove('active-variant');\n        });\n        this.oneTimeCard.classList.add('active-variant', 'is-one-time-selected');\n      }\n      \n      // \u89E6\u53D1\u81EA\u5B9A\u4E49\u4E8B\u4EF6\n      this.dispatchEvent('subscriptionSelected', {\n        variantId: variantId,\n        sellingPlanId: ''\n      });\n\n      if (trackingOptions.track === true) {\n        this.pushSubscriptionOptionSelect(\n          this.getOneTimeTrackingData(this.oneTimeSelector, variantId),\n          trackingOptions.source || 'radio'\n        );\n      }\n      \n      // console.log('\u4E00\u6B21\u6027\u8D2D\u4E70\u5DF2\u9009\u62E9:', { variantId });\n    }\n    \n    // \u6E05\u9664\u6240\u6709\u9009\u4E2D\u72B6\u6001\n    clearAllSelections() {\n      this.planRadios.forEach(radio => {\n        radio.checked = false;\n      });\n      \n      // \u4E5F\u6E05\u9664\u4E00\u6B21\u6027\u8D2D\u4E70\u9009\u9879\n      if (this.oneTimeRadio) {\n        this.oneTimeRadio.checked = false;\n      }\n      \n      this.container.querySelectorAll('.plan-label').forEach(label => {\n        label.classList.remove('selected');\n        label.classList.remove('one-time-linked-variant');\n      });\n      \n      this.variantCards.forEach(card => {\n        card.classList.remove('active-variant');\n      });\n      \n      // \u6E05\u9664\u4E00\u6B21\u6027\u8D2D\u4E70\u5361\u7247\u7684\u9AD8\u4EAE\n      if (this.oneTimeCard) {\n        this.oneTimeCard.classList.remove('active-variant');\n        this.oneTimeCard.classList.remove('is-one-time-selected');\n      }\n    }\n\n    handlePlanSelection(radio, trackingOptions = {}) {\n      const variantId = radio.dataset.variantId;\n      const sellingPlanId = radio.dataset.sellingPlanId || '';\n      \n      // console.log('\u5904\u7406\u8BA2\u9605\u9009\u62E9:', { variantId, sellingPlanId });\n      \n      // \u5148\u6E05\u9664\u6240\u6709\u9009\u4E2D\u72B6\u6001\n      this.clearAllSelections();\n      \n      // \u66F4\u65B0\u72B6\u6001\n      this.selectedVariant = variantId;\n      this.selectedSellingPlan = sellingPlanId;\n      \n      // \u66F4\u65B0\u6211\u4EEC\u7684\u9690\u85CF\u8F93\u5165\n      if (this.variantIdInput) {\n        this.variantIdInput.value = variantId;\n      }\n      if (this.sellingPlanInput) {\n        this.sellingPlanInput.value = sellingPlanId;\n      }\n      \n      // \u91CD\u7F6E\u8868\u5355\u72B6\u6001\uFF08\u91CD\u8981\uFF1A\u786E\u4FDD\u8868\u5355\u53EF\u4EE5\u518D\u6B21\u63D0\u4EA4\uFF09\n      this.resetFormState();\n      \n      // \u540C\u6B65\u5230 Shopify \u539F\u751F\u8868\u5355\n      this.syncToShopifyForm(variantId, sellingPlanId);\n      \n      // \u66F4\u65B0\u89C6\u89C9\u53CD\u9988\n      this.updateVisualFeedback(radio);\n      \n      // \u66F4\u65B0\u4EF7\u683C\u663E\u793A\n      this.updatePriceDisplay(radio);\n\n      if (this.isLinkedOneTimeMode()) {\n        this.updateOneTimeVariantDisplay(variantId);\n      }\n      \n      // \u542F\u7528\u6DFB\u52A0\u5230\u8D2D\u7269\u8F66\u6309\u94AE\n      this.enableAddToCart();\n      \n      // \u540C\u6B65 Appstle\n      this.syncWithAppstle(variantId, sellingPlanId);\n      \n      // \u89E6\u53D1\u81EA\u5B9A\u4E49\u4E8B\u4EF6\n      this.dispatchEvent('subscriptionSelected', {\n        variantId: variantId,\n        sellingPlanId: sellingPlanId\n      });\n\n      if (trackingOptions.track === true) {\n        this.pushSubscriptionOptionSelect(\n          this.getSubscriptionTrackingData(radio),\n          trackingOptions.source || 'radio'\n        );\n      }\n      \n      // console.log('\u8BA2\u9605\u5DF2\u9009\u62E9:', { variantId, sellingPlanId });\n    }\n    \n    // \u91CD\u7F6E\u8868\u5355\u72B6\u6001\n    resetFormState() {\n      if (!this.shopifyForm) {\n        // \u5373\u4F7F\u6CA1\u6709\u8868\u5355\uFF0C\u4E5F\u91CD\u7F6E\u6211\u4EEC\u7684\u6309\u94AE\n        if (this.addToCartBtn) {\n          this.addToCartBtn.disabled = false;\n          this.addToCartBtn.removeAttribute('disabled');\n        }\n        return;\n      }\n      \n      // \u79FB\u9664\u53EF\u80FD\u963B\u6B62\u63D0\u4EA4\u7684\u5C5E\u6027\n      const submitButtons = this.shopifyForm.querySelectorAll('button[type=\"submit\"], button[name=\"add\"]');\n      submitButtons.forEach(btn => {\n        btn.disabled = false;\n        btn.removeAttribute('disabled');\n        btn.removeAttribute('aria-disabled');\n      });\n      \n      // \u4E5F\u91CD\u7F6E\u6211\u4EEC\u7684\u6309\u94AE\n      if (this.addToCartBtn) {\n        this.addToCartBtn.disabled = false;\n        this.addToCartBtn.removeAttribute('disabled');\n      }\n      \n      // \u6E05\u9664\u8868\u5355\u7684\u63D0\u4EA4\u72B6\u6001\n      this.shopifyForm.removeAttribute('data-submitting');\n      this.shopifyForm.removeAttribute('data-submitted');\n      \n      // \u6E05\u9664\u53EF\u80FD\u963B\u6B62\u63D0\u4EA4\u7684\u7C7B\u540D\n      this.shopifyForm.classList.remove('submitting', 'submitted', 'disabled');\n      \n      // \u786E\u4FDD\u8868\u5355\u53EF\u4EE5\u518D\u6B21\u63D0\u4EA4\n      // console.log('\u8868\u5355\u72B6\u6001\u5DF2\u91CD\u7F6E\uFF0C\u53EF\u4EE5\u518D\u6B21\u63D0\u4EA4');\n    }\n\n    updateVisualFeedback(selectedRadio) {\n      // \u6E05\u9664\u6240\u6709\u53D8\u4F53\u7684\u6240\u6709\u9009\u4E2D\u72B6\u6001\n      this.container.querySelectorAll('.plan-label').forEach(label => {\n        label.classList.remove('selected');\n      });\n      \n      // \u6E05\u9664\u6240\u6709\u53D8\u4F53\u5361\u7247\u7684\u9009\u4E2D\u72B6\u6001\n      this.variantCards.forEach(card => {\n        card.classList.remove('active-variant');\n      });\n      \n      // \u6E05\u9664\u6240\u6709radio\u7684checked\u72B6\u6001\uFF08\u9664\u4E86\u5F53\u524D\u9009\u4E2D\u7684\uFF09\n      this.planRadios.forEach(radio => {\n        if (radio !== selectedRadio) {\n          radio.checked = false;\n        }\n      });\n      \n      // \u6DFB\u52A0\u9009\u4E2D\u72B6\u6001\u5230\u5F53\u524D\u9009\u9879\n      const selectedLabel = selectedRadio.closest('.plan-label');\n      if (selectedLabel) {\n        selectedLabel.classList.add('selected');\n      }\n      \n      // \u9AD8\u4EAE\u5BF9\u5E94\u7684\u53D8\u4F53\u5361\u7247\n      const variantCard = selectedRadio.closest('.variant-subscription-card');\n      if (variantCard) {\n        variantCard.classList.add('active-variant');\n      }\n    }\n\n    updatePriceDisplay(selectedRadio) {\n      const planItem = selectedRadio.closest('.subscription-plan-item');\n      if (!planItem) return;\n      \n      // \u4F18\u5148\u4ECE data-subscription-price \u5C5E\u6027\u83B7\u53D6\u4EF7\u683C\n      const planPricing = planItem.querySelector('.plan-pricing');\n      let priceText = '';\n      \n      if (planPricing) {\n        const priceElement = planPricing.querySelector('.price-current');\n        if (priceElement) {\n          const totalPriceFormatted = priceElement.getAttribute('data-total-price-formatted');\n          if (totalPriceFormatted) {\n            priceText = totalPriceFormatted;\n          } else {\n            priceText = priceElement.textContent.trim();\n          }\n        }\n      }\n      \n      // \u5982\u679C\u6CA1\u6709\u627E\u5230\uFF0C\u5C1D\u8BD5\u4ECE Appstle \u83B7\u53D6\u4EF7\u683C\n      if (!priceText) {\n        priceText = this.getPriceFromAppstle(selectedRadio);\n      }\n      \n      // \u66F4\u65B0\u8D2D\u7269\u8F66\u6309\u94AE\u4EF7\u683C\u663E\u793A\n      if (this.cartPriceDisplay && priceText) {\n        this.cartPriceDisplay.textContent = priceText;\n      }\n      \n      // \u66F4\u65B0\u5168\u5C40\u4EF7\u683C\u663E\u793A\uFF08\u5982\u679C\u9875\u9762\u6709\uFF09\n      this.updateGlobalPriceDisplay(priceText);\n    }\n    \n    // \u4ECE Appstle \u83B7\u53D6\u4EF7\u683C\n    getPriceFromAppstle(radio) {\n      if (!this.appstleInitialized) return null;\n      \n      try {\n        // \u67E5\u627E Appstle \u5C0F\u90E8\u4EF6\u4E2D\u7684\u4EF7\u683C\u663E\u793A\n        const appstleWidget = this.getProductRoot().querySelector('.appstle_sub_widget');\n        if (appstleWidget) {\n          // \u67E5\u627E\u9009\u4E2D\u7684\u8BA2\u9605\u8BA1\u5212\u5BF9\u5E94\u7684\u4EF7\u683C\n          const sellingPlanId = radio.dataset.sellingPlanId;\n          if (sellingPlanId) {\n            const appstlePlan = appstleWidget.querySelector(`input[value=\"${sellingPlanId}\"]`);\n            if (appstlePlan) {\n              // \u67E5\u627E\u5BF9\u5E94\u7684\u4EF7\u683C\u663E\u793A\u5143\u7D20\n              const priceElement = appstlePlan.closest('label')?.querySelector('.price, .appstle-price, [data-price]');\n              if (priceElement) {\n                return priceElement.textContent.trim();\n              }\n            }\n          }\n        }\n      } catch (error) {\n        // console.warn('\u4ECE Appstle \u83B7\u53D6\u4EF7\u683C\u5931\u8D25:', error);\n      }\n      \n      return null;\n    }\n    \n    // \u66F4\u65B0\u5168\u5C40\u4EF7\u683C\u663E\u793A\n    updateGlobalPriceDisplay(priceText) {\n      if (!priceText) return;\n      \n      // \u67E5\u627E\u9875\u9762\u4E0A\u7684\u4EF7\u683C\u663E\u793A\u5143\u7D20\uFF08\u5E38\u89C1\u7684\u9009\u62E9\u5668\uFF09\n      const priceSelectors = [\n        '.product-price .price',\n        '.product__price .price',\n        '[data-product-price]',\n        '.price--current',\n        '.product-single__price'\n      ];\n      \n      const productRoot = this.container.closest('#featureproduct, #mainproduct, .featured-product, .product') || this.container;\n      priceSelectors.forEach(selector => {\n        const elements = productRoot.querySelectorAll(selector);\n        elements.forEach(el => {\n          // \u53EA\u66F4\u65B0\u4E3B\u4EF7\u683C\uFF0C\u4E0D\u66F4\u65B0\u539F\u4EF7\n          if (!el.closest('.price--compare') && !el.closest('.price-original')) {\n            el.textContent = priceText;\n          }\n        });\n      });\n    }\n\n    enableAddToCart() {\n      if (this.addToCartBtn) {\n        this.addToCartBtn.disabled = false;\n      }\n    }\n\n    setDefaultSelection() {\n      this.orderConfiguredOneTimeVariants();\n\n      // D block can select a configured variant + selling plan; other blocks retain the legacy fallback.\n      const defaultVariantId = this.container.dataset.defaultVariantId;\n      const defaultSellingPlanId = this.container.dataset.defaultSellingPlanId;\n      let configuredSelectionApplied = false;\n      if (defaultVariantId && defaultSellingPlanId) {\n        const configuredRadio = Array.from(this.planRadios).find((radio) => (\n          radio.dataset.variantId === defaultVariantId\n          && radio.dataset.sellingPlanId === defaultSellingPlanId\n        ));\n        if (configuredRadio) {\n          configuredRadio.checked = true;\n          this.handlePlanSelection(configuredRadio);\n          configuredSelectionApplied = true;\n        }\n      }\n\n      if (!configuredSelectionApplied) {\n        // \u9ED8\u8BA4\u9009\u4E2D\u7B2C\u4E8C\u4E2A\u53D8\u4F53\u7684\u7B2C\u4E00\u4E2A\u8BA2\u9605\u9009\u9879\uFF08variant_index == 1\uFF09\n        const secondCard = this.variantCards[1]; // \u7B2C\u4E8C\u4E2A\u53D8\u4F53\u5361\u7247\uFF08\u7D22\u5F15\u4E3A1\uFF09\n        if (secondCard) {\n          const firstPlanRadio = secondCard.querySelector('.plan-radio');\n          if (firstPlanRadio) {\n            // \u5982\u679C\u8FD8\u6CA1\u6709\u9009\u4E2D\uFF0C\u8BBE\u7F6E\u4E3A\u9009\u4E2D\n            if (!firstPlanRadio.checked) {\n              firstPlanRadio.checked = true;\n            }\n            // \u89E6\u53D1\u9009\u62E9\u5904\u7406\n            this.handlePlanSelection(firstPlanRadio);\n            // console.log('\u9ED8\u8BA4\u9009\u4E2D\u7B2C\u4E8C\u4E2A\u53D8\u4F53\u7684\u8BA2\u9605\u9009\u9879');\n          }\n        } else {\n          // \u5982\u679C\u6CA1\u6709\u7B2C\u4E8C\u4E2A\u53D8\u4F53\uFF0C\u56DE\u9000\u5230\u7B2C\u4E00\u4E2A\u53D8\u4F53\n          const firstCard = this.variantCards[0];\n          if (firstCard) {\n            const firstPlanRadio = firstCard.querySelector('.plan-radio');\n            if (firstPlanRadio && !firstPlanRadio.checked) {\n              firstPlanRadio.checked = true;\n              this.handlePlanSelection(firstPlanRadio);\n            }\n          }\n        }\n      }\n      \n      // \u521D\u59CB\u5316\u4E00\u6B21\u6027\u8D2D\u4E70\u9009\u62E9\u5668\uFF08\u5982\u679C\u9ED8\u8BA4\u9009\u62E9\u4E86\u7B2C\u4E00\u4E2A\u53D8\u4F53\uFF09\n      if (this.oneTimeSelector && this.oneTimeSelector.selectedIndex > 0) {\n        // \u5982\u679C\u5DF2\u7ECF\u9009\u62E9\u4E86\u53D8\u4F53\uFF08\u4E0D\u662F\"\u8BF7\u9009\u62E9...\"\uFF09\uFF0C\u89E6\u53D1\u4EF7\u683C\u663E\u793A\n        const selectedIndex = this.oneTimeSelector.selectedIndex;\n        if (selectedIndex > 0) {\n          if (this.isLinkedOneTimeMode()) {\n            this.updateOneTimeVariantDisplay(this.selectedVariant || this.oneTimeSelector.value);\n          } else {\n            this.handleOneTimeVariantChange(this.oneTimeSelector);\n          }\n        }\n      }\n    }\n\n    orderConfiguredOneTimeVariants() {\n      const defaultVariantId = this.container.dataset.defaultVariantId;\n      const defaultSellingPlanId = this.container.dataset.defaultSellingPlanId;\n      if (!defaultVariantId || !defaultSellingPlanId || !this.oneTimeSelector) return;\n\n      const cycleOrder = {\n        '1month': 1,\n        '3month': 2,\n        '6month': 3\n      };\n\n      const options = Array.from(this.oneTimeSelector.options);\n      options.sort((a, b) => {\n        const aCycle = cycleOrder[a.dataset.dCycle] || 99;\n        const bCycle = cycleOrder[b.dataset.dCycle] || 99;\n        return aCycle - bCycle;\n      });\n\n      options.forEach((option) => this.oneTimeSelector.appendChild(option));\n    }\n\n    readVariantFromURL() {\n      const urlParams = new URLSearchParams(window.location.search);\n      const variantParam = urlParams.get('variant');\n      \n      if (variantParam) {\n        // \u627E\u5230\u5BF9\u5E94\u7684\u53D8\u4F53\u5361\u7247\u5E76\u9AD8\u4EAE\n        const variantCard = this.container.querySelector(`[data-variant-id=\"${variantParam}\"]`);\n        if (variantCard) {\n          variantCard.classList.add('active-variant');\n          variantCard.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n          \n          // \u9009\u62E9\u8BE5\u53D8\u4F53\u7684\u7B2C\u4E00\u4E2A\u8BA2\u9605\u9009\u9879\n          const firstPlanRadio = variantCard.querySelector('.plan-radio');\n          if (firstPlanRadio) {\n            firstPlanRadio.checked = true;\n            this.handlePlanSelection(firstPlanRadio);\n          }\n        }\n      }\n    }\n\n    watchPageVariantSelector() {\n      // \u4EC5\u76D1\u542C\u5F53\u524D\u5546\u54C1\u6A21\u5757\u5185\u7684\u53D8\u4F53\u9009\u62E9\u5668\uFF0C\u907F\u514D\u6BCF\u4E2A\u5B9E\u4F8B\u626B\u63CF\u6574\u9875\u3002\n      const productRoot = this.container.closest('#featureproduct, #mainproduct, .featured-product, .product') || this.container;\n      const variantSelectors = productRoot.querySelectorAll(\n        'select[name=\"id\"], input[name=\"id\"][type=\"radio\"]'\n      );\n      \n      variantSelectors.forEach(selector => {\n        selector.addEventListener('change', (e) => {\n          const variantId = e.target.value;\n          this.highlightVariantCard(variantId);\n        });\n      });\n    }\n\n    highlightVariantCard(variantId) {\n      this.variantCards.forEach(card => {\n        if (card.dataset.variantId === variantId) {\n          card.classList.add('active-variant');\n          card.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n        } else {\n          card.classList.remove('active-variant');\n        }\n      });\n    }\n\n    initAppstle() {\n      requestAppstleReady(this);\n      this.setupAppstleListeners();\n    }\n\n    waitForAppstle() {\n      requestAppstleReady(this);\n    }\n\n    setupAppstleListeners() {\n      if (this.appstleListenersReady) return;\n      this.appstleListenersReady = true;\n      this.watchAppstlePriceChanges();\n    }\n\n    handleAppstlePriceUpdated(event) {\n      if (event.detail && event.detail.sellingPlanId) {\n        this.updatePriceFromAppstle(event.detail.sellingPlanId);\n      }\n    }\n    \n    // \u76D1\u542C Appstle \u4EF7\u683C\u53D8\u5316\n    watchAppstlePriceChanges() {\n      let lastPrice = null;\n      \n      const checkPrice = () => {\n        try {\n          const appstleWidget = this.getProductRoot().querySelector('.appstle_sub_widget');\n          if (!appstleWidget) return;\n          \n          const selectedInput = appstleWidget.querySelector('input[name=selling_plan]:checked');\n          if (selectedInput) {\n            const planContainer = selectedInput.closest('label, .appstle-plan-item');\n            if (planContainer) {\n              const priceElement = planContainer.querySelector('.price, .appstle-price, [data-price]');\n              if (priceElement) {\n                const currentPrice = priceElement.textContent.trim();\n                if (currentPrice !== lastPrice) {\n                  lastPrice = currentPrice;\n                  const sellingPlanId = selectedInput.value;\n                  this.updatePriceFromAppstle(sellingPlanId);\n                }\n              }\n            }\n          }\n        } catch (error) {\n          // \u9759\u9ED8\u5904\u7406\u9519\u8BEF\n        }\n      };\n      \n      // \u4EC5\u5728\u7528\u6237\u4EA4\u4E92\u6216\u8BA2\u9605\u9009\u62E9\u65F6\u68C0\u67E5\u4EF7\u683C\u53D8\u5316\uFF0C\u4E0D\u518D\u4F7F\u7528\u5B9A\u671F\u68C0\u67E5\n      // \u4F7F\u7528\u4E8B\u4EF6\u9A71\u52A8\u800C\u4E0D\u662F\u8F6E\u8BE2\uFF0C\u51CF\u5C11\u6027\u80FD\u5F00\u9500\n      const priceObserver = new MutationObserver(() => {\n        if (this.selectedSellingPlan) {\n          checkPrice();\n        }\n      });\n      \n      // [2026-05-26] \u4FEE\u590D\u672A\u5B9A\u4E49\u5F15\u7528\uFF1A\u5728\u5916\u5C42\u91CD\u65B0\u67E5\u8BE2 appstleWidget\n      // Appstle widget \u53EF\u80FD\u5F02\u6B65\u52A0\u8F7D\uFF0C\u627E\u4E0D\u5230\u65F6\u5EF6\u8FDF\u91CD\u8BD5\u4E00\u6B21\u3002\n      const attachObserver = () => {\n        const appstleWidget = this.getProductRoot().querySelector('.appstle_sub_widget');\n        if (appstleWidget) {\n          this.observe(priceObserver, appstleWidget, {\n            childList: true,\n            subtree: true,\n            characterData: true\n          });\n          return true;\n        }\n        return false;\n      };\n      \n      if (!attachObserver()) this.schedule(attachObserver, 2000);\n    }\n\n    handleAppstleSelection(event) {\n      if (this.isSyncingAppstle) return;\n\n      // \u4ECE Appstle \u83B7\u53D6\u9009\u4E2D\u7684\u9500\u552E\u8BA1\u5212\n      const appstleInput = this.getProductRoot().querySelector('.appstle_sub_widget input[name=selling_plan]:checked');\n      if (appstleInput) {\n        const sellingPlanId = appstleInput.value;\n        const variantId = this.getVariantIdFromAppstle();\n        \n        // \u540C\u6B65\u5230\u6211\u4EEC\u7684\u754C\u9762\n        const correspondingRadio = this.container.querySelector(\n          `[data-variant-id=\"${variantId}\"][data-selling-plan-id=\"${sellingPlanId}\"]`\n        );\n        \n        if (correspondingRadio) {\n          correspondingRadio.checked = true;\n          this.handlePlanSelection(correspondingRadio, { track: true, source: 'appstle' });\n          \n          // \u4ECE Appstle \u66F4\u65B0\u4EF7\u683C\u663E\u793A\n          this.updatePriceFromAppstle(sellingPlanId);\n        }\n      }\n    }\n    \n    // \u4ECE Appstle \u66F4\u65B0\u4EF7\u683C\u663E\u793A\n    // [2026-05-26] \u91CD\u6784\uFF1A\n    //   - \u4E0D\u518D\u76F4\u63A5\u8986\u76D6 .price-current \u7684 textContent\uFF08\u907F\u514D\u4E22\u5931 /mo \u540E\u7F00 + \u53E3\u5F84\u51B2\u7A81\uFF09\n    //   - Appstle \u7ED9\u7684\u662F\u300C\u6298\u540E\u603B\u4EF7\u300D\uFF0C\u4EC5\u5199\u5165 data-total-price-formatted / data-subscription-price\n    //   - \u5982\u679C\u80FD\u62FF\u5230 months_count\uFF0C\u5219\u540C\u6B65\u91CD\u7B97\u300C\u5355\u74F6\u4EF7/mo\u300D\u5E76\u4EC5\u66F4\u65B0\u6570\u5B57\u8282\u70B9\n    //   - \u8D2D\u7269\u8F66\u6309\u94AE\u663E\u793A\u603B\u4EF7\uFF08\u4E0E\u539F\u884C\u4E3A\u4E00\u81F4\uFF09\n    updatePriceFromAppstle(sellingPlanId) {\n      try {\n        const appstleWidget = this.getProductRoot().querySelector('.appstle_sub_widget');\n        if (!appstleWidget) return;\n        \n        const selectedPlan = appstleWidget.querySelector(`input[value=\"${sellingPlanId}\"]`);\n        if (!selectedPlan) return;\n        \n        const planContainer = selectedPlan.closest('label, .appstle-plan-item, [data-plan]');\n        if (!planContainer) return;\n        \n        const priceElement = planContainer.querySelector('.price, .appstle-price, [data-price], .plan-price');\n        if (!priceElement) return;\n        \n        const appstlePriceText = priceElement.textContent.trim();\n        if (!appstlePriceText) return;\n\n        let displayPriceText = appstlePriceText;\n        let displayTotalNum = null;\n        const numericMatch = appstlePriceText.match(/[\\d,]+(?:\\.\\d+)?/);\n        const currencySymbol = (appstlePriceText.match(/[^\\d.,\\s]+/) || ['$'])[0];\n        if (numericMatch) {\n          const totalNum = parseFloat(numericMatch[0].replace(/,/g, ''));\n          if (!isNaN(totalNum) && totalNum > 0) {\n            displayTotalNum = totalNum;\n            displayPriceText = `${currencySymbol}${displayTotalNum.toFixed(2)}`;\n          }\n        }\n        \n        const correspondingPlan = this.container.querySelector(`[data-selling-plan-id=\"${sellingPlanId}\"]`);\n        if (!correspondingPlan) return;\n        \n        const planPricing = correspondingPlan.querySelector('.plan-pricing');\n        const ourPriceElement = correspondingPlan.querySelector('.price-current');\n        if (!ourPriceElement) return;\n\n        const planDiscountedCents = planPricing\n          ? parseInt(planPricing.getAttribute('data-discounted-price'), 10)\n          : NaN;\n        if (!isNaN(planDiscountedCents) && planDiscountedCents > 0) {\n          displayTotalNum = planDiscountedCents / 100;\n          displayPriceText = `${currencySymbol}${displayTotalNum.toFixed(2)}`;\n        }\n        \n        // \u68C0\u67E5\u662F\u5426\u5DF2\u7ECF\u540C\u6B65\u8FC7\u76F8\u540C\u7684\u603B\u4EF7\uFF0C\u907F\u514D\u91CD\u590D\u5DE5\u4F5C\n        const prevTotal = ourPriceElement.getAttribute('data-total-price-formatted');\n        if (prevTotal === displayPriceText) return;\n        \n        // \u4EC5\u66F4\u65B0 data-* \u5C5E\u6027\uFF08\u52A0\u8D2D\u603B\u4EF7\u7684\u53E3\u5F84\uFF09\n        ourPriceElement.setAttribute('data-total-price-formatted', displayPriceText);\n        ourPriceElement.setAttribute('data-subscription-price', displayPriceText);\n        \n        // \u5982\u679C\u6709 months_count\uFF0C\u5219\u5C1D\u8BD5\u89E3\u6790 Appstle \u603B\u4EF7\u5E76\u91CD\u7B97\"\u5355\u74F6\u4EF7/mo\"\n        // \u4EC5\u5728\u80FD\u7A33\u5B9A\u89E3\u6790\u65F6\u624D\u66F4\u65B0\u663E\u793A\u6587\u672C\uFF1B\u89E3\u6790\u5931\u8D25\u5C31\u4FDD\u7559 Liquid \u539F\u503C\uFF0C\u4E0D\u7834\u574F DOM \u7ED3\u6784\n        const monthsCount = planPricing\n          ? parseInt(planPricing.getAttribute('data-months-count'), 10)\n          : NaN;\n        \n        if (monthsCount > 0 && displayTotalNum) {\n              const perBottle = displayTotalNum / monthsCount;\n              const perBottleFormatted = `${currencySymbol}${perBottle.toFixed(2)}`;\n              \n              // \u53EA\u66F4\u65B0\u6570\u5B57\u6587\u672C\u8282\u70B9\uFF0C\u4FDD\u7559 .price-suffix\uFF08/mo\uFF09\u5B50\u8282\u70B9\u4E0D\u52A8\n              const suffixEl = ourPriceElement.querySelector('.price-suffix');\n              if (suffixEl) {\n                // \u79FB\u9664 .price-suffix \u4E4B\u524D\u7684\u7EAF\u6587\u672C\u8282\u70B9\uFF0C\u518D\u63D2\u5165\u65B0\u6570\u5B57\n                Array.from(ourPriceElement.childNodes).forEach((node) => {\n                  if (node.nodeType === Node.TEXT_NODE) {\n                    ourPriceElement.removeChild(node);\n                  }\n                });\n                ourPriceElement.insertBefore(\n                  document.createTextNode(perBottleFormatted),\n                  suffixEl\n                );\n              }\n        }\n        \n        // \u8D2D\u7269\u8F66\u6309\u94AE\u663E\u793A\u300C\u603B\u4EF7\u300D\n        if (this.cartPriceDisplay) {\n          this.cartPriceDisplay.textContent = displayPriceText;\n        }\n      } catch (error) {\n        // console.warn('\u4ECE Appstle \u66F4\u65B0\u4EF7\u683C\u5931\u8D25:', error);\n      }\n    }\n\n    handleAppstleDeselection(event) {\n      // \u5904\u7406\u53D6\u6D88\u9009\u62E9\n      // console.log('Appstle: \u8BA2\u9605\u8BA1\u5212\u5DF2\u53D6\u6D88\u9009\u62E9');\n    }\n\n    syncWithAppstle(variantId, sellingPlanId) {\n      if (!this.appstleInitialized || !sellingPlanId) return;\n      \n      // \u540C\u6B65\u5230 Appstle \u5C0F\u90E8\u4EF6\n      const appstleInput = this.getProductRoot().querySelector(`.appstle_sub_widget input[value=\"${sellingPlanId}\"]`);\n      if (appstleInput) {\n        this.isSyncingAppstle = true;\n\n        try {\n          appstleInput.checked = true;\n          \n          // \u89E6\u53D1 change \u4E8B\u4EF6\n          const changeEvent = new Event('change', { bubbles: true });\n          appstleInput.dispatchEvent(changeEvent);\n        } finally {\n          this.schedule(() => {\n            this.isSyncingAppstle = false;\n          }, 0);\n        }\n      }\n    }\n\n    getVariantIdFromAppstle() {\n      // \u5C1D\u8BD5\u4ECE Appstle \u5C0F\u90E8\u4EF6\u83B7\u53D6\u53D8\u4F53 ID\n      const variantInput = this.getProductRoot().querySelector('.appstle_sub_widget input[name=\"id\"]');\n      return variantInput ? variantInput.value : this.selectedVariant;\n    }\n\n    addToCart() {\n      if (!this.selectedVariant) {\n        alert('\u8BF7\u5148\u9009\u62E9\u4E00\u4E2A\u8BA2\u9605\u8BA1\u5212\u6216\u4E00\u6B21\u6027\u8D2D\u4E70\u9009\u9879');\n        return;\n      }\n      \n      // console.log('\u51C6\u5907\u6DFB\u52A0\u5230\u8D2D\u7269\u8F66:', {\n      //   variant: this.selectedVariant,\n      //   selling_plan: this.selectedSellingPlan || '(\u4E00\u6B21\u6027\u8D2D\u4E70)'\n      // });\n      \n      // \u91CD\u7F6E\u8868\u5355\u72B6\u6001\uFF08\u91CD\u8981\uFF1A\u786E\u4FDD\u53EF\u4EE5\u518D\u6B21\u63D0\u4EA4\uFF09\n      this.resetFormState();\n      \n      // \u5982\u679C\u9009\u62E9\u4E86\u8BA2\u9605\u8BA1\u5212\uFF0C\u53EA\u79FB\u9664\u4E0D\u5141\u8BB8\u7528\u4E8E\u8BA2\u9605\u7684\u6298\u6263\u7801\n      if (this.selectedSellingPlan) {\n        this.removeDiscountCodeBeforeAdd();\n      }\n      \n      // \u786E\u4FDD\u8868\u5355\u5DF2\u540C\u6B65\uFF08\u591A\u6B21\u540C\u6B65\u786E\u4FDD\u503C\u6B63\u786E\uFF09\n      this.syncToShopifyForm(this.selectedVariant, this.selectedSellingPlan);\n      \n      // \u6E05\u7406\u8868\u5355\uFF0C\u79FB\u9664\u53EF\u80FD\u51B2\u7A81\u7684\u5B57\u6BB5\n      this.cleanupFormForSubscription();\n      \n      // \u518D\u6B21\u9A8C\u8BC1\u5E76\u8BBE\u7F6E selling_plan\uFF08\u786E\u4FDD\u503C\u5DF2\u8BBE\u7F6E\uFF09\n      this.ensureSellingPlanInForm();\n      \n      // \u76F4\u63A5\u4F7F\u7528 Shopify \u539F\u751F\u6309\u94AE\uFF08\u6211\u4EEC\u7684\u6309\u94AE\u5DF2\u9690\u85CF\uFF09\n      if (this.shopifyAddToCartBtn) {\n        // \u786E\u4FDD\u6309\u94AE\u53EF\u7528\n        this.shopifyAddToCartBtn.disabled = false;\n        this.shopifyAddToCartBtn.removeAttribute('disabled');\n        \n        // \u5EF6\u8FDF\u4E00\u5C0F\u6BB5\u65F6\u95F4\uFF0C\u786E\u4FDD\u8868\u5355\u5B57\u6BB5\u5DF2\u66F4\u65B0\n        this.schedule(() => {\n          // \u518D\u6B21\u9A8C\u8BC1 selling_plan \u662F\u5426\u5DF2\u8BBE\u7F6E\n          this.verifySellingPlanBeforeSubmit();\n          \n          // \u6700\u7EC8\u6E05\u7406\uFF0C\u786E\u4FDD\u6CA1\u6709\u91CD\u590D\u5B57\u6BB5\n          this.cleanupFormForSubscription();\n          \n          // \u6700\u7EC8\u9A8C\u8BC1\u8868\u5355\u6570\u636E\n          if (this.shopifyForm) {\n            const formData = new FormData(this.shopifyForm);\n            const finalVariantId = formData.get('id');\n            const finalSellingPlan = formData.get('selling_plan');\n            \n            // console.log('\u6700\u7EC8\u8868\u5355\u6570\u636E:', {\n            //   id: finalVariantId,\n            //   selling_plan: finalSellingPlan || '(\u7A7A\uFF0C\u4E00\u6B21\u6027\u8D2D\u4E70)',\n            //   quantity: formData.get('quantity'),\n            //   expected_variant: this.selectedVariant,\n            //   expected_selling_plan: this.selectedSellingPlan || '(\u7A7A\uFF0C\u4E00\u6B21\u6027\u8D2D\u4E70)'\n            // });\n            \n            // \u5982\u679C\u6570\u636E\u4E0D\u5339\u914D\uFF0C\u5F3A\u5236\u4FEE\u590D\n            if (finalVariantId !== this.selectedVariant) {\n              // console.warn('\u53D8\u4F53ID\u4E0D\u5339\u914D\uFF0C\u6B63\u5728\u4FEE\u590D...');\n              const variantInput = this.shopifyForm.querySelector('[name=\"id\"]');\n              if (variantInput) {\n                variantInput.value = this.selectedVariant;\n              }\n            }\n            \n            if (this.selectedSellingPlan && finalSellingPlan !== this.selectedSellingPlan) {\n              // console.warn('\u9500\u552E\u8BA1\u5212ID\u4E0D\u5339\u914D\uFF0C\u6B63\u5728\u4FEE\u590D...');\n              const sellingPlanInput = this.shopifyForm.querySelector('[name=\"selling_plan\"]');\n              if (sellingPlanInput) {\n                sellingPlanInput.value = this.selectedSellingPlan;\n              }\n            }\n            \n            // \u5982\u679C\u6CA1\u6709\u9009\u62E9\u8BA2\u9605\uFF0C\u786E\u4FDD selling_plan \u4E3A\u7A7A\n            if (!this.selectedSellingPlan) {\n              const sellingPlanInput = this.shopifyForm.querySelector('[name=\"selling_plan\"]');\n              if (sellingPlanInput && sellingPlanInput.value) {\n                // console.log('\u6E05\u9664 selling_plan\uFF08\u4E00\u6B21\u6027\u8D2D\u4E70\uFF09');\n                sellingPlanInput.value = '';\n              }\n            }\n          }\n          \n          // \u68C0\u67E5\u662F\u5426\u6B63\u5728\u63D0\u4EA4\uFF08\u9632\u6B62\u91CD\u590D\u63D0\u4EA4\uFF09\n          if (this.shopifyForm && this.shopifyForm.getAttribute('data-submitting') === 'true') {\n            // console.warn('\u8868\u5355\u6B63\u5728\u63D0\u4EA4\u4E2D\uFF0C\u8BF7\u7A0D\u5019...');\n            return;\n          }\n          \n          // \u6807\u8BB0\u8868\u5355\u6B63\u5728\u63D0\u4EA4\uFF08\u9632\u6B62\u91CD\u590D\u63D0\u4EA4\uFF09\n          if (this.shopifyForm) {\n            this.shopifyForm.setAttribute('data-submitting', 'true');\n          }\n          \n          // \u4E34\u65F6\u7981\u7528\u6309\u94AE\uFF08\u9632\u6B62\u91CD\u590D\u70B9\u51FB\uFF09\n          const originalDisabled = this.shopifyAddToCartBtn.disabled;\n          this.shopifyAddToCartBtn.disabled = true;\n          \n          // \u89E6\u53D1\u539F\u751F\u6309\u94AE\u7684\u70B9\u51FB\u4E8B\u4EF6\n          try {\n            this.shopifyAddToCartBtn.click();\n            // console.log('\u4F7F\u7528 Shopify \u539F\u751F\u52A0\u8D2D\u6309\u94AE', {\n            //   variant: this.selectedVariant,\n            //   selling_plan: this.selectedSellingPlan || '(\u4E00\u6B21\u6027\u8D2D\u4E70)'\n            // });\n            \n            // \u5EF6\u8FDF\u91CD\u7F6E\u63D0\u4EA4\u72B6\u6001\u548C\u6309\u94AE\n            this.schedule(() => {\n              // \u6062\u590D\u6309\u94AE\u72B6\u6001\n              this.shopifyAddToCartBtn.disabled = originalDisabled;\n              \n              if (this.shopifyForm) {\n                this.shopifyForm.removeAttribute('data-submitting');\n                this.shopifyForm.removeAttribute('data-submitted');\n              }\n              \n              // \u91CD\u7F6E\u8868\u5355\u72B6\u6001\uFF0C\u786E\u4FDD\u53EF\u4EE5\u4E0B\u6B21\u63D0\u4EA4\n              this.resetFormState();\n              \n              // console.log('\u8868\u5355\u63D0\u4EA4\u5B8C\u6210\uFF0C\u5DF2\u91CD\u7F6E\u72B6\u6001\uFF0C\u53EF\u4EE5\u518D\u6B21\u63D0\u4EA4');\n            }, 800); // \u589E\u52A0\u5EF6\u8FDF\uFF0C\u786E\u4FDD\u7B2C\u4E00\u6B21\u63D0\u4EA4\u5B8C\u6210\n            \n            // \u66F4\u957F\u7684\u5EF6\u8FDF\uFF0C\u786E\u4FDD\u5B8C\u5168\u91CD\u7F6E\n            this.schedule(() => {\n              this.resetFormState();\n            }, 2000);\n          } catch (error) {\n            // console.error('\u70B9\u51FB\u52A0\u8D2D\u6309\u94AE\u5931\u8D25:', error);\n            // \u91CD\u7F6E\u72B6\u6001\n            this.shopifyAddToCartBtn.disabled = originalDisabled;\n            this.resetFormState();\n          }\n          \n          // \u9A8C\u8BC1\u8D2D\u7269\u8F66\u662F\u5426\u66F4\u65B0\uFF08\u8BA2\u9605\u548C\u4E00\u6B21\u6027\u8D2D\u4E70\u90FD\u9700\u8981\uFF09\n          this.schedule(() => {\n            this.verifyCartUpdate();\n          }, 500);\n        }, 150); // \u589E\u52A0\u5EF6\u8FDF\u65F6\u95F4\uFF0C\u786E\u4FDD\u6240\u6709\u5B57\u6BB5\u90FD\u5DF2\u66F4\u65B0\n        return;\n      }\n\n      // \u5982\u679C\u6CA1\u6709\u539F\u751F\u6309\u94AE\uFF0C\u4F7F\u7528 API \u65B9\u5F0F\n      const formData = {\n        id: this.selectedVariant,\n        quantity: 1\n      };\n\n      if (this.selectedSellingPlan) {\n        formData.selling_plan = this.selectedSellingPlan;\n      }\n\n      // \u4F7F\u7528 Shopify Cart API \u6DFB\u52A0\u5230\u8D2D\u7269\u8F66\n      fetch('/cart/add.js', {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n        },\n        body: JSON.stringify(formData)\n      })\n      .then(response => response.json())\n      .then(data => {\n        // console.log('\u5DF2\u6DFB\u52A0\u5230\u8D2D\u7269\u8F66:', data);\n\n        this.applyDefaultDiscountCode().finally(() => {\n          // \u89E6\u53D1\u8D2D\u7269\u8F66\u66F4\u65B0\u4E8B\u4EF6\uFF08Shopify \u4E3B\u9898\u901A\u5E38\u4F1A\u76D1\u542C\u8FD9\u4E2A\u4E8B\u4EF6\uFF09\n          document.dispatchEvent(new CustomEvent('cart:updated'));\n          window.dispatchEvent(new CustomEvent('cart:updated'));\n\n          // \u89E6\u53D1\u8D2D\u7269\u8F66\u66F4\u65B0\u4E8B\u4EF6\n          this.dispatchEvent('cartUpdated', data);\n\n          // \u66F4\u65B0\u8D2D\u7269\u8F66\u56FE\u6807\uFF08\u5982\u679C\u9875\u9762\u6709\uFF09\n          this.updateCartCount();\n        });\n      })\n      .catch(error => {\n        // console.error('\u6DFB\u52A0\u5230\u8D2D\u7269\u8F66\u5931\u8D25:', error);\n        alert('\u6DFB\u52A0\u5230\u8D2D\u7269\u8F66\u5931\u8D25\uFF0C\u8BF7\u91CD\u8BD5');\n      });\n    }\n    \n    // \u5F53\u524D\u8BA2\u9605 wrapper \u6240\u5C5E\u7684\u5546\u54C1\u6A21\u5757\uFF1BDOM \u67E5\u8BE2\u4F18\u5148\u9650\u5236\u5728\u6B64\u8303\u56F4\uFF0C\u907F\u514D\u626B\u63CF\u5176\u4ED6 PDP/featured product\u3002\n    getProductRoot() {\n      return this.container.closest('#featureproduct, #mainproduct, .featured-product, .product') || this.container;\n    }\n\n    findShopifyProductForm() {\n      // \u5C1D\u8BD5\u591A\u79CD\u53EF\u80FD\u7684\u9009\u62E9\u5668\n      const selectors = [\n        'form[action=\"/cart/add\"]',\n        'form[action*=\"/cart/add\"]',\n        'form.product-form',\n        '[data-product-form]',\n        'form[action^=\"/cart\"]'\n      ];\n      \n      const root = this.getProductRoot();\n      for (const selector of selectors) {\n        const form = root.querySelector(selector) || document.querySelector(selector);\n        if (form) {\n          // console.log('\u627E\u5230 Shopify \u4EA7\u54C1\u8868\u5355:', selector);\n          return form;\n        }\n      }\n      \n      // console.warn('\u672A\u627E\u5230 Shopify \u4EA7\u54C1\u8868\u5355');\n      return null;\n    }\n    \n    // \u67E5\u627E Shopify \u539F\u751F\u53D8\u4F53\u8F93\u5165\n    findShopifyVariantInput() {\n      if (!this.shopifyForm) return null;\n      \n      const selectors = [\n        'input[name=\"id\"]',\n        'select[name=\"id\"]',\n        '[name=\"id\"]'\n      ];\n      \n      for (const selector of selectors) {\n        const input = this.shopifyForm.querySelector(selector);\n        if (input) {\n          // console.log('\u627E\u5230 Shopify \u53D8\u4F53\u8F93\u5165:', selector);\n          return input;\n        }\n      }\n      \n      const root = this.getProductRoot();\n      for (const selector of selectors) {\n        const input = root.querySelector(selector);\n        if (input) {\n          // console.log('\u5728\u9875\u9762\u627E\u5230 Shopify \u53D8\u4F53\u8F93\u5165:', selector);\n          return input;\n        }\n      }\n      \n      // console.warn('\u672A\u627E\u5230 Shopify \u53D8\u4F53\u8F93\u5165');\n      return null;\n    }\n    \n    // \u67E5\u627E Shopify \u539F\u751F\u9500\u552E\u8BA1\u5212\u8F93\u5165\n    findShopifySellingPlanInput() {\n      if (!this.shopifyForm) {\n        // \u5373\u4F7F\u6CA1\u6709\u8868\u5355\uFF0C\u4E5F\u53EA\u5728\u5F53\u524D\u5546\u54C1\u6A21\u5757\u5185\u67E5\u627E\u3002\n        const selectors = [\n          'input[name=\"selling_plan\"]',\n          'select[name=\"selling_plan\"]',\n          '[name=\"selling_plan\"]',\n          'input[name=\"selling_plan_id\"]',\n          '[name=\"selling_plan_id\"]'\n        ];\n        \n        for (const selector of selectors) {\n          const input = this.getProductRoot().querySelector(selector);\n          if (input) {\n            // console.log('\u5728\u9875\u9762\u627E\u5230 Shopify \u9500\u552E\u8BA1\u5212\u8F93\u5165:', selector);\n            return input;\n          }\n        }\n        return null;\n      }\n      \n      const selectors = [\n        'input[name=\"selling_plan\"]',\n        'select[name=\"selling_plan\"]',\n        '[name=\"selling_plan\"]',\n        'input[name=\"selling_plan_id\"]',\n        '[name=\"selling_plan_id\"]'\n      ];\n      \n      for (const selector of selectors) {\n        const input = this.shopifyForm.querySelector(selector);\n        if (input) {\n          // console.log('\u627E\u5230 Shopify \u9500\u552E\u8BA1\u5212\u8F93\u5165:', selector);\n          return input;\n        }\n      }\n      \n      // \u5982\u679C\u8868\u5355\u5185\u6CA1\u627E\u5230\uFF0C\u5728\u5F53\u524D\u5546\u54C1\u6A21\u5757\u5185\u67E5\u627E\n      for (const selector of selectors) {\n        const input = this.getProductRoot().querySelector(selector);\n        if (input) {\n          // console.log('\u5728\u9875\u9762\u627E\u5230 Shopify \u9500\u552E\u8BA1\u5212\u8F93\u5165:', selector);\n          return input;\n        }\n      }\n      \n      // \u5982\u679C\u6CA1\u6709\u627E\u5230\uFF0C\u7A0D\u540E\u4F1A\u5728 ensureSellingPlanInForm \u4E2D\u521B\u5EFA\n      // console.log('\u672A\u627E\u5230 Shopify \u9500\u552E\u8BA1\u5212\u8F93\u5165\uFF0C\u5C06\u5728\u9700\u8981\u65F6\u521B\u5EFA');\n      return null;\n    }\n    \n    // \u67E5\u627E Shopify \u539F\u751F\u52A0\u8D2D\u6309\u94AE\n    findShopifyAddToCartButton() {\n      if (!this.shopifyForm) {\n        // \u5373\u4F7F\u6CA1\u6709\u8868\u5355\uFF0C\u4E5F\u53EA\u5728\u5F53\u524D\u5546\u54C1\u6A21\u5757\u5185\u67E5\u627E\u6309\u94AE\n        const selectors = [\n          'button[type=\"submit\"][name=\"add\"]',\n          'button[name=\"add\"]',\n          '[data-add-to-cart]',\n          '.product-form__cart-submit',\n          'button[type=\"submit\"]'\n        ];\n        \n        for (const selector of selectors) {\n          const btn = this.getProductRoot().querySelector(selector);\n          if (btn && (btn.closest('form') || btn.textContent.toLowerCase().includes('add') || btn.textContent.toLowerCase().includes('cart'))) {\n            // console.log('\u627E\u5230 Shopify \u52A0\u8D2D\u6309\u94AE:', selector);\n            return btn;\n          }\n        }\n        return null;\n      }\n      \n      const selectors = [\n        'button[type=\"submit\"][name=\"add\"]',\n        'button[name=\"add\"]',\n        '[data-add-to-cart]',\n        '.product-form__cart-submit',\n        'button[type=\"submit\"]'\n      ];\n      \n      for (const selector of selectors) {\n        const btn = this.shopifyForm.querySelector(selector);\n        if (btn) {\n          // console.log('\u5728\u8868\u5355\u4E2D\u627E\u5230 Shopify \u52A0\u8D2D\u6309\u94AE:', selector);\n          return btn;\n        }\n      }\n      \n      // \u5982\u679C\u8868\u5355\u5185\u6CA1\u627E\u5230\uFF0C\u5728\u5F53\u524D\u5546\u54C1\u6A21\u5757\u5185\u67E5\u627E\n      for (const selector of selectors) {\n        const btn = this.getProductRoot().querySelector(selector);\n        if (btn) {\n          // console.log('\u5728\u9875\u9762\u627E\u5230 Shopify \u52A0\u8D2D\u6309\u94AE:', selector);\n          return btn;\n        }\n      }\n      \n      // console.warn('\u672A\u627E\u5230 Shopify \u52A0\u8D2D\u6309\u94AE');\n      return null;\n    }\n    \n    // \u540C\u6B65\u9009\u62E9\u5230 Shopify \u539F\u751F\u8868\u5355\n    syncToShopifyForm(variantId, sellingPlanId) {\n      // \u66F4\u65B0\u53D8\u4F53\u8F93\u5165\n      if (this.shopifyVariantInput) {\n        if (this.shopifyVariantInput.tagName === 'SELECT') {\n          this.shopifyVariantInput.value = variantId;\n        } else {\n          this.shopifyVariantInput.value = variantId;\n        }\n        \n        // \u89E6\u53D1 change \u4E8B\u4EF6\uFF0C\u8BA9\u5176\u4ED6\u76D1\u542C\u5668\u77E5\u9053\u53D8\u4F53\u5DF2\u6539\u53D8\n        const changeEvent = new Event('change', { bubbles: true });\n        this.shopifyVariantInput.dispatchEvent(changeEvent);\n      }\n      \n      // \u66F4\u65B0\u9500\u552E\u8BA1\u5212\u8F93\u5165\n      if (this.shopifySellingPlanInput) {\n        this.shopifySellingPlanInput.value = sellingPlanId || '';\n        \n        // \u89E6\u53D1 change \u4E8B\u4EF6\n        const changeEvent = new Event('change', { bubbles: true });\n        this.shopifySellingPlanInput.dispatchEvent(changeEvent);\n      }\n      \n      // \u786E\u4FDD selling_plan \u5B57\u6BB5\u5B58\u5728\uFF08\u5982\u679C\u4E0D\u5B58\u5728\u5219\u521B\u5EFA\uFF09\n      this.ensureSellingPlanInForm();\n      \n      // console.log('\u5DF2\u540C\u6B65\u5230 Shopify \u8868\u5355:', { variantId, sellingPlanId });\n    }\n    \n    // \u786E\u4FDD selling_plan \u5B57\u6BB5\u5728\u8868\u5355\u4E2D\n    ensureSellingPlanInForm() {\n      if (!this.shopifyForm) return;\n      \n      // \u79FB\u9664\u6240\u6709\u91CD\u590D\u7684 selling_plan \u5B57\u6BB5\uFF08\u907F\u514D\u51B2\u7A81\uFF09\n      const existingSellingPlanInputs = this.shopifyForm.querySelectorAll('[name=\"selling_plan\"], [name=\"selling_plan_id\"]');\n      existingSellingPlanInputs.forEach((input, index) => {\n        if (index > 0) {\n          // \u4FDD\u7559\u7B2C\u4E00\u4E2A\uFF0C\u79FB\u9664\u5176\u4ED6\u7684\n          input.remove();\n          // console.log('\u79FB\u9664\u4E86\u91CD\u590D\u7684 selling_plan \u5B57\u6BB5');\n        }\n      });\n      \n      // \u68C0\u67E5\u662F\u5426\u5B58\u5728 selling_plan \u8F93\u5165\n      let sellingPlanInput = this.shopifyForm.querySelector('[name=\"selling_plan\"]');\n      \n      // \u5982\u679C\u4E0D\u5B58\u5728\uFF0C\u521B\u5EFA\u5B83\n      if (!sellingPlanInput) {\n        sellingPlanInput = document.createElement('input');\n        sellingPlanInput.type = 'hidden';\n        sellingPlanInput.name = 'selling_plan';\n        this.shopifyForm.appendChild(sellingPlanInput);\n        // console.log('\u521B\u5EFA\u4E86 selling_plan \u8F93\u5165\u5B57\u6BB5');\n      }\n      \n      // \u8BBE\u7F6E\u503C\n      if (this.selectedSellingPlan) {\n        sellingPlanInput.value = this.selectedSellingPlan;\n        // console.log('\u8BBE\u7F6E selling_plan \u503C:', this.selectedSellingPlan);\n      } else {\n        // \u5982\u679C\u6CA1\u6709\u9009\u62E9\u8BA2\u9605\uFF0C\u6E05\u7A7A\u8BE5\u5B57\u6BB5\uFF08\u4E0D\u8981\u79FB\u9664\uFF0C\u907F\u514D\u8868\u5355\u7ED3\u6784\u53D8\u5316\uFF09\n        sellingPlanInput.value = '';\n      }\n      \n      // \u66F4\u65B0\u5F15\u7528\n      this.shopifySellingPlanInput = sellingPlanInput;\n      \n      // \u79FB\u9664 selling_plan_id\uFF08\u907F\u514D\u51B2\u7A81\uFF0C\u53EA\u4F7F\u7528 selling_plan\uFF09\n      const sellingPlanIdInput = this.shopifyForm.querySelector('[name=\"selling_plan_id\"]');\n      if (sellingPlanIdInput) {\n        sellingPlanIdInput.remove();\n        // console.log('\u79FB\u9664\u4E86 selling_plan_id \u5B57\u6BB5\uFF0C\u53EA\u4F7F\u7528 selling_plan');\n      }\n    }\n    \n    // \u5728\u63D0\u4EA4\u524D\u9A8C\u8BC1 selling_plan\n    verifySellingPlanBeforeSubmit() {\n      if (!this.shopifyForm) {\n        // console.warn('\u672A\u627E\u5230 Shopify \u8868\u5355');\n        return;\n      }\n      \n      const sellingPlanInput = this.shopifyForm.querySelector('[name=\"selling_plan\"]');\n      const variantInput = this.shopifyForm.querySelector('[name=\"id\"]');\n      \n      // \u9A8C\u8BC1\u53D8\u4F53ID\n      if (variantInput) {\n        if (variantInput.value !== this.selectedVariant) {\n          // console.warn('\u53D8\u4F53ID\u4E0D\u5339\u914D\uFF0C\u6B63\u5728\u4FEE\u590D...', {\n          //   expected: this.selectedVariant,\n          //   actual: variantInput.value\n          // });\n          variantInput.value = this.selectedVariant;\n          \n          // \u5982\u679C\u662F SELECT\uFF0C\u4E5F\u9700\u8981\u66F4\u65B0\n          if (variantInput.tagName === 'SELECT') {\n            variantInput.value = this.selectedVariant;\n            // \u89E6\u53D1 change \u4E8B\u4EF6\n            const changeEvent = new Event('change', { bubbles: true });\n            variantInput.dispatchEvent(changeEvent);\n          }\n        }\n      } else {\n        // console.warn('\u672A\u627E\u5230\u53D8\u4F53\u8F93\u5165\u5B57\u6BB5');\n      }\n      \n      // \u9A8C\u8BC1\u9500\u552E\u8BA1\u5212\n      if (this.selectedSellingPlan) {\n        if (!sellingPlanInput) {\n          // console.warn('\u672A\u627E\u5230 selling_plan \u8F93\u5165\u5B57\u6BB5\uFF0C\u6B63\u5728\u521B\u5EFA...');\n          this.ensureSellingPlanInForm();\n          return;\n        }\n        \n        if (sellingPlanInput.value !== this.selectedSellingPlan) {\n          // console.warn('selling_plan \u503C\u4E0D\u5339\u914D\uFF0C\u6B63\u5728\u4FEE\u590D...', {\n          //   expected: this.selectedSellingPlan,\n          //   actual: sellingPlanInput.value\n          // });\n          sellingPlanInput.value = this.selectedSellingPlan;\n          \n          // \u89E6\u53D1 change \u4E8B\u4EF6\n          const changeEvent = new Event('change', { bubbles: true });\n          sellingPlanInput.dispatchEvent(changeEvent);\n        }\n        \n        // console.log('\u9A8C\u8BC1 selling_plan:', {\n        //   expected: this.selectedSellingPlan,\n        //   actual: sellingPlanInput.value,\n        //   variant: variantInput ? variantInput.value : 'not found'\n        // });\n      } else {\n        // \u4E00\u6B21\u6027\u8D2D\u4E70\uFF0C\u786E\u4FDD selling_plan \u4E3A\u7A7A\n        if (sellingPlanInput && sellingPlanInput.value) {\n          // console.log('\u4E00\u6B21\u6027\u8D2D\u4E70\uFF1A\u6E05\u9664 selling_plan \u503C');\n          sellingPlanInput.value = '';\n        }\n      }\n    }\n    \n    // \u9A8C\u8BC1\u8D2D\u7269\u8F66\u662F\u5426\u66F4\u65B0\n    verifyCartUpdate() {\n      fetch('/cart.js')\n        .then(response => response.json())\n        .then(cart => {\n          // console.log('\u8D2D\u7269\u8F66\u9A8C\u8BC1:', {\n          //   item_count: cart.item_count,\n          //   items: cart.items.map(item => ({\n          //     variant_id: item.variant_id,\n          //     selling_plan: item.selling_plan,\n          //     title: item.product_title\n          //   }))\n          // });\n          \n          // \u68C0\u67E5\u662F\u5426\u6709\u6211\u4EEC\u521A\u6DFB\u52A0\u7684\u5546\u54C1\n          const hasOurItem = cart.items.some(item => {\n            const matchesVariant = item.variant_id.toString() === this.selectedVariant.toString();\n            if (this.selectedSellingPlan) {\n              // \u8BA2\u9605\u5546\u54C1\uFF0C\u9700\u8981\u68C0\u67E5 selling_plan\n              return matchesVariant && item.selling_plan && \n                     item.selling_plan.toString() === this.selectedSellingPlan.toString();\n            } else {\n              // \u4E00\u6B21\u6027\u8D2D\u4E70\uFF0C\u4E0D\u5E94\u8BE5\u6709 selling_plan\n              return matchesVariant && !item.selling_plan;\n            }\n          });\n          \n          if (!hasOurItem) {\n            // console.warn('\u8D2D\u7269\u8F66\u4E2D\u6CA1\u6709\u627E\u5230\u521A\u6DFB\u52A0\u7684\u5546\u54C1\uFF0C\u53EF\u80FD\u6DFB\u52A0\u5931\u8D25');\n            // console.warn('\u9884\u671F:', {\n            //   variant: this.selectedVariant,\n            //   selling_plan: this.selectedSellingPlan || '(\u4E00\u6B21\u6027\u8D2D\u4E70)'\n            // });\n          } else {\n            // console.log('\u2705 \u8D2D\u7269\u8F66\u66F4\u65B0\u6210\u529F');\n          }\n        })\n        .catch(error => {\n          // console.error('\u9A8C\u8BC1\u8D2D\u7269\u8F66\u66F4\u65B0\u5931\u8D25:', error);\n        });\n    }\n\n    showSuccessMessage() {\n      // \u521B\u5EFA\u6210\u529F\u63D0\u793A\n      const message = document.createElement('div');\n      message.className = 'add-to-cart-success';\n      message.textContent = '\u2713 \u5DF2\u6DFB\u52A0\u5230\u8D2D\u7269\u8F66';\n      message.style.cssText = `\n        position: fixed;\n        top: 20px;\n        right: 20px;\n        background: #28a745;\n        color: white;\n        padding: 1rem 2rem;\n        border-radius: 8px;\n        box-shadow: 0 4px 12px rgba(0,0,0,0.2);\n        z-index: 10000;\n        animation: slideIn 0.3s ease;\n      `;\n      \n      document.body.appendChild(message);\n      \n      this.schedule(() => {\n        message.style.animation = 'slideOut 0.3s ease';\n        this.schedule(() => message.remove(), 300);\n      }, 2000);\n    }\n\n    updateCartCount() {\n      // \u66F4\u65B0\u8D2D\u7269\u8F66\u6570\u91CF\uFF08\u5982\u679C\u9875\u9762\u6709\u8D2D\u7269\u8F66\u56FE\u6807\uFF09\n      fetch('/cart.js')\n        .then(response => response.json())\n        .then(cart => {\n          // \u66F4\u65B0\u5404\u79CD\u53EF\u80FD\u7684\u8D2D\u7269\u8F66\u6570\u91CF\u5143\u7D20\n          const cartCountSelectors = [\n            '[data-cart-count]',\n            '.cart-count',\n            '#cart-count',\n            '[aria-label*=\"cart\"] .count',\n            '.header__cart-count'\n          ];\n          \n          cartCountSelectors.forEach(selector => {\n            const elements = document.querySelectorAll(selector);\n            elements.forEach(el => {\n              el.textContent = cart.item_count;\n              // \u89E6\u53D1\u66F4\u65B0\u4E8B\u4EF6\n              el.dispatchEvent(new Event('cart:updated'));\n            });\n          });\n          \n          // \u89E6\u53D1\u5168\u5C40\u8D2D\u7269\u8F66\u66F4\u65B0\u4E8B\u4EF6\n          document.dispatchEvent(new CustomEvent('cart:updated', { detail: cart }));\n          window.dispatchEvent(new CustomEvent('cart:updated', { detail: cart }));\n        })\n        .catch(error => {\n          // console.error('\u66F4\u65B0\u8D2D\u7269\u8F66\u6570\u91CF\u5931\u8D25:', error);\n        });\n    }\n\n    dispatchEvent(eventName, detail) {\n      const event = new CustomEvent(`wonderbioticsSubscriptions:${eventName}`, {\n        detail: detail,\n        bubbles: true\n      });\n      this.container.dispatchEvent(event);\n    }\n    \n    // [2026-05-26] \u7EDF\u4E00\u7684\u91D1\u989D\u683C\u5F0F\u5316\u5DE5\u5177\n    // \u4F18\u5148\u7EA7\uFF1A\n    //   1) \u4E3B\u9898 / option_selection.js \u63D0\u4F9B\u7684 Shopify.formatMoney + window.theme.moneyFormat\n    //   2) Intl.NumberFormat (\u6309\u9875\u9762 locale + window.Shopify.currency.active \u6216 'USD')\n    //   3) \u515C\u5E95\uFF1A'$X.XX'\uFF08\u4FDD\u7559\u539F\u6709\u884C\u4E3A\uFF0C\u907F\u514D\u5B8C\u5168\u5931\u8D25\uFF09\n    // \u5165\u53C2\u652F\u6301\u300C\u5206\u5355\u4F4D\u5B57\u7B26\u4E32/\u6570\u5B57\u300D\uFF08Shopify \u6807\u51C6\uFF09\n    formatMoney(priceCents) {\n      if (priceCents === null || priceCents === undefined || priceCents === '') return '';\n      const cents = typeof priceCents === 'number' ? priceCents : parseFloat(priceCents);\n      if (isNaN(cents)) return '';\n      \n      // 1) Shopify.formatMoney\n      try {\n        if (typeof window.Shopify !== 'undefined' && typeof window.Shopify.formatMoney === 'function') {\n          const moneyFormat = (window.theme && window.theme.moneyFormat) || window.Shopify.money_format;\n          if (moneyFormat) {\n            return window.Shopify.formatMoney(cents, moneyFormat);\n          }\n          return window.Shopify.formatMoney(cents);\n        }\n      } catch (e) {\n        // \u9759\u9ED8\u56DE\u843D\u5230 Intl\n      }\n      \n      // 2) Intl.NumberFormat\n      try {\n        const currency = (window.Shopify && window.Shopify.currency && window.Shopify.currency.active) || 'USD';\n        const locale = (window.Shopify && window.Shopify.locale) || document.documentElement.lang || 'en-US';\n        return new Intl.NumberFormat(locale, {\n          style: 'currency',\n          currency: currency\n        }).format(cents / 100);\n      } catch (e) {\n        // \u9759\u9ED8\u56DE\u843D\u5230 $X.XX\n      }\n      \n      // 3) \u515C\u5E95\n      return '$' + (cents / 100).toFixed(2);\n    }\n\n    // \u516C\u5171\u65B9\u6CD5\uFF1A\u83B7\u53D6\u5F53\u524D\u9009\u62E9\n    getSelection() {\n      return {\n        variantId: this.selectedVariant,\n        sellingPlanId: this.selectedSellingPlan\n      };\n    }\n\n    // \u516C\u5171\u65B9\u6CD5\uFF1A\u8BBE\u7F6E\u9009\u62E9\n    setSelection(variantId, sellingPlanId = '') {\n      const radio = this.container.querySelector(\n        `[data-variant-id=\"${variantId}\"][data-selling-plan-id=\"${sellingPlanId}\"]`\n      );\n      \n      if (radio) {\n        radio.checked = true;\n        this.handlePlanSelection(radio);\n        return true;\n      }\n      \n      return false;\n    }\n    \n    // \u76D1\u542C\u8D2D\u7269\u8F66\u66F4\u65B0\uFF0C\u68C0\u6D4B\u5E76\u79FB\u9664\u81EA\u52A8\u5E94\u7528\u7684\u6298\u6263\u7801\n    watchCartForAutoDiscounts() {\n      if (this.discountWatchStarted) return;\n      this.discountWatchStarted = true;\n      // \u53EA\u89C2\u5BDF\u8D2D\u7269\u8F66\u5BB9\u5668\uFF1B\u5168\u5C40 cart \u4E8B\u4EF6\u7531\u9875\u9762\u7EA7 runtime \u7EDF\u4E00\u5206\u53D1\u3002\n      const cartDrawer = document.querySelector('[data-cart-drawer], .cart-drawer, #cart-drawer, [data-cart-sidebar]');\n      if (cartDrawer) {\n        let mutationTimeout = null;\n        const observer = new MutationObserver(() => {\n          this.cancelScheduled(mutationTimeout);\n          mutationTimeout = this.schedule(() => {\n            if (this.selectedSellingPlan) this.removeDiscountFromDOMIfDisallowed();\n          }, 300);\n        });\n        this.observe(observer, cartDrawer, {\n          childList: true,\n          subtree: true\n        });\n      }\n    }\n\n    handleCartSignal() {\n      // \u5C06\u8FDE\u7EED cart \u4E8B\u4EF6\u5408\u5E76\u4E3A\u4E00\u6B21\u6298\u6263\u6821\u9A8C\uFF0C\u4FDD\u7559\u8BA2\u9605\u4E1A\u52A1\u89C4\u5219\u4F46\u51CF\u5C11\u91CD\u590D\u8BF7\u6C42\u548C DOM \u5DE5\u4F5C\u3002\n      if (!this.selectedSellingPlan) return;\n      this.cancelScheduled(this.cartSignalTimer);\n      this.cartSignalTimer = this.schedule(() => {\n        this.cartSignalTimer = null;\n        this.checkAndRemoveAutoDiscounts();\n      }, 500);\n    }\n\n    handleCartButtonClick() {\n      if (!this.selectedSellingPlan) return;\n      this.schedule(() => this.removeDiscountFromDOMIfDisallowed(), 300);\n    }\n    \n    getDiscountCodeValue(discountCode) {\n      if (!discountCode) return '';\n      if (typeof discountCode === 'string') return discountCode;\n      return discountCode.code || discountCode.title || discountCode.discount_code || '';\n    }\n\n    isSubscriptionAllowedDiscount(discountCode) {\n      const code = this.getDiscountCodeValue(discountCode).toUpperCase();\n      return this.subscriptionAllowedDiscountCodes.includes(code);\n    }\n\n    applyDefaultDiscountCode() {\n      if (!this.defaultDiscountCode) return Promise.resolve(null);\n\n      return fetch('/cart/update.js', {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n        },\n        body: JSON.stringify({\n          discount: this.defaultDiscountCode\n        })\n      })\n      .then(response => response.json())\n      .then(cart => {\n        document.dispatchEvent(new CustomEvent('cart:updated', { detail: cart }));\n        window.dispatchEvent(new CustomEvent('cart:updated', { detail: cart }));\n\n        if (typeof window.theme?.cart?.refresh === 'function') {\n          window.theme.cart.refresh();\n        } else if (typeof window.theme?.cart?.drawer?.refresh === 'function') {\n          window.theme.cart.drawer.refresh();\n        }\n\n        return cart;\n      })\n      .catch(error => {\n        // \u9759\u9ED8\u5904\u7406\uFF0C\u907F\u514D\u6298\u6263\u63A5\u53E3\u5931\u8D25\u5F71\u54CD\u52A0\u8D2D\u3002\n        return null;\n      });\n    }\n\n    hasOnlySubscriptionAllowedDiscounts(discountCodes) {\n      return Array.isArray(discountCodes) &&\n        discountCodes.length > 0 &&\n        discountCodes.every(code => this.isSubscriptionAllowedDiscount(code));\n    }\n\n    hasDisallowedSubscriptionDiscounts(discountCodes) {\n      return Array.isArray(discountCodes) &&\n        discountCodes.some(code => !this.isSubscriptionAllowedDiscount(code));\n    }\n\n    // \u5728\u6DFB\u52A0\u5230\u8D2D\u7269\u8F66\u524D\u79FB\u9664\u4E0D\u5141\u8BB8\u7528\u4E8E\u8BA2\u9605\u7684\u6298\u6263\u7801\n    removeDiscountCodeBeforeAdd() {\n      // \u5148\u68C0\u67E5\u5F53\u524D\u8D2D\u7269\u8F66\u662F\u5426\u6709\u6298\u6263\u7801\n      fetch('/cart.js')\n        .then(response => response.json())\n        .then(cart => {\n          const discountCodes = cart.discount_codes || [];\n          if (this.hasDisallowedSubscriptionDiscounts(discountCodes)) {\n            this.forceRemoveDiscountCode();\n          }\n        })\n        .catch(error => {\n          // console.error('\u68C0\u67E5\u8D2D\u7269\u8F66\u6298\u6263\u7801\u5931\u8D25:', error);\n        });\n    }\n    \n\t    // \u5F3A\u5236\u79FB\u9664\u6298\u6263\u7801\n\t    forceRemoveDiscountCode() {\n      // console.log('\u5F3A\u5236\u79FB\u9664\u6298\u6263\u7801\uFF08\u8BA2\u9605\u5546\u54C1\u4E0D\u5E94\u6709\u6298\u6263\u7801\uFF09');\n      \n      // \u540C\u65F6\u4F7F\u7528\u591A\u79CD\u65B9\u6CD5\u79FB\u9664\n      this.removeDiscountFromDOM(); // \u5148\u4ECE DOM \u79FB\u9664\u663E\u793A\n      \n      // \u65B9\u6CD51\uFF1A\u901A\u8FC7 API \u79FB\u9664\n      fetch('/cart/update.js', {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n        },\n        body: JSON.stringify({\n          discount: ''\n        })\n      })\n      .then(response => response.json())\n      .then(data => {\n        // console.log('\u5DF2\u901A\u8FC7 API \u79FB\u9664\u6298\u6263\u7801\uFF0C\u54CD\u5E94:', data);\n        \n        // \u518D\u6B21\u4ECE DOM \u79FB\u9664\uFF08\u786E\u4FDD\uFF09\n        this.removeDiscountFromDOM();\n        \n        // \u89E6\u53D1\u8D2D\u7269\u8F66\u66F4\u65B0\n        document.dispatchEvent(new CustomEvent('cart:updated'));\n        window.dispatchEvent(new CustomEvent('cart:updated'));\n        \n        // \u5237\u65B0\u8D2D\u7269\u8F66\u663E\u793A\n        if (typeof window.theme?.cart?.refresh === 'function') {\n          window.theme.cart.refresh();\n        } else if (typeof window.theme?.cart?.drawer?.refresh === 'function') {\n          window.theme.cart.drawer.refresh();\n\t    }\n        \n        // \u89E6\u53D1\u8D2D\u7269\u8F66\u66F4\u65B0\u4E8B\u4EF6\uFF08\u4E0D\u91CD\u590D\u83B7\u53D6\u8D2D\u7269\u8F66\u6570\u636E\uFF09\n        const event = new CustomEvent('cart:updated', { detail: data });\n        document.dispatchEvent(event);\n        window.dispatchEvent(event);\n        \n        // \u53EA\u68C0\u67E5\u4E00\u6B21\uFF0C\u51CF\u5C11\u8BF7\u6C42\u6B21\u6570\n        if (!this.discountRemovedVerified) {\n          this.discountRemovedVerified = true;\n          this.schedule(() => {\n            this.verifyDiscountRemoved();\n            this.removeDiscountFromDOM();\n            // \u91CD\u7F6E\u6807\u5FD7\uFF0C\u5141\u8BB8\u4E0B\u6B21\u518D\u6B21\u9A8C\u8BC1\n            this.schedule(() => {\n              this.discountRemovedVerified = false;\n            }, 1000);\n          }, 500);\n        }\n      })\n      .catch(error => {\n        // console.error('\u901A\u8FC7 API \u79FB\u9664\u6298\u6263\u7801\u5931\u8D25:', error);\n        // \u5982\u679C API \u5931\u8D25\uFF0C\u5C1D\u8BD5\u5176\u4ED6\u65B9\u6CD5\n        this.removeDiscountCodeAlternative();\n        this.removeDiscountFromDOM();\n\t      });\n\t    }\n\n\t    removeDiscountFromDOMIfDisallowed() {\n\t      fetch('/cart.js')\n\t        .then(response => response.json())\n\t        .then(cart => {\n\t          const discountCodes = cart.discount_codes || [];\n\t          if (this.hasDisallowedSubscriptionDiscounts(discountCodes)) {\n\t            this.removeDiscountFromDOM();\n\t          }\n\t        })\n\t        .catch(() => {\n\t          // \u9759\u9ED8\u5904\u7406\uFF0C\u907F\u514D\u5F71\u54CD\u52A0\u8D2D\u6D41\u7A0B\n\t        });\n\t    }\n\n    getCartAreas() {\n      // \u6298\u6263\u663E\u793A\u6E05\u7406\u4EC5\u9650\u5DF2\u77E5\u8D2D\u7269\u8F66\u533A\u57DF\uFF0C\u4E0D\u904D\u5386\u5168\u9875\u9762\u6240\u6709\u8282\u70B9\u3002\n      return Array.from(document.querySelectorAll('[data-cart-drawer], .cart-drawer, #cart-drawer, [data-cart-sidebar], main-cart-items, main-cart-footer, .cart'));\n    }\n\n\t    // \u4ECE DOM \u4E2D\u79FB\u9664\u6298\u6263\u7801\u663E\u793A\n    removeDiscountFromDOM() {\n      const selectors = [\n        '.cart-discount',\n        '.discount-code',\n        '[data-discount-code]',\n        '.cart__discount',\n        '.cart-item__discount',\n        '.cart-discount-code',\n        '[class*=\"discount\"]',\n        '[class*=\"coupon\"]',\n        '[id*=\"discount\"]',\n        '[id*=\"coupon\"]'\n      ];\n      \n      this.getCartAreas().forEach(area => {\n        area.querySelectorAll(selectors.join(',')).forEach(el => {\n          const text = el.textContent || '';\n          if (text.includes('NEWCUSTOMER10') ||\n              text.includes('NEWCUSTOMER') ||\n              text.includes('10%') ||\n              (text.toLowerCase().includes('discount') && text.length < 50) ||\n              (text.toLowerCase().includes('coupon') && text.length < 50)) {\n            el.remove();\n          }\n        });\n      });\n    }\n    \n    // \u5907\u7528\u65B9\u6CD5\uFF1A\u79FB\u9664\u6298\u6263\u7801\n    removeDiscountCodeAlternative() {\n      // \u65B9\u6CD52\uFF1A\u67E5\u627E\u5E76\u79FB\u9664\u6298\u6263\u7801\u8F93\u5165\u6846\n      this.getCartAreas().forEach(area => {\n        area.querySelectorAll('input[name=\"discount\"], input[name=\"discount_code\"], input[name=\"coupon\"], [data-discount-input]').forEach(input => {\n          if (input.value) input.value = '';\n        });\n        area.querySelectorAll('.cart-discount, .discount-code, [data-discount-code], .cart__discount').forEach(display => {\n          const code = display.textContent;\n          if (code && (code.includes('NEWCUSTOMER10') || code.includes('10'))) display.remove();\n        });\n      });\n      \n      // \u65B9\u6CD54\uFF1A\u901A\u8FC7 URL \u53C2\u6570\u79FB\u9664\uFF08\u5982\u679C\u6709\uFF09\n      const urlParams = new URLSearchParams(window.location.search);\n      if (urlParams.has('discount') || urlParams.has('coupon')) {\n        urlParams.delete('discount');\n        urlParams.delete('coupon');\n        const newUrl = window.location.pathname + (urlParams.toString() ? '?' + urlParams.toString() : '');\n        window.history.replaceState({}, '', newUrl);\n        // console.log('\u5DF2\u4ECE URL \u79FB\u9664\u6298\u6263\u7801\u53C2\u6570');\n      }\n    }\n    \n    // \u9A8C\u8BC1\u6298\u6263\u7801\u662F\u5426\u5DF2\u79FB\u9664\n    verifyDiscountRemoved() {\n      fetch('/cart.js')\n        .then(response => response.json())\n        .then(cart => {\n          const discountCodes = cart.discount_codes || [];\n          if (discountCodes.length > 0) {\n            if (this.hasOnlySubscriptionAllowedDiscounts(discountCodes)) {\n              return;\n            }\n            // console.warn('\u6298\u6263\u7801\u4ECD\u7136\u5B58\u5728\uFF0C\u518D\u6B21\u5C1D\u8BD5\u79FB\u9664:', discountCodes);\n            this.forceRemoveDiscountCode();\n            this.removeDiscountFromDOM();\n            \n            // \u5982\u679C\u4ECD\u7136\u5B58\u5728\uFF0C\u5C1D\u8BD5\u66F4\u6FC0\u8FDB\u7684\u65B9\u6CD5\n            this.schedule(() => {\n              this.aggressiveRemoveDiscount();\n            }, 1000);\n          } else {\n            // console.log('\u2705 \u6298\u6263\u7801\u5DF2\u6210\u529F\u79FB\u9664');\n            // \u5373\u4F7F API \u8BF4\u5DF2\u79FB\u9664\uFF0C\u4E5F\u8981\u786E\u4FDD DOM \u4E2D\u6CA1\u6709\u663E\u793A\n            this.removeDiscountFromDOM();\n          }\n        })\n        .catch(error => {\n          // console.error('\u9A8C\u8BC1\u6298\u6263\u7801\u79FB\u9664\u5931\u8D25:', error);\n          // \u5373\u4F7F\u9A8C\u8BC1\u5931\u8D25\uFF0C\u4E5F\u5C1D\u8BD5\u4ECE DOM \u79FB\u9664\n          this.removeDiscountFromDOM();\n        });\n    }\n    \n    // \u66F4\u6FC0\u8FDB\u7684\u65B9\u6CD5\u79FB\u9664\u6298\u6263\u7801\n    aggressiveRemoveDiscount() {\n      // console.log('\u4F7F\u7528\u6FC0\u8FDB\u65B9\u6CD5\u79FB\u9664\u6298\u6263\u7801');\n      \n      // \u65B9\u6CD51\uFF1A\u76F4\u63A5\u4FEE\u6539\u8D2D\u7269\u8F66\u6570\u636E\n      fetch('/cart/update.js', {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n        },\n        body: JSON.stringify({\n          discount: null,\n          discount_code: '',\n          discount_codes: []\n        })\n      })\n      .then(response => response.json())\n      .then(data => {\n        // console.log('\u6FC0\u8FDB\u65B9\u6CD5\u79FB\u9664\u6298\u6263\u7801\u54CD\u5E94:', data);\n        this.removeDiscountFromDOM();\n      })\n      .catch(error => {\n        // console.error('\u6FC0\u8FDB\u65B9\u6CD5\u5931\u8D25:', error);\n      });\n      \n      // \u65B9\u6CD52\uFF1A\u4EC5\u6E05\u7406\u8D2D\u7269\u8F66\u533A\u57DF\u5185\u5DF2\u77E5\u6298\u6263\u8282\u70B9\uFF0C\u907F\u514D\u904D\u5386\u65E0\u5173\u9875\u9762\u8282\u70B9\u3002\n      this.removeDiscountFromDOM();\n    }\n    \n    // \u542F\u52A8\u8D2D\u7269\u8F66\u76D1\u63A7\uFF08\u4EC5\u5728\u9700\u8981\u65F6\uFF09\n    startCartWatch() {\n      // \u517C\u5BB9\u65E7\u8C03\u7528\uFF1A\u8D2D\u7269\u8F66\u76D1\u63A7\u5DF2\u6539\u4E3A\u4E8B\u4EF6\u9A71\u52A8\uFF0C\u4E0D\u518D\u542F\u52A8\u5E38\u9A7B interval\u3002\n      this.watchCartForAutoDiscounts();\n    }\n    \n    // \u68C0\u67E5\u5E76\u79FB\u9664\u81EA\u52A8\u5E94\u7528\u7684\u6298\u6263\u7801\uFF08\u4F18\u5316\uFF1A\u6DFB\u52A0\u8282\u6D41\uFF09\n    checkAndRemoveAutoDiscounts() {\n      // \u8282\u6D41\uFF1A\u907F\u514D\u9891\u7E41\u8BF7\u6C42\n      const now = Date.now();\n      if (now - this.lastCartCheck < this.cartCheckThrottle) {\n        return;\n      }\n      this.lastCartCheck = now;\n      \n      // \u68C0\u67E5\u8D2D\u7269\u8F66\u4E2D\u662F\u5426\u6709\u8BA2\u9605\u5546\u54C1\n      fetch('/cart.js')\n        .then(response => response.json())\n        .then(cart => {\n          // \u68C0\u67E5\u662F\u5426\u6709\u8BA2\u9605\u5546\u54C1\uFF08\u6709 selling_plan\uFF09\n          const hasSubscription = cart.items.some(item => item.selling_plan);\n          \n          if (hasSubscription) {\n            // \u68C0\u67E5\u662F\u5426\u6709\u4E0D\u5141\u8BB8\u7528\u4E8E\u8BA2\u9605\u7684\u6298\u6263\u7801\u3002\n            const discountCodes = cart.discount_codes || [];\n            \n            if (this.hasDisallowedSubscriptionDiscounts(discountCodes)) {\n              this.forceRemoveDiscountCode();\n            }\n          }\n        })\n        .catch(error => {\n          // \u9759\u9ED8\u5904\u7406\u9519\u8BEF\uFF0C\u907F\u514D\u63A7\u5236\u53F0\u566A\u97F3\n        });\n    }\n    \n    // \u79FB\u9664\u6298\u6263\u7801\uFF08\u4FDD\u7559\u6B64\u65B9\u6CD5\u4EE5\u517C\u5BB9\u65E7\u4EE3\u7801\uFF09\n    removeDiscountCodes(codes) {\n      if (!this.hasOnlySubscriptionAllowedDiscounts(codes || [])) {\n        this.forceRemoveDiscountCode();\n      }\n    }\n    \n    // \u963B\u6B62\u81EA\u52A8\u5E94\u7528\u6298\u6263\u7801\uFF08\u5728\u6DFB\u52A0\u5230\u8D2D\u7269\u8F66\u65F6\uFF09\n    preventAutoDiscountOnAdd() {\n      // \u5982\u679C\u4F7F\u7528 Shopify \u539F\u751F\u6309\u94AE\uFF0C\u5728\u70B9\u51FB\u540E\u68C0\u67E5\n      if (this.shopifyAddToCartBtn) {\n        this.shopifyAddToCartBtn.addEventListener('click', () => {\n          if (this.selectedSellingPlan) {\n            this.schedule(() => {\n              this.checkAndRemoveAutoDiscounts();\n            }, 1500);\n          }\n        });\n      }\n    }\n  }\n\n  // \u7EDF\u4E00\u542F\u52A8\u5165\u53E3\uFF1Awrapper \u4EE5\u5B9E\u4F8B\u5C5E\u6027\u4F5C\u4E3A\u5E42\u7B49\u6807\u8BB0\uFF0C\u540C\u4E00 DOM \u8282\u70B9\u53EA\u521D\u59CB\u5316\u4E00\u6B21\u3002\n  function initSubscriptionWrappers(root = document) {\n    const containers = root.matches?.('.wonderbiotics-subscriptions-wrapper')\n      ? [root]\n      : root.querySelectorAll('.wonderbiotics-subscriptions-wrapper');\n    containers.forEach(container => {\n      if (container.wonderbioticsSubscriptions) return;\n      const instance = new WonderbioticsSubscriptions(container);\n      container.wonderbioticsSubscriptions = instance;\n    });\n  }\n\n  function initSubscriptions(root = document) {\n    initSubscriptionWrappers(root);\n    initSubscriptionCopy(root);\n    window.__wbSubscriptionsBootstrapped = true;\n    document.dispatchEvent(new CustomEvent('wb:subscriptions-ready', { detail: { root } }));\n  }\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', () => initSubscriptions(document), { once: true });\n  } else {\n    initSubscriptions(document);\n  }\n  // \u652F\u6301 Shopify Theme Editor \u52A8\u6001\u52A0\u8F7D/\u5378\u8F7D section\uFF0C\u540C\u65F6\u590D\u7528\u540C\u4E00\u4E2A\u9875\u9762\u7EA7 runtime\u3002\n  document.addEventListener('shopify:section:load', (event) => initSubscriptions(event.target));\n  document.addEventListener('shopify:section:unload', (event) => {\n    event.target.querySelectorAll('.wonderbiotics-subscriptions-wrapper').forEach((container) => {\n      container.wonderbioticsSubscriptions?.destroy();\n      delete container.wonderbioticsSubscriptions;\n    });\n  });\n\n    /* ======================================\n     * One-time purchase \u94FE\u63A5 \u2014 Add to cart \u6309\u94AE\u4E0B\u65B9\n     * Added: 2026-04-14\n     * update:2026-04-29\n     * * [DISABLED 2026-04-30] \u6062\u590D\u539F One-time purchase \u65B9\u6846\u6A21\u5F0F\uFF0C\n     *   \u4E0B\u65B9 IIFE \u5185\u9996\u884C return \u76F4\u63A5\u9000\u51FA\uFF0C\u4E0D\u518D\u751F\u6210 \"Buy Once for ...\" \u94FE\u63A5\u3002\n     *   \u5B8C\u6574\u903B\u8F91\u4FDD\u7559\uFF0C\u53BB\u6389\u9996\u884C return \u5373\u53EF\u6062\u590D\u94FE\u63A5\u6A21\u5F0F\u3002\n     * \u529F\u80FD\uFF1A\u5728 Add to cart \u6309\u94AE\u4E0B\u65B9\u63D2\u5165\u4E00\u4E2A \"One-time purchase\" \u94FE\u63A5\uFF0C\n     *       \u70B9\u51FB\u540E\u5C06\u7B2C\u4E00\u4E2A\u53D8\u4F53\u52A0\u5165\u8D2D\u7269\u8F66\u5E76\u8DF3\u8F6C\u5230 /cart \u9875\u9762\u3002\n     *       \u4E0D\u4FEE\u6539\u73B0\u6709\u4EFB\u4F55\u903B\u8F91\uFF0C\u7EAF\u589E\u91CF\u6DFB\u52A0\u3002\n     * \u66F4\u65B0\u529F\u80FD\uFF1A\u4FEE\u590D\u62BD\u5C49\uFF0C\u5931\u6548\u95EE\u9898\n     * ====================================== */\n    (function initOneTimePurchaseLink() {\n      return;// [DISABLED 2026-04-30] \u4E34\u65F6\u7981\u7528\u94FE\u63A5\u6A21\u5F0F\uFF0C\u6062\u590D\u539F\u65B9\u6846\n      // \u68C0\u67E5\u8BA2\u9605\u7EC4\u4EF6\u5BB9\u5668\u662F\u5426\u5B58\u5728\n      const wrapper = document.querySelector('.wonderbiotics-subscriptions-wrapper');\n      if (!wrapper) return;\n\n      // \u4ECE\u5DF2\u9690\u85CF\u7684 One-time purchase \u4E0B\u62C9\u6846\u8BFB\u53D6\u7B2C\u4E00\u4E2A\u53D8\u4F53\u4FE1\u606F\n      const selector = document.getElementById('one-time-variant-selector');\n      if (!selector || !selector.options || selector.options.length === 0) return;\n\n      const firstOption = selector.options[0];\n      const variantId = firstOption.value;               // \u7B2C\u4E00\u4E2A\u53D8\u4F53 ID\n      const variantPrice = firstOption.dataset.variantPrice || ''; // \u683C\u5F0F\u5316\u4EF7\u683C\uFF0C\u5982 \"$55.40\"\n\n      // \u627E\u5230 Add to cart \u6309\u94AE\u5BB9\u5668\uFF0C\u4F5C\u4E3A\u94FE\u63A5\u7684\u63D2\u5165\u951A\u70B9\n      const btnContainer = document.querySelector('.product-form__buttons');\n      if (!btnContainer) return;\n\n      // \u521B\u5EFA\u94FE\u63A5\u5143\u7D20\u5E76\u8BBE\u7F6E\u65E0\u969C\u788D\u5C5E\u6027\n      // \u6CE8\u610F\uFF1Ahref \u4E0D\u80FD\u7528 \"/cart\"\uFF0C\u5426\u5219\u4F1A\u88AB cart drawer \u63D2\u4EF6\u5168\u5C40\u62E6\u622A\uFF0C\n      // \u5BFC\u81F4\u4E0B\u9762\u7684 click \u56DE\u8C03\u65E0\u6CD5\u6267\u884C\uFF08\u5546\u54C1\u52A0\u4E0D\u8FDB\u8D2D\u7269\u8F66\uFF09\u3002\n      const link = document.createElement('a');\n      link.href = 'javascript:void(0)';\n      link.className = 'one-time-purchase-link';\n      link.textContent = 'Buy Once for ' + variantPrice + ' + $6 Shipping fee';\n      link.dataset.variantId = variantId;\n      link.setAttribute('role', 'button');\n      link.setAttribute('aria-label', 'Buy once for ' + variantPrice + ' plus 6 dollars shipping, add to cart and open cart drawer');\n\n      // \u63D2\u5165\u5230 Add to cart \u6309\u94AE\u4E0B\u65B9\n      btnContainer.parentNode.insertBefore(link, btnContainer.nextSibling);\n\n      // \u5728\u6309\u94AE\u4E0E\u94FE\u63A5\u4E0B\u65B9\u4E4B\u95F4\u63D2\u5165\u4FDD\u969C\u6027\u6587\u5B57\n      /*const guarantee = document.createElement('p');\n      guarantee.className = 'one-time-purchase-guarantee';\n      guarantee.id = 'one-time-purchase-guarantee';\n      guarantee.setAttribute('role','note');\n      guarantee.setAttribute('aria-label', '30-Day Risk-Free Guarantee and Free Shipping');\n      guarantee.textContent = '30-Day Risk-Free Guarantee \\u00B7 Free Shipping';\n      link.parentNode.insertBefore(guarantee,link);*/\n\n      // \u94FE\u63A5\u4E0B\u65B9\u6DFB\u52A0\u4E34\u5E8A\u63D0\u793A\u6587\u5B57\uFF0C\u5173\u8054\u5230\u94FE\u63A5\u4F9B\u5C4F\u5E55\u9605\u8BFB\u5668\u8865\u5145\u8BF4\u660E\n      const hintId = 'one-time-purchase-hint';\n      const hint = document.createElement('p');\n      hint.className = 'one-time-purchase-hint';\n      hint.id = hintId;\n      hint.setAttribute('role', 'note');\n      hint.textContent = 'Clinically proven results start to show between 3 and 6 months.';\n      link.parentNode.insertBefore(hint, link.nextSibling);\n\n      // \u5C06\u63D0\u793A\u6587\u5B57\u5173\u8054\u5230\u94FE\u63A5\uFF0C\u5C4F\u5E55\u9605\u8BFB\u5668\u4F1A\u5728\u8BFB\u5B8C\u94FE\u63A5\u540E\u8865\u5145\u8BFB\u51FA\u63D0\u793A\u5185\u5BB9\n      link.setAttribute('aria-describedby', hintId);\n\n      // \u70B9\u51FB\u4E8B\u4EF6\uFF1A\u52A0\u8D2D\u7B2C\u4E00\u4E2A\u53D8\u4F53 \u2192 \u6253\u5F00\u8D2D\u7269\u8F66\u62BD\u5C49\n      // \u4F7F\u7528 capture \u9636\u6BB5\u76D1\u542C + stopImmediatePropagation\uFF0C\n      // \u9632\u6B62 cart drawer \u63D2\u4EF6\u5728\u5192\u6CE1\u524D\u628A\u4E8B\u4EF6\u541E\u6389\u3002\n      link.addEventListener('click', function(e) {\n        e.preventDefault();\n        e.stopImmediatePropagation();\n        e.stopPropagation();\n\n        const vid = this.dataset.variantId;\n        if (!vid) return;\n\n        // \u9632\u6B62\u91CD\u590D\u70B9\u51FB\n        if (this.getAttribute('aria-disabled') === 'true') return;\n        this.setAttribute('aria-disabled', 'true');\n        this.style.opacity = '0.5';\n        this.style.pointerEvents = 'none';\n\n        const restoreLink = function() {\n          link.setAttribute('aria-disabled', 'false');\n          link.style.opacity = '';\n          link.style.pointerEvents = '';\n        };\n\n        // \u627E\u5230 cart drawer / cart notification \u7EC4\u4EF6\uFF0C\u590D\u7528\u5B83\u7684 sections \u6E32\u67D3\u903B\u8F91\n        const cart = document.querySelector('cart-notification') || document.querySelector('cart-drawer');\n\n        // \u7528 FormData \u63D0\u4EA4\uFF0C\u548C product-form.js \u4FDD\u6301\u4E00\u81F4\n        const formData = new FormData();\n        formData.append('id', vid);\n        formData.append('quantity', '1');\n\n        if (cart && typeof cart.getSectionsToRender === 'function') {\n          formData.append(\n            'sections',\n            cart.getSectionsToRender().map(function(section) { return section.id; }).join(',')\n          );\n          formData.append('sections_url', window.location.pathname);\n          if (typeof cart.setActiveElement === 'function') {\n            cart.setActiveElement(document.activeElement);\n          }\n        }\n\n        const cartAddUrl = (window.routes && window.routes.cart_add_url) || '/cart/add';\n\n        fetch(cartAddUrl, {\n          method: 'POST',\n          headers: {\n            'X-Requested-With': 'XMLHttpRequest',\n            'Accept': 'application/javascript'\n          },\n          body: formData\n        })\n        .then(function(res) {\n          return res.json().then(function(data) { return { ok: res.ok, data: data }; });\n        })\n        .then(function(result) {\n          const response = result.data;\n\n          // Shopify \u52A0\u8D2D\u51FA\u9519\u65F6\uFF0Cresponse.status \u4F1A\u662F\u6570\u5B57\uFF084xx/5xx\uFF09\n          if (!result.ok || (response && response.status)) {\n            console.error('One-time purchase add to cart error:', response);\n            // \u515C\u5E95\uFF1A\u76F4\u63A5\u8DF3\u8F6C\u5230 cart \u9875\u8BA9\u7528\u6237\u91CD\u8BD5\n            window.location.href = '/cart';\n            return;\n          }\n\n          if (cart && typeof cart.renderContents === 'function') {\n            // \u62BD\u5C49\u6A21\u5F0F\uFF1A\u5237\u65B0\u5185\u5BB9\u5E76\u81EA\u52A8\u6253\u5F00\n            if (cart.classList.contains('is-empty')) {\n              cart.classList.remove('is-empty');\n            }\n            cart.renderContents(response);\n            restoreLink();\n          } else {\n            // \u6CA1\u6709\u62BD\u5C49\u7EC4\u4EF6\u5C31\u9000\u56DE\u8001\u903B\u8F91\n            window.location.href = '/cart';\n          }\n        })\n        .catch(function(err) {\n          console.error('One-time purchase add to cart failed:', err);\n          restoreLink();\n        });\n      }, true);\n    })();\n\n  function applySubscriptionCopy(root) {\n    if (!window.location.pathname.includes('/products/')) {\n      return;\n    }\n\n    const newPauseCopy = 'Easily Edit, Skip, or Cancel Anytime';\n    const freeShippingCopy = 'Free Shipping Always ($4.99 value)';\n\n    root.querySelectorAll('.pause-cancel-hint').forEach(function(el) {\n      if (el.textContent.trim() === 'Pause or cancel anytime') {\n        el.textContent = newPauseCopy;\n      }\n    });\n\n    root.querySelectorAll('.variant-subscription-card .plan-desc-list').forEach(function(list) {\n      let hasFreeShipping = false;\n      list.querySelectorAll('li').forEach(function(item) {\n        const text = item.textContent.trim();\n        if (text === 'Pause or cancel anytime') {\n          item.textContent = newPauseCopy;\n        }\n        if (text === freeShippingCopy || item.textContent.trim() === freeShippingCopy) {\n          hasFreeShipping = true;\n        }\n      });\n\n      if (!hasFreeShipping) {\n        const item = document.createElement('li');\n        item.textContent = freeShippingCopy;\n        list.appendChild(item);\n      }\n    });\n  }\n\n  function initSubscriptionCopy(root) {\n    const wrappers = root.matches?.('.wonderbiotics-subscriptions-wrapper')\n      ? [root]\n      : root.querySelectorAll('.wonderbiotics-subscriptions-wrapper');\n    wrappers.forEach((wrapper) => {\n      applySubscriptionCopy(wrapper);\n      const target = wrapper.querySelector('.variants-subscriptions-grid');\n      if (!target || !window.MutationObserver || target.dataset.wbCopyObserved === 'true') return;\n      target.dataset.wbCopyObserved = 'true';\n      let queued = false;\n      // \u8BA2\u9605\u5361\u7247\u5F02\u6B65\u53D8\u5316\u65F6\u4EC5\u89C2\u5BDF\u5F53\u524D grid\uFF0C\u5E76\u5728\u4E00\u5E27\u5185\u5408\u5E76\u591A\u6B21 mutation\uFF0C\u4E0D\u518D\u5B9A\u65F6\u91CD\u8DD1\u6587\u6848\u3002\n      const observer = new MutationObserver(() => {\n        if (queued) return;\n        queued = true;\n        const scheduleCopy = window.requestAnimationFrame\n          ? window.requestAnimationFrame.bind(window)\n          : (callback) => setTimeout(callback, 0);\n        scheduleCopy(() => {\n          queued = false;\n          applySubscriptionCopy(wrapper);\n        });\n      });\n      observer.observe(target, { childList: true, subtree: true });\n      wrapper.wonderbioticsSubscriptions?.instanceObservers.add(observer);\n    });\n  }\n\n  // \u5BFC\u51FA\u5230\u5168\u5C40\n  window.WonderbioticsSubscriptions = WonderbioticsSubscriptions;\n\n})();\n\n// Normalize any cached Shoplift/server-rendered subscription markup after the expired promo ended.\n(function normalizePostIndependenceSubscriptionMarkup() {\n  const ROOT_SELECTOR = '.wonderbiotics-subscriptions-wrapper';\n\n  function ensureOneTimePriceStackStyles() {\n    if (document.getElementById('wb-one-time-price-stack-fix')) return;\n    const style = document.createElement('style');\n    style.id = 'wb-one-time-price-stack-fix';\n    style.textContent = `\n      .wonderbiotics-subscriptions-wrapper .one-time-purchase-card .price-row {\n        display: flex !important;\n        justify-content: flex-end !important;\n        align-items: flex-start !important;\n        width: 100% !important;\n      }\n      .wonderbiotics-subscriptions-wrapper .one-time-purchase-card #one-time-price-display,\n      .wonderbiotics-subscriptions-wrapper .one-time-purchase-card .one-time-price-display,\n      .wonderbiotics-subscriptions-wrapper .one-time-purchase-card .price-current#one-time-price-display {\n        display: flex !important;\n        flex-direction: column !important;\n        align-items: flex-end !important;\n        justify-content: center !important;\n        gap: 2px !important;\n        flex-wrap: nowrap !important;\n        white-space: nowrap !important;\n        text-align: right !important;\n      }\n      .wonderbiotics-subscriptions-wrapper .one-time-monthly-stack {\n        display: inline-flex !important;\n        flex-direction: column !important;\n        align-items: flex-end !important;\n        justify-content: center !important;\n        gap: 4px !important;\n        text-align: right !important;\n        white-space: nowrap !important;\n      }\n      .wonderbiotics-subscriptions-wrapper .one-time-monthly-price {\n        display: inline-flex !important;\n        align-items: baseline !important;\n        justify-content: flex-end !important;\n        gap: 4px !important;\n        white-space: nowrap !important;\n      }\n      .wonderbiotics-subscriptions-wrapper .one-time-daily-price {\n        display: inline-flex !important;\n        align-items: baseline !important;\n        justify-content: flex-end !important;\n        gap: 4px !important;\n        white-space: nowrap !important;\n        color: #757575 !important;\n        font-size: 12px !important;\n        font-weight: 400 !important;\n        line-height: 1.2 !important;\n      }\n      .wonderbiotics-subscriptions-wrapper .one-time-daily-price .price-suffix {\n        color: #757575 !important;\n        font-size: 12px !important;\n        font-weight: 400 !important;\n        line-height: 1 !important;\n      }\n      .wonderbiotics-subscriptions-wrapper .wb-one-time-select__line {\n        display: inline-flex !important;\n        align-items: baseline !important;\n        gap: 2px !important;\n        white-space: nowrap !important;\n      }\n      @media (max-width: 749px) {\n        .wonderbiotics-subscriptions-wrapper.wb-subscription-b .one-time-monthly-price {\n          font-size: 16px !important;\n        }\n        .wonderbiotics-subscriptions-wrapper.wb-subscription-b .one-time-monthly-price .price-suffix,\n        .wonderbiotics-subscriptions-wrapper.wb-subscription-b .one-time-daily-price,\n        .wonderbiotics-subscriptions-wrapper.wb-subscription-b .one-time-daily-price .price-suffix {\n          font-size: 10px !important;\n        }\n      }\n    `;\n    (document.head || document.documentElement).appendChild(style);\n  }\n\n  function formatMoney(cents) {\n    const value = Number(cents);\n    if (!Number.isFinite(value)) return '';\n    return `$${(value / 100).toFixed(2)}`;\n  }\n\n  function replacePriceWithSuffix(element, price, suffix) {\n    if (!element || !price) return;\n    element.textContent = '';\n    element.append(document.createTextNode(price));\n    const suffixEl = document.createElement('span');\n    suffixEl.className = 'price-suffix';\n    suffixEl.textContent = suffix;\n    element.append(suffixEl);\n  }\n\n  function normalizeWrapper(wrapper) {\n    if (!wrapper) return;\n    ensureOneTimePriceStackStyles();\n\n    wrapper.querySelectorAll('.independence-discount-badge').forEach((badge) => badge.remove());\n\n    wrapper.querySelectorAll('.plan-pricing[data-original-price][data-discounted-price][data-months-count]').forEach((pricing) => {\n      const originalCents = parseInt(pricing.dataset.originalPrice, 10);\n      const discountedCents = parseInt(pricing.dataset.discountedPrice, 10);\n      const monthsCount = parseInt(pricing.dataset.monthsCount, 10);\n      if (!originalCents || !discountedCents || !monthsCount) return;\n\n      const daysCount = monthsCount * 30;\n      const comparePrice = formatMoney(Math.round(originalCents / monthsCount));\n      const currentPrice = formatMoney(Math.round(discountedCents / monthsCount));\n      const dailyPrice = formatMoney(Math.floor(discountedCents / daysCount));\n      const originalTotal = formatMoney(originalCents);\n      const discountedTotal = formatMoney(discountedCents);\n\n      const compareEl = pricing.querySelector('.price-compare');\n      if (compareEl && comparePrice) compareEl.textContent = comparePrice;\n\n      const currentEl = pricing.querySelector('.price-current');\n      if (currentEl && currentPrice) {\n        currentEl.dataset.subscriptionPrice = String(discountedCents);\n        currentEl.dataset.compareSubscriptionPrice = String(originalCents);\n        currentEl.dataset.totalPriceFormatted = discountedTotal;\n        currentEl.dataset.compareTotalPriceFormatted = originalTotal;\n        replacePriceWithSuffix(currentEl, currentPrice, '/mo');\n      }\n\n      const dailyEl = pricing.querySelector('.price-original');\n      replacePriceWithSuffix(dailyEl, dailyPrice, '/day');\n    });\n\n    const selector = wrapper.querySelector('.one-time-variant-selector');\n    if (selector) {\n      Array.from(selector.options).forEach((option) => {\n        const price = option.dataset.variantPrice || '';\n        const priceCents = parseInt(option.dataset.variantPriceCents, 10);\n        const title = option.dataset.variantTitle || option.textContent.split(' - ')[0].trim();\n        option.removeAttribute('data-variant-sale-price');\n        option.removeAttribute('data-variant-sale-price-cents');\n        option.removeAttribute('data-variant-compare-price');\n        option.removeAttribute('data-variant-compare-price-cents');\n        if (!option.dataset.variantDisplayPrice && Number.isFinite(priceCents) && priceCents > 0) {\n          const titleKey = (option.dataset.variantOriginalTitle || title || '').toLowerCase().replace(/[\\s-]/g, '');\n          const cycleKey = option.dataset.dCycle || titleKey;\n          const monthsCount = cycleKey.includes('6month') ? 6 : cycleKey.includes('3month') ? 3 : 1;\n          const monthlyCents = Math.floor(priceCents / monthsCount);\n          const dailyCents = Math.floor(monthlyCents / 30);\n          option.dataset.variantDisplayPrice = formatMoney(monthlyCents);\n          option.dataset.variantDisplayPriceCents = String(monthlyCents);\n          option.dataset.variantDisplayDailyPrice = formatMoney(dailyCents);\n          option.dataset.variantDisplayDailyPriceCents = String(dailyCents);\n        }\n        const displayPrice = option.dataset.variantDisplayPrice || price;\n        if (displayPrice) option.textContent = `${title} - ${displayPrice}/mo`;\n      });\n\n      const selected = selector.options[selector.selectedIndex];\n      const display = wrapper.querySelector('#one-time-price-display');\n      const selectedPrice = selected?.dataset.variantDisplayPrice || selected?.dataset.variantPrice;\n      const selectedDaily = selected?.dataset.variantDisplayDailyPrice || '';\n      if (display && selectedPrice) {\n        display.innerHTML = `<span class=\"one-time-monthly-stack\" style=\"display:inline-flex!important;flex-direction:column!important;align-items:flex-end!important;justify-content:center!important;gap:4px!important;text-align:right!important;white-space:nowrap!important;\"><span class=\"one-time-monthly-price\" style=\"display:inline-flex!important;align-items:baseline!important;justify-content:flex-end!important;gap:4px!important;white-space:nowrap!important;\">${selectedPrice}<span class=\"price-suffix\">/mo</span></span>${selectedDaily ? `<span class=\"one-time-daily-price\" style=\"display:inline-flex!important;align-items:baseline!important;justify-content:flex-end!important;gap:4px!important;white-space:nowrap!important;\">${selectedDaily}<span class=\"price-suffix\">/day</span></span>` : ''}</span>`;\n      }\n    }\n  }\n\n  function run(root = document) {\n    ensureOneTimePriceStackStyles();\n    const wrappers = root.matches?.(ROOT_SELECTOR) ? [root] : root.querySelectorAll(ROOT_SELECTOR);\n    wrappers.forEach(normalizeWrapper);\n  }\n\n  ensureOneTimePriceStackStyles();\n\n  // \u4EF7\u683C\u6808\u89C4\u8303\u5316\u8DDF\u968F\u7EDF\u4E00 ready \u4E8B\u4EF6\u6267\u884C\uFF0C\u66FF\u4EE3 250/1000/2500ms \u7684\u5168\u9875\u91CD\u590D\u626B\u63CF\u3002\n  document.addEventListener('wb:subscriptions-ready', (event) => run(event.detail?.root || document));\n  if (window.__wbSubscriptionsBootstrapped) run();\n})();\n\n// Apply the optional promotion to storefront text only. Variant IDs, selling-plan IDs,\n// form values, and the price data used by Shopify/Appstle remain untouched.\n(function applyFrontendSubscriptionPromotion() {\n  const ROOT_SELECTOR = '.wonderbiotics-subscriptions-wrapper';\n\n  function formatMoney(cents) {\n    const value = Number(cents);\n    if (!Number.isFinite(value)) return '';\n    if (typeof window.Shopify !== 'undefined' && typeof window.Shopify.formatMoney === 'function') {\n      const format = window.theme?.moneyFormat || window.Shopify.money_format;\n      try {\n        return format ? window.Shopify.formatMoney(Math.round(value), format) : window.Shopify.formatMoney(Math.round(value));\n      } catch (error) { /* Fall back to USD formatting below. */ }\n    }\n    return `$${(value / 100).toFixed(2)}`;\n  }\n\n  function replacePriceWithSuffix(element, price, suffix) {\n    if (!element || !price) return;\n    element.textContent = price;\n    const suffixEl = document.createElement('span');\n    suffixEl.className = 'price-suffix';\n    suffixEl.textContent = suffix;\n    element.appendChild(suffixEl);\n  }\n\n  function getConfig(wrapper) {\n    const enabled = ['true', '1', 'yes'].includes(String(wrapper.dataset.promoEnabled || '').toLowerCase());\n    const percent = Number.parseFloat(wrapper.dataset.promoDiscountPercent || '0');\n    return {\n      enabled: enabled && Number.isFinite(percent) && percent > 0 && percent < 100,\n      percent: Math.max(0, Math.min(99, percent)),\n      badgeText: String(wrapper.dataset.promoBadgeText || '').trim(),\n      countdownEndAt: String(wrapper.dataset.promoCountdownEndAt || '').trim(),\n      countdownLabel: String(wrapper.dataset.promoCountdownLabel || '').trim(),\n      countdownAriaLabel: String(wrapper.dataset.promoCountdownAriaLabel || '').trim(),\n      countdownUnitLabels: {\n        days: String(wrapper.dataset.promoCountdownDaysLabel || '').trim(),\n        hours: String(wrapper.dataset.promoCountdownHoursLabel || '').trim(),\n        minutes: String(wrapper.dataset.promoCountdownMinutesLabel || '').trim(),\n        seconds: String(wrapper.dataset.promoCountdownSecondsLabel || '').trim()\n      }\n    };\n  }\n\n  function createPromotionStack(parent) {\n    const stack = document.createElement('div');\n    stack.className = 'wb-promo-stack';\n    const sectionGrid = parent.querySelector('.variants-subscriptions-grid');\n    const firstCard = parent.querySelector('.variant-subscription-card');\n    const anchor = sectionGrid || firstCard;\n    if (anchor) parent.insertBefore(stack, anchor);\n    else parent.appendChild(stack);\n    return stack;\n  }\n\n  function addPromoBadge(stack, percent, customText) {\n    const badge = document.createElement('span');\n    badge.className = 'wb-promo-badge';\n    badge.textContent = customText || `${Number.isInteger(percent) ? percent : percent.toFixed(2)}% off`;\n    stack.appendChild(badge);\n  }\n\n  function parseCountdownEndAt(value) {\n    const rawValue = String(value || '').trim();\n    if (!rawValue) return Number.NaN;\n\n    const normalizedValue = rawValue\n      .replace(/^(\\d{4}-\\d{2}-\\d{2})\\s+(\\d{2}:\\d{2}:\\d{2})/, '$1T$2')\n      .replace(/([+-]\\d{2})(\\d{2})$/, '$1:$2');\n    const hasTimezone = /(?:Z|[+-]\\d{2}:\\d{2})$/i.test(normalizedValue);\n    return hasTimezone ? Date.parse(normalizedValue) : Number.NaN;\n  }\n\n  function addPromoCountdown(stack, config) {\n    const endTimestamp = parseCountdownEndAt(config.countdownEndAt);\n    if (!config.countdownEndAt || Number.isNaN(endTimestamp) || endTimestamp <= Date.now()) return;\n\n    const countdown = document.createElement('span');\n    countdown.className = 'wb-promo-countdown';\n    countdown.setAttribute('role', 'timer');\n\n    if (config.countdownLabel) {\n      const label = document.createElement('span');\n      label.className = 'wb-promo-countdown__label';\n      label.textContent = config.countdownLabel;\n      countdown.appendChild(label);\n    }\n\n    const timer = document.createElement('span');\n    timer.className = 'wb-promo-countdown__timer';\n    const values = {};\n    ['days', 'hours', 'minutes', 'seconds'].forEach((unit, index) => {\n      if (index > 0) {\n        const separator = document.createElement('span');\n        separator.className = 'wb-promo-countdown__separator';\n        separator.setAttribute('aria-hidden', 'true');\n        separator.textContent = ':';\n        timer.appendChild(separator);\n      }\n      const value = document.createElement('span');\n      value.className = 'wb-promo-countdown__value';\n      value.textContent = '00';\n      timer.appendChild(value);\n      values[unit] = value;\n    });\n    countdown.appendChild(timer);\n    stack.appendChild(countdown);\n\n    function updateCountdown() {\n      const remainingMilliseconds = endTimestamp - Date.now();\n      if (remainingMilliseconds <= 0) {\n        window.clearTimeout(countdown.wbCountdownTimeout);\n        countdown.remove();\n        return;\n      }\n\n      const totalSeconds = Math.floor(remainingMilliseconds / 1000);\n      const remaining = {\n        days: Math.floor(totalSeconds / 86400),\n        hours: Math.floor((totalSeconds % 86400) / 3600),\n        minutes: Math.floor((totalSeconds % 3600) / 60),\n        seconds: totalSeconds % 60\n      };\n\n      Object.keys(values).forEach((unit) => {\n        values[unit].textContent = String(remaining[unit]).padStart(2, '0');\n      });\n\n      const spokenTime = Object.keys(remaining)\n        .map((unit) => `${remaining[unit]} ${config.countdownUnitLabels[unit]}`)\n        .join(', ');\n      countdown.setAttribute('aria-label', `${config.countdownAriaLabel}: ${spokenTime}`);\n      countdown.wbCountdownTimeout = window.setTimeout(updateCountdown, 1000);\n    }\n\n    updateCountdown();\n  }\n\n  function removePromotionStack(wrapper) {\n    wrapper.querySelectorAll('.wb-promo-stack').forEach((stack) => {\n      const countdown = stack.querySelector('.wb-promo-countdown');\n      if (countdown?.wbCountdownTimeout) window.clearTimeout(countdown.wbCountdownTimeout);\n      stack.remove();\n    });\n  }\n\n  function normalizePlan(pricing, percent) {\n    const originalCents = Number.parseInt(pricing.dataset.originalPrice, 10);\n    const backendCents = Number.parseInt(pricing.dataset.discountedPrice, 10);\n    const monthsCount = Number.parseInt(pricing.dataset.monthsCount, 10);\n    if (!Number.isFinite(originalCents) || !Number.isFinite(monthsCount) || originalCents <= 0 || monthsCount <= 0) return;\n\n    const baseCents = Number.isFinite(backendCents) && backendCents > 0 ? backendCents : originalCents;\n    const promoCents = Math.max(0, Math.round(baseCents * (100 - percent) / 100));\n    const daysCount = monthsCount * 30;\n    const compareEl = pricing.querySelector('.price-compare');\n    const currentEl = pricing.querySelector('.price-current');\n    const dailyEl = pricing.querySelector('.price-original');\n    if (compareEl) compareEl.textContent = formatMoney(Math.round(originalCents / monthsCount));\n    replacePriceWithSuffix(currentEl, formatMoney(Math.round(promoCents / monthsCount)), '/mo');\n    replacePriceWithSuffix(dailyEl, formatMoney(Math.floor(promoCents / daysCount)), '/day');\n\n    // These attributes are presentation values consumed by the existing cart-price label only.\n    // The authoritative variant/selling-plan values remain on the input and option elements.\n    if (currentEl) {\n      currentEl.dataset.subscriptionPrice = String(promoCents);\n      currentEl.dataset.totalPriceFormatted = formatMoney(promoCents);\n      currentEl.dataset.wbPromoApplied = 'true';\n    }\n  }\n\n  function normalizeOneTime(wrapper, percent) {\n    const selector = wrapper.querySelector('.one-time-variant-selector');\n    if (!selector) return;\n    Array.from(selector.options).forEach((option) => {\n      const variantCents = Number.parseInt(option.dataset.variantPriceCents, 10);\n      if (!Number.isFinite(variantCents) || variantCents <= 0) return;\n      const title = option.dataset.variantTitle || option.textContent.split(' - ')[0].trim();\n      const titleKey = (option.dataset.variantOriginalTitle || title).toLowerCase().replace(/[\\s-]/g, '');\n      const monthsCount = titleKey.includes('6month') ? 6 : titleKey.includes('3month') ? 3 : 1;\n      const promoCents = Math.max(0, Math.round(variantCents * (100 - percent) / 100));\n      const compareMonthlyCents = Math.round(variantCents / monthsCount);\n      const monthlyCents = Math.round(promoCents / monthsCount);\n      const dailyCents = Math.floor(monthlyCents / 30);\n      option.dataset.variantComparePrice = formatMoney(compareMonthlyCents);\n      option.dataset.variantComparePriceCents = String(compareMonthlyCents);\n      option.dataset.variantDisplayPrice = formatMoney(monthlyCents);\n      option.dataset.variantDisplayPriceCents = String(monthlyCents);\n      option.dataset.variantDisplayDailyPrice = formatMoney(dailyCents);\n      option.dataset.variantDisplayDailyPriceCents = String(dailyCents);\n      option.textContent = `${title} - ${formatMoney(monthlyCents)}/mo`;\n    });\n\n    const selected = selector.options[selector.selectedIndex];\n    const display = wrapper.querySelector('#one-time-price-display');\n    if (selected && display) {\n      const monthly = selected.dataset.variantDisplayPrice;\n      const daily = selected.dataset.variantDisplayDailyPrice;\n      display.innerHTML = `<span class=\"one-time-monthly-stack\"><span class=\"one-time-monthly-price\">${monthly}<span class=\"price-suffix\">/mo</span></span>${daily ? `<span class=\"one-time-daily-price\">${daily}<span class=\"price-suffix\">/day</span></span>` : ''}</span>`;\n    }\n    selector.dispatchEvent(new CustomEvent('wb:one-time-prices-updated'));\n    // Do not dispatch the native change event here. The subscription instance\n    // treats that event as a user one-time-purchase selection and clears the\n    // default selling plan. User-triggered changes still use the normal handler.\n  }\n\n  function restoreOneTime(wrapper) {\n    const selector = wrapper.querySelector('.one-time-variant-selector');\n    if (!selector) return;\n    Array.from(selector.options).forEach((option) => {\n      const variantCents = Number.parseInt(option.dataset.variantPriceCents, 10);\n      if (!Number.isFinite(variantCents) || variantCents <= 0) return;\n      const title = option.dataset.variantTitle || option.textContent.split(' - ')[0].trim();\n      const titleKey = (option.dataset.variantOriginalTitle || title).toLowerCase().replace(/[\\s-]/g, '');\n      const monthsCount = titleKey.includes('6month') ? 6 : titleKey.includes('3month') ? 3 : 1;\n      const monthlyCents = Math.floor(variantCents / monthsCount);\n      const dailyCents = Math.floor(monthlyCents / 30);\n      option.removeAttribute('data-variant-compare-price');\n      option.removeAttribute('data-variant-compare-price-cents');\n      option.dataset.variantDisplayPrice = formatMoney(monthlyCents);\n      option.dataset.variantDisplayPriceCents = String(monthlyCents);\n      option.dataset.variantDisplayDailyPrice = formatMoney(dailyCents);\n      option.dataset.variantDisplayDailyPriceCents = String(dailyCents);\n      option.textContent = `${title} - ${formatMoney(monthlyCents)}/mo`;\n    });\n\n    const selected = selector.options[selector.selectedIndex];\n    const display = wrapper.querySelector('#one-time-price-display');\n    if (selected && display) {\n      const monthly = selected.dataset.variantDisplayPrice;\n      const daily = selected.dataset.variantDisplayDailyPrice;\n      display.innerHTML = `<span class=\"one-time-monthly-stack\"><span class=\"one-time-monthly-price\">${monthly}<span class=\"price-suffix\">/mo</span></span>${daily ? `<span class=\"one-time-daily-price\">${daily}<span class=\"price-suffix\">/day</span></span>` : ''}</span>`;\n    }\n    selector.dispatchEvent(new CustomEvent('wb:one-time-prices-updated'));\n  }\n\n  function apply(wrapper) {\n    const config = getConfig(wrapper);\n    removePromotionStack(wrapper);\n    if (!config.enabled) {\n      restoreOneTime(wrapper);\n      return;\n    }\n    const stack = createPromotionStack(wrapper);\n    addPromoCountdown(stack, config);\n    addPromoBadge(stack, config.percent, config.badgeText);\n    wrapper.querySelectorAll('.plan-pricing[data-original-price][data-months-count]').forEach((pricing) => normalizePlan(pricing, config.percent));\n    normalizeOneTime(wrapper, config.percent);\n  }\n\n  function run(root = document) {\n    const wrappers = root.matches?.(ROOT_SELECTOR) ? [root] : root.querySelectorAll(ROOT_SELECTOR);\n    wrappers.forEach(apply);\n  }\n\n  document.addEventListener('wb:subscriptions-ready', (event) => run(event.detail?.root || document));\n  document.addEventListener('AppstleSubscription:PriceUpdated', () => {\n    window.setTimeout(() => run(), 0);\n  });\n  if (window.__wbSubscriptionsBootstrapped) run();\n})();\n\n// Custom one-time dropdown\n(function initWonderbioticsOneTimeDropdown() {\n  const ROOT_SELECTOR = '.wonderbiotics-subscriptions-wrapper';\n  const SELECT_SELECTOR = '.one-time-variant-selector';\n\n  function optionData(option) {\n    return {\n      value: option.value,\n      title: option.dataset.variantTitle || option.textContent.split(' - ')[0].trim(),\n      comparePrice: option.dataset.variantComparePrice || '',\n      price: option.dataset.variantDisplayPrice || option.dataset.variantPrice || '',\n      dailyPrice: option.dataset.variantDisplayDailyPrice || '',\n      selected: option.selected\n    };\n  }\n\n  function priceMarkup(data, includeCheck) {\n    const check = includeCheck ? `<span class=\"wb-one-time-select__check\">${data.selected ? '\u2713' : ''}</span>` : '';\n    const compare = data.comparePrice && data.comparePrice !== data.price\n      ? `<span class=\"wb-one-time-select__compare\">${data.comparePrice}</span>`\n      : '';\n    const daily = data.dailyPrice ? `<span class=\"wb-one-time-select__daily\">${data.dailyPrice}/day</span>` : '';\n    const line = `<span class=\"wb-one-time-select__line\"><span class=\"wb-one-time-select__title\">${data.title} -</span>${compare}<span class=\"wb-one-time-select__price\">${data.price}/mo</span>${includeCheck ? daily : ''}</span>`;\n    return `${check}${line}`;\n  }\n\n  function closeAll(except) {\n    document.querySelectorAll(`${ROOT_SELECTOR} .wb-one-time-select.is-open`).forEach((wrapper) => {\n      if (wrapper === except) return;\n      wrapper.classList.remove('is-open');\n      const button = wrapper.querySelector('.wb-one-time-select__button');\n      const menu = wrapper.querySelector('.wb-one-time-select__menu');\n      if (button) button.setAttribute('aria-expanded', 'false');\n      if (menu) menu.hidden = true;\n    });\n  }\n\n  function updateCustomSelect(select) {\n    const wrapper = select.nextElementSibling && select.nextElementSibling.classList.contains('wb-one-time-select')\n      ? select.nextElementSibling\n      : null;\n    if (!wrapper) return;\n\n    const button = wrapper.querySelector('.wb-one-time-select__button');\n    const menu = wrapper.querySelector('.wb-one-time-select__menu');\n    const selected = select.options[select.selectedIndex] || select.options[0];\n    if (!button || !menu || !selected) return;\n\n    button.innerHTML = priceMarkup(optionData(selected), false);\n    menu.innerHTML = '';\n    Array.from(select.options).forEach((option) => {\n      const data = optionData(option);\n      const item = document.createElement('button');\n      item.type = 'button';\n      item.className = `wb-one-time-select__option${option.selected ? ' is-selected' : ''}`;\n      item.setAttribute('role', 'option');\n      item.setAttribute('aria-selected', option.selected ? 'true' : 'false');\n      item.innerHTML = priceMarkup(data, true);\n      item.addEventListener('click', () => {\n        select.value = option.value;\n        select.dispatchEvent(new Event('change', { bubbles: true }));\n        closeAll();\n        updateCustomSelect(select);\n      });\n      menu.appendChild(item);\n    });\n  }\n\n  function enhance(select) {\n    if (!select || select.dataset.wbCustomSelect === 'true') return;\n    select.dataset.wbCustomSelect = 'true';\n    select.classList.add('wb-native-select-hidden');\n\n    const wrapper = document.createElement('div');\n    wrapper.className = 'wb-one-time-select';\n    wrapper.innerHTML = '<button type=\"button\" class=\"wb-one-time-select__button\" aria-haspopup=\"listbox\" aria-expanded=\"false\"></button><div class=\"wb-one-time-select__menu\" role=\"listbox\" hidden></div>';\n    select.insertAdjacentElement('afterend', wrapper);\n\n    const button = wrapper.querySelector('.wb-one-time-select__button');\n    const menu = wrapper.querySelector('.wb-one-time-select__menu');\n    button.addEventListener('click', (event) => {\n      event.stopPropagation();\n      const willOpen = !wrapper.classList.contains('is-open');\n      closeAll(wrapper);\n      wrapper.classList.toggle('is-open', willOpen);\n      button.setAttribute('aria-expanded', willOpen ? 'true' : 'false');\n      menu.hidden = !willOpen;\n      if (willOpen) updateCustomSelect(select);\n    });\n\n    select.addEventListener('change', () => updateCustomSelect(select));\n    select.addEventListener('wb:one-time-prices-updated', () => updateCustomSelect(select));\n    updateCustomSelect(select);\n  }\n\n  function init(root = document) {\n    const selects = root.matches?.(SELECT_SELECTOR)\n      ? [root]\n      : root.querySelectorAll(`${ROOT_SELECTOR} ${SELECT_SELECTOR}`);\n    selects.forEach(enhance);\n  }\n\n  // \u81EA\u5B9A\u4E49\u4E00\u6B21\u6027\u8D2D\u4E70\u4E0B\u62C9\u6846\u5171\u4EAB document click/Escape \u76D1\u542C\uFF0C\u91CD\u590D\u8F7D\u5165\u811A\u672C\u4E5F\u4E0D\u4F1A\u91CD\u590D\u7ED1\u5B9A\u3002\n  const dropdownRuntime = window.__wbSubscriptionDropdownRuntime || { eventsBound: false };\n  window.__wbSubscriptionDropdownRuntime = dropdownRuntime;\n  if (!dropdownRuntime.eventsBound) {\n    dropdownRuntime.eventsBound = true;\n    document.addEventListener('click', () => closeAll());\n    document.addEventListener('keydown', (event) => {\n      if (event.key === 'Escape') closeAll();\n    });\n  }\n  document.addEventListener('wb:subscriptions-ready', (event) => init(event.detail?.root || document));\n  if (window.__wbSubscriptionsBootstrapped) init(document);\n})();\n\n//# sourceMappingURL=wonderbiotics-subscriptions-integration.js.map\n"],
  "mappings": "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",
  "names": ["formData", "selectors"]
}
