{
  "version": 3,
  "sources": ["/cdn/shop/t/26/assets/skio-plan-picker-component.js?skio_pp=rules6"],
  "sourcesContent": ["import { LitElement, html, css, unsafeHTML } from 'https://cdn.jsdelivr.net/gh/lit/dist@3/all/lit-all.min.js'\n\n/**\n * Verbose rules / API logging. Enable via any of:\n * - `?skio_rules_debug=1` or `?skio_debug_rules=1`\n * - `window.SKIO_RULES_DEBUG = true` before this module runs\n * - `debug` on `<skio-plan-picker>` or theme editor (existing picker debug)\n */\nfunction skioRulesDebugActive() {\n  try {\n    if (typeof window === 'undefined') return false\n    if (window.SKIO_RULES_DEBUG === true) return true\n    const q = new URLSearchParams(window.location.search || '')\n    if (q.get('skio_rules_debug') === '1' || q.get('skio_debug_rules') === '1') return true\n  } catch {\n    /* ignore */\n  }\n  return false\n}\n\n;(function skioRulesModuleLoadedPing() {\n  try {\n    if (typeof window === 'undefined') return\n    if (!skioRulesDebugActive()) return\n    console.log(\n      '%c[Skio rules]%c Module skio-plan-picker-component.js loaded. Next: picker connect + fetchRules logs.',\n      'color:#b35900;font-weight:bold',\n      'color:inherit'\n    )\n  } catch {\n    /* ignore */\n  }\n})()\n\nfunction skioCoerceDiscountCode(value) {\n  if (value == null) return undefined\n  if (typeof value === 'string') {\n    const t = value.trim()\n    return t || undefined\n  }\n  if (typeof value === 'object') {\n    return skioCoerceDiscountCode(value.value ?? value.code ?? value.title ?? value.name ?? value.discountCode)\n  }\n  if (typeof value === 'number' && Number.isFinite(value)) return String(value)\n  return undefined\n}\n\n/**\n * Shopify discount code / Skio rule identifiers \u2014 API nests these under `data` or uses alternate keys.\n */\nfunction skioPickRuleDiscountCode(rule, data) {\n  const candidates = [\n    rule.code,\n    data?.code,\n    rule.discountCode,\n    data?.discountCode,\n    rule.discount_code,\n    data?.discount_code,\n    rule.shopifyDiscountCode,\n    data?.shopifyDiscountCode,\n    rule.shopify_code,\n    data?.shopifyCode,\n    data?.shopify_discount_code,\n    rule.couponCode,\n    data?.couponCode,\n    data?.promoCode,\n    rule.promoCode,\n    data?.promoCode,\n    data?.discount?.code,\n    rule.metadata?.code,\n    data?.metadata?.code,\n  ]\n  for (const c of candidates) {\n    const s = skioCoerceDiscountCode(c)\n    if (s) return s\n  }\n  return undefined\n}\n\n/**\n * `/storefront-http/get-rules-by-domain-or-hostname` may return flat fields (legacy themes)\n * or nest fields under `data` (see Skio Storefront OpenAPI). Normalize so eligibility + % off work.\n */\nfunction normalizeSkioStorefrontRule(rule) {\n  if (!rule || typeof rule !== 'object') return rule\n\n  const data = rule.data && typeof rule.data === 'object' ? rule.data : null\n  const discount =\n    data?.discount && typeof data.discount === 'object'\n      ? data.discount\n      : rule.discount && typeof rule.discount === 'object'\n        ? rule.discount\n        : null\n\n  let productVariantIds = Array.isArray(rule.productVariantIds) ? [...rule.productVariantIds] : []\n  if (productVariantIds.length === 0 && Array.isArray(data?.productVariantIds)) {\n    productVariantIds = [...data.productVariantIds]\n  }\n  if (productVariantIds.length === 0 && data?.variantToQuantity && typeof data.variantToQuantity === 'object') {\n    productVariantIds = Object.keys(data.variantToQuantity)\n  }\n\n  const code = skioPickRuleDiscountCode(rule, data)\n  const minQ =\n    rule.minQuantityToDiscount ??\n    data?.minQuantityToDiscount ??\n    data?.minQuantity ??\n    data?.quantityThreshold ??\n    rule.min_quantity_to_discount\n\n  let discountAmount = rule.discountAmount ?? rule.discount_amount ?? rule.discountPercent ?? rule.discount_percent\n  if (data && discountAmount == null) {\n    discountAmount = data.discountAmount ?? data.discount_amount ?? data.discountPercent\n  }\n  if ((discountAmount == null || Number(discountAmount) === 0) && discount) {\n    const t = String(discount.type || '').toLowerCase()\n    if (t === 'percentage' || t === 'percent' || t === 'fixed_amount') {\n      discountAmount = Number(discount.amount ?? discount.value ?? 0)\n    }\n  }\n\n  const minQuantityToDiscount = minQ != null && minQ !== '' ? Number(minQ) : undefined\n\n  const type = rule.type ?? data?.type\n  const name = rule.name ?? data?.name ?? data?.title ?? rule.title\n  const id = rule.id ?? data?.id\n\n  return {\n    ...rule,\n    id,\n    type,\n    name,\n    code,\n    minQuantityToDiscount,\n    productVariantIds,\n    discountAmount: Number(discountAmount) || 0,\n  }\n}\n\n/**\n * Skio Universal Plan Picker\n * @docs https://integrate.skio.com/\n *\n * Uses LitJS (<5kb) https://lit.dev/ for reactive web components\n */\n\nexport class SkioPlanPicker extends LitElement {\n  static properties = {\n    key: { type: String },\n\n    product: { type: Object },\n    productHandle: { type: String },\n    selectedVariant: { type: Object },\n\n    options: { type: Object },\n\n    moneyFormat: { type: String },\n\n    quantity: { type: Number },\n    rules: { type: Array },\n    rule: { type: Object },\n    cart: { type: Object },\n\n    availableSellingPlanGroups: { state: true },\n    selectedSellingPlanGroup: { type: Object },\n    selectedSellingPlan: { type: Object },\n\n    tooltipContent: { type: String },\n    disableUrl: { type: Boolean },\n\n    debug: { type: Boolean },\n  }\n\n  static styles = [\n    css`\n      :host {\n        width: 100%;\n        max-width: 440px;\n      }\n\n      .skio-plan-picker {\n        display: flex;\n        gap: 1rem;\n        padding: 0;\n        border: 0;\n        font-size: 15px;\n        color: black;\n        width: 100%;\n        margin-top: 1rem;\n        margin-bottom: 1rem;\n        font-family: inherit;\n      }\n\n      :host([layout='hidden']) .skio-plan-picker {\n        display: none;\n      }\n\n      :host([layout='vertical']) .skio-plan-picker {\n        flex-direction: column;\n      }\n\n      :host([layout='horizontal']) .skio-plan-picker {\n        flex-direction: row;\n        flex-wrap: wrap;\n      }\n\n      .sr-only {\n        position: absolute;\n        overflow: hidden;\n        clip: rect(0, 0, 0, 0);\n        width: 1px;\n        height: 1px;\n        margin: -1px;\n        padding: 0;\n        border: 0;\n      }\n\n      .group-container {\n        display: block;\n        position: relative;\n        transition: border-color 0.2s ease;\n        border: var(--skio-group-border-width, 1px) solid var(--skio-group-border-color, #ccc);\n        border-radius: var(--skio-group-border-radius, 0);\n        background-color: var(--skio-group-background-color, transparent);\n        color: var(--skio-group-text-color, #000);\n      }\n\n      .group-container--selected {\n        border-color: var(--skio-group-border-selected-color, #333);\n        background-color: var(--skio-group-background-selected-color, transparent);\n        color: var(--skio-group-text-selected-color, #000);\n      }\n\n      .group-container--last {\n        order: 1;\n      }\n\n      :host([layout='horizontal']) .group-container {\n        width: calc(50% - 0.5rem - calc(2 * var(--skio-group-border-width, 1px)));\n      }\n\n      .group-input {\n        position: absolute;\n        opacity: 0;\n        width: 0px;\n        height: 0px;\n      }\n\n      .group-input:focus-visible ~ .group-label {\n        outline: 2px #ccc solid;\n        outline-offset: 4px;\n      }\n\n      .group-label {\n        display: flex;\n        flex-direction: column;\n        padding: 10px;\n        cursor: pointer;\n      }\n\n      .group-topline {\n        display: flex;\n        align-items: center;\n        width: 100%;\n\n        gap: 8px;\n      }\n\n      .group-container--selected .group-topline {\n        font-weight: 700;\n      }\n\n      :host([layout='horizontal']) .group-topline {\n        flex-direction: column;\n        text-align: center;\n      }\n\n      .skio-radio__container {\n        display: flex;\n        color: var(--skio-group-border-color, #333);\n      }\n\n      .group-container--selected .skio-radio__container {\n        color: var(--skio-group-border-selected-color, #333);\n      }\n\n      .skio-radio {\n        transform-origin: center;\n        opacity: 0;\n        transform: scale(0);\n        transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n      }\n\n      .group-label:hover .skio-radio {\n        opacity: 0.75;\n        transform: scale(1);\n      }\n\n      .group-container--selected .group-label .skio-radio {\n        opacity: 1;\n        transform: scale(1);\n      }\n\n      .skio-unit-price {\n        font-size: 13px;\n        font-weight: 500;\n      }\n\n      .skio-price {\n        display: flex;\n        justify-content: flex-end;\n        flex-wrap: wrap;\n        align-items: center;\n        text-align: right;\n        gap: 4px;\n\n        line-height: 1;\n\n        margin-left: auto;\n        vertical-align: middle;\n\n        font-weight: 500;\n      }\n\n      .skio-price s {\n        font-size: 13px;\n\n        font-weight: 400;\n        opacity: 0.75;\n      }\n\n      :host([layout='horizontal']) .skio-price {\n        text-align: center;\n        margin-right: auto;\n      }\n\n      .group-content {\n        display: flex;\n        flex-direction: column;\n        opacity: 1;\n        width: auto;\n        max-height: 1000px;\n        transition: max-height 0.15s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.25s cubic-bezier(0.4, 0, 0.2, 1);\n      }\n\n      .group-content.margin-left {\n        margin-left: 25px;\n      }\n\n      .group-content p {\n        margin: 0.5rem 0 0 0;\n        font-size: 13px;\n        color: #000;\n      }\n\n      :host([layout='horizontal']) .group-content {\n        width: 100%;\n        order: 2;\n      }\n\n      /* Hide frequency if not selected */\n      .group-container:not(.group-container--selected) .group-content {\n        pointer-events: none;\n        opacity: 0;\n        max-height: 0;\n        visibility: hidden;\n      }\n\n      :host([layout='horizontal']) .group-container:not(.group-container--selected) + .group-content {\n        pointer-events: none;\n        opacity: 0;\n        max-height: 0;\n        visibility: hidden;\n      }\n\n      .group-title {\n        width: 100%;\n        max-width: 70%;\n        line-height: 1.5;\n        position: relative;\n      }\n\n      :host([layout='horizontal']) .group-title {\n        max-width: 100%;\n      }\n      \n      .savings {\n        color: var(--skio-discount-text-color, #fff);\n      }\n\n      .savings.bubble {\n        padding: 0px 8px;\n        background-color: var(--skio-discount-color, #0fa573);\n        border: 1px var(--skio-discount-color, #0fa573) solid;\n        border-radius: 4px;\n        font-size: 12px;\n        color: var(--skio-discount-text-color, #fff);\n        white-space: nowrap;\n      }\n\n      .skio-tooltip {\n        position: relative;\n        display: inline-block;\n        cursor: pointer;\n        margin-left: 5px;\n      }\n\n      .skio-tooltip svg {\n        vertical-align: middle;\n      }\n\n      .skio-tooltip-text {\n        visibility: hidden;\n        opacity: 0;\n        position: absolute;\n        top: 100%;\n        left: 50%;\n        transform: translateX(-50%);\n        background-color: var(--skio-tooltip-background-color, #333);\n        color: var(--skio-tooltip-text-color, #fff);\n        padding: 5px 10px;\n        border-radius: 5px;\n        font-size: 12px;\n        white-space: normal;\n        width: 200px;\n        z-index: 1000;\n        transition: opacity 0.3s ease;\n      }\n\n      .skio-tooltip:hover .skio-tooltip-text,\n      .skio-tooltip:focus-within .skio-tooltip-text {\n        visibility: visible;\n        opacity: 1;\n      }\n\n      .selling-plan-dropdown {\n        appearance: none;\n        -webkit-appearance: none;\n        -moz-appearance: none;\n        display: flex;\n        align-items: center;\n        gap: 5px;\n        width: 100%;\n        margin-top: 5px;\n        padding: 8px 30px 8px 10px;\n        background-color: var(--skio-group-background-color, #f7f7f7);\n        background-image: url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' class='h-6 w-6' fill='none' viewBox='0 0 24 24' stroke='currentColor' stroke-width='2'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' d='M19 9l-7 7-7-7' /%3E%3C/svg%3E\");\n        background-repeat: no-repeat;\n        background-position: right 10px top 50%;\n        background-size: 16px;\n        border: 1px solid var(--skio-group-border-color, #ccc);\n        border-radius: 2px;\n        font-size: 14px;\n        color: var(--skio-group-text-selected-color, #000);\n        text-overflow: ellipsis;\n        white-space: nowrap;\n        outline:none !important;\n        font-family: inherit;\n      }\n\n      .selling-plan-dropdown-label {\n        color: #666666;\n        font-weight: 500;\n      }\n\n      .selling-plan-dropdown--one {\n        background-image: none;\n        pointer-events: none;\n        background: transparent;\n      }\n\n      .selling-plan-buttons {\n        display: grid;\n        grid-template-columns: repeat(auto-fill, minmax(var(--skio-button-plan-selector-width, 20px), 1fr));\n        gap: 10px;\n        padding: 0.75rem 0;\n        border: 0;\n        font-size: 13px;\n      }\n\n      .selling-plan-buttons input[type='radio'] {\n        position: absolute;\n        opacity: 0;\n        width: 0;\n        height: 0;\n      }\n\n      .selling-plan-buttons label {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        cursor: pointer;\n        border: 1px solid #ccc;\n        text-align: center;\n        padding: 1rem 0.5rem;\n      }\n\n      .selling-plan-buttons input[type='radio']:checked + label {\n        border-color: #000;\n      }\n\n      .selling-plan-buttons input:focus-visible + label {\n        outline: 2px #ccc solid;\n        outline-offset: 4px;\n      }\n\n      .group-content-additional {\n        margin-top: 5px;\n      }\n\n      .group-content-additional ul {\n        margin: 0;\n        padding: 0;\n        padding-left: 20px;\n      }\n\n      .skio-details {\n        --text-color: #333;\n        --text-color-secondary: #888;\n\n        user-select: none;\n        -webkit-user-select: none;\n        margin-bottom: 20px;\n        order: 3;\n        max-width: max-content;\n      }\n\n      .skio-details summary::-webkit-details-marker,\n      .skio-details summary::marker,\n      .skio-details slot {\n        color: rgba(0, 0, 0, 0) !important;\n      }\n\n      .skio-details summary {\n        margin-top: 15px;\n      }\n\n      .skio-details summary span {\n        font-size: 0.9em;\n        display: flex;\n        padding: 0.5em 0;\n        cursor: pointer;\n        align-items: center;\n        gap: 10px;\n        text-decoration: underline;\n\n        margin-top: -40px;\n        color: #000;\n      }\n\n      @keyframes fadeInDown {\n        0% {\n          opacity: 0;\n          transform: translateY(-15px);\n        }\n        100% {\n          opacity: 1;\n          transform: translateY(0px);\n        }\n      }\n      .skio-details[open] > .skio-details--content {\n        animation-name: fadeInDown;\n        animation-duration: 0.3s;\n      }\n\n      .skio-details--content {\n        position: absolute;\n        z-index: 1020;\n        padding: 1em;\n        width: fit-content;\n        border-radius: 5px;\n        background: white;\n        box-shadow: 0 0 5px rgb(23 24 24 / 5%), 0 1px 2px rgb(0 0 0 / 7%);\n      }\n\n      .skio-details ul {\n        margin: 0;\n        padding: 0;\n      }\n\n      .skio-details ul li {\n        display: flex;\n        align-items: flex-start;\n        gap: 0.75em;\n\n        margin-bottom: 1em;\n      }\n\n      .skio-details .skio-content {\n        display: flex;\n        flex-direction: column;\n      }\n\n      .skio-details .skio-content p {\n        font-size: 0.9em;\n\n        margin-top: 0;\n        margin-bottom: 0;\n\n        letter-spacing: 0;\n        line-height: 1.5;\n\n        color: var(--text-color);\n      }\n\n      .skio-details ul li small {\n        font-size: 0.7em;\n        color: var(--text-color-secondary);\n      }\n\n      .skio-details .skio-icon {\n        display: flex;\n\n        width: 2.25em;\n        height: 2.25em;\n\n        color: var(--text-color);\n        background: #f8f8f8;\n        border-radius: 100%;\n\n        flex-shrink: 0;\n        align-items: center;\n        justify-content: center;\n      }\n\n      .skio-details .skio-icon svg {\n        width: 1.25em;\n        height: 1.25em;\n\n        color: inherit;\n      }\n\n      .skio-details--footer {\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n        font-size: 0.9em;\n      }\n\n      .skio-details--footer a {\n        color: var(--text-color);\n      }\n\n      .skio-manage-link {\n        text-decoration: underline;\n      }\n\n      .powered-by-skio {\n        font-size: 0.8em;\n\n        display: flex;\n        text-decoration: none;\n\n        align-items: center;\n        gap: 3px;\n      }\n\n      .setupMode {\n        position: relative;\n        color: black;\n        padding: 1rem;\n        display: flex;\n        flex-direction: column;\n        gap: 10px;\n        margin-bottom: 1rem;\n        font-size: 14px;\n        border-style: solid;\n        border-width: 4px;\n        border-image: repeating-linear-gradient(-55deg, #000, #000 20px, #ffb101 20px, #ffb101 40px) 10;\n      }\n\n      .setupMode:after {\n        content: 'Setup Mode';\n        position: absolute;\n        top: 0;\n        right: 0;\n        background-color: black;\n        color: white;\n        padding: 0.25rem 1rem;\n        font-size: 13px;\n      }\n\n      .setupMode .detection {\n        display: grid;\n        grid-template-columns: auto 1fr;\n        gap: 10px;\n      }\n\n      .setupMode .detection small {\n        grid-column: 1/-1;\n      }\n    `,\n  ]\n\n  constructor() {\n    super()\n\n    // Start - Debug Variables\n    this.debug = this.debug || window?.Shopify?.designMode\n    this.variantChanged = false\n    // End - Debug Variables\n\n    this.rules = []\n    this.rule = null\n    this.quantity = 1\n    this.showDetailsHover = false\n    this.hasDelayedExternalCartButtonTextSync = false\n  }\n\n  willUpdate(changed) {\n    if (changed.has('options') && typeof this.options === 'string') {\n      try {\n        this.options = JSON.parse(this.options)\n      } catch (e) {\n        this.error('Invalid skio-plan-picker options JSON', e)\n      }\n    }\n  }\n\n  async connectedCallback() {\n    super.connectedCallback()\n\n    if (this.rulesDebugEnabled()) {\n      console.log('%c[Skio rules]%c <skio-plan-picker> connected', 'color:#b35900;font-weight:bold', 'color:inherit', {\n        key: this.key,\n        href: typeof window !== 'undefined' ? window.location.href : '',\n      })\n    }\n\n    this.log('Mounted')\n\n    if (this.productHandle) {\n      this.loading = true\n      this.fetchProduct(this.productHandle)\n    }\n\n    this.bindFormEvents()\n    this.bindCartEvents()\n\n    this.rules = await this.fetchRules()\n    this.getRule()\n    // Rules load after first paint; ensure badge/price re-render with `this.rule`.\n    this.requestUpdate()\n  }\n\n  // SECTION: Element Templates\n  radioTemplate() {\n    return html`\n      <div class=\"skio-radio__container\">\n        <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n          <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"currentColor\" stroke-width=\"1\"></circle>\n          <circle class=\"skio-radio\" cx=\"12\" cy=\"12\" r=\"7\" fill=\"currentColor\"></circle>\n        </svg>\n      </div>\n    `\n  }\n\n  sellingPlanDropdown(group) {\n    return html`\n      <select\n        class=\"selling-plan-dropdown ${this.getAvailableSellingPlans(group).length == 1 ? 'selling-plan-dropdown--one' : ''}\"\n        @change=${e => {\n          this.selectSellingPlan(e.target.value)\n        }}\n      >\n        ${group\n          ? this.getAvailableSellingPlans(group).map(\n              selling_plan => html` <option ?selected=${group.selected_selling_plan.id === selling_plan.id} value=${selling_plan.id}>${selling_plan.name}</option> `\n            )\n          : ''}\n      </select>\n    `\n  }\n\n  sellingPlanButtons(group) {\n    return html`\n      <fieldset class=\"selling-plan-buttons\">\n        <legend class=\"sr-only\">Select subscription interval</legend>\n        ${group\n          ? this.getAvailableSellingPlans(group).map(\n              selling_plan => html`\n                <input\n                  type=\"radio\"\n                  name=\"selling_plan_button\"\n                  value=\"${selling_plan.id}\"\n                  id=\"selling_plan_button-${selling_plan.id}\"\n                  @change=\"${e => this.selectSellingPlan(selling_plan.id)}\"\n                  ?checked=${group.selected_selling_plan === selling_plan}\n                />\n\n                <label for=\"selling_plan_button-${selling_plan.id}\"> ${selling_plan.name} </label>\n              `\n            )\n          : ''}\n      </fieldset>\n    `\n  }\n\n  invalidIcon() {\n    return html`\n      <svg width=\"24\" height=\"24\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"#D22B2B\" class=\"w-6 h-6\">\n        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9.75 9.75l4.5 4.5m0-4.5l-4.5 4.5M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n      </svg>\n    `\n  }\n\n  validIcon() {\n    return html`\n      <svg width=\"24\" height=\"24\" xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke-width=\"1.5\" stroke=\"#0BDA51\" class=\"w-6 h-6\">\n        <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 12.75L11.25 15 15 9.75M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n      </svg>\n    `\n  }\n\n  setupMode() {\n    return html`\n      <div class=\"setupMode\">\n        Skio Plan Picker\n        <small>This will not appear on the live site.</small>\n\n        <small>Key: ${this.key}</small>\n\n        <div class=\"detection\">${this.product ? this.validIcon() : this.invalidIcon()} Product</div>\n\n        <div class=\"detection\">${this.selectedVariant ? this.validIcon() : this.invalidIcon()} Selected Variant</div>\n\n        <div class=\"detection\">${this.form ? this.validIcon() : this.invalidIcon()} Form</div>\n\n        <div class=\"detection\">${this.variantInput ? this.validIcon() : this.invalidIcon()} Variant Input</div>\n\n        <div class=\"detection\">\n          ${this.variantChanged ? this.validIcon() : this.invalidIcon()} Variant Change Detection\n          <small>Please attempt to change the selected variant.</small>\n        </div>\n\n        <small>If any of these don't pass please troubleshoot using our <a target=\"_blank\" rel=\"noreferrer\" href=\"https://integrate.skio.com/troubleshooting\">troubleshooting guide</a>.</small>\n      </div>\n    `\n  }\n\n  groupContent(group) {\n    return html`\n      <div class=\"group-content ${this.options?.layout == 'horizontal' ? '' : this.options?.show_radio_selector && this.options?.dropdownPosition == 'inside' ? 'margin-left' : ''}\">\n        <span class=\"selling-plan-dropdown-label\">${this.additionalFrequencyLabel()}</span>\n        ${this.options?.selector_type == 'dropdown' ? this.sellingPlanDropdown(group) : ''}\n\n        <!-- TODO: Make the label have the border instead of the group -->\n        ${this.options?.selector_type == 'button' ? this.sellingPlanButtons(group) : ''} ${this.additionalContentText()}\n      </div>\n    `\n  }\n\n  showDetails() {\n    return html`\n      <details class=\"skio-details\" @mouseover=${e => this.detailsMouseover()} @mouseleave=${e => this.detailsMouseleave()}>\n        <summary>\n          <span>\n            <svg\n              xmlns=\"http://www.w3.org/2000/svg\"\n              width=\"18\"\n              height=\"18\"\n              viewBox=\"0 0 24 24\"\n              fill=\"none\"\n              stroke=\"currentColor\"\n              stroke-width=\"2\"\n              stroke-linecap=\"round\"\n              stroke-linejoin=\"round\"\n              class=\"ai ai-ArrowRepeat\"\n            >\n              <path d=\"M18 2l3 3-3 3\" />\n              <path d=\"M6 22l-3-3 3-3\" />\n              <path d=\"M21 5H10a7 7 0 0 0-7 7\" />\n              <path d=\"M3 19h11a7 7 0 0 0 7-7\" />\n            </svg>\n\n            How do subscriptions work?\n          </span>\n        </summary>\n        <div class=\"skio-details--content\">\n          <ul>\n            <li>\n              <div class=\"skio-icon\">\n                <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"h-6 w-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\">\n                  <path\n                    stroke-linecap=\"round\"\n                    stroke-linejoin=\"round\"\n                    d=\"M17 9V7a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2m2 4h10a2 2 0 002-2v-6a2 2 0 00-2-2H9a2 2 0 00-2 2v6a2 2 0 002 2zm7-5a2 2 0 11-4 0 2 2 0 014 0z\"\n                  />\n                </svg>\n              </div>\n              <div class=\"skio-content\">\n                <p>Get exclusive deals</p>\n                <small>Subscribe for unique discounts</small>\n              </div>\n            </li>\n            <li>\n              <div class=\"skio-icon\">\n                <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n                  <path d=\"M13.586 3.586a2 2 0 112.828 2.828l-.793.793-2.828-2.828.793-.793zM11.379 5.793L3 14.172V17h2.828l8.38-8.379-2.83-2.828z\" />\n                </svg>\n              </div>\n              <div class=\"skio-content\">\n                <p>Edit your subscription anytime</p>\n                <small>Edit products, delivery schedule and more</small>\n              </div>\n            </li>\n            <li>\n              <div class=\"skio-icon\">\n                <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 20 20\" fill=\"currentColor\">\n                  <path\n                    fill-rule=\"evenodd\"\n                    d=\"M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z\"\n                    clip-rule=\"evenodd\"\n                  />\n                </svg>\n              </div>\n\n              <div class=\"skio-content\">\n                <p>No commitment</p>\n                <small>Easy to cancel if it's not for you</small>\n              </div>\n            </li>\n          </ul>\n          <div class=\"skio-details--footer\">\n            <a class=\"skio-manage-link\" href=\"/a/account/login\">Manage subscriptions</a>\n\n            <a style=\"letter-spacing: 0\" class=\"powered-by-skio\" href=\"https://skio.com/?utm_source=eonsincshop.myshopify.com&utm_medium=details_popover\" target=\"_blank\" rel=\"noopener\">\n              Powered by\n              <svg width=\"24\" height=\"11\" viewBox=\"0 0 24 11\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n                <path\n                  d=\"M4.28399 5.78801C4.12399 5.63601 3.93599 5.50801 3.71999 5.40401C3.50399 5.30001 3.27599 5.24801 3.03599 5.24801C2.85199 5.24801 2.67999 5.28401 2.51999 5.35601C2.36799 5.42801 2.29199 5.55201 2.29199 5.72801C2.29199 5.89601 2.37599 6.01601 2.54399 6.08801C2.71999 6.16001 2.99999 6.24001 3.38399 6.32801C3.60799 6.37601 3.83199 6.44401 4.05599 6.53201C4.28799 6.62001 4.49599 6.73601 4.67999 6.88001C4.86399 7.02401 5.01199 7.20001 5.12399 7.40801C5.23599 7.61601 5.29199 7.86401 5.29199 8.15201C5.29199 8.52801 5.21599 8.84801 5.06399 9.11201C4.91199 9.36801 4.71199 9.57601 4.46399 9.73601C4.22399 9.89601 3.95199 10.012 3.64799 10.084C3.34399 10.156 3.03999 10.192 2.73599 10.192C2.24799 10.192 1.76799 10.116 1.29599 9.96401C0.831989 9.80401 0.443989 9.57201 0.131989 9.26801L1.23599 8.10401C1.41199 8.29601 1.62799 8.45601 1.88399 8.58401C2.13999 8.71201 2.41199 8.77601 2.69999 8.77601C2.85999 8.77601 3.01599 8.74001 3.16799 8.66801C3.32799 8.58801 3.40799 8.45201 3.40799 8.26001C3.40799 8.07601 3.31199 7.94001 3.11999 7.85201C2.92799 7.76401 2.62799 7.67201 2.21999 7.57601C2.01199 7.52801 1.80399 7.46401 1.59599 7.38401C1.38799 7.30401 1.19999 7.19601 1.03199 7.06001C0.871989 6.92401 0.739989 6.75601 0.635989 6.55601C0.531989 6.35601 0.479989 6.11601 0.479989 5.83601C0.479989 5.47601 0.555989 5.17201 0.707989 4.92401C0.859989 4.66801 1.05599 4.46001 1.29599 4.30001C1.53599 4.14001 1.79999 4.02401 2.08799 3.95201C2.38399 3.87201 2.67599 3.83201 2.96399 3.83201C3.41199 3.83201 3.84799 3.90401 4.27199 4.04801C4.70399 4.18401 5.06799 4.39201 5.36399 4.67201L4.28399 5.78801Z\"\n                  fill=\"black\"\n                />\n                <path d=\"M12.8481 10H10.4121L8.45615 7.13201H8.42015V10H6.44015V0.928009H8.42015V6.44801H8.45615L10.3641 4.02401H12.7521L10.4481 6.72401L12.8481 10Z\" fill=\"black\" />\n                <path\n                  d=\"M15.7009 2.11601C15.7009 2.26801 15.6689 2.41201 15.6049 2.54801C15.5489 2.67601 15.4689 2.78801 15.3649 2.88401C15.2689 2.98001 15.1489 3.05601 15.0049 3.11201C14.8689 3.16801 14.7249 3.19601 14.5729 3.19601C14.2529 3.19601 13.9849 3.09201 13.7689 2.88401C13.5529 2.66801 13.4449 2.41201 13.4449 2.11601C13.4449 1.97201 13.4729 1.83601 13.5289 1.70801C13.5849 1.57201 13.6649 1.45601 13.7689 1.36001C13.8729 1.26401 13.9929 1.18801 14.1289 1.13201C14.2649 1.06801 14.4129 1.03601 14.5729 1.03601C14.7249 1.03601 14.8689 1.06401 15.0049 1.12001C15.1489 1.17601 15.2689 1.25201 15.3649 1.34801C15.4689 1.44401 15.5489 1.56001 15.6049 1.69601C15.6689 1.82401 15.7009 1.96401 15.7009 2.11601ZM13.5889 10V4.02401H15.5569V10H13.5889Z\"\n                  fill=\"black\"\n                />\n                <path\n                  d=\"M23.4516 6.98801C23.4516 7.47601 23.3636 7.92001 23.1876 8.32001C23.0116 8.71201 22.7716 9.04801 22.4676 9.32801C22.1636 9.60001 21.8116 9.81201 21.4116 9.96401C21.0116 10.116 20.5836 10.192 20.1276 10.192C19.6796 10.192 19.2516 10.116 18.8436 9.96401C18.4436 9.81201 18.0916 9.60001 17.7876 9.32801C17.4916 9.04801 17.2556 8.71201 17.0796 8.32001C16.9036 7.92001 16.8156 7.47601 16.8156 6.98801C16.8156 6.50001 16.9036 6.06001 17.0796 5.66801C17.2556 5.27601 17.4916 4.94401 17.7876 4.67201C18.0916 4.40001 18.4436 4.19201 18.8436 4.04801C19.2516 3.90401 19.6796 3.83201 20.1276 3.83201C20.5836 3.83201 21.0116 3.90401 21.4116 4.04801C21.8116 4.19201 22.1636 4.40001 22.4676 4.67201C22.7716 4.94401 23.0116 5.27601 23.1876 5.66801C23.3636 6.06001 23.4516 6.50001 23.4516 6.98801ZM21.5556 6.98801C21.5556 6.79601 21.5236 6.60801 21.4596 6.42401C21.3956 6.24001 21.3036 6.08001 21.1836 5.94401C21.0636 5.80001 20.9156 5.68401 20.7396 5.59601C20.5636 5.50801 20.3596 5.46401 20.1276 5.46401C19.8956 5.46401 19.6916 5.50801 19.5156 5.59601C19.3396 5.68401 19.1916 5.80001 19.0716 5.94401C18.9596 6.08001 18.8716 6.24001 18.8076 6.42401C18.7516 6.60801 18.7236 6.79601 18.7236 6.98801C18.7236 7.18001 18.7516 7.36801 18.8076 7.55201C18.8716 7.73601 18.9636 7.90401 19.0836 8.05601C19.2036 8.20001 19.3516 8.31601 19.5276 8.40401C19.7036 8.49201 19.9076 8.53601 20.1396 8.53601C20.3716 8.53601 20.5756 8.49201 20.7516 8.40401C20.9276 8.31601 21.0756 8.20001 21.1956 8.05601C21.3156 7.90401 21.4036 7.73601 21.4596 7.55201C21.5236 7.36801 21.5556 7.18001 21.5556 6.98801Z\"\n                  fill=\"black\"\n                />\n              </svg>\n            </a>\n          </div>\n        </div>\n      </details>\n    `\n  }\n\n  // !SECTION: Element Templates\n\n  render() {\n    if (!this.viable() || this.options?.layout === 'hidden') {\n      return this.debug ? this.setupMode() : ''\n    }\n\n    if (this.selectedVariant.selling_plan_allocations.length === 0 && !this.options?.show_without_subscription) {\n      return this.debug ? this.setupMode() : ''\n    }\n\n    if (this.availableSellingPlanGroups?.length == 0 && !this.options?.show_without_subscription) return\n\n    return html`\n      ${this.debug ? this.setupMode() : null}\n\n      <fieldset class=\"skio-plan-picker\" role=\"radiogroup\" aria-labelledby=\"skio-plan-picker-legend\">\n        <legend id=\"skio-plan-picker-legend\" class=\"${!this.options?.show_legend ? 'sr-only' : ''}\">${unsafeHTML(this.options?.legend_content)}</legend>\n\n        ${!this.product.requires_selling_plan\n          ? html`\n              <div\n                class=\"group-container ${this.selectedSellingPlanGroup == null ? 'group-container--selected' : ''} ${!this.options?.onetime_first ? 'group-container--last' : ''}\"\n                @click=${() => this.selectSellingPlanGroup(null)}\n              >\n                <input\n                  id=\"one-time-${this.key}\"\n                  class=\"group-input\"\n                  name=\"skio-group-${this.key}\"\n                  type=\"radio\"\n                  value=\"One time purchase\"\n                  ?checked=${!this.selectedSellingPlanGroup}\n                  @change=${() => this.selectSellingPlanGroup(null)}\n                />\n\n                <label class=\"group-label\" for=\"one-time-${this.key}\">\n                  <div class=\"group-topline\">\n                    ${this.options?.layout == 'horizontal' ? '' : this.options?.show_radio_selector ? this.radioTemplate() : ''}\n\n                    <div class=\"group-title\">${this.options?.onetime_title ? this.options?.onetime_title : 'One time purchase'}</div>\n\n                    <div class=\"skio-price\" aria-live=\"polite\">\n                      ${this.options?.show_compare_price && this.selectedVariant?.compare_at_price > this.selectedVariant.price\n                        ? html`<s aria-hidden=\"true\">${this.money(this.selectedVariant.compare_at_price)}</s>`\n                        : ''}\n                      ${this.money(this.selectedVariant.price)}\n                      <div class=\"skio-unit-price\">\n                        ${this.money(this.selectedVariant.price / this.unitPriceDivisor(null))} / packet\n                    </div>\n                  </div>\n                </label>\n              </div>\n            `\n          : ''}\n        ${this.availableSellingPlanGroups?.length\n          ? this.availableSellingPlanGroups.map(\n              (group, index) => html`\n                <div class=\"group-container ${this.selectedSellingPlanGroup == group ? 'group-container--selected' : ''}\">\n                  <input\n                    id=\"group-${index}-${this.key}\"\n                    class=\"group-input\"\n                    name=\"skio-group-${this.key}\"\n                    type=\"radio\"\n                    value=\"${group.id}\"\n                    @change=${() => this.selectSellingPlanGroup(group)}\n                    ?checked=${this.selectedSellingPlanGroup == group}\n                  />\n\n                  <label class=\"group-label\" for=\"group-${index}-${this.key}\">\n                    <div class=\"group-topline\">\n                      ${this.options?.layout == 'horizontal' ? '' : this.options?.show_radio_selector ? this.radioTemplate() : ''}\n\n                      <div class=\"group-title\">\n                        ${group.name !== 'Prepaid' && this.options?.subscription_title\n                          ? this.options?.subscription_title\n                          : group.name == 'Prepaid' && this.options?.prepaid_title\n                          ? this.options?.prepaid_title\n                          : group.name}\n                        ${this.discountText(group.selected_selling_plan)\n                          ? html` <span class=\"savings ${this.options?.discount_style}\"> ${this.discountText(group.selected_selling_plan)} </span> `\n                          : html``}\n                        ${this.tooltipContent ? html`<span class=\"skio-tooltip\" tabindex=\"0\" aria-describedby=\"skio-tooltip-${this.key}-${index}\">\n                          <svg width=\"16\" height=\"16\" fill=\"currentColor\" viewBox=\"0 0 16 16\"><path d=\"M8 1a7 7 0 1 0 0 14A7 7 0 0 0 8 1zM7 4h2v2H7V4zm0 3h2v5H7V7z\"/></svg>\n                          <span id=\"skio-tooltip-${this.key}-${index}\" class=\"skio-tooltip-text\" role=\"tooltip\">${this.tooltipContent}</span>\n                        </span>` : ''}\n                      </div>\n\n                      <div class=\"skio-price\" aria-live=\"polite\">\n                        ${this.options?.show_compare_price &&\n                        (this.selectedVariant?.compare_at_price > this.selectedVariant.price || this.selectedVariant.price > this.price(group.selected_selling_plan, false))\n                          ? html`<s aria-hidden=\"true\">${this.money(this.selectedVariant.compare_at_price ? this.selectedVariant.compare_at_price : this.selectedVariant.price)}</s>`\n                          : ''}\n                        ${this.price(group.selected_selling_plan)}\n                        <div class=\"skio-unit-price\">\n                          ${this.money(this.price(group.selected_selling_plan, false) / this.unitPriceDivisor(group.selected_selling_plan))} / packet\n                        </div>\n                      </div>\n                    </div>\n\n                    ${this.options?.layout == 'vertical' && this.options?.dropdownPosition == 'inside' ? this.groupContent(group) : ''}\n                  </label>\n                </div>\n                ${this.selectedSellingPlanGroup == group ? (this.options?.layout == 'horizontal' || this.options?.dropdownPosition == 'underneath' ? this.groupContent(group) : '') : ''}\n              `\n            )\n          : ''}\n        ${this.options?.show_details == true ? this.showDetails() : ''}\n      </fieldset>\n    `\n  }\n\n  async fetchRules() {\n    const dbg = this.rulesDebugEnabled()\n    if (dbg) this.logRulesDebug('Fetching rules from API (no sessionStorage cache)')\n\n    const domain = window?.Shopify?.shop\n    if (dbg) this.logRulesDebug('GET get-rules-by-domain-or-hostname', { domain })\n\n    const response = await fetch(`https://api.skio.com/storefront-http/get-rules-by-domain-or-hostname?domain=${domain}`).then(r =>\n      r.json()\n    )\n\n    if (dbg) {\n      this.logRulesDebug('API JSON shape', {\n        responseKeys: response && typeof response === 'object' ? Object.keys(response) : typeof response,\n        rawRulesLength: Array.isArray(response?.rules) ? response.rules.length : null,\n        firstRuleTopKeys: response?.rules?.[0] ? Object.keys(response.rules[0]) : null,\n      })\n      if (response?.rules?.[0]) {\n        this.logRulesDebug('sample response.rules[0] (raw)', response.rules[0])\n      }\n    }\n\n    const list = Array.isArray(response.rules) ? response.rules : []\n    const afterSurprise = list.filter(rule => rule?.type !== 'surpriseDelight')\n    const normalized = afterSurprise.map(normalizeSkioStorefrontRule)\n\n    if (dbg) {\n      afterSurprise.forEach((raw, i) => {\n        const n = normalized[i]\n        const problems = []\n        if (!n?.productVariantIds?.length) problems.push('no productVariantIds after normalize')\n        if (n?.minQuantityToDiscount == null || !Number.isFinite(Number(n.minQuantityToDiscount))) {\n          problems.push(`minQuantityToDiscount not usable: ${n?.minQuantityToDiscount}`)\n        }\n        if (problems.length) {\n          this.logRulesDebug(`rule[${i}] dropped by picker filter`, { problems, rawType: raw?.type, rawName: raw?.name, normalizedSnapshot: n })\n        }\n      })\n    }\n\n    const rules = normalized\n      .filter(\n        rule =>\n          rule.productVariantIds?.length &&\n          rule.minQuantityToDiscount != null &&\n          Number.isFinite(Number(rule.minQuantityToDiscount))\n      )\n      .sort((a, b) => Number(a.minQuantityToDiscount) - Number(b.minQuantityToDiscount))\n\n    if (dbg) {\n      this.logRulesDebug('rules kept (used by getRule)', {\n        count: rules.length,\n        summary: rules.map((r, i) => ({\n          i,\n          type: r.type,\n          name: r.name,\n          code: r.code || '(none \u2014 getRule will ignore)',\n          minQ: r.minQuantityToDiscount,\n          discountPercent: r.discountAmount,\n          variantIdCount: r.productVariantIds?.length,\n        })),\n      })\n    }\n\n    return rules\n  }\n\n  eligibleItemCount(rule) {\n    if (!this.selectedVariant?.id || !rule?.productVariantIds?.length) return 0\n\n    const vid = String(this.selectedVariant.id)\n    const gidMatchesPdpVariant = gid => gid != null && String(gid).includes(vid)\n\n    const eligibleQuantity = rule.productVariantIds.some(gidMatchesPdpVariant) ? this.quantity : 0\n\n    if (!this.cart?.items) return eligibleQuantity\n\n    // Match Skio\u2019s checkout volume script: count matching variant lines (not only subscription lines).\n    const cartItems = this.cart.items.reduce((aggregate, item) => {\n      const itemId = String(item.id)\n      const matches = rule.productVariantIds.some(gid => gid != null && String(gid).includes(itemId) && String(gid).includes(vid))\n      return matches ? aggregate + item.quantity : aggregate\n    }, 0)\n\n    return cartItems + eligibleQuantity\n  }\n\n  getRule() {\n    const dbg = this.rulesDebugEnabled()\n    if (dbg) {\n      this.logRulesDebug('getRule() context', {\n        rulesInMemory: this.rules?.length ?? 0,\n        selectedVariantId: this.selectedVariant?.id,\n        quantity: this.quantity,\n        cartLineCount: this.cart?.items?.length ?? 0,\n        shop: window?.Shopify?.shop,\n      })\n    }\n\n    let largestMinQuantity = {\n      value: -1,\n      index: -1,\n    }\n\n    this.rules.forEach((rule, index) => {\n      if (dbg) {\n        const ec = this.eligibleItemCount(rule)\n        const pct = this.getRuleDiscountPercent(rule)\n        this.logRulesDebug(`getRule() rule[${index}]`, {\n          type: rule.type,\n          name: rule.name,\n          code: rule.code ? String(rule.code) : null,\n          hasCode: !!rule.code,\n          minQuantityToDiscount: rule.minQuantityToDiscount,\n          eligibleItemCount: ec,\n          meetsMinQty: rule.minQuantityToDiscount <= ec,\n          discountPercentResolved: pct,\n          variantGidSample: rule.productVariantIds?.slice(0, 3),\n        })\n        const canParticipate =\n          !!(rule.code && String(rule.code).trim()) || this.getRuleDiscountPercent(rule) > 0\n        if (!canParticipate) {\n          this.logRulesDebug(`rule[${index}] cannot win \u2014 need rule.code or a resolved discount %`, {\n            name: rule.name,\n            id: rule.id,\n          })\n        }\n      }\n\n      const ruleEligible =\n        (!!(rule.code && String(rule.code).trim()) || this.getRuleDiscountPercent(rule) > 0) &&\n        largestMinQuantity.value < rule.minQuantityToDiscount\n      if (ruleEligible) {\n        if (rule.minQuantityToDiscount <= this.eligibleItemCount(rule)) {\n          largestMinQuantity.value = rule.minQuantityToDiscount\n          largestMinQuantity.index = index\n        }\n      }\n    })\n\n    this.rule = largestMinQuantity.index > -1 ? this.rules[largestMinQuantity.index] : null\n\n    if (dbg) {\n      if (this.rule) {\n        this.logRulesDebug('getRule() WINNER', {\n          code: this.rule.code,\n          minQuantityToDiscount: this.rule.minQuantityToDiscount,\n          discountPercent: this.getRuleDiscountPercent(),\n          eligibleItemCount: this.eligibleItemCount(this.rule),\n        })\n      } else {\n        this.logRulesDebug('getRule() NO active rule', {\n          hint: 'Check logs above: missing code, min qty not met, or variant GIDs do not match selectedVariant.id',\n        })\n      }\n    }\n  }\n\n  bindCartEvents() {\n    document.addEventListener('CartUpdated', event => {\n      this.cart = event.detail\n    })\n  }\n\n  bindFormEvents() {\n    // First try to find form by specified form_id\n    this.form = document.querySelector(`#${this.options?.form_id}`)\n    \n    // If no form found by ID, search through parents and page\n    if (!this.form) {\n      this.form = this.findProductForm()\n    }\n\n    if (!this.form) {\n      this.error('No valid product form found')\n      return\n    }\n\n    // Add debug styling if debug mode is enabled\n    if (this.debug) {\n      this.form.style.borderStyle = 'solid'\n      this.form.style.borderWidth = '4px'\n      this.form.style.borderImage = 'repeating-linear-gradient(-55deg,#000,#000 20px,#ffb101 20px,#ffb101 40px)10'\n    }\n\n    // Ensure form has an ID\n    if (!this.form.getAttribute('id')) {\n      this.form.setAttribute('id', `skio-form-${this.product.id}`)\n    }\n\n    // Set form attribute on selling plan input\n    const sellingPlanInput = this.querySelector('input[name=\"selling_plan\"]')\n    if (sellingPlanInput) {\n      sellingPlanInput.setAttribute('form', this.form.getAttribute('id'))\n    }\n\n    this.variantInput = this.form.querySelector('[name=\"id\"]')\n    if (!this.variantInput) this.variantInput = document.querySelector(`[name=\"id\"][form=\"${this.options?.form_id}\"]`)\n\n    if (this.variantInput) {\n      this.variantInput.addEventListener('change', e => {\n        this.selectedVariant = this.product.variants.find(variant => variant.id == e.target.value)\n        this.variantChanged = true\n      })\n      // this.form.addEventListener('change', e => {\n      //   this.selectedVariant = this.product.variants.find(variant => variant.id == this.variantInput.value)\n      //   this.variantChanged = true\n      // })\n    }\n\n    const quantityInput = document.querySelector(`[name=\"quantity\"]`);\n\n    if (quantityInput) {\n      this.quantity = Number(quantityInput.value)\n      quantityInput.addEventListener('input', () => {\n        this.quantity = Number(quantityInput.value)\n      })\n    }\n\n    let skio = this\n    // Example variantChanged event dispatch:\n    // document.dispatchEvent( new CustomEvent(\"variantChanged\", { detail: { variantId: variant.id } }) );\n    document.addEventListener('variantChanged', function (e) {\n      let variantId = e.detail.variantId\n      let variant = skio.product.variants.find(x => x.id == variantId)\n      if (variant) skio.selectedVariant = variant\n      else skio.log('Unable to find variant with id: ', variantId)\n      this.variantChanged = true\n      skio.requestUpdate()\n    })\n  }\n\n  findProductForm() {\n    // First try finding form through parent elements\n    const formFromParent = this.findFormThroughParents()\n    if (formFromParent) return formFromParent\n\n    // If no form found through parents, look for any valid product forms on page\n    const allProductForms = this.getAllProductForms()\n    return allProductForms[0] || null\n  }\n\n  findFormThroughParents() {\n    let currentElement = this\n    let depth = 0\n    const maxDepth = 5\n\n    while (currentElement.parentElement && depth < maxDepth) {\n      const forms = Array.from(currentElement.querySelectorAll('form'))\n      const validForm = forms.find(form => this.isValidProductForm(form))\n      \n      if (validForm) return validForm\n\n      currentElement = currentElement.parentElement\n      depth++\n    }\n\n    return null\n  }\n\n  getAllProductForms() {\n    return Array.from(document.forms).filter(form => {\n      const hasVariantId = this.getVariantId(form)\n      return this.isValidProductForm(form) && hasVariantId\n    })\n  }\n\n  isValidProductForm(form) {\n    const hasCartAction = form.getAttribute('action')?.includes('/cart/add')\n    const hasSubmitButton = !!form.querySelector('button, [type=\"submit\"]')\n    return hasCartAction && hasSubmitButton\n  }\n\n  getVariantId(form) {\n    // Try getting ID from FormData first\n    const formData = new FormData(form)\n    const idFromFormData = formData.get('id')\n    if (idFromFormData) return Number(idFromFormData)\n\n    // Fallback to finding input element\n    const idInput = form.querySelector('[name=\"id\"]')\n    return idInput ? Number(idInput.value) : null\n  }\n\n  detailsMouseover() {\n    let details = this.renderRoot.querySelector('.skio-details')\n    let summary = this.renderRoot.querySelector('.skio-details summary')\n    if (!details.hasAttribute('open') && this.showDetailsHover == false) {\n      summary.click()\n      this.showDetailsHover = true\n    }\n  }\n\n  detailsMouseleave() {\n    let details = this.renderRoot.querySelector('.skio-details')\n    let summary = this.renderRoot.querySelector('.skio-details summary')\n    if (details.hasAttribute('open') && this.showDetailsHover == true) {\n      summary.click()\n      this.showDetailsHover = false\n    }\n  }\n\n  updated(changed) {\n    if (\n      (changed.has('selectedVariant') ||\n        changed.has('quantity') ||\n        changed.has('cart') ||\n        changed.has('rules') ||\n        changed.has('product')) &&\n      this.rules?.length &&\n      this.selectedVariant?.id\n    ) {\n      this.getRule()\n    }\n\n    if (!this.viable()) return\n\n    if (changed.has('product') && this.product) {\n      this.key = this.key ? this.key : this.product.id\n    }\n\n    if (changed.has('selectedVariant') && this.selectedVariant) {\n      this.style.setProperty('--skio-group-background-selected-color', this.getSelectedVariantBackgroundColor())\n\n      const filteredSellingPlanGroups = this.product.selling_plan_groups.filter(\n        selling_plan_group =>\n          selling_plan_group.app_id === 'SKIO' && !selling_plan_group.name.toLowerCase().includes('hidden-') && !selling_plan_group.name.toLowerCase().includes('dynamic box subscription')\n      )\n\n      //update availableSellingPlanGroups based on skioSellingPlanGroups and selectedVariant.id\n      this.availableSellingPlanGroups = filteredSellingPlanGroups.filter(selling_plan_group =>\n        selling_plan_group.selling_plans.some(selling_plan =>\n          this.selectedVariant.selling_plan_allocations.some(selling_plan_allocation => selling_plan_allocation.selling_plan_id === selling_plan.id)\n        )\n      )\n\n      if (this.options?.combine_groups) {\n        this.availableSellingPlanGroups = [\n          {\n            name: this.options?.combined_group_name,\n            selling_plans: this.availableSellingPlanGroups.flatMap(group => group.selling_plans),\n            id: 'combined_group',\n            app_id: 'SKIO',\n          },\n        ]\n      }\n\n      // TODO: Select proper group depending on what selling plan is selected\n\n      //update selectedSellingPlan value\n      if (this.availableSellingPlanGroups?.length) {\n        const url = new URL(window.location.href)\n        const urlSelectedSellingPlanId = url.searchParams.get('selling_plan')\n\n        //update each group with a default selected_selling_plan\n        this.availableSellingPlanGroups.forEach(group => {\n          const availableSellingPlans = this.getAvailableSellingPlans(group)\n\n          const urlSelectedSellingPlan = availableSellingPlans.find(plan => plan.id == urlSelectedSellingPlanId)\n          const nameSelectedSellingPlan = availableSellingPlans.find(plan => plan.name === this.selectedSellingPlan?.name)\n          const defaultSellingPlan =\n            this.options?.default_subscription && this.options.default_subscription.trim() !== ''\n              ? availableSellingPlans.find(plan => plan.name.toLowerCase().includes(this.options.default_subscription.toLowerCase()))\n              : null\n\n          group.selected_selling_plan = urlSelectedSellingPlan || nameSelectedSellingPlan || defaultSellingPlan || availableSellingPlans[0]\n\n          const isAnyPlanSelected = urlSelectedSellingPlan || nameSelectedSellingPlan || defaultSellingPlan\n\n          group.selected = !!isAnyPlanSelected\n        })\n\n        if ((!this.variantChanged && this.options?.start_onetime == false) || this.product.requires_selling_plan == true || urlSelectedSellingPlanId || this.selectedSellingPlan) {\n          let selectedSellingPlanGroup = this.availableSellingPlanGroups.find(group => group.selected) || this.availableSellingPlanGroups[0]\n          let selectedSellingPlanId = selectedSellingPlanGroup.selected_selling_plan.id\n          this.selectSellingPlan(selectedSellingPlanId)\n          this.updateExternalCartButtonText()\n        } else {\n          this.selectSellingPlanGroup(null)\n          this.updateExternalCartButtonText()\n        }\n      } else {\n        this.selectSellingPlanGroup(null)\n        this.updateExternalCartButtonText()\n      }\n    }\n\n    if (changed.has('selectedSellingPlan')) {\n      //dispatch CustomEvent to tell that this specific plan picker was updated, and pass the selectedSellingPlan\n      const event = new CustomEvent(`skio::update-selling-plan`, {\n        bubbles: true,\n        composed: true,\n        detail: {\n          variant: this.selectedVariant,\n          sellingPlan: this.selectedSellingPlan,\n          key: this.key,\n        },\n      })\n\n      this.dispatchEvent(event)\n\n      this.dispatchEvent(\n        new CustomEvent('change', {\n          detail: { value: this.selectedSellingPlan?.id },\n        })\n      )\n    }\n\n    this.updateForm()\n    this.updateExternalPrice()\n    if (!this.hasDelayedExternalCartButtonTextSync) {\n      setTimeout(() => this.updateExternalCartButtonText(), 1500)\n      this.hasDelayedExternalCartButtonTextSync = true\n    } else {\n      this.updateExternalCartButtonText()\n    }\n    if (!this.disableUrl) {\n      this.updateURLParams()\n    }\n\n    this.updateExternalElements()\n    this.updateTooltipContent()\n  }\n\n  updateExternalElements() {\n    document.querySelectorAll(`[skio-price][skio-key=\"${this.key}\"]`).forEach(el => {\n      el.innerHTML = this.price(this.selectedSellingPlan)\n    })\n\n    document.querySelectorAll(`[skio-subscription-content]`).forEach(el => {\n      el.style.display = this.selectedSellingPlan ? 'block' : 'none'\n    })\n  }\n\n  // SECTION: Utility Functions\n  /** @see {skioRulesDebugActive} plus Lit `debug` / theme editor */\n  rulesDebugEnabled() {\n    return !!this.debug || skioRulesDebugActive()\n  }\n\n  logRulesDebug(message, data) {\n    if (!this.rulesDebugEnabled()) return\n    const label = `[Skio rules][picker ${this.key}]`\n    if (data !== undefined) {\n      console.log(`%c${label}`, 'color:#087cba;font-weight:bold', message, data)\n    } else {\n      console.log(`%c${label}`, 'color:#087cba;font-weight:bold', message)\n    }\n  }\n\n  log(...args) {\n    args.unshift(`%c[skio plan picker][${this.key}]`, 'color: #8770f2;')\n    console.log.apply(console, args)\n  }\n\n  error(...args) {\n    args.unshift(`%c [skio plan picker][${this.key}]`, 'color: #ff0000')\n    console.error.apply(console, args)\n  }\n\n  appendOrdinalSuffix(num) {\n    const j = num % 10,\n      k = num % 100\n    if (j == 1 && k != 11) {\n      return num + 'st'\n    }\n    if (j == 2 && k != 12) {\n      return num + 'nd'\n    }\n    if (j == 3 && k != 13) {\n      return num + 'rd'\n    }\n    return num + 'th'\n  }\n\n  viable() {\n    const errors = []\n\n    const sellingPlanInput = this.querySelector('input[name=selling_plan]')\n    if (!sellingPlanInput) {\n      errors.push('Missing selling plan input')\n    }\n\n    if (!this.product) {\n      errors.push('No product found. Please pass a product or productHandle to the skio-plan-picker component.')\n    }\n    if (!this.selectedVariant) {\n      errors.push('No variant found. Please pass a product or productHandle to the skio-plan-picker component.')\n    }\n    if (!this.form) {\n      errors.push('No form found. Please add a form_id to the plan picker through the Shopify customizer or ensure that the element is in a form that has an input with name=\"id\".')\n    }\n    if (!this.variantInput) {\n      errors.push('No variant input found. Please add a form_id to the plan picker through the Shopify customizer or ensure that the element is in a form that has an input with name=\"id\"')\n    }\n\n    if (errors.length == 0) return true\n\n    this.error('Errors', errors)\n    return false\n  }\n\n  getAvailableSellingPlans(group) {\n    let availableSellingPlans = group.selling_plans.filter(selling_plan =>\n      this.selectedVariant.selling_plan_allocations.some(selling_plan_allocation => selling_plan_allocation.selling_plan_id === selling_plan.id)\n    )\n\n    return availableSellingPlans\n  }\n\n  // !SECTION: Utility Functions\n\n  // Update selected selling plan group; called on click of group-container element\n  selectSellingPlanGroup(group) {\n    this.selectedSellingPlanGroup = group\n    this.selectedSellingPlan = group?.selected_selling_plan\n  }\n\n  // Update selected selling plan; called on change of skio-frequency select element\n  selectSellingPlan(selling_plan_id) {\n    const selectedGroup = this.availableSellingPlanGroups.find(group => group.selling_plans.some(plan => plan.id == selling_plan_id))\n    const selectedSellingPlan = selectedGroup.selling_plans.find(plan => plan.id == selling_plan_id)\n\n    selectedGroup.selected_selling_plan = selectedSellingPlan\n    this.selectedSellingPlanGroup = selectedGroup\n    this.selectedSellingPlan = selectedSellingPlan\n  }\n\n  updateExternalPrice() {\n    document.querySelectorAll(this.options?.external_price_selector).forEach(el => {\n      this.selectedSellingPlan ? (el.innerHTML = this.price(this.selectedSellingPlan)) : (el.innerHTML = this.money(this.selectedVariant.price))\n    })\n  }\n\n  updateExternalCartButtonText() {\n    const selectedVariantAddToCartButtonColor = this.getSelectedVariantAddToCartButtonColor()\n\n    document.querySelectorAll('[x-text=\"addToCartText\"]').forEach(el => {\n      if (this.selectedSellingPlan) {\n        el.textContent = 'Subscribe & Save'\n      } else {\n        el.textContent = 'Add to Cart'\n      }\n    })\n\n    document.querySelectorAll('.add-to-cart-btn > span').forEach(el => {\n      el.style.backgroundColor = selectedVariantAddToCartButtonColor\n    })\n  }\n  \n  additionalFrequencyLabel() {\n    if (!this.options?.additional_frequency_label || this.options?.additional_frequency_label == '') return\n\n    return unsafeHTML(this.options?.additional_frequency_label)\n  }\n\n  additionalContentText() {\n    if (!this.options?.additional_subscription_content || this.options?.additional_subscription_content == '') return\n\n    return html`\n      <div class=\"group-content-additional\">\n        ${unsafeHTML(\n          this.options?.additional_subscription_content\n            .replaceAll('[discount]', this.discountPlaceholderString(this.selectedSellingPlan))\n            .replaceAll('[future_price_adjustments]', this.postCheckoutDiscountsText(this.selectedSellingPlan) || '')\n        )}\n      </div>\n    `\n  }\n\n  // SECTION: Discount Functions\n  // Calculates discount based on selling_plan.price_adjustments, returns { percent, amount } of selling plan discount\n  discountText(selling_plan) {\n    if (!this.options?.discount_text || this.options?.discount_text == '') return\n    const discount = this.discount(selling_plan)\n    const planCorrupt = [discount.percent, discount.amount, discount.absolute].some(\n      v => v === Infinity || (typeof v === 'number' && v < 0) || String(v).includes('-')\n    )\n    if (planCorrupt) return ''\n\n    const placeholder = this.discountPlaceholderString(selling_plan)\n    if (!placeholder) return ''\n\n    return unsafeHTML(\n      this.options?.discount_text\n        .replaceAll('[discount]', placeholder)\n        .replaceAll('[future_price_adjustments]', this.postCheckoutDiscountsText(selling_plan) || '')\n    )\n  }\n\n  discount(selling_plan) {\n    if (!selling_plan) return { percent: 0, amount: 0 }\n    return this.getDiscountFromPriceAdjustment(selling_plan, selling_plan.price_adjustments[0])\n  }\n\n  /** Percent off from Skio rule (storefront API field names vary). */\n  getRuleDiscountPercent(rule = this.rule) {\n    if (!rule) return 0\n    const v = rule.discountAmount ?? rule.discount_amount ?? rule.discountPercent ?? rule.discount_percent\n    const n = Number(v)\n    return Number.isFinite(n) ? n : 0\n  }\n\n  /** Extra cents off from quantity rule; matches `price()` when `this.rule` is set. */\n  ruleDiscountCents() {\n    const pct = this.getRuleDiscountPercent()\n    if (!pct || !this.selectedVariant?.price) return 0\n    return Math.round((this.selectedVariant.price * pct) / 100)\n  }\n\n  /** Total savings (plan + rule) for discount badge / `[discount]` \u2014 same basis as `price()`. */\n  discountWithRule(selling_plan) {\n    const d = this.discount(selling_plan)\n    const ruleCents = this.ruleDiscountCents()\n    const totalCents = (d.amount || 0) + ruleCents\n    const price = this.selectedVariant?.price || 0\n    const percent = price > 0 ? Math.round((totalCents / price) * 100) : 0\n    return { totalCents, percent }\n  }\n\n  discountPlaceholderString(selling_plan) {\n    const { totalCents, percent } = this.discountWithRule(selling_plan)\n    if (totalCents <= 0) return ''\n    return this.options?.discount_format === 'absolute' ? this.money(totalCents) : percent + '%'\n  }\n\n  postCheckoutPriceAdjustments(selling_plan) {\n    const { price_adjustments } = selling_plan\n    const postCheckoutPriceAdjustments = price_adjustments.filter(({ position }) => position !== 1)\n    const discounts = postCheckoutPriceAdjustments.map(price_adjustment => this.getDiscountFromPriceAdjustment(selling_plan, price_adjustment))\n    return discounts\n  }\n\n  postCheckoutDiscountsText(sellingPlan = this.selectedSellingPlan) {\n    if (!sellingPlan || !this.options?.future_price_adjustments_text || this.future_price_adjustments_text == '') return\n\n    const postCheckoutPriceAdjustments = this.postCheckoutPriceAdjustments(sellingPlan)\n    if (!postCheckoutPriceAdjustments.length) return\n\n    return postCheckoutPriceAdjustments.map((discount, index) =>\n      this.options?.future_price_adjustments_text\n        .replaceAll('[discount]', this.options?.discount_format === 'absolute' ? this.money(discount.absolute) : discount.percent + '%')\n        .replaceAll('[order_count]', index + 1)\n        .replaceAll('[order_count_ordinal]', this.appendOrdinalSuffix(index + 1))\n    )\n  }\n\n  getDiscountFromPriceAdjustment(selling_plan, price_adjustment) {\n    const discount = {\n      percent: 0,\n      amount: 0,\n      absolute: 0,\n    }\n\n    let multiplier = 1\n\n    let sellingPlanGroup = this.product.selling_plan_groups.find(group => group.selling_plans.some(plan => plan.id == selling_plan.id))\n\n    if (sellingPlanGroup?.name === 'Prepaid') {\n      const str = selling_plan.name // replace with your string\n      const intervalDate = /\\b\\d+\\s*(days|weeks|months|years)\\b/gi\n      const intervalDateMatches = str.match(intervalDate)\n\n      if (intervalDateMatches?.length) {\n        const intervals = intervalDateMatches[0].match(/\\d+/g)\n        multiplier = intervals[0] / (intervals[1] || 1)\n        multiplier = multiplier > 1 ? multiplier : 1\n      }\n    }\n\n    const price = this.selectedVariant.price\n    const compareAtPrice = this.selectedVariant.compare_at_price && this.selectedVariant.compare_at_price > price ? this.selectedVariant.compare_at_price : price\n\n    switch (price_adjustment.value_type) {\n      case 'percentage':\n        discount.percent = price_adjustment.value\n        discount.absolute = Math.round((price * price_adjustment.value) / 100.0)\n        discount.amount = Math.round((price * price_adjustment.value) / 100.0)\n        break\n      case 'fixed_amount':\n        discount.percent = Math.round(((price_adjustment.value * 1.0) / price) * 100.0)\n        discount.absolute = price_adjustment.value\n        discount.amount = price_adjustment.value\n        break\n      case 'price':\n        discount.percent = Math.round((((compareAtPrice * multiplier - price_adjustment.value) * 1.0) / (compareAtPrice * multiplier)) * 100.0)\n        discount.absolute = compareAtPrice * multiplier - price_adjustment.value\n        discount.amount = price - price_adjustment.value\n        break\n    }\n\n    return discount\n  }\n\n  getSelectedVariantBackgroundColor() {\n    const variantId = String(this.selectedVariant?.id || '')\n\n    const byId = {\n      '52818915655959': '#FFF1B7', // Vanilla\n      '52818915688727': '#FFDEE0', // Strawberry Milkshake\n      '52818915721495': '#FFEDDA', // Salted Caramel\n      '51489532051735': '#f9edc7', // Variety Bundle\n    }\n\n    return byId[variantId] || 'transparent'\n  }\n\n  getSelectedVariantAddToCartButtonColor() {\n    const variantId = String(this.selectedVariant?.id || '')\n\n    const byId = {\n      '52818915655959': '#E8CC5F', // Vanilla (update me)\n      '52818915688727': '#E27D83', // Strawberry Milkshake (update me)\n      '52818915721495': '#E1953A', // Salted Caramel (update me)\n      '51489532051735': '#E8CC5F', // Variety Bundle\n    }\n\n    return byId[variantId] || 'transparent'\n  }\n\n  unitPriceDivisor(_sellingPlan) {\n    const title = (this.product?.title || '').toLowerCase()\n\n    if (title.includes('variety bundle')) {\n      return 42\n    } else if (title.includes('starter pack')) {\n      return 6\n    } else {\n      return 14\n    }\n  }\n\n  /**\n   * Formats a number of cents into a currency string using Shopify format string.\n   *\n   * https://help.shopify.com/en/manual/international/pricing/currency-formatting#currency-formatting-options\n   *\n   * Originally from: https://gist.github.com/stewartknapman/8d8733ea58d2314c373e94114472d44c\n   *\n   * @param cents - The number of cents to format.\n   * @param formatString - The format string to use.\n   * @returns The formatted currency string.\n   */\n  money(cents, formatString = this.moneyFormat) {\n    const placeholderRegex = /{{\\s*(\\w+)\\s*}}/\n\n    /**\n     * Formats a number of cents into a currency string using the provided\n     * precision, thousands separator, and decimal separator.\n     * @param number - The number of cents to format.\n     * @param precision - The number of decimal places to include.\n     * @param thousands - The character to use as the thousands separator.\n     * @param decimal - The character to use as the decimal separator.\n     * @returns The formatted currency string.\n     */\n    function formatWithDelimiters(number, precision = 2, thousands = ',', decimal = '.') {\n      if (isNaN(number) || number == null) {\n        return '0'\n      }\n\n      const numString = (number / 100.0).toFixed(precision)\n      const parts = numString.split('.')\n      const dollars = parts[0].replace(/(\\d)(?=(\\d\\d\\d)+(?!\\d))/g, '$1' + thousands)\n      const cents = parts[1] ? decimal + parts[1] : ''\n      return dollars + cents\n    }\n\n    return formatString.replace(placeholderRegex, (match, placeholder) => {\n      switch (placeholder) {\n        case 'amount':\n          // Ex.\t1,134.65\n          return formatWithDelimiters(cents, 2)\n        case 'amount_no_decimals':\n          // Ex. 1,135\n          return formatWithDelimiters(cents, 0)\n        case 'amount_with_comma_separator':\n          // Ex. 1.134,65\n          return formatWithDelimiters(cents, 2, '.', ',')\n        case 'amount_no_decimals_with_comma_separator':\n          // Ex. 1.135\n          return formatWithDelimiters(cents, 0, '.', ',')\n        case 'amount_with_apostrophe_separator':\n          // Ex. 1'134.65\n          return formatWithDelimiters(cents, 2, \"'\", '.')\n        case 'amount_no_decimals_with_space_separator':\n          // Ex. 1 135\n          return formatWithDelimiters(cents, 0, ' ')\n        case 'amount_with_space_separator':\n          // 1 134,65\n          return formatWithDelimiters(cents, 2, ' ', ',')\n        case 'amount_with_period_and_space_separator':\n          // 1 134.65\n          return formatWithDelimiters(cents, 2, ' ', '.')\n        default:\n          return match\n      }\n    })\n  }\n\n  // !SECTION: Discount Functions\n  price(selling_plan, formatted = true) {\n    const rulePct = this.getRuleDiscountPercent()\n    if (this.rule && rulePct) {\n      const ruleCents = Math.round((this.selectedVariant.price * rulePct) / 100)\n      const subtotal = this.selectedVariant.price - this.discount(selling_plan).amount - ruleCents\n      return formatted ? this.money(subtotal) : subtotal\n    }\n\n    return formatted ? this.money(this.selectedVariant.price - this.discount(selling_plan).amount) : this.selectedVariant.price - this.discount(selling_plan).amount\n  }\n\n  // Updates element data to be registered by forms\n  updateForm() {\n    let $sellingPlan = this.querySelector('input[name=selling_plan]')\n\n    if ($sellingPlan) {\n      $sellingPlan.value = this.selectedSellingPlan ? this.selectedSellingPlan.id : ''\n      $sellingPlan.dispatchEvent(new Event('change'))\n    }\n  }\n\n  // SECTION: Additional Functionality\n  updateURLParams() {\n    const url = new URL(window.location.href)\n\n    if (this.selectedSellingPlan) {\n      url.searchParams.set('selling_plan', this.selectedSellingPlan.id)\n      window.history.replaceState({}, '', url.href)\n    } else {\n      url.searchParams.delete('selling_plan')\n      window.history.replaceState({}, '', url.href)\n    }\n  }\n\n  // Runs a fetch request to add the selectedVariant to the cart with the passed quantity and selectedSellingPlan\n  addToCart(quantity) {\n    const items = [\n      {\n        id: this.selectedVariant.id,\n        quantity: quantity,\n        ...(this.selectedSellingPlan && {\n          selling_plan: this.selectedSellingPlan?.id,\n        }),\n      },\n    ]\n\n    fetch('/cart/add.js', {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n      },\n      body: JSON.stringify({\n        items,\n      }),\n    })\n      .then(response => response.json())\n      .then(response => {\n        this.log('Added item to cart: ', response)\n        //dispatch CustomEvent to tell document that an item was added to cart\n        const event = new CustomEvent(`skio::added-to-cart`, {\n          bubbles: true,\n          composed: true,\n          detail: {\n            response,\n            key: this.key,\n          },\n        })\n\n        this.dispatchEvent(event)\n      })\n      .catch(error => {\n        this.error(`SKIO ${this.key} error adding item to cart: `, error)\n      })\n  }\n\n  fetchProduct = handle => {\n    return fetch(`/products/${handle}.js`)\n      .then(response => response.json())\n      .then(product => {\n        this.product = product\n        this.selectedVariant = product.variants[0]\n        if (this.rules?.length) this.getRule()\n\n        return product\n      })\n  }\n\n  replacePlaceholders(template, sellingPlan = this.selectedSellingPlan) {\n    if (!template) return '';\n\n    const discountText = this.discountPlaceholderString(sellingPlan) || '';\n\n    const futureDiscounts = this.postCheckoutDiscountsText(sellingPlan) || [];\n    const futureDiscountsText = futureDiscounts.join(', ');\n\n    return template\n      .replaceAll('[discount]', discountText)\n      .replaceAll('[future_price_adjustments]', futureDiscountsText);\n  }\n\n  updateTooltipContent() {\n    const template = this.options?.tooltip_content || '';\n    let plan = this.selectedSellingPlan;\n    if (!plan && this.availableSellingPlanGroups?.length) {\n      const firstGroup = this.availableSellingPlanGroups[0];\n      plan = firstGroup.selected_selling_plan || firstGroup.selling_plans?.[0] || null;\n    }\n    this.tooltipContent = this.replacePlaceholders(template, plan);\n  }\n\n  // !SECTION: Additional Functionality\n}\n\nif (!customElements.get('skio-plan-picker')) {\n  customElements.define('skio-plan-picker', SkioPlanPicker)\n}\n\nif (typeof window !== 'undefined') {\n  window.SkioPlanPicker = SkioPlanPicker\n  window.skioRulesDebugActive = skioRulesDebugActive\n}"],
  "mappings": "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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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",
  "names": ["cents"]
}
