{"version":3,"file":"theme-bundle.js","sources":["../node_modules/@preact/signals-core/dist/signals-core.module.js","../src/utils/knocking.ts","../src/utils/consent.ts","../src/store/cart-store.ts","../src/store/retail-price-store.ts","../src/store/product-store.ts","../src/store/collection-store.ts","../node_modules/@lit/reactive-element/css-tag.js","../node_modules/@lit/reactive-element/reactive-element.js","../node_modules/lit-html/lit-html.js","../node_modules/lit-element/lit-element.js","../node_modules/@lit/reactive-element/decorators/custom-element.js","../node_modules/@lit/reactive-element/decorators/property.js","../node_modules/@lit/reactive-element/decorators/state.js","../src/store/extended-offer-store.ts","../src/components/theme-settings-provider.ts","../src/components/consent-gated-scripts.ts","../src/store/holiday-store.ts","../src/components/product-provider.ts","../src/components/variant-selects.ts","../src/components/variant-radios.ts","../src/components/price-pp.ts","../src/components/badges-pp.ts","../src/components/product-gallery.ts","../src/store/modal-store.ts","../src/store/voucher-store.ts","../src/components/add-to-cart.ts","../src/components/quantity-selector-pp.ts","../src/components/extended-offer-modal.ts","../src/store/promo-code-store.ts","../src/components/promo-code-modal.ts","../src/components/sticky-add-to-cart.ts","../src/components/ships-by-pp.ts","../src/components/card-provider.ts","../src/components/card-price.ts","../src/components/card-badge.ts","../src/components/card-button.ts","../src/components/card-variant-selector.ts","../src/components/card-image-switcher.ts","../src/components/card-ships-by.ts","../src/components/card-background.ts","../src/utils/equalize-card-title-heights.ts","../src/components/cart-drawer.ts","../src/components/menu-drawer.ts","../node_modules/lit-html/directive.js","../node_modules/lit-html/directive-helpers.js","../node_modules/lit-html/directives/repeat.js","../src/components/cart-item-list.ts","../src/store/customization-store.ts","../src/components/cart-item-row.ts","../src/components/cart-total.ts","../src/components/cart-savings.ts","../src/components/cart-count.ts","../src/components/cart-count-badge.ts","../src/components/cross-selling-cart.ts","../src/components/quantity-selector-cart.ts","../node_modules/tabbable/dist/index.esm.js","../node_modules/focus-trap/dist/focus-trap.esm.js","../src/controllers/dialog-a11y.ts","../src/components/modal-base.ts","../src/components/holiday-shipping-modal.ts","../src/components/confirm-custom-text-modal.ts","../src/components/holiday-shipping-countdown.ts","../src/components/customization-modal.ts","../src/components/custom-text-input.ts","../src/components/lazy-video.ts","../src/main.ts"],"sourcesContent":["var i=Symbol.for(\"preact-signals\");function t(){if(!(s>1)){var i,t=!1;while(void 0!==h){var n=h;h=void 0;v++;while(void 0!==n){var r=n.o;n.o=void 0;n.f&=-3;if(!(8&n.f)&&a(n))try{n.c()}catch(n){if(!t){i=n;t=!0}}n=r}}v=0;s--;if(t)throw i}else s--}function n(i){if(s>0)return i();s++;try{return i()}finally{t()}}var r=void 0;function o(i){var t=r;r=void 0;try{return i()}finally{r=t}}var f,h=void 0,s=0,v=0,u=0;function e(i){if(void 0!==r){var t=i.n;if(void 0===t||t.t!==r){t={i:0,S:i,p:r.s,n:void 0,t:r,e:void 0,x:void 0,r:t};if(void 0!==r.s)r.s.n=t;r.s=t;i.n=t;if(32&r.f)i.S(t);return t}else if(-1===t.i){t.i=0;if(void 0!==t.n){t.n.p=t.p;if(void 0!==t.p)t.p.n=t.n;t.p=r.s;t.n=void 0;r.s.n=t;r.s=t}return t}}}function d(i,t){this.v=i;this.i=0;this.n=void 0;this.t=void 0;this.W=null==t?void 0:t.watched;this.Z=null==t?void 0:t.unwatched;this.name=null==t?void 0:t.name}d.prototype.brand=i;d.prototype.h=function(){return!0};d.prototype.S=function(i){var t=this,n=this.t;if(n!==i&&void 0===i.e){i.x=n;this.t=i;if(void 0!==n)n.e=i;else o(function(){var i;null==(i=t.W)||i.call(t)})}};d.prototype.U=function(i){var t=this;if(void 0!==this.t){var n=i.e,r=i.x;if(void 0!==n){n.x=r;i.e=void 0}if(void 0!==r){r.e=n;i.x=void 0}if(i===this.t){this.t=r;if(void 0===r)o(function(){var i;null==(i=t.Z)||i.call(t)})}}};d.prototype.subscribe=function(i){var t=this;return m(function(){var n=t.value,o=r;r=void 0;try{i(n)}finally{r=o}},{name:\"sub\"})};d.prototype.valueOf=function(){return this.value};d.prototype.toString=function(){return this.value+\"\"};d.prototype.toJSON=function(){return this.value};d.prototype.peek=function(){var i=r;r=void 0;try{return this.value}finally{r=i}};Object.defineProperty(d.prototype,\"value\",{get:function(){var i=e(this);if(void 0!==i)i.i=this.i;return this.v},set:function(i){if(i!==this.v){if(v>100)throw new Error(\"Cycle detected\");this.v=i;this.i++;u++;s++;try{for(var n=this.t;void 0!==n;n=n.x)n.t.N()}finally{t()}}}});function c(i,t){return new d(i,t)}function a(i){for(var t=i.s;void 0!==t;t=t.n)if(t.S.i!==t.i||!t.S.h()||t.S.i!==t.i)return!0;return!1}function l(i){for(var t=i.s;void 0!==t;t=t.n){var n=t.S.n;if(void 0!==n)t.r=n;t.S.n=t;t.i=-1;if(void 0===t.n){i.s=t;break}}}function y(i){var t=i.s,n=void 0;while(void 0!==t){var r=t.p;if(-1===t.i){t.S.U(t);if(void 0!==r)r.n=t.n;if(void 0!==t.n)t.n.p=r}else n=t;t.S.n=t.r;if(void 0!==t.r)t.r=void 0;t=r}i.s=n}function w(i,t){d.call(this,void 0);this.x=i;this.s=void 0;this.g=u-1;this.f=4;this.W=null==t?void 0:t.watched;this.Z=null==t?void 0:t.unwatched;this.name=null==t?void 0:t.name}w.prototype=new d;w.prototype.h=function(){this.f&=-3;if(1&this.f)return!1;if(32==(36&this.f))return!0;this.f&=-5;if(this.g===u)return!0;this.g=u;this.f|=1;if(this.i>0&&!a(this)){this.f&=-2;return!0}var i=r;try{l(this);r=this;var t=this.x();if(16&this.f||this.v!==t||0===this.i){this.v=t;this.f&=-17;this.i++}}catch(i){this.v=i;this.f|=16;this.i++}r=i;y(this);this.f&=-2;return!0};w.prototype.S=function(i){if(void 0===this.t){this.f|=36;for(var t=this.s;void 0!==t;t=t.n)t.S.S(t)}d.prototype.S.call(this,i)};w.prototype.U=function(i){if(void 0!==this.t){d.prototype.U.call(this,i);if(void 0===this.t){this.f&=-33;for(var t=this.s;void 0!==t;t=t.n)t.S.U(t)}}};w.prototype.N=function(){if(!(2&this.f)){this.f|=6;for(var i=this.t;void 0!==i;i=i.x)i.t.N()}};Object.defineProperty(w.prototype,\"value\",{get:function(){if(1&this.f)throw new Error(\"Cycle detected\");var i=e(this);this.h();if(void 0!==i)i.i=this.i;if(16&this.f)throw this.v;return this.v}});function b(i,t){return new w(i,t)}function _(i){var n=i.u;i.u=void 0;if(\"function\"==typeof n){s++;var o=r;r=void 0;try{n()}catch(t){i.f&=-2;i.f|=8;p(i);throw t}finally{r=o;t()}}}function p(i){for(var t=i.s;void 0!==t;t=t.n)t.S.U(t);i.x=void 0;i.s=void 0;_(i)}function g(i){if(r!==this)throw new Error(\"Out-of-order effect\");y(this);r=i;this.f&=-2;if(8&this.f)p(this);t()}function S(i,t){this.x=i;this.u=void 0;this.s=void 0;this.o=void 0;this.f=32;this.name=null==t?void 0:t.name;if(f)f.push(this)}S.prototype.c=function(){var i=this.S();try{if(8&this.f)return;if(void 0===this.x)return;var t=this.x();if(\"function\"==typeof t)this.u=t}finally{i()}};S.prototype.S=function(){if(1&this.f)throw new Error(\"Cycle detected\");this.f|=1;this.f&=-9;_(this);l(this);s++;var i=r;r=this;return g.bind(this,i)};S.prototype.N=function(){if(!(2&this.f)){this.f|=2;this.o=h;h=this}};S.prototype.d=function(){this.f|=8;if(!(1&this.f))p(this)};S.prototype.dispose=function(){this.d()};function m(i,t){var n=new S(i,t);try{n.c()}catch(i){n.d();throw i}var r=n.d.bind(n);r[Symbol.dispose]=r;return r}function E(i){return function(){var t=arguments,r=this;return n(function(){return o(function(){return i.apply(r,[].slice.call(t))})})}}function x(){var i=f;f=[];return function(){var t=f;if(f&&i)i=i.concat(f);f=i;return t}}function C(i){return function(){var t,n,r=x();try{n=i.apply(void 0,[].slice.call(arguments))}catch(i){f=void 0;throw i}finally{t=r()}for(var o in n)if(\"function\"==typeof n[o])n[o]=E(n[o]);n[Symbol.dispose]=E(function(){if(t)for(var i=0;i<t.length;i++)t[i].dispose();t=void 0});return n}}export{w as Computed,S as Effect,d as Signal,E as action,n as batch,b as computed,C as createModel,m as effect,c as signal,o as untracked};//# sourceMappingURL=signals-core.module.js.map\n","/**\n * Native TypeScript utilities that replace the legacy `window.knocking` globals.\n *\n * These are ported from assets/knocking-library.js so the new reactive components\n * have no runtime dependency on the legacy script and no initialisation-timing issues.\n */\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface KnockingVariant {\n  id: number;\n  title: string;\n  price: number;\n  compare_at_price: number | null;\n  available: boolean;\n  featured_image: { src: string } | null;\n}\n\nexport interface KnockingProduct {\n  id: number;\n  handle: string;\n  title: string;\n  tags: string[];\n  featured_image: string;\n  variants: KnockingVariant[];\n}\n\nexport interface ShippingDate {\n  longDate: string;\n  shortDate?: string;\n}\n\n// ─── Date helpers ─────────────────────────────────────────────────────────────\n\nfunction addDays(days: number): Date {\n  return new Date(Date.now() + days * 86_400_000);\n}\n\nfunction addBusinessDays(days: number): Date {\n  const date = new Date();\n  for (let added = 0; added < days;) {\n    date.setDate(date.getDate() + 1);\n    const dow = date.getDay();\n    if (dow !== 0 && dow !== 6) added++;\n  }\n  return date;\n}\n\nconst DATE_FMT_LONG: Intl.DateTimeFormatOptions = {\n  month: \"short\",\n  day: \"2-digit\",\n  year: \"numeric\",\n};\nconst DATE_FMT_SHORT: Intl.DateTimeFormatOptions = {\n  month: \"short\",\n  day: \"2-digit\",\n};\n\nfunction formatShippingDate(date: Date): ShippingDate {\n  return {\n    longDate: date.toLocaleDateString(\"en-US\", DATE_FMT_LONG),\n    shortDate: date.toLocaleDateString(\"en-US\", DATE_FMT_SHORT),\n  };\n}\n\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\nexport function calculateShippingDate(tag: string): ShippingDate {\n  if (tag.includes(\"businessdays\")) {\n    const n = parseInt(tag.replace(\"businessdays\", \"\"), 10);\n    return formatShippingDate(addBusinessDays(n));\n  }\n  if (tag.includes(\"days\")) {\n    const n = parseInt(tag.replace(\"days\", \"\"), 10);\n    return formatShippingDate(addDays(n));\n  }\n  // Absolute date: \"YYYY-MM-DD\"\n  const [y, m, d] = tag.split(\"-\").map(Number);\n  return formatShippingDate(new Date(y, m - 1, d));\n}\n\n/**\n * Parse a `ships_by-*` product tag into human-readable shipping date strings.\n * Falls back to the `defaultShippingDate` theme setting when no tag is found.\n * Returns null when no default is configured either.\n */\nexport const getTagShippingDate = (tags: string[]): ShippingDate | null => {\n  const fallback = (window as any).defaultShippingDate as string | undefined;\n\n  if (!tags?.length) {\n    return fallback ? calculateShippingDate(fallback) : null;\n  }\n\n  const shippingTag = tags.find((t) => t.includes(\"ships_by-\"));\n  if (!shippingTag) {\n    return fallback ? calculateShippingDate(fallback) : null;\n  }\n\n  const trimmed = shippingTag.replace(\"ships_by-\", \"\");\n\n  if (trimmed.includes(\":\")) {\n    const [a, b] = trimmed.split(\":\").map(calculateShippingDate);\n    return {\n      longDate: `${a.longDate} - ${b.longDate}`,\n      shortDate: `${a.shortDate} - ${b.shortDate}`,\n    };\n  }\n\n  return calculateShippingDate(trimmed);\n};\n\n/** Fetch a full Shopify product object by its URL handle. Returns null if not found. */\nexport const getProductByHandle = async (\n  handle: string\n): Promise<KnockingProduct | null> => {\n  try {\n    const res = await fetch(`/products/${handle}.js`);\n    if (!res.ok) return null;\n    return res.json();\n  } catch {\n    return null;\n  }\n};\n\n/**\n * Format a price in cents to a dollar string (e.g. 1999 → \"$19.99\").\n * Omits trailing zeros so whole-dollar amounts render as \"$50\" not \"$50.00\".\n */\nexport const formatToDollarCurrencyString = (priceCents: number): string => {\n  if (!priceCents) return \"$\";\n  const str = priceCents.toString();\n  const dollars = str.slice(0, -2) || \"0\";\n  const cents = str.slice(-2).padStart(2, \"0\");\n  if (cents === \"00\") return `$${dollars}`;\n  return `$${dollars}.${cents}`;\n};\n\n/** Read a browser cookie by name. Returns empty string if not found. */\nexport const getCookie = (name: string): string => {\n  const prefix = name + \"=\";\n  for (const raw of document.cookie.split(\";\")) {\n    const c = raw.trim();\n    if (c.startsWith(prefix)) {\n      try {\n        return decodeURIComponent(c.slice(prefix.length));\n      } catch {\n        return c.slice(prefix.length);\n      }\n    }\n  }\n  return \"\";\n};\n\n/** Write a browser cookie. Defaults to a 7-day lifetime, root path. */\nexport const setCookie = (name: string, value: string, days = 7): void => {\n  const expires = new Date();\n  expires.setTime(expires.getTime() + days * 24 * 60 * 60 * 1000);\n  document.cookie = `${name}=${encodeURIComponent(value)};expires=${expires.toUTCString()};path=/`;\n};\n\n/** Convert a string to a Shopify-style URL handle (lowercase, hyphenated). */\nexport const handleize = (str: string): string => {\n  if (!str) return \"\";\n  return str\n    .toLowerCase()\n    .replace(/[^a-z0-9]+/g, \"-\")\n    .replace(/-$/, \"\")\n    .replace(/^-/, \"\");\n};\n\n/**\n * \"Change variant\" affordance behaviour, page-dependent:\n *  - Product page: smooth-scroll so the variant picker sits at the bottom of the viewport.\n *  - Any other page (e.g. collection): no-op.\n *\n * Used by the sticky add-to-cart bar and the extended-offer modal so their\n * \"Change\" buttons behave consistently.\n */\nexport const scrollToVariantPicker = (): void => {\n  const template = document.body.dataset.template ?? \"\";\n  if (!template.startsWith(\"product\")) return; // collection & elsewhere: do nothing\n  const picker = document.querySelector<HTMLElement>(\n    \".product-form__action-row-variant\"\n  );\n  if (!picker) return;\n  const top = Math.max(\n    0,\n    picker.getBoundingClientRect().bottom + window.scrollY - window.innerHeight\n  );\n  window.scrollTo({ top, behavior: \"smooth\" });\n};\n\n/**\n * Ask the Shopify CDN for an image at a given render width.\n *\n * Raw `featured_image` / `variant.featured_image.src` values come back at the\n * original upload size — commonly 2000x2000 — so dropping one into an `<img>`\n * unchanged ships ~100KB to paint a thumbnail. Pass the CSS width the image is\n * rendered at, doubled for retina.\n *\n * Non-Shopify and already-sized URLs are returned untouched.\n */\nexport const shopifyImageUrl = (\n  src: string | null | undefined,\n  width: number\n): string => {\n  if (!src || !width) return src ?? \"\";\n  try {\n    const url = new URL(src, window.location.origin);\n    if (!/(^|\\.)shopify\\.com$/.test(url.hostname) && url.hostname !== window.location.hostname) {\n      return src; // third-party CDN — no size param to add\n    }\n    url.searchParams.set(\"width\", String(Math.round(width)));\n    return url.toString();\n  } catch {\n    return src;\n  }\n};\n\n/**\n * Append (or replace) a `variant` query param on a product URL, preserving any\n * existing query string.\n *\n * Recommendation (\"You may also like\") URLs already carry Shopify tracking params\n * (e.g. `?pr_prod_strat=…&pr_seq=uniform`), so a naive `` `${base}?variant=…` ``\n * would produce a malformed double-`?` URL and the variant would never be parsed.\n * Using the URL API keeps the existing params and joins with `&`.\n */\nexport const buildVariantUrl = (\n  base: string,\n  variantId: number | null | undefined\n): string => {\n  if (!variantId || !base || base === \"#\") return base;\n  const url = new URL(base, window.location.origin);\n  url.searchParams.set(\"variant\", String(variantId));\n  return url.pathname + url.search + url.hash; // keep it relative\n};\n","/**\n * Wraps Shopify's Customer Privacy API (`Shopify.customerPrivacy`) so components\n * can gate third-party marketing/tracking scripts on visitor consent.\n *\n * Ref: https://shopify.dev/docs/api/customer-privacy\n */\n\n/**\n * Whether the current visitor has consented to marketing/tracking.\n *\n * Defaults to `false` when the API isn't available yet (e.g. it hasn't\n * finished loading on first paint) — third-party trackers must fail closed,\n * not open, since the risk being fixed is trackers firing before consent.\n */\nexport function isMarketingAllowed(): boolean {\n  try {\n    return (window as any).Shopify?.customerPrivacy?.marketingAllowed() ?? false;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Runs `callback` once if marketing is already allowed, and again every time\n * the visitor's consent choice changes to allowed. Shopify dispatches\n * `visitorConsentCollected` on the `window` whenever consent is captured or\n * updated (banner interaction, GPC signal, preference-center change).\n *\n * Only fires on the *allowed* transition — callers use this to lazily inject\n * a script the first time it becomes allowed, not to un-inject it.\n */\nexport function onMarketingAllowed(callback: () => void): void {\n  if (isMarketingAllowed()) {\n    callback();\n    return;\n  }\n\n  const handler = (): void => {\n    if (isMarketingAllowed()) {\n      window.removeEventListener(\"visitorConsentCollected\", handler);\n      callback();\n    }\n  };\n\n  window.addEventListener(\"visitorConsentCollected\", handler);\n}\n","import { signal, computed, effect } from \"@preact/signals-core\";\nimport { getCookie } from \"../utils/knocking\";\nimport { isMarketingAllowed } from \"../utils/consent\";\n\n// Define the cart data structure based on Shopify's cart.js response\nexport interface CartItem {\n  id: number;\n  properties: Record<string, any>;\n  quantity: number;\n  variant_id: number;\n  key: string;\n  title: string;\n  price: number;\n  original_price: number;\n  discounted_price: number;\n  line_price: number;\n  original_line_price: number;\n  final_price: number;\n  final_line_price: number;\n  sku: string;\n  grams: number;\n  vendor: string;\n  taxable: boolean;\n  product_id: number;\n  product_has_only_default_variant: boolean;\n  gift_card: boolean;\n  url: string;\n  featured_image: {\n    aspect_ratio: number;\n    alt: string;\n    height: number;\n    url: string;\n    width: number;\n  };\n  image: string;\n  handle: string;\n  requires_shipping: boolean;\n  product_type: string;\n  product_title: string;\n  product_description: string;\n  variant_title: string;\n  variant_options: string[];\n  options_with_values: Array<{\n    name: string;\n    value: string;\n  }>;\n  line_level_discount_allocations: any[];\n  line_level_total_discount: number;\n  /**\n   * True when a Shopify Cart Transform Function (bundles) merged component\n   * variants into this line server-side — e.g. the customization fee variant\n   * gets folded into the main product's line instead of arriving as its own\n   * line item. See cart-item-row.ts's bundled-personalization fallback.\n   */\n  has_components?: boolean;\n}\n\nexport interface ShopifyCart {\n  token: string;\n  note: string | null;\n  attributes: Record<string, any>;\n  original_total_price: number;\n  total_price: number;\n  total_discount: number;\n  total_weight: number;\n  item_count: number;\n  items: CartItem[];\n  requires_shipping: boolean;\n  currency: string;\n  items_subtotal_price: number;\n  cart_level_discount_applications: any[];\n}\n\n// ─── Cache Configuration ──────────────────────────────────────────────────────\n\ninterface CartCache {\n  data: ShopifyCart;\n  timestamp: number;\n  version: string;\n}\n\nconst CACHE_KEY = \"cart_cache_v1\";\nconst CACHE_TTL = 5 * 60 * 1000; // 5 minutes in milliseconds\nconst DEBUG_CACHE_KEY = \"debug_cart_state\";\nconst DEBUG_TIMESTAMP_KEY = \"debug_cart_timestamp\";\n\n// Global debug flag (can be toggled via window.__CART_DEBUG = true)\nlet isDebugEnabled = false;\nif (typeof window !== \"undefined\") {\n  (window as any).__CART_DEBUG = isDebugEnabled;\n  Object.defineProperty(window, \"__CART_DEBUG\", {\n    get: () => isDebugEnabled,\n    set: (value: boolean) => {\n      isDebugEnabled = value;\n      console.log(`[cart-store] Debug logging ${value ? \"enabled\" : \"disabled\"}`);\n    },\n  });\n}\n\nconst debugLog = (...args: any[]) => {\n  if (isDebugEnabled) {\n    console.log(...args);\n  }\n};\n\n// Signals for cart state\nexport const cartData = signal<ShopifyCart | null>(null);\nexport const isCartLoading = signal(false);\nexport const cartError = signal<string | null>(null);\nexport const isCartOpen = signal(false);\n\n// Computed values (automatically update when cartData changes)\nexport const itemCount = computed(() => cartData.value?.item_count || 0);\nexport const totalPrice = computed(() => cartData.value?.total_price || 0);\nexport const isEmpty = computed(() => itemCount.value === 0);\n\n// Smart loading indicator - only show if truly loading (no cache available)\nexport const shouldShowLoading = computed(\n  () => isCartLoading.value && cartData.value === null\n);\n\n// ─── Limit types ──────────────────────────────────────────────────────────────\n\nexport interface LimitStatus {\n  /** Which rule applied. \"none\" means no limit is configured for this product. */\n  type: \"product\" | \"brand\" | \"global\" | \"none\";\n  /** The configured maximum quantity. 0 when type is \"none\". */\n  limit: number;\n  /** Units of this product/brand already in the cart. */\n  inCart: number;\n  /** How many more can still be added. Infinity when type is \"none\". */\n  remaining: number;\n  /** True when inCart >= limit. */\n  reached: boolean;\n}\n\nexport interface LimitContext {\n  productId: number;\n  vendor: string;\n}\n\n// ─── Internal quantity aggregates (reactive, updated on every cart change) ────\n\nconst productQtyInCart = computed<Map<number, number>>(() => {\n  const map = new Map<number, number>();\n  for (const item of cartData.value?.items ?? []) {\n    map.set(item.product_id, (map.get(item.product_id) ?? 0) + item.quantity);\n  }\n  return map;\n});\n\nconst brandQtyInCart = computed<Map<string, number>>(() => {\n  const map = new Map<string, number>();\n  for (const item of cartData.value?.items ?? []) {\n    const vendor = decodeURIComponent(item.vendor.trim());\n    map.set(vendor, (map.get(vendor) ?? 0) + item.quantity);\n  }\n  return map;\n});\n\n// ─── Public limit API ─────────────────────────────────────────────────────────\n\n/**\n * Returns the current limit status for a product.\n * Priority: product limit → brand limit → global limit → none.\n * Call this inside a signal effect or computed to get reactivity.\n */\nexport const getLimitStatus = (\n  productId: number,\n  vendor: string\n): LimitStatus => {\n  const w = window as any;\n  const pid = productId.toString();\n  const v = decodeURIComponent(vendor.trim());\n\n  const productLimit: number | undefined = w.productLimits?.[pid];\n  if (productLimit !== undefined) {\n    const inCart = productQtyInCart.value.get(productId) ?? 0;\n    const remaining = productLimit - inCart;\n    return {\n      type: \"product\",\n      limit: productLimit,\n      inCart,\n      remaining,\n      reached: remaining <= 0,\n    };\n  }\n\n  const brandLimit: number | undefined = w.brandLimits?.[v];\n  if (brandLimit !== undefined) {\n    const inCart = brandQtyInCart.value.get(v) ?? 0;\n    const remaining = brandLimit - inCart;\n    return {\n      type: \"brand\",\n      limit: brandLimit,\n      inCart,\n      remaining,\n      reached: remaining <= 0,\n    };\n  }\n\n  if (w.enableGlobalProductLimit) {\n    const globalLimit: number = w.globalProductLimit;\n    const inCart = productQtyInCart.value.get(productId) ?? 0;\n    const remaining = globalLimit - inCart;\n    return {\n      type: \"global\",\n      limit: globalLimit,\n      inCart,\n      remaining,\n      reached: remaining <= 0,\n    };\n  }\n\n  return {\n    type: \"none\",\n    limit: 0,\n    inCart: 0,\n    remaining: Infinity,\n    reached: false,\n  };\n};\n\n/**\n * Computed set of product IDs whose limit is currently reached.\n * Derived from items already in the cart — updates automatically on cart change.\n * Useful for disabling add-to-cart buttons on collection/product pages.\n */\nexport const limitReachedProductIds = computed<Set<number>>(() => {\n  const set = new Set<number>();\n  for (const item of cartData.value?.items ?? []) {\n    if (getLimitStatus(item.product_id, item.vendor).reached) {\n      set.add(item.product_id);\n    }\n  }\n  return set;\n});\n\n/**\n * Set when addToCart is blocked by a limit. Auto-clears after 3 s.\n * Components subscribe to this to show the limit notice.\n */\nexport const cartLimitError = signal<LimitStatus | null>(null);\n\nlet _limitErrorTimer: ReturnType<typeof setTimeout> | null = null;\n\nconst setLimitError = (status: LimitStatus): void => {\n  if (_limitErrorTimer !== null) clearTimeout(_limitErrorTimer);\n  cartLimitError.value = status;\n  _limitErrorTimer = setTimeout(() => {\n    cartLimitError.value = null;\n    _limitErrorTimer = null;\n  }, 3000);\n};\n\n// ─── Cross-selling: variant IDs dismissed by the user in this session ─────────\n\nconst DELETED_VARIANTS_STORAGE_KEY = \"deleted_cross_sell_variant_ids\";\n\n/**\n * Load discarded cross-sell variant IDs from sessionStorage.\n * Falls back to an empty array on parse errors or missing key.\n */\nconst loadDeletedVariantIdsFromStorage = (): number[] => {\n  try {\n    const raw = sessionStorage.getItem(DELETED_VARIANTS_STORAGE_KEY);\n    return raw ? (JSON.parse(raw) as number[]) : [];\n  } catch {\n    return [];\n  }\n};\n\nexport const deletedVariantIds = signal<number[]>(loadDeletedVariantIdsFromStorage());\n\n/**\n * Permanently discard a cross-sell variant id for the current tab session.\n * Deduplicates and updates sessionStorage so the exclusion survives\n * same-tab navigations.\n */\nexport const addToDeletedVariants = (id: number): void => {\n  const current = deletedVariantIds.value;\n  if (current.includes(id)) return;\n  const next = [...current, id];\n  deletedVariantIds.value = next;\n  try {\n    sessionStorage.setItem(DELETED_VARIANTS_STORAGE_KEY, JSON.stringify(next));\n  } catch {\n    // Silently ignore storage errors (e.g. QuotaExceededError)\n  }\n};\n\n// ─── SessionStorage Cache Helpers ─────────────────────────────────────────────\n\n/**\n * Load cart from sessionStorage cache.\n * Returns null if cache doesn't exist, is invalid, or expired.\n */\nconst loadCartFromCache = (): CartCache | null => {\n  try {\n    const cached = sessionStorage.getItem(CACHE_KEY);\n    if (!cached) {\n      debugLog(\"[cart-store] No cache found\");\n      return null;\n    }\n\n    const cache: CartCache = JSON.parse(cached);\n    debugLog(\"[cart-store] Cache loaded:\", {\n      itemCount: cache.data?.item_count,\n      timestamp: new Date(cache.timestamp).toISOString(),\n      age: `${Math.round((Date.now() - cache.timestamp) / 1000)}s`,\n    });\n\n    return cache;\n  } catch (error) {\n    console.warn(\"[cart-store] Failed to load cache:\", error);\n    return null;\n  }\n};\n\n/**\n * Check if cache is still valid (within TTL).\n */\nconst isCacheValid = (cache: CartCache | null): boolean => {\n  if (!cache) return false;\n  const age = Date.now() - cache.timestamp;\n  const isValid = age < CACHE_TTL;\n  debugLog(\"[cart-store] Cache validation:\", {\n    age: `${Math.round(age / 1000)}s`,\n    ttl: `${CACHE_TTL / 1000}s`,\n    valid: isValid,\n  });\n  return isValid;\n};\n\n/**\n * Save cart to sessionStorage cache.\n */\nconst saveCartToCache = (cart: ShopifyCart): void => {\n  try {\n    const cache: CartCache = {\n      data: cart,\n      timestamp: Date.now(),\n      version: \"1\",\n    };\n    sessionStorage.setItem(CACHE_KEY, JSON.stringify(cache));\n    debugLog(\"[cart-store] ✓ Cart saved to cache:\", {\n      itemCount: cart.item_count,\n      totalPrice: cart.total_price,\n    });\n  } catch (error) {\n    if (error instanceof Error && error.name === \"QuotaExceededError\") {\n      console.warn(\"[cart-store] SessionStorage full, clearing and retrying\");\n      sessionStorage.clear();\n      try {\n        const cache: CartCache = {\n          data: cart,\n          timestamp: Date.now(),\n          version: \"1\",\n        };\n        sessionStorage.setItem(CACHE_KEY, JSON.stringify(cache));\n      } catch (retryError) {\n        console.warn(\"[cart-store] Failed to save cache after clear:\", retryError);\n      }\n    } else {\n      console.warn(\"[cart-store] Failed to save cache:\", error);\n    }\n  }\n};\n\n/**\n * Clear the cart cache.\n */\nconst clearCartCache = (): void => {\n  try {\n    sessionStorage.removeItem(CACHE_KEY);\n    debugLog(\"[cart-store] Cache cleared\");\n  } catch (error) {\n    console.warn(\"[cart-store] Failed to clear cache:\", error);\n  }\n};\n\n/**\n * Check if cart data has changed (for detecting updates from server).\n */\nconst hasCartChanged = (\n  cached: ShopifyCart | null,\n  fresh: ShopifyCart\n): boolean => {\n  if (!cached) return true;\n\n  const changed =\n    cached.token !== fresh.token ||\n    cached.item_count !== fresh.item_count ||\n    cached.total_price !== fresh.total_price;\n\n  if (changed) {\n    debugLog(\"[cart-store] Cart changed:\", {\n      cached: {\n        token: cached.token,\n        itemCount: cached.item_count,\n        totalPrice: cached.total_price,\n      },\n      fresh: {\n        token: fresh.token,\n        itemCount: fresh.item_count,\n        totalPrice: fresh.total_price,\n      },\n    });\n  }\n\n  return changed;\n};\n\n// Track latest refresh to ignore stale responses\nlet latestRefreshTimestamp = 0;\n\n/**\n * Fetch cart data from Shopify and update cache.\n * Uses stale-while-revalidate pattern when called from initCart.\n */\nexport const refreshCart = async (isBackgroundRefresh = false): Promise<void> => {\n  // Only set loading state if this is not a background refresh\n  if (!isBackgroundRefresh) {\n    isCartLoading.value = true;\n  }\n\n  cartError.value = null;\n\n  // Track this refresh timestamp to ignore stale responses\n  const thisRefresh = Date.now();\n  latestRefreshTimestamp = thisRefresh;\n\n  debugLog(\"[cart-store] Starting cart refresh:\", {\n    background: isBackgroundRefresh,\n    hasCache: cartData.value !== null,\n  });\n\n  try {\n    const rootUrl = (window as any).Shopify?.routes?.root || \"/\";\n    const res = await fetch(`${rootUrl}cart.js`);\n\n    if (!res.ok) {\n      throw new Error(`Failed to fetch cart: ${res.statusText}`);\n    }\n\n    const freshData: ShopifyCart = await res.json();\n\n    // Only update if this is still the latest request\n    if (thisRefresh !== latestRefreshTimestamp) {\n      debugLog(\"[cart-store] Ignoring stale response\");\n      return;\n    }\n\n    debugLog(\"[cart-store] Fresh data received:\", {\n      itemCount: freshData.item_count,\n      totalPrice: freshData.total_price,\n    });\n\n    // Check if cart actually changed\n    if (hasCartChanged(cartData.value, freshData)) {\n      debugLog(\"[cart-store] Cart updated from server\");\n      cartData.value = freshData;\n      saveCartToCache(freshData);\n    } else {\n      debugLog(\"[cart-store] No changes detected, cache is current\");\n    }\n  } catch (error) {\n    console.error(\"[cart-store] Error fetching cart:\", error);\n    cartError.value = error instanceof Error ? error.message : \"Unknown error\";\n\n    if (isBackgroundRefresh) {\n      debugLog(\"[cart-store] Background refresh failed, keeping cached data\");\n      // Keep cached data, will retry on next navigation or action\n    }\n  } finally {\n    isCartLoading.value = false;\n  }\n};\n\n// ─── Shared cart-add gateway ──────────────────────────────────────────────────\n\nlet templateName = \"unknown\";\n\n/**\n * Single entry point for every POST /cart/add.js call.\n * Add GA tracking, analytics, or other side effects here.\n */\nconst executeCartAdd = async (\n  variantId: number,\n  quantity: number,\n  properties?: Record<string, any>,\n  analytics?: { source?: string; productId?: number }\n): Promise<void> => {\n  // Collect promo code from cookie\n  const promoProps: Record<string, string> = {};\n  const promoCode = getCookie(\"promo_code\");\n  if (promoCode?.trim()) {\n    promoProps[\"_promo-code\"] = promoCode;\n  }\n\n  // Collect referral properties from sessionStorage and merge with incoming properties\n  const referralProps: Record<string, string> = {};\n  const renamingMap: Record<string, string> = (window as any).referalRenaming ?? {};\n  for (const [key, value] of Object.entries(sessionStorage)) {\n    if (key.startsWith(\"referals-\")) {\n      const rawKey = key.replace(\"referals-\", \"\");\n      const propName = renamingMap[rawKey] ?? rawKey;\n      referralProps[`_${propName}`] = value;\n    }\n  }\n\n  const mergedProperties = { ...promoProps, ...referralProps, ...properties };\n  const body: Record<string, any> = { id: variantId, quantity };\n  if (Object.keys(mergedProperties).length > 0) {\n    body.properties = mergedProperties;\n  }\n\n  const baseAddUrl = (window as any).routes?.cart_add_url || \"/cart/add\";\n  // Force the AJAX JSON endpoint (`.js`) so Shopify emits the standard\n  // `product_added_to_cart` web-pixel event. The bare `/cart/add` route is\n  // treated as a form add (302 redirect) and the interceptor never fires.\n  // Guard against a value that already ends in `.js`/`.json`.\n  const addUrl = /\\.(js|json)$/.test(baseAddUrl) ? baseAddUrl : `${baseAddUrl}.js`;\n  const res = await fetch(addUrl, {\n    method: \"POST\",\n    headers: { \"Content-Type\": \"application/json\" },\n    body: JSON.stringify(body),\n  });\n\n  if (!res.ok) {\n    throw new Error(`Failed to add to cart: ${res.statusText}`);\n  }\n\n  // One successful POST adds exactly one cart line, and Shopify emits exactly\n  // one `product_added_to_cart` web-pixel event per line. Publishing `kn` here\n  // keeps the two events 1:1 so they map cleanly in GA — a multi-line add\n  // (customizable product's companion SKU, or a split-mode voucher's per-code\n  // lines) fires both events the same number of times. This relies on sending\n  // ONE item per POST: do not batch into a single `items:[…]` request, or the\n  // per-call `kn` and per-line `product_added_to_cart` would diverge.\n  //\n  // Klaviyo \"Added to Cart\" is deliberately NOT fired here — its payload is the\n  // whole cart, so it is published once per user action at the add boundary via\n  // publishKlaviyoAddedToCart() (modal-store executeAddToCart, cross-selling-cart).\n  publishKnAddToCart(analytics?.source, variantId, analytics?.productId);\n};\n\n/**\n * Push an \"Added to Cart\" event to Klaviyo's onsite tracking queue (`_learnq`).\n * Mirrors the legacy behaviour in assets/product-form.js: prices are converted\n * from cents to dollars, while `total_discount` is intentionally left in cents\n * to preserve the existing payload shape.\n */\nconst trackKlaviyoAddedToCart = (cart: ShopifyCart | null): void => {\n  if (!cart || !isMarketingAllowed()) return;\n\n  const _learnq = ((window as any)._learnq = (window as any)._learnq || []);\n\n  const klaviyoCart = {\n    total_price: cart.total_price / 100,\n    $value: cart.total_price / 100,\n    total_discount: cart.total_discount,\n    original_total_price: cart.original_total_price / 100,\n    items: cart.items,\n  };\n\n  console.log('[cart-store] Klaviyo \"Added to Cart\" tracked:', klaviyoCart);\n  _learnq.push([\"track\", \"Added to Cart\", klaviyoCart]);\n};\n\n/**\n * Publish the `kn_add_to_cart` custom pixel event (forwarded to GA) for a single\n * cart line.\n *\n * Called once per line from executeCartAdd so it stays 1:1 with Shopify's\n * per-line `product_added_to_cart` standard event — the whole point of this\n * event is to tag each Shopify add with the CTA `source` for GA mapping, which\n * only works if the two fire the same number of times. Do NOT call this at the\n * user-action boundary: a multi-line add (companion SKU, split-mode voucher)\n * must fire it per line to match.\n */\nexport const publishKnAddToCart = (\n  source?: string,\n  variantId?: number,\n  productId?: number\n): void => {\n  try {\n    const payload = {\n      source: `${source ?? \"unknown\"}_${templateName}-page`,\n      variantId,\n      productId,\n    };\n    console.log(\"[cart-store] Publishing analytics payload:\", payload);\n    (window as any).Shopify?.analytics?.publish(\"kn_add_to_cart\", payload);\n  } catch (error) {\n    console.error(\"[cart-store] Failed to publish analytics payload:\", error);\n  }\n};\n\n/**\n * Push the Klaviyo \"Added to Cart\" onsite event for a single user action.\n *\n * Unlike `kn_add_to_cart`, this must fire ONCE per add — not per line item —\n * because its payload is the whole cart (total, value, all items). Firing it per\n * line would send duplicate whole-cart events and inflate Klaviyo's add-to-cart\n * count and value. Boundaries that represent one user intent (modal-store\n * executeAddToCart, cross-selling-cart) call this exactly once after the whole\n * add succeeds, so the cart total reflects everything just added.\n */\nexport const publishKlaviyoAddedToCart = (): void => {\n  trackKlaviyoAddedToCart(cartData.value);\n};\n\n/**\n * Identify the current browser to Klaviyo by email so onsite `track` events\n * (e.g. \"Added to Cart\") are attributed to the customer's profile. Klaviyo only\n * records track events for a cookied/identified browser; identifying early on\n * page load sets the __kla_id cookie and sidesteps the identify→track race.\n *\n * Gated on marketing consent — this is onsite tracking, not the back-in-stock\n * signup flow (extended-offer-store.ts), which calls Klaviyo's API directly\n * and is an intentional user action that must keep working regardless.\n */\nexport const publishKlaviyoIdentify = (email: string): void => {\n  if (!email || !isMarketingAllowed()) return;\n  const _learnq = ((window as any)._learnq = (window as any)._learnq || []);\n  _learnq.push([\"identify\", { $email: email }]);\n};\n\n// Function to add item to cart.\n// Returns true when the item was added, false when the add was blocked\n// (e.g. by a purchase limit) or failed — callers should not open the cart\n// when this resolves to false.\nexport const addToCart = async (\n  variantId: number,\n  quantity: number = 1,\n  properties?: Record<string, any>,\n  limitContext?: LimitContext,\n  analytics?: { source?: string; productId?: number }\n): Promise<boolean> => {\n  console.log(\"Attempting add to cart: \", {\n    variantId,\n    quantity,\n    properties,\n    limitContext,\n  });\n  if (limitContext) {\n    const status = getLimitStatus(limitContext.productId, limitContext.vendor);\n    if (status.type !== \"none\" && status.remaining < quantity) {\n      setLimitError(status);\n      return false;\n    }\n  }\n\n  isCartLoading.value = true;\n  cartError.value = null;\n\n  try {\n    await executeCartAdd(variantId, quantity, properties, analytics);\n\n    // Refresh cart after adding\n    await refreshCart();\n\n    return true;\n  } catch (error) {\n    console.error(\"Error adding to cart:\", error);\n    cartError.value = error instanceof Error ? error.message : \"Unknown error\";\n    isCartLoading.value = false;\n    return false;\n  }\n};\n\n// Function to update cart item quantity\nexport const updateCartItem = async (\n  line: number,\n  quantity: number\n): Promise<void> => {\n  isCartLoading.value = true;\n  cartError.value = null;\n\n  try {\n    const res = await fetch(\n      (window as any).routes?.cart_change_url || \"/cart/change.js\",\n      {\n        method: \"POST\",\n        headers: {\n          \"Content-Type\": \"application/json\",\n        },\n        body: JSON.stringify({\n          line,\n          quantity,\n        }),\n      }\n    );\n\n    if (!res.ok) {\n      throw new Error(`Failed to update cart: ${res.statusText}`);\n    }\n\n    await refreshCart();\n\n    // Keep voucher-code arrays in step with the new line quantity (merge mode).\n    // Guarded so non-voucher carts skip the dynamic import entirely.\n    const { hasVoucherCodesOutOfSync } = await import(\"./voucher-store\");\n    if (hasVoucherCodesOutOfSync()) {\n      const { reconcileVoucherCodes } = await import(\"./voucher-store\");\n      await reconcileVoucherCodes();\n    }\n  } catch (error) {\n    console.error(\"Error updating cart:\", error);\n    cartError.value = error instanceof Error ? error.message : \"Unknown error\";\n    isCartLoading.value = false;\n  }\n};\n\n/**\n * Update a single line item's property (and quantity) via /cart/change.js.\n * Used by voucher reconciliation to rewrite the `_encoded-vouchers` array.\n */\nexport const updateCartProperty = async (\n  line: number,\n  property: string,\n  value: any,\n  quantity: number\n): Promise<void> => {\n  try {\n    const res = await fetch(\n      (window as any).routes?.cart_change_url || \"/cart/change.js\",\n      {\n        method: \"POST\",\n        headers: { \"Content-Type\": \"application/json\" },\n        body: JSON.stringify({\n          line,\n          quantity,\n          properties: { [property]: value },\n        }),\n      }\n    );\n\n    if (!res.ok) {\n      throw new Error(`Failed to update cart property: ${res.statusText}`);\n    }\n  } catch (error) {\n    console.error(\"Error updating cart property:\", error);\n    cartError.value = error instanceof Error ? error.message : \"Unknown error\";\n  }\n};\n\n// Actions to open/close the cart drawer\nexport const openCart = (): void => {\n  isCartOpen.value = true;\n};\n\nexport const closeCart = (): void => {\n  isCartOpen.value = false;\n};\n\n// Convenience wrapper: set quantity to 0 to remove the line item\nexport const removeCartItem = async (line: number): Promise<void> => {\n  await updateCartItem(line, 0);\n};\n\n// Function to clear cart\nexport const clearCart = async (): Promise<void> => {\n  isCartLoading.value = true;\n  cartError.value = null;\n\n  try {\n    const res = await fetch(\n      (window as any).routes?.cart_clear_url || \"/cart/clear.js\",\n      {\n        method: \"POST\",\n      }\n    );\n\n    if (!res.ok) {\n      throw new Error(`Failed to clear cart: ${res.statusText}`);\n    }\n\n    await refreshCart();\n  } catch (error) {\n    console.error(\"Error clearing cart:\", error);\n    cartError.value = error instanceof Error ? error.message : \"Unknown error\";\n    isCartLoading.value = false;\n  }\n};\n\n// ─── Debug: Session Storage Sync ──────────────────────────────────────────────\n\nlet sessionStorageDebounce: number | null = null;\n\n/**\n * Save cart state to sessionStorage for debugging purposes.\n * This runs asynchronously and debounced to avoid performance impact.\n * Uses separate keys from the cache to avoid conflicts.\n */\nconst saveCartToSessionStorage = () => {\n  debugLog('[cart-store] saveCartToSessionStorage called');\n\n  if (sessionStorageDebounce) {\n    clearTimeout(sessionStorageDebounce);\n  }\n\n  sessionStorageDebounce = window.setTimeout(() => {\n    debugLog('[cart-store] Debounce timer fired, saving debug data');\n    try {\n      if (cartData.value) {\n        const cartJson = JSON.stringify(cartData.value, null, 2);\n        sessionStorage.setItem(DEBUG_CACHE_KEY, cartJson);\n        sessionStorage.setItem(DEBUG_TIMESTAMP_KEY, new Date().toISOString());\n        debugLog('[cart-store] ✓ Debug data saved to sessionStorage:', {\n          itemCount: cartData.value.item_count,\n          totalPrice: cartData.value.total_price,\n        });\n      }\n    } catch (error) {\n      console.warn('[cart-store] Failed to save debug data:', error);\n    }\n  }, 500); // 500ms debounce\n};\n\n/**\n * Initialize cart store with stale-while-revalidate pattern.\n * \n * Flow:\n * 1. Try to load from sessionStorage cache (instant)\n * 2. If cache is valid, show it immediately\n * 3. Fetch fresh data from Shopify in background\n * 4. Update if changed\n */\nexport const initCart = (): void => {\n  const init = () => {\n    templateName = document.body.dataset.template ?? \"unknown\";\n    debugLog(\"[cart-store] Initializing cart store\");\n\n    // 1. Try to load from cache first (instant, 0ms)\n    const cached = loadCartFromCache();\n    if (cached && isCacheValid(cached)) {\n      debugLog(\"[cart-store] Using valid cache for instant display\");\n      cartData.value = cached.data;\n\n      // 2. Fetch fresh data in background (don't await)\n      debugLog(\"[cart-store] Starting background refresh\");\n      refreshCart(true).catch((error) => {\n        console.error(\"[cart-store] Background refresh failed:\", error);\n      });\n    } else {\n      // No valid cache, show loading and fetch\n      if (cached) {\n        debugLog(\"[cart-store] Cache expired, fetching fresh data\");\n      } else {\n        debugLog(\"[cart-store] No cache, fetching fresh data\");\n      }\n      refreshCart(false); // Not background, show loading\n    }\n  };\n\n  if (document.readyState === \"loading\") {\n    document.addEventListener(\"DOMContentLoaded\", init);\n  } else {\n    init();\n  }\n\n  // Setup debug sessionStorage sync (always enabled)\n  effect(() => {\n    debugLog(\"[cart-store] Effect triggered, cartData:\", cartData.value ? \"exists\" : \"null\");\n    if (cartData.value) {\n      saveCartToSessionStorage();\n    }\n  });\n\n  debugLog(\"[cart-store] Debug sessionStorage sync enabled\");\n};\n","import { signal, computed, effect } from \"@preact/signals-core\";\nimport { cartData, totalPrice, type CartItem } from \"./cart-store\";\nimport { getProductByHandle } from \"../utils/knocking\";\n\n/**\n * Retail (compare-at) pricing for the cart.\n *\n * Shopify's /cart.js line items carry no `compare_at_price`, so it is hydrated\n * per product from /products/{handle}.js (CDN-cached) — one request per\n * distinct product handle, never repeated within a page load.\n *\n * \"Retail\" for a line is the higher of the variant's compare-at price and the\n * line's pre-discount `original_price`, so Shopify discounts and merchant\n * compare-at prices both read as savings, and a line with neither contributes\n * zero (mixed carts never show a misleading saving).\n */\n\n/** variant id → compare-at price in cents (only variants that have one). */\nexport const compareAtByVariant = signal<Record<number, number>>({});\n\nconst requestedHandles = new Set<string>();\n\nconst hydrateHandle = async (handle: string): Promise<void> => {\n  requestedHandles.add(handle);\n  const product = await getProductByHandle(handle);\n  if (!product) return;\n\n  const next: Record<number, number> = {};\n  for (const variant of product.variants) {\n    if (variant.compare_at_price && variant.compare_at_price > 0) {\n      next[variant.id] = variant.compare_at_price;\n    }\n  }\n  compareAtByVariant.value = { ...compareAtByVariant.value, ...next };\n};\n\n/**\n * Retail unit price (cents) for a cart line. Lines merged by a Cart Transform\n * (`has_components`) fold a fee variant into `original_price`, so the main\n * variant's compare-at cannot be compared against it — they fall back to\n * their pre-discount price.\n */\nexport const getRetailUnitPrice = (\n  item: CartItem,\n  compareAt: Record<number, number>\n): number => {\n  if (item.has_components) return item.original_price;\n  return Math.max(compareAt[item.variant_id] ?? 0, item.original_price);\n};\n\n/** Sum of retail unit price × quantity across all lines, in cents. */\nexport const retailSubtotal = computed(() => {\n  const items = cartData.value?.items ?? [];\n  const compareAt = compareAtByVariant.value;\n  return items.reduce(\n    (sum, item) => sum + getRetailUnitPrice(item, compareAt) * item.quantity,\n    0\n  );\n});\n\n/** Total saving vs retail, in cents. Never negative; 0 means \"show nothing\". */\nexport const totalSavings = computed(() =>\n  Math.max(0, retailSubtotal.value - totalPrice.value)\n);\n\nlet started = false;\n\n/** Start hydrating compare-at prices whenever the cart gains a new product. */\nexport const initRetailPrices = (): void => {\n  if (started) return;\n  started = true;\n  effect(() => {\n    for (const item of cartData.value?.items ?? []) {\n      if (item.handle && !requestedHandles.has(item.handle)) {\n        void hydrateHandle(item.handle);\n      }\n    }\n  });\n};\n\n/** Test helper: forget hydrated data and in-flight bookkeeping. */\nexport const resetRetailPrices = (): void => {\n  requestedHandles.clear();\n  compareAtByVariant.value = {};\n};\n","import { signal, computed, ReadonlySignal, effect } from \"@preact/signals-core\";\n\n// 1. Raw State\nexport const productData = signal<any>(null); // Populated from Liquid\nexport const selectedVariantId = signal<number | null>(null);\nexport const activeMediaId = signal<number | null>(null);\nexport const quantity = signal(1);\nexport const selectedQuantity = signal(1); // New signal for selected quantity\n\n// 2. Computed State (The \"Selectors\")\nexport const productMedia = computed(() => productData.value?.media ?? []);\n\nexport const shipsBy = computed(() => {\n  const tags = productData.value?.tags ?? [];\n  const tag = tags.find((t: string) => t.startsWith(\"ships_by-\"));\n  const fallback = (window as any).defaultShippingDate as string | undefined;\n  return tag ? tag.replace(\"ships_by-\", \"\") : (fallback || null);\n});\n\nexport const filteredTags = computed(() => {\n  const tags = productData.value?.tags ?? [];\n  return tags.filter((t: string) => !t.startsWith(\"ships_by-\"));\n});\n\nexport const selectedVariant = computed(() => {\n  if (!productData.value || !selectedVariantId.value) {\n    // If no variant is selected, but we have product data, return the first variant\n    if (productData.value?.variants) {\n      return productData.value.variants[0];\n    }\n    return null;\n  }\n  return productData.value.variants.find(\n    (v: any) => v.id === selectedVariantId.value\n  );\n});\n\n// Signal to compute badges for each variant\nexport const variantBadges = computed(() => {\n  if (!productData.value) return [];\n\n  return productData.value.variants.map((variant: any) => {\n    const badge = computeBadge(variant.price, variant.compare_at_price);\n    return {\n      variantId: variant.id,\n      type: badge.type,\n      value: badge.value,\n    };\n  });\n});\n\nexport const isAvailable = computed(() => {\n  const variant = selectedVariant.value;\n  if (!variant) return false;\n  // Gift cards don't track inventory — Shopify reports qty 0 while available is true\n  if (productData.value?.type === \"Gift Card\") {\n    return Boolean(variant.available);\n  }\n  // Use inventory_quantity instead of available flag to match collection store behavior\n  // This ensures \"continue selling when out of stock\" doesn't prevent extended offer from showing\n  const qty = variant.inventory_quantity ?? variant.inventoryQuantity ?? 0;\n  return qty > 0;\n});\nexport const currentPrice = computed(\n  () => selectedVariant.value?.price ?? productData.value?.price\n);\nexport const compareAtPrice: ReadonlySignal<string | null> = computed(\n  () => selectedVariant.value?.compare_at_price?.toString() ?? null\n);\n\n// 3. Effects (reactions to state changes)\n\n// Initialize IDs when productData is available\neffect(() => {\n  if (productData.value) {\n    // Set initial selected variant if not already set\n    if (!selectedVariantId.value) {\n      selectedVariantId.value = productData.value.variants[0]?.id ?? null;\n    }\n    // Set initial active media if not already set\n    if (!activeMediaId.value) {\n      activeMediaId.value =\n        selectedVariant.value?.featured_media?.id ??\n        productData.value.media[0]?.id ??\n        null;\n    }\n  }\n});\n\n// Reset quantity when variant changes\neffect(() => {\n  if (selectedVariantId.value) {\n    selectedQuantity.value = 1;\n  }\n});\n\n// Sync active media when the selected variant changes.\n// peek() reads activeMediaId without subscribing to it, so gallery arrow\n// navigation never triggers this effect and causes a reset loop.\neffect(() => {\n  const variant = selectedVariant.value;\n  if (\n    variant?.featured_media &&\n    activeMediaId.peek() !== variant.featured_media.id\n  ) {\n    activeMediaId.value = variant.featured_media.id;\n  }\n});\n\n// 4. Actions\nexport const changeVariant = (id: number) => {\n  selectedVariantId.value = id;\n  syncUrlWithVariant(id);\n};\n\nexport const updateQuantity = (newQuantity: number) => {\n  selectedQuantity.value = newQuantity; // Action to update selected quantity\n};\n\nexport const setActiveMedia = (mediaId: number) => {\n  activeMediaId.value = mediaId;\n\n  // If this media is a featured image for a variant, update the selected variant\n  const variant = productData.value?.variants.find(\n    (v: any) => v.featured_media?.id === mediaId\n  );\n  if (variant && selectedVariantId.value !== variant.id) {\n    selectedVariantId.value = variant.id;\n  }\n};\n\n// Helper: Sync URL with selected variant for shareability\nexport const syncUrlWithVariant = (variantId: number) => {\n  const url = new URL(window.location.href);\n  url.searchParams.set(\"variant\", variantId.toString());\n  window.history.replaceState({}, \"\", url.toString());\n};\n\n// 5. Helper Functions\n// Function to compute the badge\nconst computeBadge = (price: number, compareAtPrice: number | null) => {\n  if (!compareAtPrice) {\n    // No compare_at_price -> Exclusive Offer\n    return { type: \"exclusive-offer\", value: null };\n  }\n\n  const raw = ((compareAtPrice - price) / compareAtPrice) * 100;\n  const percentageSaved = (window as any).alwaysRoundDown\n    ? Math.floor(raw)\n    : Math.round(raw);\n\n  if (percentageSaved <= 20) {\n    // Less than 20% saved -> Special Offer\n    return { type: \"special-offer\", value: null };\n  }\n\n  // 20% or more saved -> Regular Offer\n  return { type: \"regular\", value: percentageSaved };\n};\n","import { signal, computed } from \"@preact/signals-core\";\nimport { getLimitStatus } from \"./cart-store\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type ButtonState =\n  | \"addToCart\"\n  | \"limitReached\"\n  | \"soldOut\"\n  | \"clickToBuy\"\n  | \"extendedOffer-modal\"\n  | \"extendedOffer-redirect\"\n  | \"cbsNotify\";\n\nexport interface CardConfig {\n  optionSize: number;\n  visibleVariantCount: number;\n  hasCustomText: boolean;\n  isCustomizable: boolean;\n  extendedOfferEnabled: boolean;\n  specialOfferEnabled: boolean;\n  isCbsBox: boolean;\n  hiddenVariantIds: Set<number>;\n}\n\nexport interface BadgeResult {\n  type: \"exclusive-offer\" | \"special-offer\" | \"regular\";\n  value: number | null;\n}\n\nexport interface CardSignals {\n  selectedVariantId: ReturnType<typeof signal<number | null>>;\n  selectedVariant: ReturnType<typeof computed<any>>;\n  buttonState: ReturnType<typeof computed<ButtonState>>;\n  price: ReturnType<typeof computed<number | null>>;\n  compareAtPrice: ReturnType<typeof computed<number | null>>;\n  badge: ReturnType<typeof computed<BadgeResult>>;\n  /** Static product ID — never changes after registration. */\n  productId: number;\n  /** Static vendor string — never changes after registration. */\n  vendor: string;\n  /** Static tags array — never changes after registration. */\n  tags: string[];\n  /** Hidden 'ships_by' property extracted from tags. */\n  shipsBy: string | null;\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\nfunction computeBadge(\n  price: number | null,\n  compareAtPrice: number | null,\n  specialOfferEnabled: boolean\n): BadgeResult {\n  if (!price || !compareAtPrice) {\n    return { type: \"exclusive-offer\", value: null };\n  }\n  const raw = ((compareAtPrice - price) / compareAtPrice) * 100;\n  const pct = (window as any).alwaysRoundDown ? Math.floor(raw) : Math.round(raw);\n  if (pct <= 20 && specialOfferEnabled) {\n    return { type: \"special-offer\", value: null };\n  }\n  return { type: \"regular\", value: pct };\n}\n\nfunction computeButtonState(\n  variant: any,\n  config: CardConfig,\n  productType?: string\n): ButtonState {\n  if (!variant) return \"soldOut\";\n\n  // Gift cards don't track inventory — Shopify reports qty 0 while available is true\n  const isGiftCard = productType === \"Gift Card\";\n  const qty = variant.inventoryQuantity ?? 0;\n  const hasStock = isGiftCard ? Boolean(variant.available) : qty > 0;\n\n  if (hasStock) {\n    // Redirect to product page if there are genuinely multiple selectable variants,\n    // or if the product requires customization. Note: we use visibleVariantCount\n    // rather than optionSize — a product can have multiple option types but only\n    // one actual variant (all options have a single value), in which case we can\n    // add directly without navigating to the PDP.\n    if (\n      (config.visibleVariantCount > 1 && config.optionSize > 1) ||\n      config.hasCustomText\n    ) {\n      return \"clickToBuy\";\n    }\n    return \"addToCart\";\n  }\n\n  // Product is sold out (qty <= 0)\n  // CBS Box wins before normal extended offer — open \"Notify me for next box\" modal\n  if (config.isCbsBox) return \"cbsNotify\";\n\n  // Show \"Notify Me\" if extended offer feature is enabled\n  if (config.extendedOfferEnabled) {\n    // Customizable products open the back-in-stock modal inline on the collection\n    // page (even multi-option) rather than redirecting to the PDP.\n    if (config.isCustomizable) {\n      return \"extendedOffer-modal\";\n    }\n    if (config.optionSize > 1 || config.hasCustomText) {\n      return \"extendedOffer-redirect\";\n    }\n    return \"extendedOffer-modal\";\n  }\n\n  return \"soldOut\";\n}\n\n// ─── Registry ─────────────────────────────────────────────────────────────────\n\ninterface CardEntry {\n  productData: any;\n  config: CardConfig;\n  signals: CardSignals;\n}\n\nconst cardRegistry = new Map<string, CardEntry>();\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\nexport function registerCard(\n  cardId: string,\n  productData: any,\n  config: CardConfig,\n  initialVariantId: number | null\n): CardSignals {\n  if (cardRegistry.has(cardId)) {\n    return cardRegistry.get(cardId)!.signals;\n  }\n\n  const productId = (productData.id ?? 0) as number;\n  const vendor = ((productData.vendor as string) ?? \"\").trim();\n  const rawTags = Array.isArray(productData.tags) ? productData.tags : [];\n  const shipsByTag = rawTags.find((t: string) => t.startsWith(\"ships_by-\"));\n  const fallbackShipsBy = (window as any).defaultShippingDate as string | undefined;\n  const shipsBy = shipsByTag ? shipsByTag.replace(\"ships_by-\", \"\") : (fallbackShipsBy || null);\n  const tags = rawTags.filter((t: string) => !t.startsWith(\"ships_by-\"));\n\n  // console.log(`registerCard [${cardId}]: productId=${productId}, shipsBy=\"${shipsBy}\" (fallback: \"${fallbackShipsBy}\"), tags=`, rawTags);\n\n  const selectedVariantId = signal<number | null>(initialVariantId);\n\n  const selectedVariant = computed<any>(() => {\n    const id = selectedVariantId.value;\n    const variants: any[] = productData.variants ?? [];\n    const found = variants.find((v) => v.id === id);\n    if (found) return found;\n    // Prefer first available variant as fallback\n    return variants.find((v) => !config.hiddenVariantIds.has(v.id) && v.available) ?? variants[0] ?? null;\n  });\n\n  const buttonState = computed<ButtonState>(() => {\n    const base = computeButtonState(\n      selectedVariant.value,\n      config,\n      productData.type as string | undefined\n    );\n    if (base === \"addToCart\" && getLimitStatus(productId, vendor).reached) {\n      return \"limitReached\";\n    }\n    return base;\n  });\n\n  const price = computed<number | null>(() => selectedVariant.value?.price ?? null);\n  const compareAtPrice = computed<number | null>(\n    () => selectedVariant.value?.compare_at_price ?? null\n  );\n  const badge = computed<BadgeResult>(() =>\n    computeBadge(price.value, compareAtPrice.value, config.specialOfferEnabled)\n  );\n\n  const signals: CardSignals = {\n    selectedVariantId,\n    selectedVariant,\n    buttonState,\n    price,\n    compareAtPrice,\n    badge,\n    productId,\n    vendor,\n    tags,\n    shipsBy,\n  };\n\n  cardRegistry.set(cardId, { productData, config, signals });\n  return signals;\n}\n\nexport function changeCardVariant(cardId: string, variantId: number): void {\n  const entry = cardRegistry.get(cardId);\n  if (entry) {\n    entry.signals.selectedVariantId.value = variantId;\n\n    // Log variant change details for debugging\n    const variant = entry.productData.variants?.find((v: any) => v.id === variantId);\n    if (variant) {\n      const qty = variant.inventoryQuantity ?? 0;\n      const newButtonState = computeButtonState(\n        variant,\n        entry.config,\n        entry.productData.type as string | undefined\n      );\n      const isExtendedOffer = newButtonState === \"extendedOffer-modal\" || newButtonState === \"extendedOffer-redirect\";\n\n      console.group(`🔄 Variant Changed [${cardId}]`);\n      console.log(`Variant ID: ${variantId}`);\n      console.log(`Variant Title: ${variant.title}`);\n      console.log(`📦 Availability:`);\n      console.log(`  - inventoryQuantity: ${qty}`);\n      console.log(`  - available flag: ${variant.available}`);\n      console.log(`🎯 Extended Offer Status:`);\n      console.log(`  - Is Extended Offer: ${isExtendedOffer}`);\n      console.log(`  - Button State: ${newButtonState}`);\n      console.log(`  - Extended Offer Enabled (config): ${entry.config.extendedOfferEnabled}`);\n      console.log(`⚙️ Config:`);\n      console.log(`  - optionSize: ${entry.config.optionSize}`);\n      console.log(`  - hasCustomText: ${entry.config.hasCustomText}`);\n      console.log(`  - isCbsBox: ${entry.config.isCbsBox}`);\n      console.groupEnd();\n    }\n  }\n}\n\nexport function getCardSignals(cardId: string): CardSignals | null {\n  return cardRegistry.get(cardId)?.signals ?? null;\n}\n\nexport function getCardData(cardId: string): any | null {\n  return cardRegistry.get(cardId)?.productData ?? null;\n}\n\nexport function getCardConfig(cardId: string): CardConfig | null {\n  return cardRegistry.get(cardId)?.config ?? null;\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&\"adoptedStyleSheets\"in Document.prototype&&\"replace\"in CSSStyleSheet.prototype,s=Symbol(),o=new WeakMap;class n{constructor(t,e,o){if(this._$cssResult$=!0,o!==s)throw Error(\"CSSResult is not constructable. Use `unsafeCSS` or `css` instead.\");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const s=this.t;if(e&&void 0===t){const e=void 0!==s&&1===s.length;e&&(t=o.get(s)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&o.set(s,t))}return t}toString(){return this.cssText}}const r=t=>new n(\"string\"==typeof t?t:t+\"\",void 0,s),i=(t,...e)=>{const o=1===t.length?t[0]:e.reduce((e,s,o)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if(\"number\"==typeof t)return t;throw Error(\"Value passed to 'css' function must be a 'css' function result: \"+t+\". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.\")})(s)+t[o+1],t[0]);return new n(o,t,s)},S=(s,o)=>{if(e)s.adoptedStyleSheets=o.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(const e of o){const o=document.createElement(\"style\"),n=t.litNonce;void 0!==n&&o.setAttribute(\"nonce\",n),o.textContent=e.cssText,s.appendChild(o)}},c=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e=\"\";for(const s of t.cssRules)e+=s.cssText;return r(e)})(t):t;export{n as CSSResult,S as adoptStyles,i as css,c as getCompatibleStyle,e as supportsAdoptingStyleSheets,r as unsafeCSS};\n//# sourceMappingURL=css-tag.js.map\n","import{getCompatibleStyle as t,adoptStyles as s}from\"./css-tag.js\";export{CSSResult,css,supportsAdoptingStyleSheets,unsafeCSS}from\"./css-tag.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{is:i,defineProperty:e,getOwnPropertyDescriptor:h,getOwnPropertyNames:r,getOwnPropertySymbols:o,getPrototypeOf:n}=Object,a=globalThis,c=a.trustedTypes,l=c?c.emptyScript:\"\",p=a.reactiveElementPolyfillSupport,d=(t,s)=>t,u={toAttribute(t,s){switch(s){case Boolean:t=t?l:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,s){let i=t;switch(s){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},f=(t,s)=>!i(t,s),b={attribute:!0,type:String,converter:u,reflect:!1,useDefault:!1,hasChanged:f};Symbol.metadata??=Symbol(\"metadata\"),a.litPropertyMetadata??=new WeakMap;class y extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,s=b){if(s.state&&(s.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((s=Object.create(s)).wrapped=!0),this.elementProperties.set(t,s),!s.noAccessor){const i=Symbol(),h=this.getPropertyDescriptor(t,i,s);void 0!==h&&e(this.prototype,t,h)}}static getPropertyDescriptor(t,s,i){const{get:e,set:r}=h(this.prototype,t)??{get(){return this[s]},set(t){this[s]=t}};return{get:e,set(s){const h=e?.call(this);r?.call(this,s),this.requestUpdate(t,h,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(d(\"elementProperties\")))return;const t=n(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(d(\"finalized\")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(d(\"properties\"))){const t=this.properties,s=[...r(t),...o(t)];for(const i of s)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const s=litPropertyMetadata.get(t);if(void 0!==s)for(const[t,i]of s)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,s]of this.elementProperties){const i=this._$Eu(t,s);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(s){const i=[];if(Array.isArray(s)){const e=new Set(s.flat(1/0).reverse());for(const s of e)i.unshift(t(s))}else void 0!==s&&i.push(t(s));return i}static _$Eu(t,s){const i=s.attribute;return!1===i?void 0:\"string\"==typeof i?i:\"string\"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,s=this.constructor.elementProperties;for(const i of s.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return s(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,s,i){this._$AK(t,i)}_$ET(t,s){const i=this.constructor.elementProperties.get(t),e=this.constructor._$Eu(t,i);if(void 0!==e&&!0===i.reflect){const h=(void 0!==i.converter?.toAttribute?i.converter:u).toAttribute(s,i.type);this._$Em=t,null==h?this.removeAttribute(e):this.setAttribute(e,h),this._$Em=null}}_$AK(t,s){const i=this.constructor,e=i._$Eh.get(t);if(void 0!==e&&this._$Em!==e){const t=i.getPropertyOptions(e),h=\"function\"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:u;this._$Em=e;const r=h.fromAttribute(s,t.type);this[e]=r??this._$Ej?.get(e)??r,this._$Em=null}}requestUpdate(t,s,i,e=!1,h){if(void 0!==t){const r=this.constructor;if(!1===e&&(h=this[t]),i??=r.getPropertyOptions(t),!((i.hasChanged??f)(h,s)||i.useDefault&&i.reflect&&h===this._$Ej?.get(t)&&!this.hasAttribute(r._$Eu(t,i))))return;this.C(t,s,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,s,{useDefault:i,reflect:e,wrapped:h},r){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,r??s??this[t]),!0!==h||void 0!==r)||(this._$AL.has(t)||(this.hasUpdated||i||(s=void 0),this._$AL.set(t,s)),!0===e&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,s]of this._$Ep)this[t]=s;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[s,i]of t){const{wrapped:t}=i,e=this[s];!0!==t||this._$AL.has(s)||void 0===e||this.C(s,void 0,i,e)}}let t=!1;const s=this._$AL;try{t=this.shouldUpdate(s),t?(this.willUpdate(s),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(s)):this._$EM()}catch(s){throw t=!1,this._$EM(),s}t&&this._$AE(s)}willUpdate(t){}_$AE(t){this._$EO?.forEach(t=>t.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(t=>this._$ET(t,this[t])),this._$EM()}updated(t){}firstUpdated(t){}}y.elementStyles=[],y.shadowRootOptions={mode:\"open\"},y[d(\"elementProperties\")]=new Map,y[d(\"finalized\")]=new Map,p?.({ReactiveElement:y}),(a.reactiveElementVersions??=[]).push(\"2.1.2\");export{y as ReactiveElement,s as adoptStyles,u as defaultConverter,t as getCompatibleStyle,f as notEqual};\n//# sourceMappingURL=reactive-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,i=t=>t,s=t.trustedTypes,e=s?s.createPolicy(\"lit-html\",{createHTML:t=>t}):void 0,h=\"$lit$\",o=`lit$${Math.random().toFixed(9).slice(2)}$`,n=\"?\"+o,r=`<${n}>`,l=document,c=()=>l.createComment(\"\"),a=t=>null===t||\"object\"!=typeof t&&\"function\"!=typeof t,u=Array.isArray,d=t=>u(t)||\"function\"==typeof t?.[Symbol.iterator],f=\"[ \\t\\n\\f\\r]\",v=/<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))/g,_=/-->/g,m=/>/g,p=RegExp(`>|${f}(?:([^\\\\s\"'>=/]+)(${f}*=${f}*(?:[^ \\t\\n\\f\\r\"'\\`<>=]|(\"|')|))|$)`,\"g\"),g=/'/g,$=/\"/g,y=/^(?:script|style|textarea|title)$/i,x=t=>(i,...s)=>({_$litType$:t,strings:i,values:s}),b=x(1),w=x(2),T=x(3),E=Symbol.for(\"lit-noChange\"),A=Symbol.for(\"lit-nothing\"),C=new WeakMap,P=l.createTreeWalker(l,129);function V(t,i){if(!u(t)||!t.hasOwnProperty(\"raw\"))throw Error(\"invalid template strings array\");return void 0!==e?e.createHTML(i):i}const N=(t,i)=>{const s=t.length-1,e=[];let n,l=2===i?\"<svg>\":3===i?\"<math>\":\"\",c=v;for(let i=0;i<s;i++){const s=t[i];let a,u,d=-1,f=0;for(;f<s.length&&(c.lastIndex=f,u=c.exec(s),null!==u);)f=c.lastIndex,c===v?\"!--\"===u[1]?c=_:void 0!==u[1]?c=m:void 0!==u[2]?(y.test(u[2])&&(n=RegExp(\"</\"+u[2],\"g\")),c=p):void 0!==u[3]&&(c=p):c===p?\">\"===u[0]?(c=n??v,d=-1):void 0===u[1]?d=-2:(d=c.lastIndex-u[2].length,a=u[1],c=void 0===u[3]?p:'\"'===u[3]?$:g):c===$||c===g?c=p:c===_||c===m?c=v:(c=p,n=void 0);const x=c===p&&t[i+1].startsWith(\"/>\")?\" \":\"\";l+=c===v?s+r:d>=0?(e.push(a),s.slice(0,d)+h+s.slice(d)+o+x):s+o+(-2===d?i:x)}return[V(t,l+(t[s]||\"<?>\")+(2===i?\"</svg>\":3===i?\"</math>\":\"\")),e]};class S{constructor({strings:t,_$litType$:i},e){let r;this.parts=[];let l=0,a=0;const u=t.length-1,d=this.parts,[f,v]=N(t,i);if(this.el=S.createElement(f,e),P.currentNode=this.el.content,2===i||3===i){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(r=P.nextNode())&&d.length<u;){if(1===r.nodeType){if(r.hasAttributes())for(const t of r.getAttributeNames())if(t.endsWith(h)){const i=v[a++],s=r.getAttribute(t).split(o),e=/([.?@])?(.*)/.exec(i);d.push({type:1,index:l,name:e[2],strings:s,ctor:\".\"===e[1]?I:\"?\"===e[1]?L:\"@\"===e[1]?z:H}),r.removeAttribute(t)}else t.startsWith(o)&&(d.push({type:6,index:l}),r.removeAttribute(t));if(y.test(r.tagName)){const t=r.textContent.split(o),i=t.length-1;if(i>0){r.textContent=s?s.emptyScript:\"\";for(let s=0;s<i;s++)r.append(t[s],c()),P.nextNode(),d.push({type:2,index:++l});r.append(t[i],c())}}}else if(8===r.nodeType)if(r.data===n)d.push({type:2,index:l});else{let t=-1;for(;-1!==(t=r.data.indexOf(o,t+1));)d.push({type:7,index:l}),t+=o.length-1}l++}}static createElement(t,i){const s=l.createElement(\"template\");return s.innerHTML=t,s}}function M(t,i,s=t,e){if(i===E)return i;let h=void 0!==e?s._$Co?.[e]:s._$Cl;const o=a(i)?void 0:i._$litDirective$;return h?.constructor!==o&&(h?._$AO?.(!1),void 0===o?h=void 0:(h=new o(t),h._$AT(t,s,e)),void 0!==e?(s._$Co??=[])[e]=h:s._$Cl=h),void 0!==h&&(i=M(t,h._$AS(t,i.values),h,e)),i}class R{constructor(t,i){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=i}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){const{el:{content:i},parts:s}=this._$AD,e=(t?.creationScope??l).importNode(i,!0);P.currentNode=e;let h=P.nextNode(),o=0,n=0,r=s[0];for(;void 0!==r;){if(o===r.index){let i;2===r.type?i=new k(h,h.nextSibling,this,t):1===r.type?i=new r.ctor(h,r.name,r.strings,this,t):6===r.type&&(i=new Z(h,this,t)),this._$AV.push(i),r=s[++n]}o!==r?.index&&(h=P.nextNode(),o++)}return P.currentNode=l,e}p(t){let i=0;for(const s of this._$AV)void 0!==s&&(void 0!==s.strings?(s._$AI(t,s,i),i+=s.strings.length-2):s._$AI(t[i])),i++}}class k{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,i,s,e){this.type=2,this._$AH=A,this._$AN=void 0,this._$AA=t,this._$AB=i,this._$AM=s,this.options=e,this._$Cv=e?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode;const i=this._$AM;return void 0!==i&&11===t?.nodeType&&(t=i.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,i=this){t=M(this,t,i),a(t)?t===A||null==t||\"\"===t?(this._$AH!==A&&this._$AR(),this._$AH=A):t!==this._$AH&&t!==E&&this._(t):void 0!==t._$litType$?this.$(t):void 0!==t.nodeType?this.T(t):d(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==A&&a(this._$AH)?this._$AA.nextSibling.data=t:this.T(l.createTextNode(t)),this._$AH=t}$(t){const{values:i,_$litType$:s}=t,e=\"number\"==typeof s?this._$AC(t):(void 0===s.el&&(s.el=S.createElement(V(s.h,s.h[0]),this.options)),s);if(this._$AH?._$AD===e)this._$AH.p(i);else{const t=new R(e,this),s=t.u(this.options);t.p(i),this.T(s),this._$AH=t}}_$AC(t){let i=C.get(t.strings);return void 0===i&&C.set(t.strings,i=new S(t)),i}k(t){u(this._$AH)||(this._$AH=[],this._$AR());const i=this._$AH;let s,e=0;for(const h of t)e===i.length?i.push(s=new k(this.O(c()),this.O(c()),this,this.options)):s=i[e],s._$AI(h),e++;e<i.length&&(this._$AR(s&&s._$AB.nextSibling,e),i.length=e)}_$AR(t=this._$AA.nextSibling,s){for(this._$AP?.(!1,!0,s);t!==this._$AB;){const s=i(t).nextSibling;i(t).remove(),t=s}}setConnected(t){void 0===this._$AM&&(this._$Cv=t,this._$AP?.(t))}}class H{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,i,s,e,h){this.type=1,this._$AH=A,this._$AN=void 0,this.element=t,this.name=i,this._$AM=e,this.options=h,s.length>2||\"\"!==s[0]||\"\"!==s[1]?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=A}_$AI(t,i=this,s,e){const h=this.strings;let o=!1;if(void 0===h)t=M(this,t,i,0),o=!a(t)||t!==this._$AH&&t!==E,o&&(this._$AH=t);else{const e=t;let n,r;for(t=h[0],n=0;n<h.length-1;n++)r=M(this,e[s+n],i,n),r===E&&(r=this._$AH[n]),o||=!a(r)||r!==this._$AH[n],r===A?t=A:t!==A&&(t+=(r??\"\")+h[n+1]),this._$AH[n]=r}o&&!e&&this.j(t)}j(t){t===A?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??\"\")}}class I extends H{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===A?void 0:t}}class L extends H{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==A)}}class z extends H{constructor(t,i,s,e,h){super(t,i,s,e,h),this.type=5}_$AI(t,i=this){if((t=M(this,t,i,0)??A)===E)return;const s=this._$AH,e=t===A&&s!==A||t.capture!==s.capture||t.once!==s.once||t.passive!==s.passive,h=t!==A&&(s===A||e);e&&this.element.removeEventListener(this.name,this,s),h&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){\"function\"==typeof this._$AH?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}}class Z{constructor(t,i,s){this.element=t,this.type=6,this._$AN=void 0,this._$AM=i,this.options=s}get _$AU(){return this._$AM._$AU}_$AI(t){M(this,t)}}const j={M:h,P:o,A:n,C:1,L:N,R,D:d,V:M,I:k,H,N:L,U:z,B:I,F:Z},B=t.litHtmlPolyfillSupport;B?.(S,k),(t.litHtmlVersions??=[]).push(\"3.3.2\");const D=(t,i,s)=>{const e=s?.renderBefore??i;let h=e._$litPart$;if(void 0===h){const t=s?.renderBefore??null;e._$litPart$=h=new k(i.insertBefore(c(),t),t,void 0,s??{})}return h._$AI(t),h};export{j as _$LH,b as html,T as mathml,E as noChange,A as nothing,D as render,w as svg};\n//# sourceMappingURL=lit-html.js.map\n","import{ReactiveElement as t}from\"@lit/reactive-element\";export*from\"@lit/reactive-element\";import{render as e,noChange as r}from\"lit-html\";export*from\"lit-html\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const s=globalThis;class i extends t{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const r=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=e(r,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return r}}i._$litElement$=!0,i[\"finalized\"]=!0,s.litElementHydrateSupport?.({LitElement:i});const o=s.litElementPolyfillSupport;o?.({LitElement:i});const n={_$AK:(t,e,r)=>{t._$AK(e,r)},_$AL:t=>t._$AL};(s.litElementVersions??=[]).push(\"4.2.2\");export{i as LitElement,n as _$LE};\n//# sourceMappingURL=lit-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=t=>(e,o)=>{void 0!==o?o.addInitializer(()=>{customElements.define(t,e)}):customElements.define(t,e)};export{t as customElement};\n//# sourceMappingURL=custom-element.js.map\n","import{notEqual as t,defaultConverter as e}from\"../reactive-element.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o={attribute:!0,type:String,converter:e,reflect:!1,hasChanged:t},r=(t=o,e,r)=>{const{kind:n,metadata:i}=r;let s=globalThis.litPropertyMetadata.get(i);if(void 0===s&&globalThis.litPropertyMetadata.set(i,s=new Map),\"setter\"===n&&((t=Object.create(t)).wrapped=!0),s.set(r.name,t),\"accessor\"===n){const{name:o}=r;return{set(r){const n=e.get.call(this);e.set.call(this,r),this.requestUpdate(o,n,t,!0,r)},init(e){return void 0!==e&&this.C(o,void 0,t,e),e}}}if(\"setter\"===n){const{name:o}=r;return function(r){const n=this[o];e.call(this,r),this.requestUpdate(o,n,t,!0,r)}}throw Error(\"Unsupported decorator location: \"+n)};function n(t){return(e,o)=>\"object\"==typeof o?r(t,e,o):((t,e,o)=>{const r=e.hasOwnProperty(o);return e.constructor.createProperty(o,t),r?Object.getOwnPropertyDescriptor(e,o):void 0})(t,e,o)}export{n as property,r as standardProperty};\n//# sourceMappingURL=property.js.map\n","import{property as t}from\"./property.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */function r(r){return t({...r,state:!0,attribute:!1})}export{r as state};\n//# sourceMappingURL=state.js.map\n","import { signal, computed, effect } from \"@preact/signals-core\";\nimport { productData } from \"./product-store\";\n\n// 1. Raw State - populated by theme-settings-provider\nexport const themeSettings = signal<{\n  enableBackInStockAlerts: boolean;\n  klaviyoCompanyId: string;\n  shopDomain: string;\n  showNewsletterCheckbox: boolean;\n  promoCodes: string[];\n  enablePromoCodeModal: boolean;\n} | null>(null);\n\n// Debug: Log when theme settings change\neffect(() => {\n  console.log(\n    \"[extended-offer-store] themeSettings changed:\",\n    themeSettings.value\n  );\n});\n\n// Debug: Log when productData changes\neffect(() => {\n  console.log(\"[extended-offer-store] productData changed:\", {\n    id: productData.value?.id,\n    title: productData.value?.title,\n    tags: productData.value?.tags,\n  });\n});\n\n// 2. Computed State\nexport const isExtendedOfferEnabled = computed(() => {\n  const settings = themeSettings.value;\n  const product = productData.value;\n\n  if (!settings || !product) {\n    console.log(\n      \"[extended-offer-store] isExtendedOfferEnabled: false (no settings or product)\"\n    );\n    return false;\n  }\n\n  // Check all conditions\n  const hasKlaviyoId =\n    settings.klaviyoCompanyId && settings.klaviyoCompanyId.trim() !== \"\";\n  const featureEnabled = settings.enableBackInStockAlerts;\n\n  const result = hasKlaviyoId && featureEnabled;\n\n  console.log(\"[extended-offer-store] isExtendedOfferEnabled:\", {\n    result,\n    hasKlaviyoId,\n    klaviyoId: settings.klaviyoCompanyId,\n    featureEnabled,\n    productTags: product.tags,\n  });\n\n  // Warn if Klaviyo ID is missing when feature is enabled\n  if (featureEnabled && !hasKlaviyoId) {\n    console.warn(\n      \"[extended-offer-store] ⚠️  Back in stock alerts are ENABLED but Klaviyo Company ID is MISSING. Please configure it in theme settings.\"\n    );\n  }\n\n  return result;\n});\n\n// 3. Types\nexport interface BackInStockRequest {\n  email: string;\n  variantId: number;\n  subscribeToNewsletter?: boolean;\n}\n\nexport interface BackInStockResponse {\n  success: boolean;\n  message?: string;\n}\n\n// 4. Actions\nexport const submitBackInStockRequest = async (\n  request: BackInStockRequest\n): Promise<BackInStockResponse> => {\n  const settings = themeSettings.value;\n\n  if (!settings?.klaviyoCompanyId) {\n    return {\n      success: false,\n      message: \"Klaviyo Company ID is not configured.\",\n    };\n  }\n\n  const payload = {\n    data: {\n      type: \"back-in-stock-subscription\",\n      attributes: {\n        profile: {\n          data: {\n            type: \"profile\",\n            attributes: {\n              email: request.email,\n            },\n          },\n        },\n        channels: [\"EMAIL\"],\n      },\n      relationships: {\n        variant: {\n          data: {\n            type: \"catalog-variant\",\n            id: `$shopify:::$default:::${request.variantId}`,\n          },\n        },\n      },\n    },\n  };\n\n  try {\n    const response = await fetch(\n      `https://a.klaviyo.com/client/back-in-stock-subscriptions?company_id=${settings.klaviyoCompanyId}`,\n      {\n        method: \"POST\",\n        headers: {\n          accept: \"application/vnd.api+json\",\n          revision: \"2024-10-15\",\n          \"content-type\": \"application/vnd.api+json\",\n        },\n        body: JSON.stringify(payload),\n      }\n    );\n\n    if (response.status >= 200 && response.status < 300) {\n      return { success: true };\n    } else {\n      const errorData = await response.json().catch(() => ({}));\n      return {\n        success: false,\n        message:\n          errorData.message || \"Failed to subscribe to back-in-stock alerts.\",\n      };\n    }\n  } catch (error) {\n    console.error(\"Error submitting back-in-stock request:\", error);\n    return {\n      success: false,\n      message: \"An error occurred. Please try again later.\",\n    };\n  }\n};\n","import { LitElement } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { themeSettings } from \"../store/extended-offer-store\";\nimport { publishKlaviyoIdentify } from \"../store/cart-store\";\n\n/**\n * Bootstrap component that populates theme settings into the extended-offer-store.\n * Should be placed in layout/theme.liquid with data attributes from Liquid.\n *\n * Usage:\n * <theme-settings-provider\n *   data-enable-back-in-stock-alerts=\"true\"\n *   data-klaviyo-company-id=\"ABC123\"\n *   data-shop-domain=\"example.myshopify.com\"\n *   data-show-newsletter-checkbox=\"true\"\n * ></theme-settings-provider>\n */\n@customElement(\"theme-settings-provider\")\nexport class ThemeSettingsProvider extends LitElement {\n  @property({ type: String, attribute: \"data-enable-back-in-stock-alerts\" })\n  enableBackInStockAlerts: string | boolean = false;\n\n  @property({ type: String, attribute: \"data-klaviyo-company-id\" })\n  klaviyoCompanyId = \"\";\n\n  @property({ type: String, attribute: \"data-shop-domain\" })\n  shopDomain = \"\";\n\n  @property({ type: String, attribute: \"data-show-newsletter-checkbox\" })\n  showNewsletterCheckbox: string | boolean = false;\n\n  @property({ type: String, attribute: \"data-promo-codes\" })\n  promoCodes = \"\";\n\n  @property({ type: String, attribute: \"data-enable-promo-code-modal\" })\n  enablePromoCodeModal: string | boolean = false;\n\n  @property({ type: String, attribute: \"data-customer-email\" })\n  customerEmail = \"\";\n\n  constructor() {\n    super();\n    console.log(\"[theme-settings-provider] Constructor called\");\n  }\n\n  connectedCallback() {\n    super.connectedCallback();\n    console.log(\"[theme-settings-provider] connectedCallback - attributes:\", {\n      enableBackInStockAlerts: this.enableBackInStockAlerts,\n      klaviyoCompanyId: this.klaviyoCompanyId,\n      shopDomain: this.shopDomain,\n      showNewsletterCheckbox: this.showNewsletterCheckbox,\n    });\n  }\n\n  // This runs after properties are updated from attributes\n  firstUpdated() {\n    console.log(\"[theme-settings-provider] firstUpdated - populating settings\");\n    this._populateSettings();\n  }\n\n  private _populateSettings() {\n    const settings = {\n      enableBackInStockAlerts:\n        this.enableBackInStockAlerts === true ||\n        this.enableBackInStockAlerts === \"true\",\n      klaviyoCompanyId: this.klaviyoCompanyId,\n      shopDomain: this.shopDomain,\n      showNewsletterCheckbox:\n        this.showNewsletterCheckbox === true ||\n        this.showNewsletterCheckbox === \"true\",\n      promoCodes: this.promoCodes\n        .split(\",\")\n        .map((code) => code.trim().toUpperCase())\n        .filter((code) => code.length > 0),\n      enablePromoCodeModal:\n        this.enablePromoCodeModal === true ||\n        this.enablePromoCodeModal === \"true\",\n    };\n\n    console.log(\"[theme-settings-provider] Populating settings:\", settings);\n    themeSettings.value = settings;\n\n    // Identify the logged-in customer to Klaviyo early so onsite `track` events\n    // (e.g. \"Added to Cart\") are attributed to their profile. Empty when logged out.\n    if (this.customerEmail) publishKlaviyoIdentify(this.customerEmail);\n  }\n\n  // No rendering needed - this is a bootstrap component\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this;\n  }\n}\n","import { LitElement } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { onMarketingAllowed } from \"../utils/consent\";\n\n/**\n * Bootstrap component that injects marketing/tracking vendor scripts (Hovr,\n * Gobot) only once the visitor has consented, per Shopify Customer Privacy.\n * Audit finding this fixes: both vendors kept transmitting after opt-out\n * because they were hard-coded `<script>` tags with no consent check.\n *\n * NoFraud is deliberately not gated here — it's fraud prevention, not\n * marketing, and isn't present in this theme's codebase.\n *\n * Usage (place once in layout/theme.liquid, inside <head> or <body>):\n * <consent-gated-scripts\n *   data-hovr-enabled=\"true\"\n *   data-hovr-shop-id=\"{{ settings.hovr_shop_id }}\"\n *   data-gobot-key=\"{{ settings.gobot_key }}\"\n * ></consent-gated-scripts>\n */\n@customElement(\"consent-gated-scripts\")\nexport class ConsentGatedScripts extends LitElement {\n  @property({ type: String, attribute: \"data-hovr-enabled\" })\n  hovrEnabled: string | boolean = false;\n\n  @property({ type: String, attribute: \"data-hovr-shop-id\" })\n  hovrShopId = \"\";\n\n  @property({ type: String, attribute: \"data-gobot-key\" })\n  gobotKey = \"\";\n\n  connectedCallback(): void {\n    super.connectedCallback();\n\n    const hovrEnabled =\n      this.hovrEnabled === true || this.hovrEnabled === \"true\";\n\n    if (hovrEnabled && this.hovrShopId) {\n      onMarketingAllowed(() => this._loadHovr(this.hovrShopId));\n    }\n\n    if (this.gobotKey) {\n      onMarketingAllowed(() => this._loadGobot(this.gobotKey));\n    }\n  }\n\n  private _loadHovr(shopId: string): void {\n    if (document.getElementById(\"hio-script-identifier\")) return;\n    const script = document.createElement(\"script\");\n    script.id = \"hio-script-identifier\";\n    script.defer = true;\n    script.src = \"https://script.gethovr.com/bundle.js\";\n    script.dataset.id = shopId;\n    document.head.appendChild(script);\n  }\n\n  private _loadGobot(key: string): void {\n    if (document.getElementById(\"gobot-script\")) return;\n    const script = document.createElement(\"script\");\n    script.id = \"gobot-script\";\n    script.src = `https://track.getgobot.com/gobot/js/shopify.js?key=${encodeURIComponent(key)}`;\n    document.head.appendChild(script);\n  }\n\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this;\n  }\n}\n","import { signal, computed, effect } from \"@preact/signals-core\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\ninterface BrandCutoffDate {\n  brand_name: string;\n  holiday_shipping_cutoff_date: string;\n}\n\ninterface TimeRemaining {\n  days: number;\n  hours: number;\n  minutes: number;\n}\n\n// ─── Configuration ────────────────────────────────────────────────────────────\n\n/** Whether holiday shipping feature is enabled (from theme settings) */\nexport const isHolidayShippingEnabled = signal<boolean>(false);\n\n/** Global fallback cutoff date (from theme settings) */\nexport const globalCutoffDate = signal<string | null>(null);\n\n/** Brand-specific cutoff dates (from shop metafield JSON) */\nexport const brandCutoffDates = signal<Record<string, string>>({});\n\n/** Gift card product URL */\nexport const giftCardUrl = signal<string>(\"/products/gift-card\");\n\n// ─── Runtime State ────────────────────────────────────────────────────────────\n\n/** Current product's cutoff date (calculated from product → collection → global) */\nexport const productCutoffDate = signal<string | null>(null);\n\n/** Current product's cutoff timestamp */\nexport const productCutoffTimestamp = computed(() => {\n  const cutoff = productCutoffDate.value;\n  if (!cutoff) return null;\n  return new Date(cutoff).getTime();\n});\n\n/** Whether the cutoff has expired */\nexport const hasExpired = computed(() => {\n  const timestamp = productCutoffTimestamp.value;\n  if (!timestamp) return false;\n  return new Date().getTime() > timestamp;\n});\n\n/** Time remaining until cutoff (null if expired or no cutoff) */\nexport const timeRemaining = signal<TimeRemaining | null>(null);\n\n// ─── Internal State ───────────────────────────────────────────────────────────\n\nlet countdownInterval: number | null = null;\n\n// ─── Initialization ───────────────────────────────────────────────────────────\n\n/**\n * Initialize holiday shipping system with theme settings and metafield data.\n * Should be called once per page load from Liquid template.\n */\nexport const initHolidayShipping = (\n  enabled: boolean,\n  globalCutoff: string | null,\n  brandsJson: BrandCutoffDate[] | null,\n  giftCardProductUrl: string = \"/products/gift-card\"\n) => {\n  isHolidayShippingEnabled.value = enabled;\n  globalCutoffDate.value = globalCutoff;\n  giftCardUrl.value = giftCardProductUrl;\n\n  // Parse brands JSON into lookup object\n  if (brandsJson && Array.isArray(brandsJson)) {\n    const brandMap: Record<string, string> = {};\n    brandsJson.forEach((brand) => {\n      if (brand.brand_name && brand.holiday_shipping_cutoff_date) {\n        brandMap[brand.brand_name] = brand.holiday_shipping_cutoff_date;\n      }\n    });\n    brandCutoffDates.value = brandMap;\n  }\n\n  // Start countdown\n  startCountdown();\n};\n\n// ─── Product Cutoff Calculation ──────────────────────────────────────────────\n\n/**\n * Set the cutoff date for the current product.\n * Priority: product metafield → collection brand → global\n */\nexport const setProductCutoff = (product: any) => {\n  if (!isHolidayShippingEnabled.value) {\n    productCutoffDate.value = null;\n    return;\n  }\n\n  let cutoff: string | null = null;\n\n  // 1. Check product metafield\n  if (product?.metafields?.holiday_shipping?.holiday_shipping_cutoff_date) {\n    cutoff = product.metafields.holiday_shipping.holiday_shipping_cutoff_date;\n  }\n\n  // 2. Check collections for brand match\n  if (!cutoff && product?.collections && Array.isArray(product.collections)) {\n    for (const collection of product.collections) {\n      const handle = collection.handle;\n      if (handle && brandCutoffDates.value[handle]) {\n        cutoff = brandCutoffDates.value[handle];\n        break;\n      }\n    }\n  }\n\n  // 3. Fallback to global\n  if (!cutoff) {\n    cutoff = globalCutoffDate.value;\n  }\n\n  productCutoffDate.value = cutoff;\n};\n\n// ─── Countdown Management ─────────────────────────────────────────────────────\n\n/**\n * Start the countdown interval (updates every minute).\n */\nexport const startCountdown = () => {\n  // Clear any existing interval\n  stopCountdown();\n\n  // Update immediately\n  updateCountdown();\n\n  // Update every minute (60000ms)\n  countdownInterval = window.setInterval(() => {\n    updateCountdown();\n  }, 60000);\n};\n\n/**\n * Stop the countdown interval.\n */\nexport const stopCountdown = () => {\n  if (countdownInterval !== null) {\n    clearInterval(countdownInterval);\n    countdownInterval = null;\n  }\n};\n\n/**\n * Update the time remaining calculation.\n */\nconst updateCountdown = () => {\n  const timestamp = productCutoffTimestamp.value;\n\n  if (!timestamp) {\n    timeRemaining.value = null;\n    return;\n  }\n\n  const now = new Date().getTime();\n  const distance = timestamp - now;\n\n  if (distance < 0) {\n    timeRemaining.value = null;\n    return;\n  }\n\n  const days = Math.floor(distance / (1000 * 60 * 60 * 24));\n  const hours = Math.floor(\n    (distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)\n  );\n  const minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));\n\n  timeRemaining.value = { days, hours, minutes };\n};\n\n// ─── Utility Helpers ──────────────────────────────────────────────────────────\n\n/**\n * Format the cutoff date for display.\n */\nexport const getFormattedCutoffDate = (): string | null => {\n  const cutoff = productCutoffDate.value;\n  if (!cutoff) return null;\n\n  const date = new Date(cutoff);\n  return date.toLocaleDateString(\"en-US\", {\n    month: \"long\",\n    day: \"numeric\",\n    year: \"numeric\",\n    hour: \"numeric\",\n    minute: \"2-digit\",\n  });\n};\n\n/**\n * Get a formatted countdown string (e.g., \"2 days, 5 hours, 30 minutes\").\n */\nexport const getFormattedCountdown = (): string | null => {\n  const time = timeRemaining.value;\n  if (!time) return null;\n\n  const parts: string[] = [];\n  if (time.days > 0) parts.push(`${time.days} day${time.days !== 1 ? \"s\" : \"\"}`);\n  if (time.hours > 0) parts.push(`${time.hours} hour${time.hours !== 1 ? \"s\" : \"\"}`);\n  if (time.minutes > 0) parts.push(`${time.minutes} minute${time.minutes !== 1 ? \"s\" : \"\"}`);\n\n  return parts.join(\", \");\n};\n","import { LitElement } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { effect } from \"@preact/signals-core\";\nimport { productData, selectedVariantId } from \"../store/product-store\";\nimport { setProductCutoff, isHolidayShippingEnabled } from \"../store/holiday-store\";\n\n@customElement(\"product-provider\")\nexport class ProductProvider extends LitElement {\n  @property({ type: String, attribute: \"data-id\" }) dataId = \"\";\n  @property({ type: String, attribute: \"data-collections-id\" }) collectionsId = \"\";\n  @property({ type: String, attribute: \"data-product-cutoff\" }) productCutoff = \"\";\n\n  private _productDataLoaded = false;\n\n  connectedCallback() {\n    super.connectedCallback();\n    const scriptTag = document.getElementById(this.dataId);\n\n    if (scriptTag) {\n      const data = JSON.parse(scriptTag.textContent || \"{}\");\n\n      // Load collections if provided\n      if (this.collectionsId) {\n        const collectionsTag = document.getElementById(this.collectionsId);\n        if (collectionsTag) {\n          const collections = JSON.parse(collectionsTag.textContent || \"[]\");\n          data.collections = collections;\n        }\n      }\n\n      // Inject inventory quantities into variants (like card-provider does)\n      const quantitiesId = this.dataId.replace(\"ProductJson\", \"ProductVariantQuantities\");\n      const qtyEl = document.getElementById(quantitiesId);\n      if (qtyEl?.textContent) {\n        const qtys = qtyEl.textContent\n          .split(\"/\")\n          .filter(Boolean)\n          .map((s: string) => parseInt(s.trim(), 10));\n        data.variants.forEach((v: any, i: number) => {\n          v.inventory_quantity = isNaN(qtys[i]) ? 0 : qtys[i];\n        });\n        console.log(\"[product-provider] Injected inventory quantities:\", qtys);\n      } else {\n        console.warn(\"[product-provider] No inventory quantities found\");\n      }\n\n      // Add product-level cutoff date from Liquid metafield (if exists)\n      if (this.productCutoff) {\n        if (!data.metafields) data.metafields = {};\n        if (!data.metafields.holiday_shipping) data.metafields.holiday_shipping = {};\n        data.metafields.holiday_shipping.holiday_shipping_cutoff_date = this.productCutoff;\n      }\n\n      productData.value = data;\n      this._productDataLoaded = true;\n\n      // Initialize variant ID\n      const urlParam = new URLSearchParams(window.location.search).get('variant');\n      const urlVariantId = urlParam ? parseInt(urlParam, 10) : NaN;\n      const validVariant = !isNaN(urlVariantId) && data.variants.find((v: any) => v.id === urlVariantId);\n      selectedVariantId.value = validVariant ? urlVariantId : data.variants[0].id;\n\n      // Try to set cutoff immediately (in case holiday shipping already initialized)\n      setProductCutoff(data);\n    }\n    \n    // Watch for holiday shipping to be enabled, then re-calculate cutoff\n    effect(() => {\n      if (isHolidayShippingEnabled.value && this._productDataLoaded) {\n        setProductCutoff(productData.value);\n      }\n    });\n  }\n\n  render() {\n    return null;\n  } // Invisible\n}\n","import { LitElement, html } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport {\n  selectedVariantId,\n  productData,\n  changeVariant,\n} from \"../store/product-store\";\n\n@customElement(\"variant-selects\")\nexport class VariantSelect extends LitElement {\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this;\n  }\n  // Method to update the global signal\n  _onVariantChange(e: Event) {\n    const select = e.target as HTMLSelectElement;\n    changeVariant(parseInt(select.value));\n    // Note: URL sync now handled in changeVariant() action\n  }\n\n  render() {\n    const variants = productData.value?.variants || [];\n    const optionLabel = (productData.value?.options || []).join(\" / \");\n\n    return html`\n      <div class=\"product-form__input product-form__input--dropdown w-full rounded-sm border border-[var(--color-neutral-300)] bg-white transition-colors duration-200 focus-within:border-[var(--color-secondary-500)] focus-within:ring-2 focus-within:ring-[var(--color-secondary-200)]\">\n        <div class=\"select relative\">\n          ${optionLabel\n            ? html`<span\n                class=\"pointer-events-none absolute left-4 top-4 z-10 block text-caption text-[var(--color-neutral-400)]\"\n                >${optionLabel}</span\n              >`\n            : null}\n          <select\n            @change=${this._onVariantChange}\n            class=\"peer select__select w-full appearance-none pt-[40px] pb-4 pr-10 pl-4 text-sm font-semibold uppercase leading-none text-[var(--color-neutral-700)] outline-none tracking-wider\"\n          >\n            ${variants.map(\n              (v: any) => html`\n                <option\n                  value=\"${v.id}\"\n                  ?selected=${selectedVariantId.value === v.id}\n                >\n                  ${v.title}\n                </option>\n              `\n            )}\n          </select>\n          <svg\n            aria-hidden=\"true\"\n            focusable=\"false\"\n            viewBox=\"0 0 10 6\"\n            class=\"pointer-events-none absolute right-4 top-1/2 h-[8px] w-[14px] -translate-y-1/2 text-[var(--color-neutral-700)] transition-colors duration-200 peer-focus:text-[var(--color-secondary-500)]\"\n          >\n            <path\n              fill-rule=\"evenodd\"\n              clip-rule=\"evenodd\"\n              d=\"M9.354.646a.5.5 0 00-.708 0L5 4.293 1.354.646a.5.5 0 00-.708.708l4 4a.5.5 0 00.708 0l4-4a.5.5 0 000-.708z\"\n              fill=\"currentColor\"\n            ></path>\n          </svg>\n        </div>\n      </div>\n    `;\n  }\n}\n","import { LitElement, html } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\nimport { effect } from \"@preact/signals-core\";\nimport {\n  selectedVariantId,\n  productData,\n  changeVariant,\n} from \"../store/product-store\";\n\n/**\n * Reactive variant selector using radio buttons (for products with <5 variants).\n *\n * Renders radio button fieldsets for each product option and syncs with the\n * product store. When a radio is selected, calls changeVariant() which updates\n * the global state and URL.\n *\n * Usage in Liquid:\n * ```liquid\n * <variant-radios\n *   data-section=\"{{ section.id }}\"\n *   data-url=\"{{ product.url }}\"\n * >\n *   {%- for option in product.options_with_values -%}\n *     <fieldset>...</fieldset>\n *   {%- endfor -%}\n * </variant-radios>\n * ```\n */\n@customElement(\"variant-radios\")\nexport class VariantRadios extends LitElement {\n  @state() private _options: string[] = [];\n  @state() private _selectedVariantId: number | null = null;\n  private _isUserInteraction = false;\n\n  constructor() {\n    super();\n\n    // Subscribe to selected variant changes\n    effect(() => {\n      this._selectedVariantId = selectedVariantId.value;\n      // Only update radios if this wasn't triggered by user interaction\n      if (!this._isUserInteraction) {\n        this.updateOptionsFromSelectedVariant();\n      }\n      this._isUserInteraction = false;\n    });\n  }\n\n  // Light DOM — no shadow root (allows global CSS and Tailwind)\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this;\n  }\n\n  connectedCallback() {\n    super.connectedCallback();\n    // Set up radio change listeners\n    this.addEventListener(\"change\", this._onRadioChange);\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    this.removeEventListener(\"change\", this._onRadioChange);\n  }\n\n  /**\n   * Handle radio input change events.\n   * Reads all checked radios to build the option values array,\n   * then finds the matching variant and updates the store.\n   */\n  private _onRadioChange = (e: Event) => {\n    const target = e.target as HTMLInputElement;\n    if (target.type !== \"radio\") return;\n\n    // Mark this as user interaction to prevent the effect from overwriting\n    this._isUserInteraction = true;\n\n    // Collect all checked radio values (one per fieldset/option)\n    const fieldsets = Array.from(this.querySelectorAll(\"fieldset\"));\n    const selectedOptions = fieldsets.map((fieldset) => {\n      const checkedRadio = fieldset.querySelector(\n        'input[type=\"radio\"]:checked'\n      ) as HTMLInputElement;\n      return checkedRadio?.value ?? \"\";\n    });\n\n    // Find the variant matching these option values\n    const variant = this._findVariantByOptions(selectedOptions);\n    if (variant) {\n      changeVariant(variant.id);\n    }\n  };\n\n  /**\n   * Find a variant by matching its option values.\n   * Example: [\"Red\", \"Large\"] → variant with option1=Red, option2=Large\n   */\n  private _findVariantByOptions(options: string[]): any {\n    if (!productData.value) return null;\n\n    return productData.value.variants.find((variant: any) => {\n      // Shopify variants have option1, option2, option3\n      return options.every((opt, idx) => {\n        const optionKey = `option${idx + 1}`;\n        return variant[optionKey] === opt;\n      });\n    });\n  }\n\n  /**\n   * When the selected variant changes (from another component or initial load),\n   * update which radios are checked.\n   */\n  private updateOptionsFromSelectedVariant() {\n    if (!productData.value || !this._selectedVariantId) return;\n\n    const variant = productData.value.variants.find(\n      (v: any) => v.id === this._selectedVariantId\n    );\n    if (!variant) return;\n\n    // Use requestAnimationFrame to ensure DOM is ready\n    requestAnimationFrame(() => {\n      // Update radio checked states to match variant options\n      const fieldsets = Array.from(this.querySelectorAll(\"fieldset\"));\n      fieldsets.forEach((fieldset, idx) => {\n        const optionKey = `option${idx + 1}`;\n        const optionValue = variant[optionKey];\n        if (!optionValue) return;\n\n        const radios = fieldset.querySelectorAll(\n          'input[type=\"radio\"]'\n        ) as NodeListOf<HTMLInputElement>;\n        radios.forEach((radio) => {\n          radio.checked = radio.value === optionValue;\n        });\n      });\n    });\n  }\n\n  render() {\n    // The Liquid template already renders the radio HTML structure,\n    // so we just need to render a slot to display it.\n    // The component's main job is to handle change events and sync state.\n    return html`<slot></slot>`;\n  }\n}\n","import { LitElement, html } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { currentPrice, compareAtPrice } from \"../store/product-store\";\nimport { effect } from \"@preact/signals-core\";\nimport { formatToDollarCurrencyString } from \"../utils/knocking\";\n\n@customElement(\"price-pp\")\nexport class PricePP extends LitElement {\n  @property({ type: String }) price: string | null = null;\n  @property({ type: String }) compareAtPrice: string | null = null;\n\n  constructor() {\n    super();\n\n    effect(() => {\n      this.price = currentPrice.value;\n      this.compareAtPrice = compareAtPrice.value;\n    });\n  }\n\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this;\n  }\n\n  private _formatPrice(value: string | number | null | undefined): string {\n    if (value == null || value === \"\") return \"N/A\";\n    const cents = typeof value === \"string\" ? parseInt(value, 10) : value;\n    if (Number.isNaN(cents)) return \"N/A\";\n    return formatToDollarCurrencyString(cents);\n  }\n\n  private _toCents(value: string | number | null | undefined): number | null {\n    if (value == null || value === \"\") return null;\n    const cents = typeof value === \"string\" ? parseInt(value, 10) : value;\n    if (Number.isNaN(cents)) return null;\n    return cents;\n  }\n\n  render() {\n    const priceFormatted = this._formatPrice(this.price);\n    const compareCents = this._toCents(this.compareAtPrice);\n    const compareFormatted =\n      compareCents != null && compareCents > 0\n        ? this._formatPrice(compareCents)\n        : null;\n    const isCompact = this.hasAttribute(\"compact\");\n\n    return html`\n    <div class=\"flex items-center gap-3 md:gap-7.5\">\n      <span\n        class=\"price-pp__current ${isCompact ? \"text-lg md:text-3xl\" : \"text-3xl\"} font-bold text-[var(--color-secondary-500)]\"\n      >${priceFormatted}</span>\n        ${compareFormatted\n          ? html`<span class=\"price-pp__compare ${isCompact ? \"text-base md:text-xl\" : \"text-xl md:text-2xl\"} line-through font-semibold text-[var(--color-danger-700)]\">${compareFormatted}</span>`\n          : \"\"}\n      </div>\n    `;\n  }\n}\n","import { LitElement, html } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { selectedVariantId } from \"../store/product-store\";\nimport { variantBadges } from \"../store/product-store\";\nimport { effect } from \"@preact/signals-core\";\n\n@customElement(\"badges-pp\")\nexport class BadgesPP extends LitElement {\n  @property({ type: Object }) badge: { type: string; value: number | null } | null = null;\n\n  constructor() {\n    super();\n\n    // Listen to changes in the selected variant and update the badge\n    effect(() => {\n      const selectedId = selectedVariantId.value;\n      const badges = variantBadges.value;\n      this.badge = badges.find((b: any) => b.variantId === selectedId) ?? null;\n    });\n  }\n\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this; // Render in the light DOM\n  }\n\n  render() {\n    if (!this.badge) {\n      return html`<span>No badge available</span>`;\n    }\n\n    const { type, value } = this.badge;\n\n    switch (type) {\n      case \"exclusive-offer\":\n        return html`<span class=\"discount-badge\">Exclusive Offer</span>`;\n      case \"special-offer\":\n        return html`<span class=\"discount-badge\">Special Offer</span>`;\n      case \"regular\":\n        return html`<span class=\"discount-badge\">${value}% Off</span>`;\n      default:\n        return html`<span>Unknown badge type</span>`;\n    }\n  }\n}\n","import { LitElement, html, nothing } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\nimport { effect } from \"@preact/signals-core\";\nimport {\n  productMedia,\n  activeMediaId,\n  setActiveMedia,\n} from \"../store/product-store\";\n\ndeclare global {\n  interface Window {\n    pauseAllMedia?: () => void;\n  }\n}\n\n@customElement(\"product-gallery-lit\")\nexport class ProductGallery extends LitElement {\n  @state() private _media: any[] = [];\n  @state() private _activeMediaId: number | null = null;\n  @state() private _canScrollUp = false;\n  @state() private _canScrollDown = false;\n  @state() private _canScrollLeft = false;\n  @state() private _canScrollRight = false;\n\n  private _sizeChartDelegate: ((e: Event) => void) | null = null;\n  private _desktopScrollHandler: (() => void) | null = null;\n  private _mobileScrollHandler: (() => void) | null = null;\n\n  constructor() {\n    super();\n    effect(() => {\n      this._media = productMedia.value;\n      this._activeMediaId = activeMediaId.value;\n    });\n  }\n\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this;\n  }\n\n  connectedCallback() {\n    super.connectedCallback();\n    this._sizeChartDelegate = (e: Event) => {\n      const target = (e.target as HTMLElement).closest('a[href=\"#sizechart\"]');\n      if (!target) return;\n      e.preventDefault();\n      const lastMedia = this._media[this._media.length - 1];\n      if (lastMedia) {\n        setActiveMedia(lastMedia.id);\n        this.scrollIntoView({ behavior: \"smooth\", block: \"start\" });\n      }\n    };\n    document.addEventListener(\"click\", this._sizeChartDelegate);\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    if (this._sizeChartDelegate) {\n      document.removeEventListener(\"click\", this._sizeChartDelegate);\n      this._sizeChartDelegate = null;\n    }\n    this._removeScrollListeners();\n  }\n\n  firstUpdated() {\n    this._attachScrollListeners();\n  }\n\n  updated() {\n    // Desktop and mobile strips render thumbnails with the same data-thumb-id,\n    // so scope the lookup to each container and scroll them independently.\n    this._scrollActiveThumbIntoView(\".gallery-thumbs-desktop\", \"vertical\");\n    this._scrollActiveThumbIntoView(\".gallery-thumbs-mobile\", \"horizontal\");\n    // Re-attach listeners if DOM changed (e.g. media list populated)\n    this._attachScrollListeners();\n    requestAnimationFrame(() => this._updateScrollFlags());\n  }\n\n  private _scrollActiveThumbIntoView(\n    containerSelector: string,\n    axis: \"vertical\" | \"horizontal\"\n  ) {\n    const container = this.querySelector<HTMLElement>(containerSelector);\n    if (!container) return;\n    const activeLi = container.querySelector<HTMLElement>(\n      `[data-thumb-id=\"${this._activeMediaId}\"]`\n    );\n    if (!activeLi) return;\n\n    const c = container.getBoundingClientRect();\n    const t = activeLi.getBoundingClientRect();\n\n    // Only scroll when the active thumb is out of view; align it to the\n    // leading (left/top) edge of the visible strip.\n    if (axis === \"horizontal\") {\n      if (t.left < c.left || t.right > c.right) {\n        container.scrollBy({ left: t.left - c.left, behavior: \"smooth\" });\n      }\n    } else {\n      if (t.top < c.top || t.bottom > c.bottom) {\n        container.scrollBy({ top: t.top - c.top, behavior: \"smooth\" });\n      }\n    }\n  }\n\n  // --- Scroll tracking ---\n\n  private _attachScrollListeners() {\n    const desktopList = this.querySelector<HTMLElement>(\n      \".gallery-thumbs-desktop\"\n    );\n    const mobileList = this.querySelector<HTMLElement>(\n      \".gallery-thumbs-mobile\"\n    );\n\n    if (desktopList && !this._desktopScrollHandler) {\n      this._desktopScrollHandler = () => this._updateScrollFlags();\n      desktopList.addEventListener(\"scroll\", this._desktopScrollHandler, {\n        passive: true,\n      });\n    }\n    if (mobileList && !this._mobileScrollHandler) {\n      this._mobileScrollHandler = () => this._updateScrollFlags();\n      mobileList.addEventListener(\"scroll\", this._mobileScrollHandler, {\n        passive: true,\n      });\n    }\n  }\n\n  private _removeScrollListeners() {\n    const desktopList = this.querySelector<HTMLElement>(\n      \".gallery-thumbs-desktop\"\n    );\n    const mobileList = this.querySelector<HTMLElement>(\n      \".gallery-thumbs-mobile\"\n    );\n    if (desktopList && this._desktopScrollHandler) {\n      desktopList.removeEventListener(\"scroll\", this._desktopScrollHandler);\n      this._desktopScrollHandler = null;\n    }\n    if (mobileList && this._mobileScrollHandler) {\n      mobileList.removeEventListener(\"scroll\", this._mobileScrollHandler);\n      this._mobileScrollHandler = null;\n    }\n  }\n\n  private _updateScrollFlags() {\n    const desktopList = this.querySelector<HTMLElement>(\n      \".gallery-thumbs-desktop\"\n    );\n    if (desktopList) {\n      this._canScrollUp = desktopList.scrollTop > 1;\n      this._canScrollDown =\n        desktopList.scrollTop + desktopList.clientHeight <\n        desktopList.scrollHeight - 1;\n    }\n    const mobileList = this.querySelector<HTMLElement>(\n      \".gallery-thumbs-mobile\"\n    );\n    if (mobileList) {\n      this._canScrollLeft = mobileList.scrollLeft > 1;\n      this._canScrollRight =\n        mobileList.scrollLeft + mobileList.clientWidth <\n        mobileList.scrollWidth - 1;\n    }\n  }\n\n  private _scrollThumbnails(\n    direction: \"up\" | \"down\" | \"left\" | \"right\"\n  ) {\n    if (direction === \"up\" || direction === \"down\") {\n      const list = this.querySelector<HTMLElement>(\".gallery-thumbs-desktop\");\n      if (list)\n        list.scrollBy({\n          top: direction === \"down\" ? 128 : -128,\n          behavior: \"smooth\",\n        });\n    } else {\n      const list = this.querySelector<HTMLElement>(\".gallery-thumbs-mobile\");\n      if (list)\n        list.scrollBy({\n          left: direction === \"right\" ? 78 : -78,\n          behavior: \"smooth\",\n        });\n    }\n  }\n\n  // --- Navigation ---\n\n  private _handleThumbnailClick(mediaId: number) {\n    window.pauseAllMedia?.();\n    setActiveMedia(mediaId);\n  }\n\n  private _handleNavClick(direction: \"prev\" | \"next\") {\n    if (!this._activeMediaId) return;\n    const currentIndex = this._media.findIndex(\n      (m) => m.id === this._activeMediaId\n    );\n    if (currentIndex === -1) return;\n    const nextIndex =\n      direction === \"next\" ? currentIndex + 1 : currentIndex - 1;\n    if (nextIndex < 0 || nextIndex >= this._media.length) return;\n    window.pauseAllMedia?.();\n    setActiveMedia(this._media[nextIndex].id);\n  }\n\n  // --- Media helpers ---\n\n  private _getImageSrc(media: any): string | null {\n    const src =\n      media.preview_image?.src ??\n      (media.media_type === \"image\" ? media.src : undefined);\n    if (!src) return null;\n    return src.startsWith(\"//\") ? `https:${src}` : src;\n  }\n\n  // --- Arrow classes ---\n\n  private _arrowClasses(side: \"prev\" | \"next\"): string {\n    return [\n      \"absolute top-1/2 -translate-y-1/2 z-10\",\n      side === \"prev\" ? \"left-3\" : \"right-3\",\n      \"bg-[#eafcff] rounded-full w-[35px] h-[35px]\",\n      \"flex items-center justify-center\",\n      \"shadow-[0px_10px_38px_-10px_rgba(0,0,0,0.75)]\",\n      // Slide-in from edges + fade. Mobile: always visible and in place.\n      side === \"prev\"\n        ? \"opacity-0 -translate-x-[100px] group-hover:opacity-100 group-hover:translate-x-0 max-lg:opacity-100 max-lg:translate-x-0\"\n        : \"opacity-0 translate-x-[100px] group-hover:opacity-100 group-hover:translate-x-0 max-lg:opacity-100 max-lg:translate-x-0\",\n      \"transition-all duration-300\",\n      \"disabled:hidden\",\n      \"cursor-pointer\",\n    ].join(\" \");\n  }\n\n  // --- Caret SVG ---\n\n  private _caretSvg(direction: \"left\" | \"right\" | \"up\" | \"down\") {\n    const points: Record<string, string> = {\n      left: \"15 18 9 12 15 6\",\n      right: \"9 18 15 12 9 6\",\n      up: \"18 15 12 9 6 15\",\n      down: \"18 9 12 15 6 9\",\n    };\n    return html`<svg\n      aria-hidden=\"true\"\n      focusable=\"false\"\n      role=\"presentation\"\n      viewBox=\"0 0 24 24\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      class=\"w-[0.8rem] h-[0.8rem] fill-none stroke-[#22355b]\"\n      stroke-width=\"2\"\n    >\n      <polyline points=\"${points[direction]}\"></polyline>\n    </svg>`;\n  }\n\n  // --- Media type icon overlays for thumbnails ---\n\n  private _mediaTypeIcon(mediaType: string) {\n    if (mediaType === \"video\" || mediaType === \"external_video\") {\n      return html`<span\n        class=\"absolute bottom-1 right-1 w-4 h-4 bg-black/50 rounded-full flex items-center justify-center\"\n      >\n        <svg\n          viewBox=\"0 0 16 16\"\n          class=\"w-2.5 h-2.5 fill-white\"\n          xmlns=\"http://www.w3.org/2000/svg\"\n        >\n          <polygon points=\"4,2 14,8 4,14\"></polygon>\n        </svg>\n      </span>`;\n    }\n    if (mediaType === \"model\") {\n      return html`<span\n        class=\"absolute bottom-1 right-1 w-4 h-4 bg-black/50 rounded-full flex items-center justify-center\"\n      >\n        <svg\n          viewBox=\"0 0 16 16\"\n          class=\"w-2.5 h-2.5 fill-white\"\n          xmlns=\"http://www.w3.org/2000/svg\"\n        >\n          <path d=\"M8 1L14 4.5V11.5L8 15L2 11.5V4.5L8 1Z\"></path>\n        </svg>\n      </span>`;\n    }\n    return nothing;\n  }\n\n  // --- Main media rendering (image / video / 3D model) ---\n\n  private _renderMainMedia(media: any) {\n    const src = this._getImageSrc(media);\n    if (!src) return nothing;\n\n    if (media.media_type === \"image\") {\n      return html`<img\n        src=\"${src}\"\n        alt=\"${media.alt ?? \"\"}\"\n        loading=\"eager\"\n        width=\"${media.width}\"\n        height=\"${media.height}\"\n        class=\"absolute inset-0 w-full h-full object-contain\"\n      />`;\n    }\n\n    if (\n      media.media_type === \"video\" ||\n      media.media_type === \"external_video\"\n    ) {\n      return html`\n        <deferred-media\n          class=\"deferred-media absolute inset-0 w-full h-full\"\n          data-media-id=\"${media.id}\"\n          style=\"padding-top: 0;\"\n        >\n          <button\n            id=\"Deferred-Poster-${media.id}\"\n            class=\"deferred-media__poster w-full h-full\"\n            type=\"button\"\n          >\n            <span class=\"deferred-media__poster-button motion-reduce\">\n              <span class=\"sr-only\">Play video</span>\n              <svg\n                class=\"w-12 h-12\"\n                viewBox=\"0 0 64 64\"\n                fill=\"none\"\n                xmlns=\"http://www.w3.org/2000/svg\"\n              >\n                <circle cx=\"32\" cy=\"32\" r=\"32\" fill=\"rgba(0,0,0,0.4)\" />\n                <polygon points=\"26,20 46,32 26,44\" fill=\"white\" />\n              </svg>\n            </span>\n            <img\n              src=\"${src}\"\n              alt=\"${media.alt ?? \"\"}\"\n              loading=\"eager\"\n              class=\"absolute inset-0 w-full h-full object-contain\"\n            />\n          </button>\n          <template>\n            ${media.media_type === \"video\"\n              ? html`<video\n                  playsinline\n                  controls\n                  autoplay\n                  style=\"width:100%;height:100%;object-fit:contain;\"\n                >\n                  ${(media.sources ?? []).map(\n                    (s: any) =>\n                      html`<source src=\"${s.url}\" type=\"${s.mime_type}\" />`\n                  )}\n                </video>`\n              : html`<iframe\n                  src=\"${this._getExternalVideoUrl(media)}\"\n                  allow=\"autoplay; encrypted-media\"\n                  allowfullscreen\n                  style=\"width:100%;height:100%;border:0;\"\n                ></iframe>`}\n          </template>\n        </deferred-media>\n      `;\n    }\n\n    if (media.media_type === \"model\") {\n      return html`\n        <product-model\n          class=\"deferred-media absolute inset-0 w-full h-full\"\n          data-media-id=\"${media.id}\"\n          style=\"padding-top: 0;\"\n        >\n          <button\n            id=\"Deferred-Poster-${media.id}\"\n            class=\"deferred-media__poster w-full h-full\"\n            type=\"button\"\n          >\n            <span class=\"deferred-media__poster-button motion-reduce\">\n              <span class=\"sr-only\">View 3D model</span>\n              <svg\n                class=\"w-12 h-12\"\n                viewBox=\"0 0 64 64\"\n                fill=\"none\"\n                xmlns=\"http://www.w3.org/2000/svg\"\n              >\n                <circle cx=\"32\" cy=\"32\" r=\"32\" fill=\"rgba(0,0,0,0.4)\" />\n                <path\n                  d=\"M32 18L46 26V42L32 50L18 42V26L32 18Z\"\n                  stroke=\"white\"\n                  stroke-width=\"2\"\n                  fill=\"none\"\n                />\n              </svg>\n            </span>\n            <img\n              src=\"${src}\"\n              alt=\"${media.alt ?? \"\"}\"\n              loading=\"eager\"\n              class=\"absolute inset-0 w-full h-full object-contain\"\n            />\n          </button>\n          <template>\n            ${media.sources?.[0]?.url\n              ? html`<model-viewer\n                  src=\"${media.sources[0].url}\"\n                  camera-controls\n                  interaction-prompt=\"none\"\n                  style=\"width:100%;height:100%;\"\n                ></model-viewer>`\n              : nothing}\n          </template>\n        </product-model>\n      `;\n    }\n\n    // Fallback: render as image\n    return html`<img\n      src=\"${src}\"\n      alt=\"${media.alt ?? \"\"}\"\n      loading=\"eager\"\n      class=\"absolute inset-0 w-full h-full object-contain\"\n    />`;\n  }\n\n  private _getExternalVideoUrl(media: any): string {\n    if (media.host === \"youtube\") {\n      return `https://www.youtube.com/embed/${media.external_id}?autoplay=1`;\n    }\n    if (media.host === \"vimeo\") {\n      return `https://player.vimeo.com/video/${media.external_id}?autoplay=1`;\n    }\n    return media.sources?.[0]?.url ?? \"\";\n  }\n\n  // --- Thumbnail rendering ---\n\n  private _renderThumbnail(\n    media: any,\n    size: \"desktop\" | \"mobile\"\n  ) {\n    const thumbSrc = this._getImageSrc(media);\n    const isActive = media.id === this._activeMediaId;\n    const sizeClass =\n      size === \"desktop\"\n        ? \"w-[120px] h-[120px]\"\n        : \"w-[70px] h-[70px]\";\n\n    return html`\n      <li\n        data-thumb-id=\"${media.id}\"\n        class=\"relative flex-none ${sizeClass} cursor-pointer rounded overflow-hidden border ${isActive\n          ? \"border-gray-500\"\n          : \"border-gray-200\"}\"\n        @click=${() => this._handleThumbnailClick(media.id)}\n      >\n        ${thumbSrc\n          ? html`<img\n              src=\"${thumbSrc}\"\n              alt=\"${media.alt ?? \"\"}\"\n              loading=\"lazy\"\n              class=\"w-full h-full object-contain\"\n            />`\n          : nothing}\n        ${this._mediaTypeIcon(media.media_type)}\n      </li>\n    `;\n  }\n\n  // --- Thumbnail scroll button ---\n\n  private _thumbScrollBtn(\n    direction: \"up\" | \"down\" | \"left\" | \"right\",\n    disabled: boolean,\n    size: \"desktop\" | \"mobile\"\n  ) {\n    const sizeClass =\n      size === \"desktop\"\n        ? \"w-[35px] h-[35px]\"\n        : \"w-[20px] h-[20px]\";\n\n    return html`<button\n      type=\"button\"\n      aria-label=\"Scroll thumbnails ${direction}\"\n      ?disabled=${disabled}\n      @click=${() => this._scrollThumbnails(direction)}\n      class=\"${sizeClass} bg-[#eafcff] rounded-full flex items-center justify-center cursor-pointer disabled:opacity-30 disabled:cursor-default flex-none\"\n    >\n      ${this._caretSvg(direction)}\n    </button>`;\n  }\n\n  // --- Render ---\n\n  render() {\n    if (this._media.length === 0) {\n      return html`<div class=\"p-4 text-sm text-gray-400\">\n        Loading gallery...\n      </div>`;\n    }\n\n    const activeMedia = this._media.find((m) => m.id === this._activeMediaId);\n    const currentIndex = this._media.findIndex(\n      (m) => m.id === this._activeMediaId\n    );\n    const isFirst = currentIndex === 0;\n    const isLast = currentIndex === this._media.length - 1;\n    const hasMultiple = this._media.length > 1;\n\n    return html`\n      <div class=\"${hasMultiple ? 'flex flex-col lg:grid lg:grid-cols-[120px_1fr] lg:gap-4' : ''}\"\n        <!-- Desktop: vertical thumbnail sidebar (left) -->\n        ${hasMultiple\n          ? html`\n              <div class=\"hidden lg:block relative\">\n                <div class=\"absolute inset-0 flex flex-col items-center\">\n                  <div class=\"flex justify-center mb-2 flex-none\">\n                    ${this._thumbScrollBtn(\"up\", !this._canScrollUp, \"desktop\")}\n                  </div>\n                  <ul\n                    class=\"gallery-thumbs-desktop flex flex-col gap-2 overflow-y-auto list-none p-0 m-0 flex-1 min-h-0 [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\"\n                  >\n                    ${this._media.map((m) =>\n                      this._renderThumbnail(m, \"desktop\")\n                    )}\n                  </ul>\n                  <div class=\"flex justify-center mt-2 flex-none\">\n                    ${this._thumbScrollBtn(\n                      \"down\",\n                      !this._canScrollDown,\n                      \"desktop\"\n                    )}\n                  </div>\n                </div>\n              </div>\n            `\n          : nothing}\n\n        <!-- Main image area -->\n        <div class=\"flex-1 min-w-0\">\n          <div\n            class=\"group relative aspect-square overflow-hidden rounded-lg border border-gray-200\"\n          >\n            ${activeMedia ? this._renderMainMedia(activeMedia) : nothing}\n            ${hasMultiple\n              ? html`\n                  <button\n                    type=\"button\"\n                    aria-label=\"Previous slide\"\n                    @click=${() => this._handleNavClick(\"prev\")}\n                    ?disabled=${isFirst}\n                    class=\"${this._arrowClasses(\"prev\")}\"\n                  >\n                    ${this._caretSvg(\"left\")}\n                  </button>\n                  <button\n                    type=\"button\"\n                    aria-label=\"Next slide\"\n                    @click=${() => this._handleNavClick(\"next\")}\n                    ?disabled=${isLast}\n                    class=\"${this._arrowClasses(\"next\")}\"\n                  >\n                    ${this._caretSvg(\"right\")}\n                  </button>\n                `\n              : nothing}\n          </div>\n\n          <!-- Mobile: horizontal thumbnail strip (below) -->\n          ${hasMultiple\n            ? html`\n                <div\n                  class=\"flex lg:hidden items-center gap-1 mt-2\"\n                >\n                  ${this._thumbScrollBtn(\n                    \"left\",\n                    !this._canScrollLeft,\n                    \"mobile\"\n                  )}\n                  <ul\n                    class=\"gallery-thumbs-mobile flex overflow-x-auto gap-2 list-none p-0 m-0 flex-1 [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\"\n                  >\n                    ${this._media.map((m) =>\n                      this._renderThumbnail(m, \"mobile\")\n                    )}\n                  </ul>\n                  ${this._thumbScrollBtn(\n                    \"right\",\n                    !this._canScrollRight,\n                    \"mobile\"\n                  )}\n                </div>\n              `\n            : nothing}\n        </div>\n      </div>\n    `;\n  }\n}\n","import { signal, computed } from \"@preact/signals-core\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\n/**\n * Context passed through the modal chain and available to all modals.\n */\nexport interface ModalContext {\n  productId?: number;\n  variantId?: number;\n  quantity?: number;\n  productTitle?: string;\n  variantTitle?: string;\n  customization?: Record<string, any>;\n  triggerButton?: HTMLButtonElement;\n  vendor?: string;\n  imageUrl?: string;\n  source?: string;\n  /** Custom SKU variant ID — when set, a second line item is added to the cart after the main product. */\n  customSkuVariantId?: number;\n  /** True when the product is a voucher product — routes add-to-cart through the voucher flow. */\n  isVoucher?: boolean;\n  /** Selected variant SKU — required by the voucher Lambda fetch. */\n  variantSku?: string;\n  /** True when voucher codes should merge into one line item (MergeVoucherCodeVariants tag). */\n  mergeVouchers?: boolean;\n  [key: string]: any;\n}\n\n/**\n * Modal configuration for registration.\n * Modals open reactively by watching `activeModal` signal — no `show()` method needed.\n */\nexport interface ModalConfig {\n  name: string;\n  priority: number;\n  shouldShow: (context: ModalContext) => boolean;\n  onApprove?: (context: ModalContext) => void | Promise<void>;\n  onCancel?: (context: ModalContext) => void;\n}\n\n// ─── State ────────────────────────────────────────────────────────────────────\n\nexport const registeredModals = signal<ModalConfig[]>([]);\nexport const activeModal = signal<string | null>(null);\nexport const modalContext = signal<ModalContext | null>(null);\nexport const isProcessing = signal(false);\n\n// ─── Computed Values ──────────────────────────────────────────────────────────\n\nexport const sortedModals = computed(() =>\n  [...registeredModals.value].sort((a, b) => a.priority - b.priority)\n);\n\nexport const currentModalConfig = computed(() =>\n  sortedModals.value.find((m) => m.name === activeModal.value) || null\n);\n\n// ─── Chain Promise ────────────────────────────────────────────────────────────\n\n// Resolves the Promise returned by startModalChain when the chain ends.\nlet _resolveChain: ((success: boolean) => void) | null = null;\n\n// ─── Actions ──────────────────────────────────────────────────────────────────\n\nexport const registerModal = (config: ModalConfig) => {\n  if (!config.name || config.priority === undefined || !config.shouldShow) {\n    console.error(\"[modal-store] Invalid modal config:\", config);\n    return;\n  }\n  registeredModals.value = [\n    ...registeredModals.value.filter((m) => m.name !== config.name),\n    config,\n  ];\n  console.log(`[modal-store] Registered modal: ${config.name} (priority: ${config.priority})`);\n};\n\nexport const unregisterModal = (name: string) => {\n  registeredModals.value = registeredModals.value.filter((m) => m.name !== name);\n  console.log(`[modal-store] Unregistered modal: ${name}`);\n};\n\n/**\n * Start the modal chain with the given context.\n * Shows modals in priority order; when all are approved, executes the real\n * cart add and opens the cart. Returns true on success, false if cancelled.\n *\n * When at least one modal needs to show, this returns a Promise that stays\n * pending until the user approves or cancels (driven by approveModal /\n * cancelModal calls from the modal components themselves).\n */\nexport const startModalChain = (context: ModalContext): Promise<boolean> => {\n  if (isProcessing.value) {\n    console.warn(\"[modal-store] Already processing, ignoring\");\n    return Promise.resolve(false);\n  }\n\n  isProcessing.value = true;\n  modalContext.value = context;\n\n  const nextModal = sortedModals.value.find((m) => {\n    try {\n      return m.shouldShow(context);\n    } catch (error) {\n      console.error(`[modal-store] Error in shouldShow for ${m.name}:`, error);\n      return false;\n    }\n  });\n\n  if (!nextModal) {\n    // No modals needed — execute add-to-cart immediately\n    console.log(\"[modal-store] No modals to show, executing add-to-cart\");\n    return executeAddToCart(context).then((added) => {\n      resetModalState();\n      return added;\n    }).catch((error) => {\n      console.error(\"[modal-store] Error in add-to-cart:\", error);\n      resetModalState();\n      return false;\n    });\n  }\n\n  // Open first modal; the Promise resolves when approveModal/cancelModal finishes the chain\n  console.log(`[modal-store] Showing modal: ${nextModal.name}`);\n  activeModal.value = nextModal.name;\n  return new Promise((resolve) => {\n    _resolveChain = resolve;\n  });\n};\n\n/**\n * Approve the current modal and advance the chain.\n * Called by modal components (via modal-base.ts → handleApprove).\n */\nexport const approveModal = async () => {\n  const current = currentModalConfig.value;\n  if (!current) {\n    console.error(\"[modal-store] No active modal to approve\");\n    return;\n  }\n\n  console.log(`[modal-store] Approving modal: ${current.name}`);\n\n  if (current.onApprove) {\n    try {\n      await current.onApprove(modalContext.value!);\n    } catch (error) {\n      console.error(`[modal-store] Error in onApprove for ${current.name}:`, error);\n      _resolveChain?.(false);\n      _resolveChain = null;\n      resetModalState();\n      return;\n    }\n  }\n\n  activeModal.value = null;\n\n  // Find the next modal in priority order\n  const nextModal = sortedModals.value.find(\n    (m) => m.priority > current.priority && m.shouldShow(modalContext.value!)\n  );\n\n  if (nextModal) {\n    console.log(`[modal-store] Showing next modal: ${nextModal.name}`);\n    activeModal.value = nextModal.name;\n    // Chain continues — promise stays pending\n  } else {\n    console.log(\"[modal-store] All modals approved, executing add-to-cart\");\n    try {\n      const added = await executeAddToCart(modalContext.value!);\n      _resolveChain?.(added);\n    } catch (error) {\n      console.error(\"[modal-store] Error executing add-to-cart:\", error);\n      _resolveChain?.(false);\n    }\n    _resolveChain = null;\n    resetModalState();\n  }\n};\n\n/**\n * Cancel the current modal and stop the chain.\n * Called by modal components (via modal-base.ts → handleCancel).\n */\nexport const cancelModal = () => {\n  const current = currentModalConfig.value;\n  const context = modalContext.value;\n\n  if (!current) {\n    console.error(\"[modal-store] No active modal to cancel\");\n    return;\n  }\n\n  console.log(`[modal-store] Cancelling modal: ${current.name}`);\n\n  if (current.onCancel) {\n    try {\n      current.onCancel(context!);\n    } catch (error) {\n      console.error(`[modal-store] Error in onCancel for ${current.name}:`, error);\n    }\n  }\n\n  _resolveChain?.(false);\n  _resolveChain = null;\n  resetModalState();\n};\n\nconst resetModalState = () => {\n  activeModal.value = null;\n  modalContext.value = null;\n  isProcessing.value = false;\n};\n\nconst executeAddToCart = async (context: ModalContext): Promise<boolean> => {\n  if (!context.variantId) {\n    console.error(\"[modal-store] No variant ID in context\");\n    return false;\n  }\n\n  console.log(\"[modal-store] Executing add-to-cart:\", context);\n\n  const { addToCart, openCart, publishKlaviyoAddedToCart } = await import(\"./cart-store\");\n\n  const analytics = { source: context.source, productId: context.productId };\n\n  // Voucher products: fetch encoded codes and build line items via the voucher flow.\n  if (context.isVoucher) {\n    const { addVoucherProductToCart } = await import(\"./voucher-store\");\n    const voucherAdded = await addVoucherProductToCart(context);\n    if (!voucherAdded) {\n      return false;\n    }\n    // `kn_add_to_cart` fires per line inside executeCartAdd (1:1 with\n    // product_added_to_cart). Klaviyo's whole-cart event fires once here.\n    publishKlaviyoAddedToCart();\n    openCart();\n    return true;\n  }\n\n  // Add the main product variant\n  const added = await addToCart(\n    context.variantId,\n    context.quantity || 1,\n    context.customization,\n    context.productId && context.vendor\n      ? { productId: context.productId, vendor: context.vendor }\n      : undefined,\n    analytics\n  );\n\n  // Failsafe: if the add was blocked (e.g. by a purchase limit) or failed,\n  // do not add the companion SKU and do not open the cart. The limit notice\n  // is already surfaced via cartLimitError.\n  if (!added) {\n    return false;\n  }\n\n  // If a custom SKU variant is configured, add it as a second line item\n  if (context.customSkuVariantId) {\n    const skuProperties: Record<string, any> = {\n      \"_variant-to-customize\": String(context.variantId),\n      \"_custom-sku-variant\": \"true\",\n    };\n    if (context.customization?.[\"Your Text\"]) {\n      skuProperties[\"Your Text\"] = context.customization[\"Your Text\"];\n    }\n    await addToCart(\n      context.customSkuVariantId,\n      context.quantity || 1,\n      skuProperties,\n      undefined,\n      analytics\n    );\n  }\n\n  // `kn_add_to_cart` already fired per line inside executeCartAdd (main line +\n  // companion SKU), staying 1:1 with product_added_to_cart. Klaviyo's\n  // whole-cart event fires once here for the whole user action.\n  publishKlaviyoAddedToCart();\n\n  openCart();\n  return true;\n};\n\n// ─── Debug Helpers ────────────────────────────────────────────────────────────\n\nexport const getRegisteredModals = () => {\n  return registeredModals.value.map((m) => ({\n    name: m.name,\n    priority: m.priority,\n  }));\n};\n","import { signal } from \"@preact/signals-core\";\nimport {\n  cartData,\n  addToCart,\n  updateCartItem,\n  updateCartProperty,\n  refreshCart,\n  type LimitContext,\n} from \"./cart-store\";\nimport type { ModalContext } from \"./modal-store\";\n\n// ─── Constants ────────────────────────────────────────────────────────────────\n\nconst VOUCHER_TAGS = [\"Voucher\", \"voucher\", \"voucher-code\"];\nconst MERGE_TAG = \"MergeVoucherCodeVariants\";\n\n/** Line item property that carries the encoded voucher codes. */\nconst VOUCHER_PROP = \"_encoded-vouchers\";\n\n// AWS Lambda function URL pattern:\n// https://{url-id}.lambda-url.{region}.on.aws[/]\n// url-id: 32 lowercase alphanumeric characters; region: e.g. us-east-1\nconst LAMBDA_URL_PATTERN =\n  /^https:\\/\\/[a-z0-9]{32}\\.lambda-url\\.[a-z0-9-]+\\.on\\.aws\\/?$/;\n\nconst FALLBACK_DEV_URL =\n  \"https://tpuorwloi446mxs7pwl2svkiim0nsrwf.lambda-url.us-east-1.on.aws/\";\nconst FALLBACK_PROD_URL =\n  \"https://2m4fkxdjkw5awnhlb5xgwkjgxe0ltyrt.lambda-url.us-east-1.on.aws\";\n\n// ─── State ────────────────────────────────────────────────────────────────────\n\n/** Set when a voucher-code fetch fails; components surface a retry notice. */\nexport const voucherError = signal<boolean>(false);\n\n// ─── Tag helpers ──────────────────────────────────────────────────────────────\n\nexport const isVoucherProductTags = (tags: string[] | undefined): boolean =>\n  Array.isArray(tags) && VOUCHER_TAGS.some((t) => tags.includes(t));\n\nexport const shouldMergeVouchers = (tags: string[] | undefined): boolean =>\n  Array.isArray(tags) && tags.includes(MERGE_TAG);\n\n// ─── Lambda config ────────────────────────────────────────────────────────────\n\nconst isValidLambdaUrl = (url: unknown): url is string =>\n  typeof url === \"string\" && LAMBDA_URL_PATTERN.test(url.trim());\n\n/**\n * Resolve the voucher Lambda endpoint.\n * Priority: valid `window.voucherLambdaUrl` metafield → store-name fallback.\n * Returns `null` (and warns) when neither a valid URL nor a store name is\n * available, so callers abort instead of hitting an unknown endpoint.\n */\nconst resolveLambdaUrl = (): string | null => {\n  const metafieldUrl = (window as any).voucherLambdaUrl;\n  const storeName = (window as any).storeName;\n\n  if (isValidLambdaUrl(metafieldUrl)) {\n    return metafieldUrl.trim();\n  }\n\n  if (metafieldUrl) {\n    console.warn(\n      \"[voucher] Invalid Lambda URL format in metafield voucher_lambda_url:\",\n      metafieldUrl\n    );\n  }\n\n  if (typeof storeName === \"string\" && storeName.trim() !== \"\") {\n    return storeName === \"Knocking Develop\"\n      ? FALLBACK_DEV_URL\n      : FALLBACK_PROD_URL;\n  }\n\n  console.warn(\n    \"[voucher] Lambda URL and store name unavailable — voucher feature used but not configured; aborting add-to-cart\"\n  );\n  return null;\n};\n\n// ─── Fetch ────────────────────────────────────────────────────────────────────\n\n/**\n * Fetch `qty` encoded voucher codes from the Lambda for a vendor/sku pair.\n * Returns the array of codes, or `null` on any failure (missing config,\n * network error, or an empty/invalid response).\n */\nexport const fetchVoucherCodes = async (\n  vendor: string,\n  sku: string,\n  qty: number\n): Promise<string[] | null> => {\n  if (!vendor || !sku || !qty) {\n    console.error(\n      \"[voucher] Missing vendor/sku/qty for voucher-code fetch — aborting\"\n    );\n    return null;\n  }\n\n  const url = resolveLambdaUrl();\n  if (!url) return null;\n\n  try {\n    const query = `vendor=${encodeURIComponent(vendor)}&sku=${encodeURIComponent(\n      sku\n    )}&qty=${encodeURIComponent(String(qty))}`;\n    const res = await fetch(`${url}?${query}`);\n    if (!res.ok) throw new Error(res.statusText);\n\n    const data = await res.json();\n    if (!Array.isArray(data) || data.length === 0) {\n      throw new Error(\"Empty or invalid response from voucher service\");\n    }\n    return data as string[];\n  } catch (err) {\n    console.error(\"[voucher] Error fetching voucher codes:\", err);\n    return null;\n  }\n};\n\n// ─── Property parsing ─────────────────────────────────────────────────────────\n\n/**\n * Read the voucher-codes array off a cart line item.\n * Shopify may echo the property back as a JSON string, so parse when needed.\n */\nconst parseVoucherProp = (raw: unknown): string[] | null => {\n  if (Array.isArray(raw)) return raw as string[];\n  if (typeof raw === \"string\") {\n    try {\n      const parsed = JSON.parse(raw);\n      return Array.isArray(parsed) ? (parsed as string[]) : null;\n    } catch {\n      return null;\n    }\n  }\n  return null;\n};\n\n/** Whether the cart currently holds a voucher line whose code count ≠ its quantity. */\nexport const hasVoucherCodesOutOfSync = (): boolean => {\n  const items = cartData.value?.items ?? [];\n  return items.some((item) => {\n    const codes = parseVoucherProp(item.properties?.[VOUCHER_PROP]);\n    return codes != null && codes.length !== item.quantity;\n  });\n};\n\n// ─── Add-to-cart orchestration ────────────────────────────────────────────────\n\n/**\n * Add a voucher product to the cart, fetching encoded codes first.\n *\n * - Merge mode: one line item carrying the full codes array. If the variant is\n *   already in the cart, its quantity is bumped and reconciliation tops up the\n *   codes (see {@link reconcileVoucherCodes}).\n * - Split mode: one qty-1 line item per code, each flagged `_hideQtySelector`.\n *\n * Returns `true` when the item(s) were added, `false` when the fetch failed or\n * the add was blocked (e.g. by a purchase limit).\n */\nexport const addVoucherProductToCart = async (\n  context: ModalContext\n): Promise<boolean> => {\n  const variantId = context.variantId;\n  if (!variantId) return false;\n\n  const vendor = context.vendor ?? \"\";\n  const sku = context.variantSku ?? \"\";\n  const qty = context.quantity || 1;\n  const merge = Boolean(context.mergeVouchers);\n  const customization = context.customization ?? {};\n  const limitContext: LimitContext | undefined =\n    context.productId && context.vendor\n      ? { productId: context.productId, vendor: context.vendor }\n      : undefined;\n  // Forwarded to executeCartAdd so each voucher line publishes its own\n  // `kn_add_to_cart`, staying 1:1 with Shopify's per-line product_added_to_cart.\n  const analytics = { source: context.source, productId: context.productId };\n\n  voucherError.value = false;\n\n  if (merge) {\n    // If this variant is already a voucher line, bump its quantity and let\n    // reconciliation fetch the additional codes (avoids a redundant fetch).\n    const items = cartData.value?.items ?? [];\n    const idx = items.findIndex(\n      (item) =>\n        item.variant_id === variantId &&\n        item.properties?.[VOUCHER_PROP] != null\n    );\n    if (idx !== -1) {\n      await updateCartItem(idx + 1, items[idx].quantity + qty);\n      return true;\n    }\n\n    const codes = await fetchVoucherCodes(vendor, sku, qty);\n    if (!codes) {\n      voucherError.value = true;\n      return false;\n    }\n    return await addToCart(\n      variantId,\n      qty,\n      { ...customization, [VOUCHER_PROP]: codes },\n      limitContext,\n      analytics\n    );\n  }\n\n  // Split mode — one line item per code.\n  const codes = await fetchVoucherCodes(vendor, sku, qty);\n  if (!codes) {\n    voucherError.value = true;\n    return false;\n  }\n\n  let anyAdded = false;\n  for (const code of codes) {\n    const added = await addToCart(\n      variantId,\n      1,\n      { ...customization, [VOUCHER_PROP]: [code], _hideQtySelector: true },\n      limitContext,\n      analytics\n    );\n    if (!added) break;\n    anyAdded = true;\n  }\n  return anyAdded;\n};\n\n// ─── Reconciliation ───────────────────────────────────────────────────────────\n\n/**\n * Keep each voucher line's code count in step with its quantity (merge mode).\n * Trims extra codes when quantity drops; fetches more when it rises.\n * Called after cart quantity changes. Returns `true` if it changed the cart.\n */\nexport const reconcileVoucherCodes = async (): Promise<boolean> => {\n  const cart = cartData.value;\n  if (!cart) return false;\n\n  let changesMade = 0;\n\n  for (let i = 0; i < cart.items.length; i++) {\n    const item = cart.items[i];\n    const codes = parseVoucherProp(item.properties?.[VOUCHER_PROP]);\n    if (codes == null) continue;\n\n    const qty = item.quantity;\n    if (codes.length === qty) continue;\n\n    const line = i + 1;\n\n    if (codes.length > qty) {\n      await updateCartProperty(line, VOUCHER_PROP, codes.slice(0, qty), qty);\n      changesMade++;\n      continue;\n    }\n\n    // codes.length < qty → fetch the difference and append.\n    const codesToAdd = qty - codes.length;\n    const newCodes = await fetchVoucherCodes(item.vendor, item.sku, codesToAdd);\n    const merged = newCodes ? [...codes, ...newCodes] : codes;\n    await updateCartProperty(line, VOUCHER_PROP, merged, qty);\n    changesMade++;\n  }\n\n  if (changesMade > 0) {\n    await refreshCart();\n    return true;\n  }\n  return false;\n};\n","import { LitElement, html } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\nimport { effect } from \"@preact/signals-core\";\nimport {\n  selectedVariantId,\n  isAvailable,\n  selectedQuantity,\n  productData,\n  shipsBy,\n  selectedVariant,\n} from \"../store/product-store\";\nimport {\n  isCartLoading,\n  getLimitStatus,\n  cartLimitError,\n  LimitStatus,\n} from \"../store/cart-store\";\nimport { startModalChain } from \"../store/modal-store\";\nimport { isExtendedOfferEnabled } from \"../store/extended-offer-store\";\nimport {\n  isVoucherProductTags,\n  shouldMergeVouchers,\n  voucherError,\n} from \"../store/voucher-store\";\n\ntype ButtonState = \"add-to-cart\" | \"extended-offer\" | \"limit-reached\";\n\n@customElement(\"add-to-cart\")\nexport class AddToCart extends LitElement {\n  @state() private _available = false;\n  @state() private _loading = false;\n  @state() private _variantId: number | null = null;\n  @state() private _limitReached = false;\n  @state() private _extendedOfferEnabled = false;\n  @state() private _voucherError = false;\n  private _quantity = 1;\n  private _productId: number | null = null;\n  private _vendor = \"\";\n\n  constructor() {\n    super();\n    effect(() => {\n      this._available = isAvailable.value;\n      this._loading = isCartLoading.value;\n      this._variantId = selectedVariantId.value;\n      this._quantity = selectedQuantity.value;\n      this._extendedOfferEnabled = Boolean(isExtendedOfferEnabled.value);\n      this._voucherError = voucherError.value;\n\n      const pd = productData.value;\n      if (pd) {\n        this._productId = pd.id;\n        this._vendor = pd.vendor ?? \"\";\n        const status = getLimitStatus(pd.id, pd.vendor ?? \"\");\n        this._limitReached = status.reached;\n      }\n\n    });\n  }\n\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this;\n  }\n\n  private get _buttonState(): ButtonState {\n    if (!this._available && this._extendedOfferEnabled) return \"extended-offer\";\n    if (this._limitReached) return \"limit-reached\";\n    return \"add-to-cart\";\n  }\n\n  private async _handleClick(e: Event) {\n    e.preventDefault();\n    if (!this._variantId || this._loading) return;\n\n    const state = this._buttonState;\n\n    // If extended offer, open the modal instead of adding to cart\n    if (state === \"extended-offer\") {\n      const modal = (window as any).extendedOfferModal;\n      if (modal) {\n        modal.open();\n      }\n      return;\n    }\n\n    if (this._limitReached) return;\n\n    const button = e.target as HTMLButtonElement;\n\n    // Build customization properties\n    const properties: Record<string, any> = {};\n    if (shipsBy.value) {\n      properties[\"_ships-by\"] = shipsBy.value;\n    }\n\n    // Start modal chain (if no modals show, it will add to cart directly)\n    // Cart opens automatically after the real API call succeeds\n    const variant = selectedVariant.value;\n\n    let imageUrl = variant?.featured_image?.src ||\n                   variant?.image ||\n                   productData.value?.featured_image ||\n                   \"\";\n\n    // Ensure protocol is included for protocol-relative URLs\n    if (imageUrl.startsWith(\"//\")) {\n      imageUrl = \"https:\" + imageUrl;\n    }\n\n    // Remove query string (like ?v=...) to match Shopify cart API format\n    // This allows cart-item-row to properly apply _180x transformation\n    imageUrl = imageUrl.split('?')[0];\n\n    const tags = productData.value?.tags as string[] | undefined;\n    const isVoucher = isVoucherProductTags(tags);\n\n    await startModalChain({\n      productId: this._productId || undefined,\n      variantId: this._variantId,\n      quantity: this._quantity,\n      productTitle: productData.value?.title,\n      variantTitle: selectedVariant.value?.title,\n      customization: properties,\n      triggerButton: button,\n      vendor: this._vendor,\n      imageUrl: imageUrl,\n      source: e.isTrusted ? \"main-button\" : \"sticky-add-to-cart\",\n      isVoucher,\n      variantSku: isVoucher ? selectedVariant.value?.sku : undefined,\n      mergeVouchers: isVoucher ? shouldMergeVouchers(tags) : undefined,\n    });\n  }\n\n  private _renderSpinner() {\n    return html`\n      <div class=\"flex items-center justify-center w-full\">\n        <svg\n          aria-hidden=\"true\"\n          focusable=\"false\"\n          role=\"presentation\"\n          class=\"animate-spin\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          xmlns=\"http://www.w3.org/2000/svg\"\n          width=\"22\"\n          height=\"22\"\n        >\n          <circle\n            cx=\"12\"\n            cy=\"12\"\n            r=\"10\"\n            stroke=\"rgba(255,255,255,0.25)\"\n            stroke-width=\"2.5\"\n          ></circle>\n          <circle\n            cx=\"12\"\n            cy=\"12\"\n            r=\"10\"\n            stroke=\"rgba(255,255,255,0.9)\"\n            stroke-width=\"2.5\"\n            stroke-linecap=\"round\"\n            stroke-dasharray=\"62.83\"\n            stroke-dashoffset=\"47\"\n          ></circle>\n        </svg>\n      </div>\n    `;\n  }\n\n  render() {\n    const state = this._buttonState;\n\n    const config: Record<\n      ButtonState,\n      { label: string; disabled: boolean; styleClass: string; styleOverride: string }\n    > = {\n      \"add-to-cart\": {\n        label: \"Add to cart\",\n        disabled: false,\n        styleClass: \"btn\",\n        styleOverride: \"\",\n      },\n      \"extended-offer\": {\n        label: \"Notify Me\",\n        disabled: false,\n        styleClass: \"btn\",\n        styleOverride:\n          \"bg-[var(--color-secondary-500)] hover:bg-[var(--color-secondary-500)] text-white\",\n      },\n      \"limit-reached\": {\n        label: \"Add to cart\",\n        disabled: false,\n        styleClass: \"btn\",\n        styleOverride: \"\",\n      },\n    };\n\n    const { label, styleClass, styleOverride } = config[state];\n    const isDisabled = state !== \"extended-offer\" && this._limitReached || this._loading;\n\n    const buttonStyles =\n      \"btn w-full flex items-center justify-center text-sm font-bold h-[46px] px-[25px] rounded-t-none\";\n    return html`\n      <button\n        type=\"button\"\n        name=\"add\"\n        class=\"product-form__submit button w-full ${styleClass} ${buttonStyles} ${styleOverride} ${isDisabled\n          ? \"opacity-50 cursor-not-allowed\"\n          : \"\"}\"\n        ?disabled=${isDisabled}\n        @click=${this._handleClick}\n      >\n        ${this._loading ? this._renderSpinner() : html`<span>${label}</span>`}\n      </button>\n      ${this._voucherError\n        ? html`<p\n            class=\"text-sm text-[var(--color-error-500)] mt-2\"\n            role=\"alert\"\n          >\n            Couldn't be added to the cart, please try again\n          </p>`\n        : \"\"}\n    `;\n  }\n}\n\n@customElement(\"cart-limit-notice\")\nexport class CartLimitNotice extends LitElement {\n  @state() private _limitError: LimitStatus | null = null;\n  @state() private _proactiveStatus: LimitStatus | null = null;\n  @state() private _dismissed = false;\n\n  constructor() {\n    super();\n    effect(() => {\n      this._limitError = cartLimitError.value;\n    });\n    effect(() => {\n      const pd = productData.value;\n      if (!pd) {\n        this._proactiveStatus = null;\n        return;\n      }\n      const status = getLimitStatus(pd.id, pd.vendor ?? \"\");\n      // Re-show if the status changes (e.g. variant switch) while dismissed\n      const nextStatus = status.reached ? status : null;\n      if (nextStatus?.type !== this._proactiveStatus?.type || nextStatus?.limit !== this._proactiveStatus?.limit) {\n        this._dismissed = false;\n      }\n      this._proactiveStatus = nextStatus;\n    });\n  }\n\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this;\n  }\n\n  render() {\n    const notice = this._limitError ?? (!this._dismissed ? this._proactiveStatus : null);\n    if (!notice) return html``;\n    const limitType = notice.type === \"brand\" ? \"brand\" : \"product\";\n    return html`\n      <div\n        class=\"flex items-center justify-between bg-[var(--color-info-100)] rounded-sm p-2 md:p-4 mt-4\"\n      >\n        <div class=\"flex flex-col gap-1 min-w-0\">\n          <p\n            class=\"text-sm md:text-base font-bold text-[var(--color-neutral-950)] leading-snug\"\n          >\n            Product Limit Reached\n          </p>\n          <p\n            class=\"text-xs md:text-sm font-light text-[var(--color-neutral-700)] leading-normal\"\n          >\n            You can only buy ${notice.limit ?? \"\"} of this\n            ${limitType} per order\n          </p>\n        </div>\n        <button\n          type=\"button\"\n          class=\"flex-shrink-0 ml-4 p-1 bg-transparent border-none cursor-pointer text-[var(--color-neutral-400)] hover:text-[var(--color-neutral-600)] transition-colors\"\n          aria-label=\"Close\"\n          @click=${() => {\n            cartLimitError.value = null;\n            this._dismissed = true;\n          }}\n        >\n          <svg\n            xmlns=\"http://www.w3.org/2000/svg\"\n            aria-hidden=\"true\"\n            focusable=\"false\"\n            role=\"presentation\"\n            class=\"icon icon-close\"\n            fill=\"none\"\n            width=\"15\"\n            height=\"15\"\n            viewBox=\"0 0 18 17\"\n          >\n            <path\n              d=\"M.865 15.978a.5.5 0 00.707.707l7.433-7.431 7.579 7.282a.501.501 0 00.846-.37.5.5 0 00-.153-.351L9.712 8.546l7.417-7.416a.5.5 0 10-.707-.708L8.991 7.853 1.413.573a.5.5 0 10-.693.72l7.563 7.268-7.418 7.417z\"\n              fill=\"currentColor\"\n            ></path>\n          </svg>\n        </button>\n      </div>\n    `;\n  }\n}\n","import { LitElement, html } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\nimport { effect } from \"@preact/signals-core\";\nimport { selectedQuantity, updateQuantity, productData } from \"../store/product-store\";\nimport { getLimitStatus } from \"../store/cart-store\";\n\n@customElement(\"quantity-selector-pp\")\nexport class QuantitySelectorPP extends LitElement {\n  @state() private _quantity = 1;\n  @state() private _atLimit = false;\n  // Max units that can still be added this order (limit − units already in cart).\n  // Infinity when no limit applies.\n  private _maxAddable = Infinity;\n\n  constructor() {\n    super();\n    effect(() => {\n      this._quantity = selectedQuantity.value;\n    });\n    effect(() => {\n      const qty = selectedQuantity.value;\n      const pd = productData.value;\n      if (!pd?.id) {\n        this._maxAddable = Infinity;\n        this._atLimit = false;\n        return;\n      }\n      const status = getLimitStatus(pd.id, pd.vendor ?? \"\");\n      this._maxAddable =\n        status.type !== \"none\" ? Math.max(status.remaining, 0) : Infinity;\n      this._atLimit = qty >= this._maxAddable;\n\n      // Clamp the current selection if the cart changed and it now exceeds\n      // what can still be added (keep at least 1 so the input stays usable).\n      if (this._maxAddable >= 1 && qty > this._maxAddable) {\n        updateQuantity(this._maxAddable);\n      }\n    });\n  }\n\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this;\n  }\n\n  private _decrement() {\n    if (this._quantity > 1) {\n      updateQuantity(this._quantity - 1);\n    }\n  }\n\n  private _increment() {\n    if (this._atLimit) return;\n    updateQuantity(this._quantity + 1);\n  }\n\n  private _handleInput(e: Event) {\n    const val = parseInt((e.target as HTMLInputElement).value, 10);\n    if (!isNaN(val) && val >= 1) {\n      // Never let a typed value exceed what can still be added this order.\n      updateQuantity(Math.min(val, this._maxAddable));\n    }\n  }\n\n  render() {\n    const buttonClass = \"shrink-0 w-[25px] h-[25px] flex items-center justify-center rounded-[9999px] border border-[var(--color-neutral-500)] bg-transparent p-0 cursor-pointer [&_svg]:w-3 [&_svg]:h-3 [&_svg]:pointer-events-none\";\n    return html`\n    <div class=\"quantity relative flex items-center gap-2\">\n      <button\n        class=\"quantity__button no-js-hidden ${buttonClass}${this._quantity <= 1 ? \" opacity-50 cursor-not-allowed pointer-events-none\" : \"\"}\"\n        name=\"minus\"\n        type=\"button\"\n        tabindex=\"0\"\n        ?disabled=${this._quantity <= 1}\n        @click=${this._decrement}\n      >\n        <span class=\"sr-only\">Decrease quantity</span>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" focusable=\"false\" viewBox=\"0 0 10 2\">\n          <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M.5 1C.5.7.7.5 1 .5h8a.5.5 0 110 1H1A.5.5 0 01.5 1z\" fill=\"currentColor\"/>\n        </svg>\n      </button>\n      <input\n        class=\"quantity__input flex-1 min-w-0 text-center appearance-none outline-none focus:outline-none focus:ring-0 [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-outer-spin-button]:m-0 [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-inner-spin-button]:m-0 [-moz-appearance:textfield]\"\n        type=\"number\"\n        name=\"quantity\"\n        min=\"1\"\n        .value=${String(this._quantity)}\n        @change=${this._handleInput}\n      />\n      <button\n        class=\"quantity__button no-js-hidden ${buttonClass}${this._atLimit ? \" opacity-50 cursor-not-allowed pointer-events-none\" : \"\"}\"\n        name=\"plus\"\n        type=\"button\"\n        tabindex=\"0\"\n        ?disabled=${this._atLimit}\n        @click=${this._increment}\n      >\n        <span class=\"sr-only\">Increase quantity</span>\n        <svg xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\" focusable=\"false\" viewBox=\"0 0 10 10\">\n          <path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M1 4.51a.5.5 0 000 1h3.5l.01 3.5a.5.5 0 001-.01V5.5l3.5-.01a.5.5 0 00-.01-1H5.5L5.49.99a.5.5 0 00-1 .01v3.5l-3.5.01H1z\" fill=\"currentColor\"/>\n        </svg>\n      </button>\n      </div>\n    `;\n  }\n}\n","import { LitElement, html } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { effect } from \"@preact/signals-core\";\nimport { selectedVariant, productData } from \"../store/product-store\";\nimport { scrollToVariantPicker } from \"../utils/knocking\";\nimport {\n  submitBackInStockRequest,\n  themeSettings,\n} from \"../store/extended-offer-store\";\n\n// Global focus trap instance (loaded from CDN)\ndeclare const focusTrap: any;\n\nconst FADE_DURATION_MS = 300;\n\n/**\n * Extended Offer Modal - Back in Stock Alert Subscription\n *\n * This is a global modal instance that shows a form for users to sign up\n * for back-in-stock alerts when a product variant is sold out.\n *\n * Usage:\n * 1. Place <extended-offer-modal></extended-offer-modal> once in your layout\n * 2. Call window.extendedOfferModal?.open(variantId) to open the modal\n *\n * Sheet chrome: `src/tailwind.css` (`@layer components` → `.offer-modal-*`).\n * CBS sold-out: `snippets/cbs-notify-extended-offer.liquid` dispatches `open-extended-offer` (same modal).\n */\n@customElement(\"extended-offer-modal\")\nexport class ExtendedOfferModal extends LitElement {\n  @property({ type: String, attribute: \"data-cbs-title\" }) cbsModalTitle =\n    \"Get on the list!\";\n  @property({ type: String, attribute: \"data-cbs-subtitle\" }) cbsModalSubtitle =\n    \"Sign up to be the first to know when the next Box launches!\";\n\n  @state() private _isOpen = false;\n  @state() private _isAnimatedIn = false;\n  @state() private _isClosing = false;\n  @state() private _isLoading = false;\n  @state() private _isSuccess = false;\n  @state() private _errorMessage = \"\";\n  @state() private _email = \"\";\n  @state() private _subscribeToNewsletter = false;\n  @state() private _currentVariant: any = null;\n  @state() private _currentProduct: any = null;\n\n  /** True when variant/product were supplied explicitly (collection cards). */\n  private _hasExplicitData = false;\n  private _previouslyFocused: HTMLElement | null = null;\n  private _focusTrap: any = null;\n  private _closeTimeoutId: number | null = null;\n\n  constructor() {\n    super();\n\n    // Subscribe to variant and product changes from product-store (for product page).\n    // Always read both signals so the effect stays subscribed; only apply the values\n    // when the data wasn't set explicitly by a collection card.\n    effect(() => {\n      const variant = selectedVariant.value;\n      const product = productData.value;\n      if (!this._hasExplicitData) {\n        this._currentVariant = variant;\n        this._currentProduct = product;\n      }\n    });\n\n    // Make this component globally accessible\n    (window as any).extendedOfferModal = this;\n  }\n\n  connectedCallback() {\n    super.connectedCallback();\n\n    // Initialize focus trap\n    this._focusTrap =\n      typeof focusTrap !== \"undefined\"\n        ? focusTrap.createFocusTrap(this, {\n            initialFocus: () =>\n              this.querySelector(\"#extended-offer-email\") ||\n              this.querySelector(\n                'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n              ) ||\n              this,\n            escapeDeactivates: true,\n            allowOutsideClick: true,\n            onDeactivate: () => {\n              if (\n                this._previouslyFocused &&\n                typeof this._previouslyFocused.focus === \"function\"\n              ) {\n                this._previouslyFocused.focus();\n              }\n            },\n          })\n        : null;\n\n    // Keyboard event listeners\n    this.addEventListener(\"keydown\", this._handleKeydown);\n\n    // Listen for open-extended-offer events from collection cards\n    document.addEventListener(\"open-extended-offer\", this._handleOpenEvent as EventListener);\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    this.removeEventListener(\"keydown\", this._handleKeydown);\n    document.removeEventListener(\"open-extended-offer\", this._handleOpenEvent as EventListener);\n    if (this._closeTimeoutId) {\n      clearTimeout(this._closeTimeoutId);\n    }\n    document.body.style.overflow = \"\";\n    (window as any).extendedOfferModal = null;\n  }\n\n  updated(changedProperties: Map<string, unknown>) {\n    super.updated?.(changedProperties);\n    if (this._isOpen && !this._isClosing && !this._isAnimatedIn) {\n      requestAnimationFrame(() => {\n        this._isAnimatedIn = true;\n      });\n    }\n  }\n\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this;\n  }\n\n  // Public API - called from add-to-cart button (product page)\n  public open() {\n    this._isOpen = true;\n    this._isAnimatedIn = false;\n    this._isClosing = false;\n    this._resetForm();\n    document.body.style.overflow = \"hidden\";\n    this._previouslyFocused = document.activeElement as HTMLElement;\n    if (this._focusTrap) this._focusTrap.activate();\n  }\n\n  // Public API - called from collection cards with explicit variant/product data\n  public openWithData(variant: any, product: any) {\n    this._hasExplicitData = true;\n    this._currentVariant = variant;\n    this._currentProduct = product;\n    this.open();\n  }\n\n  // Handle custom event from collection cards\n  private _handleOpenEvent = (e: CustomEvent) => {\n    const { variant, product } = e.detail || {};\n    if (variant && product) {\n      this.openWithData(variant, product);\n    } else {\n      this.open();\n    }\n  };\n\n  private _closeWithAnimation() {\n    if (this._isClosing) return;\n    this._isClosing = true;\n\n    this._closeTimeoutId = window.setTimeout(() => {\n      this._closeTimeoutId = null;\n      this._isClosing = false;\n      this._isAnimatedIn = false;\n      this._close();\n    }, FADE_DURATION_MS);\n  }\n\n  private _close() {\n    this._isOpen = false;\n    document.body.style.overflow = \"\";\n    if (this._focusTrap) this._focusTrap.deactivate();\n    // Drop explicit collection-card data so the product-store (product page) takes\n    // over again. On the product page there is no explicit data, so the store-synced\n    // values are kept intact for the next open.\n    if (this._hasExplicitData) {\n      this._hasExplicitData = false;\n      this._currentVariant = selectedVariant.value;\n      this._currentProduct = productData.value;\n    }\n  }\n\n  private _resetForm() {\n    this._email = \"\";\n    this._subscribeToNewsletter = false;\n    this._isLoading = false;\n    this._isSuccess = false;\n    this._errorMessage = \"\";\n  }\n\n  private _handleKeydown = (e: KeyboardEvent) => {\n    if (e.key === \"Escape\" && this._isOpen) {\n      e.stopPropagation();\n      this._closeWithAnimation();\n    }\n  };\n\n  private _handleBackdropClick = (e: Event) => {\n    if (e.target === e.currentTarget) {\n      this._closeWithAnimation();\n    }\n  };\n\n  private async _handleSubmit(e: Event) {\n    e.preventDefault();\n\n    if (!this._currentVariant || this._isLoading) return;\n\n    // Validate email\n    const emailInput = this.querySelector(\n      \"#extended-offer-email\"\n    ) as HTMLInputElement;\n    if (!emailInput?.checkValidity()) {\n      this._errorMessage = \"Please enter a valid email address.\";\n      emailInput?.setAttribute(\"aria-invalid\", \"true\");\n      emailInput?.setAttribute(\"aria-describedby\", \"extended-offer-error\");\n      return;\n    }\n\n    this._isLoading = true;\n    this._errorMessage = \"\";\n\n    const response = await submitBackInStockRequest({\n      email: this._email,\n      variantId: this._currentVariant.id,\n      subscribeToNewsletter: this._subscribeToNewsletter,\n    });\n\n    this._isLoading = false;\n\n    if (response.success) {\n      this._isSuccess = true;\n      emailInput?.setAttribute(\"aria-invalid\", \"false\");\n      emailInput?.setAttribute(\"aria-describedby\", \"extended-offer-success\");\n    } else {\n      this._errorMessage =\n        response.message || \"An error occurred. Please try again.\";\n      emailInput?.setAttribute(\"aria-invalid\", \"true\");\n      emailInput?.setAttribute(\"aria-describedby\", \"extended-offer-error\");\n    }\n  }\n\n  private _handleEmailInput(e: Event) {\n    const input = e.target as HTMLInputElement;\n    this._email = input.value;\n  }\n\n  private _handleNewsletterChange(e: Event) {\n    const checkbox = e.target as HTMLInputElement;\n    this._subscribeToNewsletter = checkbox.checked;\n  }\n\n  /**\n   * Close the modal, then (product page only) scroll the variant picker to the\n   * bottom of the viewport. On the collection page the modal just closes and the\n   * card's own variant selector is revealed — no scrolling.\n   */\n  private _handleChangeVariant(e: Event) {\n    e.preventDefault();\n    e.stopPropagation();\n    scrollToVariantPicker();\n    this._closeWithAnimation();\n  }\n\n  /** CBS Boxes use locale title/subtitle instead of the product title. */\n  private _isCbsBoxProduct(product: { tags?: unknown } | null): boolean {\n    const tags = product?.tags;\n    if (Array.isArray(tags)) return tags.includes(\"cbs-box\");\n    if (typeof tags === \"string\") {\n      return tags\n        .split(\",\")\n        .map((tag) => tag.trim())\n        .includes(\"cbs-box\");\n    }\n    return false;\n  }\n\n  /**\n   * Vendor stays. CBS Boxes show a bold locale title with a regular-weight\n   * subtitle underneath. Other products keep the bold product title.\n   */\n  private _renderTitleBlock(\n    productVendor: string,\n    productTitle: string,\n    isCbsBox: boolean,\n    sizeClass: string,\n    productTitleClass: string\n  ) {\n    return html`\n      <div class=\"text-caption\">${productVendor}</div>\n      ${isCbsBox\n        ? html`\n            <div class=\"${sizeClass} font-bold\">${this.cbsModalTitle}</div>\n            <div class=\"${sizeClass} font-normal\">${this.cbsModalSubtitle}</div>\n          `\n        : html`<div class=\"${productTitleClass}\">${productTitle}</div>`}\n    `;\n  }\n\n  render() {\n    if (!this._isOpen) return html``;\n\n    const settings = themeSettings.value;\n    const showNewsletter = settings?.showNewsletterCheckbox ?? false;\n    const isVisible = this._isAnimatedIn && !this._isClosing;\n\n    // Build variant display info\n    const variantOptions: { name: string; value: string }[] = [];\n    if (this._currentProduct && this._currentVariant) {\n      const optionNames = this._currentProduct.options || [];\n      for (let i = 0; i < optionNames.length; i++) {\n        const optionValue = this._currentVariant[`option${i + 1}`];\n        if (optionValue && optionValue !== \"Default Title\") {\n          variantOptions.push({\n            name: optionNames[i],\n            value: optionValue,\n          });\n        }\n      }\n    }\n\n    // Product image URL (variant or product featured image)\n    const imageSrc =\n      this._currentVariant?.featured_image?.src ||\n      (typeof this._currentProduct?.featured_image === \"string\"\n        ? this._currentProduct.featured_image\n        : this._currentProduct?.featured_image?.src) ||\n      null;\n\n    const productTitle =\n      this._currentProduct?.title || this._currentVariant?.title || \"\";\n    const productVendor = this._currentProduct?.vendor ?? \"\";\n    const isCbsBox = this._isCbsBoxProduct(this._currentProduct);\n    const dialogHeading = isCbsBox\n      ? this.cbsModalTitle\n      : \"Notify Me When Available\";\n    const hasMultipleVariants =\n      (this._currentProduct?.variants?.length ?? 0) > 1 ||\n      this._currentProduct?.has_only_default_variant === false;\n\n    return html`\n      <!-- Backdrop with blur - sticky bottom bar (shared .offer-modal-* chrome) -->\n      <div\n        class=\"offer-modal-backdrop ${isVisible ? \"opacity-100\" : \"opacity-0\"}\"\n        role=\"dialog\"\n        aria-modal=\"true\"\n        aria-labelledby=\"extended-offer-modal-heading\"\n        aria-hidden=\"${!isVisible}\"\n        @click=${this._handleBackdropClick}\n      >\n        <h2 id=\"extended-offer-modal-heading\" class=\"sr-only\">\n          ${dialogHeading}\n        </h2>\n        <div\n          class=\"offer-modal-panel ${isVisible ? \"opacity-100 translate-y-0\" : \"opacity-0 translate-y-full\"}\"\n          @click=${(e: Event) => e.stopPropagation()}\n        >\n          <div class=\"offer-modal-layout-mobile\">\n            <div class=\"offer-modal-row-mobile-top\">\n              ${imageSrc\n                ? html`\n                    <div class=\"offer-modal-media-wrap\">\n                      <img\n                        src=\"${imageSrc}\"\n                        alt=\"${productTitle}\"\n                        class=\"offer-modal-thumb-img-sm\"\n                      />\n                      <span class=\"offer-modal-badge-sold-out\">\n                        Sold Out\n                      </span>\n                    </div>\n                  `\n                : html``}\n              <div class=\"offer-modal-stack-product\">\n                <div class=\"offer-modal-stack-titles\">\n                  ${this._renderTitleBlock(\n                    productVendor,\n                    productTitle,\n                    isCbsBox,\n                    \"text-base\",\n                    \"text-base font-bold truncate\"\n                  )}\n                </div>\n                ${variantOptions.length > 0\n                  ? html`\n                      <div class=\"offer-modal-variant-row\">\n                        <div class=\"offer-modal-variant-pill\">\n                          ${variantOptions.map(\n                            (opt) => html`\n                              <span class=\"offer-modal-variant-label\">\n                                ${opt.value}\n                              </span>\n                            `\n                          )}\n                        </div>\n                        ${hasMultipleVariants\n                          ? html`\n                              <button\n                                type=\"button\"\n                                class=\"offer-modal-btn-change-variant\"\n                                @click=${this._handleChangeVariant}\n                              >\n                                Change\n                              </button>\n                            `\n                          : html``}\n                      </div>\n                    `\n                  : \"\"}\n              </div>\n            </div>\n            <div class=\"offer-modal-column-form-mobile\">\n              ${this._errorMessage\n                ? html`\n                    <div\n                      id=\"extended-offer-error\"\n                      role=\"alert\"\n                      aria-live=\"assertive\"\n                      class=\"offer-modal-alert\"\n                    >\n                      ${this._errorMessage}\n                    </div>\n                  `\n                : \"\"}\n              ${this._isSuccess\n                ? html`\n                    <div\n                      id=\"extended-offer-success\"\n                      role=\"status\"\n                      aria-live=\"polite\"\n                      class=\"offer-modal-success-msg\"\n                    >\n                      Success! We'll notify you when this item is back in stock.\n                    </div>\n                  `\n                : html`\n                    <form\n                      id=\"extended-offer-form\"\n                      class=\"offer-modal-form-row-mobile\"\n                      @submit=${this._handleSubmit}\n                    >\n                      <input\n                        type=\"email\"\n                        id=\"extended-offer-email\"\n                        name=\"email\"\n                        placeholder=\"Enter your email\"\n                        required\n                        .value=${this._email}\n                        @input=${this._handleEmailInput}\n                        ?disabled=${this._isLoading}\n                        aria-invalid=\"${this._errorMessage ? \"true\" : \"false\"}\"\n                        aria-describedby=\"${this._errorMessage\n                          ? \"extended-offer-error\"\n                          : \"\"}\"\n                        class=\"offer-modal-input-email-mobile\"\n                      />\n                      <button\n                        type=\"submit\"\n                        class=\"btn offer-modal-submit-mobile\"\n                        ?disabled=${this._isLoading}\n                      >\n                        ${this._isLoading ? \"Processing...\" : \"Get Notified\"}\n                      </button>\n                    </form>\n                  `}\n              ${showNewsletter && !this._isSuccess && !this._isLoading\n                ? html`\n                    <label class=\"offer-modal-newsletter-label\">\n                      <input\n                        type=\"checkbox\"\n                        id=\"subscribe-to-mail-list\"\n                        .checked=${this._subscribeToNewsletter}\n                        @change=${this._handleNewsletterChange}\n                        class=\"offer-modal-newsletter-checkbox\"\n                      />\n                      <span class=\"offer-modal-newsletter-span\"\n                        >Subscribe to our mailing list</span\n                      >\n                    </label>\n                  `\n                : \"\"}\n            </div>\n            <button\n              type=\"button\"\n              class=\"btn w-full rounded-md bg-[var(--color-danger-200)] text-[var(--color-danger-800)] hover:bg-[var(--color-danger-300)] md:min-h-[60px]\"\n              aria-label=\"Close modal\"\n              @click=${() => this._closeWithAnimation()}\n            >\n              Close\n            </button>\n            <p class=\"offer-modal-privacy-mobile\">\n              We respect your privacy and will not share your personal\n              information.\n            </p>\n          </div>\n\n          <div class=\"offer-modal-layout-desktop\">\n            ${imageSrc\n              ? html`\n                  <div class=\"offer-modal-img-desktop-rel\">\n                    <img\n                      src=\"${imageSrc}\"\n                      alt=\"${productTitle}\"\n                      class=\"offer-modal-thumb-img-lg\"\n                    />\n                    <span class=\"offer-modal-badge-sold-out\">\n                      Sold Out\n                    </span>\n                  </div>\n                `\n              : \"\"}\n            <div class=\"offer-modal-desktop-flex-outer\">\n              <div class=\"offer-modal-desktop-flex-inner\">\n                <div class=\"offer-modal-desktop-title-row\">\n                  <div class=\"hidden min-w-0 lg:flex lg:flex-col\">\n                    ${this._renderTitleBlock(\n                      productVendor,\n                      productTitle,\n                      isCbsBox,\n                      \"text-lg\",\n                      \"text-lg font-bold break-words\"\n                    )}\n                  </div>\n                  ${variantOptions.length > 0\n                    ? html`\n                        <div class=\"offer-modal-desktop-variant-wrap\">\n                          <div class=\"offer-modal-variant-pill-lg\">\n                            ${variantOptions.map(\n                              (opt) => html`\n                                <span class=\"offer-modal-variant-label\">\n                                  ${opt.value}\n                                </span>\n                              `\n                            )}\n                          </div>\n                        </div>\n                      `\n                    : \"\"}\n                </div>\n                <div class=\"offer-modal-desktop-form-column\">\n                  ${this._errorMessage\n                    ? html`\n                        <div\n                          id=\"extended-offer-error\"\n                          role=\"alert\"\n                          aria-live=\"assertive\"\n                          class=\"offer-modal-alert\"\n                        >\n                          ${this._errorMessage}\n                        </div>\n                      `\n                    : \"\"}\n                  ${this._isSuccess\n                    ? html`\n                        <div\n                          id=\"extended-offer-success\"\n                          role=\"status\"\n                          aria-live=\"polite\"\n                          class=\"offer-modal-success-msg\"\n                        >\n                          Success! We'll notify you when this item is back in stock.\n                        </div>\n                      `\n                    : html`\n                        <form\n                          id=\"extended-offer-form\"\n                          class=\"offer-modal-form-row-desktop\"\n                          @submit=${this._handleSubmit}\n                        >\n                          <input\n                            type=\"email\"\n                            id=\"extended-offer-email\"\n                            name=\"email\"\n                            placeholder=\"Enter your email\"\n                            required\n                            .value=${this._email}\n                            @input=${this._handleEmailInput}\n                            ?disabled=${this._isLoading}\n                            aria-invalid=\"${this._errorMessage ? \"true\" : \"false\"}\"\n                            aria-describedby=\"${this._errorMessage\n                              ? \"extended-offer-error\"\n                              : \"\"}\"\n                            class=\"offer-modal-input-email-desktop\"\n                          />\n                          <button\n                            type=\"submit\"\n                            class=\"btn offer-modal-submit-desktop\"\n                            ?disabled=${this._isLoading}\n                          >\n                            ${this._isLoading ? \"Processing...\" : \"Get Notified\"}\n                          </button>\n                        </form>\n                      `}\n                  ${showNewsletter && !this._isSuccess && !this._isLoading\n                    ? html`\n                        <label class=\"offer-modal-newsletter-label\">\n                          <input\n                            type=\"checkbox\"\n                            id=\"subscribe-to-mail-list\"\n                            .checked=${this._subscribeToNewsletter}\n                            @change=${this._handleNewsletterChange}\n                            class=\"offer-modal-newsletter-checkbox\"\n                          />\n                          <span class=\"offer-modal-newsletter-span\"\n                            >Subscribe to our mailing list</span\n                          >\n                        </label>\n                      `\n                    : \"\"}\n                  <p class=\"offer-modal-privacy-desktop\">\n                    We respect your privacy and will not share your personal\n                    information.\n                  </p>\n                </div>\n              </div>\n\n              <button\n                type=\"button\"\n                class=\"btn min-h-[60px] min-w-[150px] shrink-0 rounded-md bg-[var(--color-danger-200)] text-[var(--color-danger-800)] hover:bg-[var(--color-danger-300)] md:min-h-[60px]\"\n                aria-label=\"Close modal\"\n                @click=${() => this._closeWithAnimation()}\n              >\n                Close\n              </button>\n            </div>\n          </div>\n        </div>\n      </div>\n    `;\n  }\n}\n\n// TypeScript declaration for global access\ndeclare global {\n  interface Window {\n    extendedOfferModal?: ExtendedOfferModal;\n    Shopify?: {\n      routes?: {\n        root?: string;\n      };\n    };\n  }\n}\n","import { signal, computed } from \"@preact/signals-core\";\nimport { getCookie, setCookie } from \"../utils/knocking\";\nimport { themeSettings } from \"./extended-offer-store\";\n\n/**\n * Promo-code capture state.\n *\n * A promo code is captured from the `?promo_code=` URL param or the promo-code\n * modal, validated against the merchant-defined list (theme settings), and\n * persisted in the `promo_code` cookie. The cart store reads that cookie on every\n * add and attaches it as the `_promo-code` line-item property — so the cookie is\n * the source of truth and cart-store needs no changes.\n */\n\nconst PROMO_COOKIE = \"promo_code\";\nconst COOKIE_DAYS = 7;\n\n// 1. Raw state — the currently applied (valid) promo code, if any.\nexport const appliedPromoCode = signal<string | null>(null);\n\n// 2. Computed state\n/** Merchant-defined valid codes (upper-cased), sourced from theme settings. */\nexport const validPromoCodes = computed<string[]>(\n  () => themeSettings.value?.promoCodes ?? []\n);\n\n/** Whether the promo-code modal feature is enabled in theme settings. */\nexport const isPromoCodeModalEnabled = computed<boolean>(\n  () => themeSettings.value?.enablePromoCodeModal ?? false\n);\n\nexport const hasValidPromoCode = computed<boolean>(\n  () => appliedPromoCode.value !== null\n);\n\n// 3. Actions\n/** Case-insensitive membership check against the merchant-defined codes. */\nexport const validatePromoCode = (code: string): boolean => {\n  const normalized = code.trim().toUpperCase();\n  if (!normalized) return false;\n  return validPromoCodes.value.includes(normalized);\n};\n\n/** Extract a promo code from the current URL's `?promo_code=` param, if present. */\nexport const getUrlPromoCode = (): string | null => {\n  const params = new URLSearchParams(window.location.search);\n  const code = params.get(\"promo_code\");\n  return code ? code.trim().toUpperCase() : null;\n};\n\n/**\n * Validate and persist a promo code. On success the `promo_code` cookie is set\n * (7-day lifetime) and `appliedPromoCode` updated. Returns whether it was valid.\n */\nexport const applyPromoCode = (code: string): boolean => {\n  const normalized = code.trim().toUpperCase();\n  if (!validatePromoCode(normalized)) return false;\n  setCookie(PROMO_COOKIE, normalized, COOKIE_DAYS);\n  appliedPromoCode.value = normalized;\n  return true;\n};\n\n/**\n * Bootstrap on page load: prefer a URL code, else fall back to an existing\n * cookie. If a valid code is found it is applied silently (no modal). Returns\n * true when a valid code was applied.\n */\nexport const initPromoCode = (): boolean => {\n  const fromUrl = getUrlPromoCode();\n  if (fromUrl) return applyPromoCode(fromUrl);\n\n  const fromCookie = getCookie(PROMO_COOKIE);\n  if (fromCookie && validatePromoCode(fromCookie)) {\n    appliedPromoCode.value = fromCookie.trim().toUpperCase();\n    return true;\n  }\n  return false;\n};\n","import { LitElement, html } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { effect } from \"@preact/signals-core\";\nimport { themeSettings } from \"../store/extended-offer-store\";\nimport {\n  applyPromoCode,\n  validPromoCodes,\n  isPromoCodeModalEnabled,\n  initPromoCode,\n} from \"../store/promo-code-store\";\n\n// Global focus trap instance (loaded from CDN, see layout/theme.liquid)\ndeclare const focusTrap: any;\n\nconst FADE_DURATION_MS = 300;\n\n/**\n * Promo Code Modal — captures a merchant-defined promo code from the customer.\n *\n * On page load it applies any valid code from the `?promo_code=` URL param or an\n * existing cookie (silently). If no valid code is present and the feature is\n * enabled in theme settings, the modal opens so the customer can enter one.\n * Applying a code writes the `promo_code` cookie, which the cart store attaches\n * to line items as `_promo-code`.\n *\n * Presentational copy + background come from theme settings/locales, passed as\n * data-attributes by `snippets/promo-code-modal.liquid`.\n */\n@customElement(\"promo-code-modal\")\nexport class PromoCodeModal extends LitElement {\n  @property({ type: String, attribute: \"data-header\" })\n  headerCopy = \"\";\n\n  @property({ type: String, attribute: \"data-subheader\" })\n  subHeaderCopy = \"\";\n\n  @property({ type: String, attribute: \"data-placeholder\" })\n  placeholder = \"\";\n\n  @property({ type: String, attribute: \"data-submit-label\" })\n  submitLabel = \"Submit\";\n\n  @property({ type: String, attribute: \"data-no-code-label\" })\n  noCodeLabel = \"\";\n\n  @property({ type: String, attribute: \"data-no-code-copy\" })\n  noCodeCopy = \"\";\n\n  @property({ type: String, attribute: \"data-background-image\" })\n  backgroundImage = \"\";\n\n  @state() private _isOpen = false;\n  @state() private _isAnimatedIn = false;\n  @state() private _isClosing = false;\n  @state() private _value = \"\";\n  @state() private _showError = false;\n  @state() private _showNoCodeMessage = false;\n  @state() private _suggestions: string[] = [];\n\n  private _previouslyFocused: HTMLElement | null = null;\n  private _focusTrap: any = null;\n  private _closeTimeoutId: number | null = null;\n  private _didInit = false;\n\n  connectedCallback() {\n    super.connectedCallback();\n\n    // Theme settings (valid codes + enable flag) are populated asynchronously by\n    // <theme-settings-provider>, so wait for them before deciding to prompt.\n    // Apply any code already present (URL or cookie); only open the modal when\n    // there is no valid code and the feature is enabled. Runs exactly once.\n    effect(() => {\n      if (this._didInit || themeSettings.value === null) return;\n      this._didInit = true;\n      const hasCode = initPromoCode();\n      if (!hasCode && isPromoCodeModalEnabled.value) {\n        this.open();\n      }\n    });\n\n    this._focusTrap =\n      typeof focusTrap !== \"undefined\"\n        ? focusTrap.createFocusTrap(this, {\n            initialFocus: () =>\n              this.querySelector(\"#promo_code_input\") ||\n              this.querySelector(\n                'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n              ) ||\n              this,\n            escapeDeactivates: true,\n            allowOutsideClick: true,\n            onDeactivate: () => {\n              if (\n                this._previouslyFocused &&\n                typeof this._previouslyFocused.focus === \"function\"\n              ) {\n                this._previouslyFocused.focus();\n              }\n            },\n          })\n        : null;\n\n    this.addEventListener(\"keydown\", this._handleKeydown);\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    this.removeEventListener(\"keydown\", this._handleKeydown);\n    if (this._closeTimeoutId) clearTimeout(this._closeTimeoutId);\n    document.body.style.overflow = \"\";\n  }\n\n  updated(changedProperties: Map<string, unknown>) {\n    super.updated?.(changedProperties);\n    if (this._isOpen && !this._isClosing && !this._isAnimatedIn) {\n      requestAnimationFrame(() => {\n        this._isAnimatedIn = true;\n      });\n    }\n  }\n\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this;\n  }\n\n  public open() {\n    this._isOpen = true;\n    this._isAnimatedIn = false;\n    this._isClosing = false;\n    this._value = \"\";\n    this._showError = false;\n    this._showNoCodeMessage = false;\n    this._suggestions = [];\n    document.body.style.overflow = \"hidden\";\n    this._previouslyFocused = document.activeElement as HTMLElement;\n    if (this._focusTrap) this._focusTrap.activate();\n  }\n\n  private _closeWithAnimation() {\n    if (this._isClosing) return;\n    this._isClosing = true;\n    this._closeTimeoutId = window.setTimeout(() => {\n      this._closeTimeoutId = null;\n      this._isClosing = false;\n      this._isAnimatedIn = false;\n      this._close();\n    }, FADE_DURATION_MS);\n  }\n\n  private _close() {\n    this._isOpen = false;\n    document.body.style.overflow = \"\";\n    if (this._focusTrap) this._focusTrap.deactivate();\n  }\n\n  private _handleKeydown = (e: KeyboardEvent) => {\n    if (e.key === \"Escape\" && this._isOpen) {\n      e.stopPropagation();\n      this._closeWithAnimation();\n    }\n  };\n\n  private _handleBackdropClick = (e: Event) => {\n    if (e.target === e.currentTarget) this._closeWithAnimation();\n  };\n\n  private _handleInput(e: Event) {\n    const input = e.target as HTMLInputElement;\n    this._value = input.value;\n    this._showError = false;\n    const query = input.value.trim().toUpperCase();\n    this._suggestions = query\n      ? validPromoCodes.value.filter((code) => code.startsWith(query))\n      : [];\n  }\n\n  private _selectSuggestion(code: string) {\n    this._value = code;\n    this._suggestions = [];\n    this._submit();\n  }\n\n  private _handleSubmit(e: Event) {\n    e.preventDefault();\n    this._submit();\n  }\n\n  private _submit() {\n    if (applyPromoCode(this._value)) {\n      this._suggestions = [];\n      this._closeWithAnimation();\n    } else {\n      this._showError = true;\n    }\n  }\n\n  private _toggleNoCode(e: Event) {\n    e.preventDefault();\n    this._showNoCodeMessage = !this._showNoCodeMessage;\n  }\n\n  render() {\n    if (!this._isOpen) return html``;\n\n    const isVisible = this._isAnimatedIn && !this._isClosing;\n    const bgStyle = this.backgroundImage\n      ? `background-image:url(${this.backgroundImage});background-size:cover;background-position:bottom center;`\n      : \"\";\n\n    return html`\n      <div\n        class=\"fixed inset-0 z-[1000] flex items-center justify-center bg-black/50 p-4 transition-opacity duration-300 ${isVisible\n          ? \"opacity-100\"\n          : \"opacity-0\"}\"\n        role=\"dialog\"\n        aria-modal=\"true\"\n        aria-labelledby=\"promo-modal-heading\"\n        aria-hidden=\"${!isVisible}\"\n        @click=${this._handleBackdropClick}\n      >\n        <div\n          class=\"relative w-full max-w-md overflow-hidden rounded-lg bg-white shadow-xl transition-all duration-300 ${isVisible\n            ? \"scale-100 opacity-100\"\n            : \"scale-95 opacity-0\"}\"\n          style=\"${bgStyle}\"\n          @click=${(e: Event) => e.stopPropagation()}\n        >\n          <div class=\"p-6 text-center\">\n            <button\n              type=\"button\"\n              class=\"absolute right-3 top-3 p-1 text-current\"\n              aria-label=\"Close\"\n              @click=${() => this._closeWithAnimation()}\n            >\n              <svg\n                width=\"16\"\n                height=\"16\"\n                viewBox=\"0 0 16 16\"\n                fill=\"none\"\n                aria-hidden=\"true\"\n              >\n                <path\n                  d=\"M1 1l14 14M15 1L1 15\"\n                  stroke=\"currentColor\"\n                  stroke-width=\"2\"\n                />\n              </svg>\n            </button>\n\n            <h2 id=\"promo-modal-heading\" class=\"h2 mb-2\">${this.headerCopy}</h2>\n            <p class=\"mb-4\">${this.subHeaderCopy}</p>\n\n            <form class=\"relative\" @submit=${this._handleSubmit}>\n              <label for=\"promo_code_input\" class=\"sr-only\"\n                >${this.subHeaderCopy}</label\n              >\n              <input\n                id=\"promo_code_input\"\n                class=\"w-full rounded-md border border-gray-300 px-3 py-2 uppercase\"\n                type=\"text\"\n                autocomplete=\"off\"\n                .value=${this._value}\n                placeholder=\"${this.placeholder}\"\n                aria-invalid=\"${this._showError ? \"true\" : \"false\"}\"\n                @input=${this._handleInput}\n                required\n              />\n              ${this._suggestions.length > 0\n                ? html`\n                    <ul\n                      class=\"absolute z-10 mt-1 w-full overflow-hidden rounded-md border border-gray-200 bg-white text-left shadow\"\n                    >\n                      ${this._suggestions.map(\n                        (code) => html`\n                          <li>\n                            <button\n                              type=\"button\"\n                              class=\"w-full px-3 py-2 text-left hover:bg-gray-100\"\n                              @click=${() => this._selectSuggestion(code)}\n                            >\n                              ${code}\n                            </button>\n                          </li>\n                        `\n                      )}\n                    </ul>\n                  `\n                : \"\"}\n              ${this._showError\n                ? html`<p role=\"alert\" class=\"mt-2 text-sm text-[var(--color-danger-800)]\">\n                    That code isn't valid.\n                  </p>`\n                : \"\"}\n              <button\n                type=\"submit\"\n                class=\"button button--full mt-3 w-full\"\n              >\n                ${this.submitLabel}\n              </button>\n            </form>\n\n            ${this.noCodeLabel\n              ? html`\n                  <p class=\"mt-4\">\n                    <a href=\"#\" @click=${this._toggleNoCode}\n                      >${this.noCodeLabel}</a\n                    >\n                  </p>\n                  ${this._showNoCodeMessage\n                    ? html`<p class=\"mt-2 text-sm\">${this.noCodeCopy}</p>`\n                    : \"\"}\n                `\n              : \"\"}\n          </div>\n        </div>\n      </div>\n    `;\n  }\n}\n\ndeclare global {\n  interface Window {\n    promoCodeModal?: PromoCodeModal;\n  }\n}\n","import { LitElement, html } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\nimport { effect } from \"@preact/signals-core\";\nimport {\n  productData,\n  selectedVariant,\n  isAvailable,\n  shipsBy,\n} from \"../store/product-store\";\nimport { calculateShippingDate, scrollToVariantPicker } from \"../utils/knocking\";\nimport { isCartLoading, getLimitStatus } from \"../store/cart-store\";\nimport { isExtendedOfferEnabled } from \"../store/extended-offer-store\";\n\ntype ButtonState = \"add-to-cart\" | \"extended-offer\" | \"limit-reached\";\n\n@customElement(\"sticky-add-to-cart\")\nexport class StickyAddToCart extends LitElement {\n  @state() private _productData: any = null;\n  @state() private _variant: any = null;\n  @state() private _available = false;\n  @state() private _isVisible = false;\n  @state() private _limitReached = false;\n  @state() private _extendedOfferEnabled = false;\n  @state() private _loading = false;\n  @state() private _shippingDate: string | null = null;\n\n  private _mainButton: HTMLElement | null = null;\n  private _footer: HTMLElement | null = null;\n  private _scrollHandler: (() => void) | null = null;\n  private _resizeHandler: (() => void) | null = null;\n\n  constructor() {\n    super();\n\n    // Subscribe to all relevant signals\n    effect(() => {\n      this._productData = productData.value;\n      this._variant = selectedVariant.value;\n      this._available = isAvailable.value;\n      this._extendedOfferEnabled = Boolean(isExtendedOfferEnabled.value);\n      this._loading = isCartLoading.value;\n\n      // Check limit status\n      if (productData.value) {\n        const status = getLimitStatus(\n          productData.value.id,\n          productData.value.vendor ?? \"\"\n        );\n        this._limitReached = status.reached;\n      }\n\n      // Calculate shipping date\n      const shipsByTag = shipsBy.value;\n      if (shipsByTag) {\n        try {\n          const calculated = calculateShippingDate(shipsByTag);\n          this._shippingDate = calculated.shortDate || calculated.longDate;\n        } catch (error) {\n          console.error(\"sticky-add-to-cart: failed to calculate shipping date\", error);\n          this._shippingDate = null;\n        }\n      } else {\n        this._shippingDate = null;\n      }\n\n    });\n  }\n\n  connectedCallback() {\n    super.connectedCallback();\n\n    // Prefer the dark <footer> so clearance keeps the footer background\n    this._footer =\n      document.querySelector(\"#shopify-section-footer footer\") ||\n      document.querySelector(\"#shopify-section-footer\");\n\n    // Delay finding the button to ensure the page is fully loaded\n    // This is needed because the main add-to-cart component might mount after us\n    setTimeout(() => {\n      // Find main add-to-cart button\n      this._mainButton = document.querySelector(\".product-form__submit\");\n\n      if (!this._mainButton) {\n        console.warn(\"[sticky-add-to-cart] Main button not found\");\n        return;\n      }\n\n      // Setup scroll and resize handlers\n      this._scrollHandler = this._checkVisibility.bind(this);\n      this._resizeHandler = () => {\n        this._checkVisibility();\n        this._syncFooterPadding();\n      };\n\n      // Add event listeners with passive scroll for performance\n      window.addEventListener(\"scroll\", this._scrollHandler, { passive: true });\n      window.addEventListener(\"resize\", this._resizeHandler);\n\n      // Initial visibility check\n      this._checkVisibility();\n      this._syncFooterPadding();\n    }, 100);\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n\n    // Cleanup event listeners\n    if (this._scrollHandler) {\n      window.removeEventListener(\"scroll\", this._scrollHandler);\n    }\n    if (this._resizeHandler) {\n      window.removeEventListener(\"resize\", this._resizeHandler);\n    }\n\n    // Remove sticky-bar clearance from the footer\n    if (this._footer) {\n      this._footer.style.paddingBottom = \"\";\n    }\n  }\n\n  protected updated(changedProperties: Map<string, unknown>): void {\n    super.updated(changedProperties);\n    this._syncFooterPadding();\n  }\n\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this; // Light DOM - allows Tailwind classes to work\n  }\n\n  private _checkVisibility() {\n    if (!this._mainButton) return;\n\n    const rect = this._mainButton.getBoundingClientRect();\n    // Show sticky cart when main button scrolls out of view (60px threshold)\n    const isVisible = rect.bottom < 0 || rect.bottom < 60;\n\n    if (isVisible !== this._isVisible) {\n      this._isVisible = isVisible;\n    }\n  }\n\n  /**\n   * Reserve space at the bottom of the footer so logo/legal links can scroll\n   * above the fixed sticky ATC bar (bar stays visible).\n   */\n  private _syncFooterPadding() {\n    if (!this._footer) return;\n\n    const bar = this.firstElementChild as HTMLElement | null;\n    if (!bar) {\n      this._footer.style.paddingBottom = \"\";\n      return;\n    }\n\n    // Exact sticky bar height only — keeps logo/legal flush above the bar\n    const height = Math.round(bar.getBoundingClientRect().height);\n    this._footer.style.paddingBottom = height > 0 ? `${height}px` : \"\";\n  }\n\n  private _handleAddToCart(e: Event) {\n    e.preventDefault();\n    e.stopPropagation();\n\n    if (this._loading || !this._mainButton) return;\n\n    // Delegate to main add-to-cart button\n    // This maintains all existing logic: validation, modal chains, extended offers, etc.\n    this._mainButton.click();\n  }\n\n  private _handleChange(e: Event) {\n    e.preventDefault();\n    e.stopPropagation();\n\n    // Product page: scroll the variant picker to the bottom of the viewport.\n    // Any other page: no-op.\n    scrollToVariantPicker();\n  }\n\n  private get _buttonState(): ButtonState {\n    if (!this._available && this._extendedOfferEnabled) return \"extended-offer\";\n    if (this._limitReached) return \"limit-reached\";\n    return \"add-to-cart\";\n  }\n\n  private _renderSpinner() {\n    return html`\n      <div class=\"flex items-center justify-center w-full\">\n        <svg\n          aria-hidden=\"true\"\n          focusable=\"false\"\n          role=\"presentation\"\n          class=\"animate-spin\"\n          viewBox=\"0 0 24 24\"\n          fill=\"none\"\n          xmlns=\"http://www.w3.org/2000/svg\"\n          width=\"22\"\n          height=\"22\"\n        >\n          <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"rgba(255,255,255,0.25)\" stroke-width=\"2.5\"></circle>\n          <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"rgba(255,255,255,0.9)\" stroke-width=\"2.5\"\n            stroke-linecap=\"round\" stroke-dasharray=\"62.83\" stroke-dashoffset=\"47\"></circle>\n        </svg>\n      </div>\n    `;\n  }\n\n  render() {\n    if (!this._productData) return html``;\n\n    // Visibility transition classes\n    const visibilityClasses = this._isVisible\n      ? \"opacity-100 translate-y-0\"\n      : \"opacity-0 translate-y-full pointer-events-none\";\n\n    // Button configuration based on state\n    const state = this._buttonState;\n    const buttonConfig = {\n      \"add-to-cart\": { label: \"Add to cart\", styleOverride: \"\" },\n      \"extended-offer\": {\n        label: \"Notify Me\",\n        styleOverride:\n          \"bg-[var(--color-secondary-500)] hover:bg-[var(--color-secondary-500)] text-white\",\n      },\n      \"limit-reached\": { label: \"Add to cart\", styleOverride: \"\" },\n    };\n\n    const buttonLabel = buttonConfig[state].label;\n    const buttonStyleOverride = buttonConfig[state].styleOverride;\n    const isDisabled = state !== \"extended-offer\" && this._limitReached || this._loading;\n    const showSoldOutShipsBy = state === \"extended-offer\";\n    const showShipsByPanel = showSoldOutShipsBy || Boolean(this._shippingDate);\n\n    // Get image source (variant image or product image), normalise protocol-relative URLs\n    const rawImageSrc =\n      this._variant?.featured_image?.src ||\n      this._productData?.featured_image ||\n      \"\";\n    const imageSrc = rawImageSrc.startsWith(\"//\") ? `https:${rawImageSrc}` : rawImageSrc;\n    const imageAlt =\n      this._variant?.featured_image?.alt || this._productData.title;\n\n    const hasMultipleVariants =\n      (this._productData.variants?.length ?? 0) > 1 ||\n      this._productData.has_only_default_variant === false;\n\n    return html`\n      <div\n        class=\"fixed bottom-0 left-0 right-0 z-10 bg-gradient-to-b from-[var(--color-secondary-50)] to-[var(--color-secondary-100)] shadow-lg transition-all duration-300 ease-in-out ${visibilityClasses}\"\n      >\n        <div class=\"w-full px-4 py-3\">\n          <div class=\"flex align-center lg:hidden w-full gap-3\">\n            ${imageSrc\n              ? html`\n                  <img\n                    src=\"${imageSrc}\"\n                    alt=\"${imageAlt}\"\n                    class=\"w-22 h-22 object-cover rounded-sm bg-white flex-wrap\"\n                  />\n                `\n              : html``}\n\n            <div class=\"flex min-w-0 flex-1 flex-col gap-2\">\n              <div class=\"min-w-0\">\n                <div class=\"text-caption\">${this._productData.vendor}</div>\n                <div class=\"truncate text-base font-bold\">${this._productData.title}</div>\n              </div>\n\n              <div\n                class=\"flex min-w-0 flex-wrap items-center gap-3 ${!hasMultipleVariants\n                  ? \"hidden\"\n                  : \"\"}\"\n              >\n                <div class=\"flex items-center gap-2 flex-wrap\">\n                  <div class=\"border border-[var(--color-secondary-500)] rounded-sm px-4 py-2 flex items-center justify-center\">\n                    <span class=\"text-xs font-bold text-[var(--color-secondary-500)] uppercase\">\n                      ${this._variant?.options?.join(\" / \") ?? \"\"}\n                    </span>\n                  </div>\n                  <button\n                    @click=\"${this._handleChange}\"\n                    class=\"text-xs font-bold text-[var(--color-secondary-500)] uppercase hover:opacity-80 underline tracking-wide\"\n                  >\n                    Change\n                  </button>\n                </div>\n              </div>\n            </div>\n          </div>\n\n          <div class=\"mt-3 flex lg:hidden w-full items-center gap-2 w-full\">\n            <div class=\"flex min-w-0 items-center gap-2 flex-wrap w-full justify-between\">\n              <price-pp compact></price-pp>\n              <badges-pp></badges-pp>\n            </div>\n          </div>\n\n          <button\n            @click=\"${this._handleAddToCart}\"\n            ?disabled=\"${isDisabled}\"\n            class=\"btn ${buttonStyleOverride} mt-3 flex lg:hidden w-full min-h-[48px] ${isDisabled\n              ? \"opacity-50 cursor-not-allowed\"\n              : \"\"}\"\n          >\n            ${this._loading\n              ? this._renderSpinner()\n              : html`<span>${buttonLabel}</span>`}\n          </button>\n\n          <div class=\"hidden lg:flex lg:items-center lg:gap-6 lg:justify-between\">\n            ${imageSrc\n              ? html`\n                  <img\n                    src=\"${imageSrc}\"\n                    alt=\"${imageAlt}\"\n                    class=\"md:w-[95px] md:h-[95px] object-cover rounded-sm bg-white flex-shrink-0 bg-white\"\n                  />\n                `\n              : html``}\n\n            <div class=\"flex flex-1 min-w-0 items-center justify-between gap-6\">\n              <div class=\"flex min-w-0 flex-1 flex-wrap items-center gap-4\">\n                <div class=\"flex min-w-0 flex-col gap-1\">\n                  <div class=\"text-caption\">${this._productData.vendor}</div>\n                  <div class=\"truncate text-lg font-bold\">${this._productData.title}</div>\n                </div>\n                ${hasMultipleVariants\n                  ? html`\n                      <div class=\"flex flex-wrap items-center gap-2\">\n                        <div class=\"flex min-h-[51px] min-w-[79px] items-center justify-center rounded-sm border border-[var(--color-secondary-500)] md:px-6 md:py-[17px]\">\n                          <span class=\"text-xs font-bold uppercase text-[var(--color-secondary-500)]\">\n                            ${this._variant?.options?.join(\" / \") ?? \"\"}\n                          </span>\n                        </div>\n                        <button\n                          @click=\"${this._handleChange}\"\n                          class=\"text-xs font-bold uppercase tracking-wide text-[var(--color-secondary-500)] underline hover:opacity-80\"\n                        >\n                          Change\n                        </button>\n                      </div>\n                    `\n                  : html``}\n              </div>\n\n              <div class=\"flex items-center gap-4 min-w-0 flex-wrap\">\n                <div class=\"flex items-center gap-2 flex-wrap\">\n                  <price-pp compact></price-pp>\n                  <badges-pp></badges-pp>\n                </div>\n\n                <div class=\"flex overflow-hidden rounded-[5px]\">\n                  ${showSoldOutShipsBy\n                    ? html`\n                      <div\n                        class=\"bg-[var(--color-secondary-50)] uppercase text-xs text-[var(--color-primary-950)] tracking-[0.1em] py-[5.5px] px-4 text-center flex flex-col justify-center items-center\"\n                      >\n                        <span class=\"text-sm font-bold text-[var(--color-secondary-950)]\">Sold Out</span>\n                      </div>\n                    `\n                    : this._shippingDate\n                    ? html`\n                      <div\n                        class=\"bg-[var(--color-primary-50)] uppercase text-xs text-[var(--color-primary-950)] tracking-[0.1em] py-[5.5px] px-4 text-center flex flex-col justify-center items-center\"\n                      >\n                        <span class=\"text-xs text-[var(--color-primary-950)] uppercase\">Ships by</span>\n                        <span class=\"text-sm font-bold text-[var(--color-primary-950)]\">${this._shippingDate}</span>\n                      </div>\n                    `\n                    : html``\n                  }\n                  <button\n                    @click=\"${this._handleAddToCart}\"\n                    ?disabled=\"${isDisabled}\"\n                    class=\"btn ${buttonStyleOverride} ${showShipsByPanel ? 'rounded-l-none' : ''} min-h-[60px] min-w-[150px] ${isDisabled\n                      ? \"opacity-50 cursor-not-allowed\"\n                      : \"\"}\"\n                  >\n                    ${this._loading\n                      ? this._renderSpinner()\n                      : html`<span>${buttonLabel}</span>`}\n                  </button>\n                </div>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    `;\n  }\n}\n","import { LitElement, html } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { effect } from \"@preact/signals-core\";\nimport { isAvailable, shipsBy } from \"../store/product-store\";\nimport { isExtendedOfferEnabled } from \"../store/extended-offer-store\";\nimport { calculateShippingDate } from \"../utils/knocking\";\n\n@customElement(\"ships-by-pp\")\nexport class ShipsByPP extends LitElement {\n  @property({ type: String }) format: \"long\" | \"short\" = \"long\";\n  @state() private _shippingDate: string | null = null;\n  @state() private _showSoldOut = false;\n\n  protected createRenderRoot() {\n    return this; // Light DOM for Tailwind\n  }\n\n  connectedCallback() {\n    super.connectedCallback();\n\n    effect(() => {\n      const shipsByTag = shipsBy.value;\n      const showSoldOut =\n        !isAvailable.value && Boolean(isExtendedOfferEnabled.value);\n\n      if (showSoldOut) {\n        this._showSoldOut = true;\n        this._shippingDate = null;\n        return;\n      }\n\n      this._showSoldOut = false;\n\n      if (!shipsByTag) {\n        this._shippingDate = null;\n        return;\n      }\n\n      try {\n        const calculated = calculateShippingDate(shipsByTag);\n        this._shippingDate = this.format === \"short\"\n          ? (calculated.shortDate || calculated.longDate)\n          : calculated.longDate;\n      } catch (error) {\n        console.error(`ships-by-pp: failed to calculate date`, error);\n        this._shippingDate = null;\n      }\n    });\n  }\n\n  render() {\n    if (this._showSoldOut) {\n      return html`\n        <div\n          id=\"product-shipsby-notice\"\n          class=\"product__shipsby-notice bg-[var(--color-secondary-50)] rounded-tl-sm rounded-tr-sm uppercase text-xs text-[var(--color-primary-950)] tracking-[0.1em] py-[5.5px] px-4 text-center\"\n        >\n          <p class=\"flex flex-row items-center justify-center text-center gap-1\">\n            <span class=\"text-xs font-bold text-[var(--color-secondary-950)]\">Sold Out</span>\n          </p>\n        </div>\n      `;\n    }\n\n    if (!this._shippingDate) {\n      return html`<!-- ships-by-pp: no shipping date -->`;\n    }\n\n    return html`\n      <div\n        id=\"product-shipsby-notice\"\n        class=\"product__shipsby-notice bg-[var(--color-primary-50)] rounded-tl-[4px] rounded-tr-[4px] uppercase text-xs text-[var(--color-primary-950)] tracking-[0.1em] py-[5.5px] px-4 text-center flex flex-col justify-center items-center\"\n      >\n        <p class=\"flex flex-row items-center justify-center text-center gap-1\">\n          <span class=\"text-xs text-[var(--color-primary-950)] uppercase\">Ships by</span>\n          <span class=\"text-xs font-bold text-[var(--color-primary-950)]\">${this._shippingDate}</span>\n        </p>\n      </div>\n    `;\n  }\n}\n","import { LitElement } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { effect } from \"@preact/signals-core\";\nimport {\n  registerCard,\n  changeCardVariant,\n  getCardSignals,\n  CardConfig,\n} from \"../store/collection-store\";\nimport { buildVariantUrl } from \"../utils/knocking\";\n\n/**\n * Invisible bootstrap element for each product/variant card.\n * Must be the first child of <product-card> in the liquid template.\n *\n * Responsibilities:\n *  - Reads product JSON + inventory quantities from embedded <script> tags\n *  - Determines the initial variant (first available, or pinned for variant-cards)\n *  - Registers the card's signal state in the collection store\n *  - Watches the hidden variant input for changes (from variant-dropdown-cp or\n *    any other vanilla selector) and forwards them to the store\n */\n@customElement(\"card-provider\")\nexport class CardProvider extends LitElement {\n  @property({ type: String, attribute: \"data-card-id\" }) cardId = \"\";\n  @property({ type: Number, attribute: \"data-initial-variant-id\" }) initialVariantId = 0;\n  @property({ type: Boolean, attribute: \"data-is-variant-card\" }) isVariantCard = false;\n  @property({ type: Number, attribute: \"data-option-size\" }) optionSize = 1;\n  @property({ type: Boolean, attribute: \"data-extended-offer-enabled\" }) extendedOfferEnabled = false;\n  @property({ type: Boolean, attribute: \"data-has-custom-text\" }) hasCustomText = false;\n  @property({ type: Boolean, attribute: \"data-customizable\" }) customizable = false;\n  @property({ type: Boolean, attribute: \"data-special-offer-enabled\" }) specialOfferEnabled = false;\n\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this;\n  }\n\n  connectedCallback() {\n    super.connectedCallback();\n    if (!this.cardId) return;\n\n    const card = this.closest(\"product-card\");\n    if (!card) return;\n\n    // ── 1. Parse product JSON ──────────────────────────────────────────────\n    const productEl = card.querySelector(\".product-card-product\");\n    if (!productEl?.textContent) {\n      console.error(`card-provider [${this.cardId}]: product JSON not found`);\n      return;\n    }\n    const productData = JSON.parse(productEl.textContent);\n\n    // ── 2. Inject inventory quantities into variants ───────────────────────\n    const qtyEl = card.querySelector(\"#variant-quantities\");\n    if (qtyEl?.textContent) {\n      if (this.isVariantCard) {\n        // variant-card embeds a single quantity for the pinned variant\n        const qty = parseInt(qtyEl.textContent.trim(), 10);\n        const pinned = productData.variants.find(\n          (v: any) => v.id === this.initialVariantId\n        );\n        if (pinned) pinned.inventoryQuantity = isNaN(qty) ? 0 : qty;\n      } else {\n        // product-card embeds \"/\"-delimited quantities in variant order\n        const qtys = qtyEl.textContent\n          .split(\"/\")\n          .filter(Boolean)\n          .map((s: string) => parseInt(s.trim(), 10));\n        productData.variants.forEach((v: any, i: number) => {\n          v.inventoryQuantity = isNaN(qtys[i]) ? 0 : qtys[i];\n        });\n      }\n    }\n\n    // ── 3. Read hidden variant IDs ─────────────────────────────────────────\n    const hiddenEl = card.querySelector(\"#hidden-variant-ids\");\n    const hiddenVariantIds = new Set<number>();\n    if (hiddenEl?.textContent) {\n      try {\n        const arr = JSON.parse(hiddenEl.textContent);\n        if (Array.isArray(arr)) {\n          arr.forEach((id: number) => hiddenVariantIds.add(id));\n        }\n      } catch {\n        // ignore malformed JSON\n      }\n    }\n\n    // ── 4. Determine initial variant ──────────────────────────────────────\n    const allVariants: any[] = productData.variants ?? [];\n    const visible = allVariants.filter((v) => !hiddenVariantIds.has(v.id));\n\n    let initialId: number | null = null;\n    if (this.isVariantCard) {\n      initialId = this.initialVariantId || null;\n    } else {\n      const first =\n        visible.find((v) => (v.inventoryQuantity ?? 0) > 0) ??\n        visible.find((v) => v.available) ??\n        visible[0] ??\n        null;\n      initialId = first?.id ?? null;\n    }\n\n    // ── 5. Build config and register ──────────────────────────────────────\n    const isCbsBox = (productData.tags ?? []).includes(\"cbs-box\");\n    const config: CardConfig = {\n      optionSize: this.optionSize,\n      visibleVariantCount: this.isVariantCard ? 1 : visible.length,\n      hasCustomText: this.hasCustomText,\n      isCustomizable: this.customizable,\n      extendedOfferEnabled: this.extendedOfferEnabled,\n      specialOfferEnabled: this.specialOfferEnabled,\n      isCbsBox,\n      hiddenVariantIds,\n    };\n\n    registerCard(this.cardId, productData, config, initialId);\n\n    // ── 6. Sync <a data-variant-href-base> links with selected variant ─────\n    effect(() => {\n      const variantId = getCardSignals(this.cardId)?.selectedVariantId.value;\n      const links = document.querySelectorAll<HTMLAnchorElement>(\n        `[data-variant-href-base][data-card-id=\"${this.cardId}\"]`\n      );\n      links.forEach((link) => {\n        const base = link.dataset.variantHrefBase ?? link.href;\n        link.href = buildVariantUrl(base, variantId);\n      });\n    });\n\n    // ── 7. Watch the hidden variant input for changes ──────────────────────\n    // variant-dropdown-cp (and other selectors) update input[name=\"id\"].\n    // We mirror those changes into the collection store signal.\n    const variantInput = card.querySelector<HTMLInputElement>('input[name=\"id\"]');\n    if (variantInput) {\n      variantInput.addEventListener(\"change\", (e) => {\n        const id = parseInt((e.target as HTMLInputElement).value, 10);\n        if (!isNaN(id)) changeCardVariant(this.cardId, id);\n      });\n    }\n  }\n\n  render() {\n    return null;\n  }\n}\n","import { LitElement, html } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { effect } from \"@preact/signals-core\";\nimport { getCardSignals } from \"../store/collection-store\";\nimport { formatToDollarCurrencyString } from \"../utils/knocking\";\n\n/**\n * Reactive price block for collection cards.\n *\n * Replaces the static `{% render 'price' %}` / `{% render 'dynamic-price-cp' %}`\n * inside product-card.liquid and variant-card.liquid.\n *\n * Attributes:\n *   data-card-id             — matches the card registered in collection-store\n *   data-label-regular       — a11y label for regular price (translated via Liquid)\n *   data-label-sale          — a11y label for sale price (translated via Liquid)\n */\n@customElement(\"card-price\")\nexport class CardPrice extends LitElement {\n  @property({ type: String, attribute: \"data-card-id\" }) cardId = \"\";\n  @property({ type: String, attribute: \"data-label-regular\" }) labelRegular = \"Regular price\";\n  @property({ type: String, attribute: \"data-label-sale\" }) labelSale = \"Sale price\";\n\n  @state() private _price: number | null = null;\n  @state() private _compareAtPrice: number | null = null;\n\n  private _disposeEffect?: () => void;\n\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this;\n  }\n\n  connectedCallback() {\n    super.connectedCallback();\n    const signals = getCardSignals(this.cardId);\n    if (!signals) {\n      console.error(`card-price: no signals for card \"${this.cardId}\"`);\n      return;\n    }\n    this._disposeEffect = effect(() => {\n      this._price = signals.price.value;\n      this._compareAtPrice = signals.compareAtPrice.value;\n    });\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    this._disposeEffect?.();\n  }\n\n  render() {\n    const price = this._price;\n    const compareAtPrice = this._compareAtPrice;\n    const priceStr = price != null ? formatToDollarCurrencyString(price) : \"\";\n    const compareFormatted =\n      compareAtPrice != null ? formatToDollarCurrencyString(compareAtPrice) : null;\n\n    return html`\n      <div class=\"flex items-center gap-4\">\n        <span class=\"price-pp__current text-2xl font-bold text-[var(--color-secondary-500)]\">${priceStr}</span>\n        ${compareFormatted\n          ? html`<span class=\"price-pp__compare text-base line-through font-semibold text-[var(--color-danger-700)]\">${compareFormatted}</span>`\n          : \"\"}\n      </div>\n    `;\n  }\n}\n","import { LitElement, html } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { effect } from \"@preact/signals-core\";\nimport { getCardSignals, BadgeResult } from \"../store/collection-store\";\n\n/**\n * Reactive discount badge for collection cards.\n *\n * Replaces the static `{% render 'discount-badge-product-card' %}` /\n * `{% render 'discount-badge-variant-card' %}` snippets.\n *\n * Attributes:\n *   data-card-id          — matches the card registered in collection-store\n *   data-text-exclusive   — translated \"Exclusive Offer\" label (from Liquid `t` filter)\n *   data-text-special     — translated \"Special Offer\" label (from Liquid `t` filter)\n */\n@customElement(\"card-badge\")\nexport class CardBadge extends LitElement {\n  @property({ type: String, attribute: \"data-card-id\" }) cardId = \"\";\n  @property({ type: String, attribute: \"data-text-exclusive\" }) textExclusive = \"Exclusive Offer\";\n  @property({ type: String, attribute: \"data-text-special\" }) textSpecial = \"Special Offer\";\n\n  @state() private _badge: BadgeResult = { type: \"exclusive-offer\", value: null };\n\n  private _disposeEffect?: () => void;\n\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this;\n  }\n\n  connectedCallback() {\n    super.connectedCallback();\n    const signals = getCardSignals(this.cardId);\n    if (!signals) {\n      console.error(`card-badge: no signals for card \"${this.cardId}\"`);\n      return;\n    }\n    this._disposeEffect = effect(() => {\n      this._badge = signals.badge.value;\n    });\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    this._disposeEffect?.();\n  }\n\n  render() {\n    const { type, value } = this._badge;\n\n    if (type === \"exclusive-offer\") {\n      return html`\n        <div class=\"discount-badge exclusive\">\n          <div class=\"discount-badge__text exclusive\">${this.textExclusive}</div>\n        </div>\n      `;\n    }\n\n    if (type === \"special-offer\") {\n      return html`\n        <div class=\"discount-badge special\">\n          <div class=\"discount-badge__text special\">${this.textSpecial}</div>\n        </div>\n      `;\n    }\n\n    // regular — show percentage\n    return html`\n      <div class=\"discount-badge\">\n        <div class=\"discount-badge__text\">${value}</div>\n        <div class=\"discount-badge__symbol\">\n          <span class=\"symbol-percentage\">%</span>\n          <span class=\"symbol-text\">OFF</span>\n        </div>\n      </div>\n    `;\n  }\n}\n","import { LitElement, html } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { effect } from \"@preact/signals-core\";\nimport { getCardSignals, getCardData, ButtonState } from \"../store/collection-store\";\nimport { startModalChain } from \"../store/modal-store\";\nimport { isVoucherProductTags, shouldMergeVouchers } from \"../store/voucher-store\";\nimport { buildVariantUrl } from \"../utils/knocking\";\n\n/**\n * Reactive add-to-cart / sold-out / state button for collection cards.\n *\n * Always type=\"button\" — bypasses product-form.js entirely.\n * All cart operations go through modal orchestrator for consistent modal handling\n * (holiday shipping, custom text, etc.), then cart-store.ts updates the reactive cart.\n *\n * Attributes (translated strings come from Liquid `t` filter):\n *   data-card-id              — matches the card registered in collection-store\n *   data-product-base-url     — base product URL for navigation states (no query string)\n *   data-text-add-to-cart\n *   data-text-sold-out\n *   data-text-extended-offer\n *   data-text-click-to-buy\n *   data-text-cbs-notify\n *   data-extra-classes        — extra CSS classes on the button (e.g. \"product-has-variants\")\n */\n@customElement(\"card-button\")\nexport class CardButton extends LitElement {\n  @property({ type: String, attribute: \"data-card-id\" }) cardId = \"\";\n  @property({ type: String, attribute: \"data-product-base-url\" }) productBaseUrl = \"\";\n\n  @property({ type: String, attribute: \"data-text-add-to-cart\" }) textAddToCart = \"Add to Cart\";\n  @property({ type: String, attribute: \"data-text-sold-out\" }) textSoldOut = \"Sold Out\";\n  @property({ type: String, attribute: \"data-text-extended-offer\" }) textExtendedOffer = \"Notify Me\";\n  @property({ type: String, attribute: \"data-text-click-to-buy\" }) textClickToBuy = \"Select Options\";\n  @property({ type: String, attribute: \"data-text-cbs-notify\" }) textCbsNotify = \"Notify me for next box\";\n  @property({ type: String, attribute: \"data-extra-classes\" }) extraClasses = \"\";\n\n  @state() private _buttonState: ButtonState = \"addToCart\";\n  @state() private _loading = false;\n  @state() private _showLimitNotice = false;\n\n  private _disposeEffect?: () => void;\n  private _limitNoticeTimer: ReturnType<typeof setTimeout> | null = null;\n\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this;\n  }\n\n  connectedCallback() {\n    super.connectedCallback();\n\n    const signals = getCardSignals(this.cardId);\n    if (!signals) {\n      console.error(`card-button: no signals for card \"${this.cardId}\"`);\n      return;\n    }\n\n    this._disposeEffect = effect(() => {\n      this._buttonState = signals.buttonState.value;\n    });\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    this._disposeEffect?.();\n    if (this._limitNoticeTimer !== null) clearTimeout(this._limitNoticeTimer);\n  }\n\n  private _triggerLimitNotice() {\n    if (this._limitNoticeTimer !== null) clearTimeout(this._limitNoticeTimer);\n    this._showLimitNotice = true;\n    this._limitNoticeTimer = setTimeout(() => {\n      this._showLimitNotice = false;\n      this._limitNoticeTimer = null;\n    }, 3000);\n  }\n\n  private get _label(): string {\n    switch (this._buttonState) {\n      case \"addToCart\":\n      case \"limitReached\": return this.textAddToCart;\n      case \"soldOut\": return this.textSoldOut;\n      case \"extendedOffer-modal\":\n      case \"extendedOffer-redirect\": return this.textExtendedOffer;\n      case \"clickToBuy\": return this.textClickToBuy;\n      case \"cbsNotify\": return this.textCbsNotify;\n    }\n  }\n\n  private _openExtendedOffer() {\n    const signals = getCardSignals(this.cardId);\n    const productData = getCardData(this.cardId);\n    const variant = signals?.selectedVariant.value;\n\n    this.dispatchEvent(\n      new CustomEvent(\"open-extended-offer\", {\n        bubbles: true,\n        composed: true,\n        detail: {\n          variant: variant,\n          product: productData,\n        },\n      })\n    );\n  }\n\n  /** Read all properties[*] hidden inputs from the parent form. */\n  private _collectProperties(): Record<string, string> {\n    const form = this.closest(\"form\");\n    if (!form) return {};\n    const props: Record<string, string> = {};\n    for (const input of Array.from(\n      form.querySelectorAll<HTMLInputElement>('input[name^=\"properties[\"]')\n    )) {\n      const match = input.name.match(/properties\\[(.+)\\]/);\n      if (match && input.value) props[match[1]] = input.value;\n    }\n    return props;\n  }\n\n  /** Navigate to the product URL with the currently selected variant. */\n  private _navigateToProduct() {\n    const signals = getCardSignals(this.cardId);\n    const variantId = signals?.selectedVariantId.value;\n    const base = this.productBaseUrl;\n    if (!base) return;\n    window.location.href = buildVariantUrl(base, variantId);\n  }\n\n  private async _handleClick(e: Event) {\n    e.preventDefault(); // stop <a> navigation AND form submission for all states\n\n    if (this._loading) return;\n\n    switch (this._buttonState) {\n      case \"limitReached\": {\n        this._triggerLimitNotice();\n        break;\n      }\n\n      case \"addToCart\": {\n        const signals = getCardSignals(this.cardId);\n        const productData = getCardData(this.cardId);\n        const variantId = signals?.selectedVariantId.value;\n        const variant = signals?.selectedVariant.value;\n\n        if (!variantId) return;\n\n        const properties = this._collectProperties();\n        if (signals?.shipsBy) {\n          properties[\"_ships-by\"] = signals.shipsBy;\n        }\n\n        const button = e.target as HTMLButtonElement;\n\n        const rawImageSrc = variant?.featured_image?.src || productData?.featured_image || \"\";\n        const imageUrl = rawImageSrc.startsWith(\"//\") ? `https:${rawImageSrc}` : rawImageSrc;\n\n        const tags = signals?.tags;\n        const isVoucher = isVoucherProductTags(tags);\n\n        this._loading = true;\n        try {\n          const added = await startModalChain({\n            productId: signals?.productId,\n            variantId: variantId,\n            quantity: 1,\n            productTitle: productData?.title,\n            variantTitle: variant?.title || variant?.name,\n            customization: properties,\n            triggerButton: button,\n            vendor: signals?.vendor || \"\",\n            source: \"product-card\",\n            imageUrl,\n            isVoucher,\n            variantSku: isVoucher ? variant?.sku : undefined,\n            mergeVouchers: isVoucher ? shouldMergeVouchers(tags) : undefined,\n          });\n          // Safety net: if the add was blocked (e.g. a limit reached before the\n          // button state updated), surface the limit notice instead of failing silently.\n          if (!added) this._triggerLimitNotice();\n        } finally {\n          this._loading = false;\n        }\n        break;\n      }\n\n      case \"clickToBuy\":\n      case \"extendedOffer-redirect\":\n        this._navigateToProduct();\n        break;\n\n      case \"cbsNotify\":\n      case \"extendedOffer-modal\":\n        this._openExtendedOffer();\n        break;\n\n      case \"soldOut\":\n        // No action\n        break;\n    }\n  }\n\n  render() {\n    const isDisabled = this._buttonState === \"soldOut\" || this._loading;\n    const isExtendedOfferState =\n      this._buttonState === \"extendedOffer-modal\" ||\n      this._buttonState === \"extendedOffer-redirect\" ||\n      this._buttonState === \"cbsNotify\";\n\n    const baseClasses = [\n      \"product-form__submit\",\n      \"button\",\n      \"w-full\",\n      \"btn\",\n      \"min-h-[48px]\",\n      \"rounded-l-none\",\n      isExtendedOfferState\n        ? \"bg-[var(--color-secondary-500)] hover:bg-[var(--color-secondary-500)] text-white\"\n        : \"\",\n      this.extraClasses,\n    ]\n      .filter(Boolean)\n      .join(\" \");\n\n    // Derive limit type from signals for the notice text\n    const signals = getCardSignals(this.cardId);\n    const limitType = signals?.productId\n      ? (window as any).productLimits?.[signals.productId.toString()] !== undefined\n        ? \"product\"\n        : (window as any).brandLimits?.[signals.vendor] !== undefined\n          ? \"brand\"\n          : \"product\"\n      : \"product\";\n\n    // No dynamic child bindings inside <button>.\n    // Vanilla product-card.js calls button.textContent = \"...\" which destroys\n    // any text nodes Lit creates inside the button, causing null-ref errors on\n    // the next render cycle. Text is set imperatively in updated() instead.\n    return html`\n      <button\n        type=\"button\"\n        name=\"add\"\n        class=${baseClasses}\n        data-button-location=\"product-card\"\n        ?disabled=${isDisabled}\n        @click=${this._handleClick}\n      ></button>\n      <div\n        class=\"absolute inset-0 z-10 flex items-center justify-center rounded-sm bg-[var(--color-danger-200)] px-5 text-center transition-opacity duration-300 ease-out ${this._showLimitNotice ? \"pointer-events-auto opacity-100\" : \"pointer-events-none opacity-0\"}\"\n      >\n        <span class=\"text-sm text-[var(--color-danger-950)]\"\n          >You've reached the limit for this ${limitType}</span>\n      </div>\n    `;\n  }\n\n  updated() {\n    const btn = this.querySelector<HTMLButtonElement>(\"button.product-form__submit\");\n    if (!btn) return;\n    if (this._loading) {\n      btn.innerHTML = `\n        <svg aria-hidden=\"true\" focusable=\"false\" class=\"animate-spin w-[18px] h-[18px]\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n          <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"rgba(255,255,255,0.25)\" stroke-width=\"2.5\"></circle>\n          <circle cx=\"12\" cy=\"12\" r=\"10\" stroke=\"rgba(255,255,255,0.9)\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-dasharray=\"62.83\" stroke-dashoffset=\"47\"></circle>\n        </svg>`;\n    } else {\n      btn.textContent = this._label;\n    }\n  }\n}\n","import { LitElement, html } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { effect } from \"@preact/signals-core\";\nimport {\n  getCardSignals,\n  getCardData,\n  getCardConfig,\n  changeCardVariant,\n} from \"../store/collection-store\";\n\n/**\n * Variant dropdown selector for collection product cards.\n * Replaces the legacy variant-dropdown-cp component with a reactive Lit implementation.\n *\n * Usage: <card-variant-selector data-card-id=\"p-12345\"></card-variant-selector>\n */\n@customElement(\"card-variant-selector\")\nexport class CardVariantSelector extends LitElement {\n  @property({ type: String, attribute: \"data-card-id\" }) cardId = \"\";\n\n  @state() private _selectedId: number | null = null;\n  @state() private _variants: any[] = [];\n\n  private _disposeEffect?: () => void;\n\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this;\n  }\n\n  connectedCallback() {\n    super.connectedCallback();\n    if (!this.cardId) return;\n\n    // Load product data and filter variants\n    const productData = getCardData(this.cardId);\n    const config = getCardConfig(this.cardId);\n\n    if (!productData || !config) {\n      console.warn(`card-variant-selector: no data/config for ${this.cardId}`);\n      return;\n    }\n\n    // Filter out hidden variants\n    const allVariants = productData.variants ?? [];\n    this._variants = allVariants.filter(\n      (v: any) => !config.hiddenVariantIds.has(v.id)\n    );\n\n    // Subscribe to the selected variant signal from the collection store.\n    // Must run here (not in the constructor) — the `data-card-id` attribute is\n    // not reflected onto `this.cardId` until after construction, so a\n    // constructor effect would guard-return before reading any signal and never\n    // subscribe, leaving the native <select> stuck on its first <option>.\n    this._disposeEffect = effect(() => {\n      const signals = getCardSignals(this.cardId);\n      if (!signals) return;\n      this._selectedId = signals.selectedVariantId.value ?? null;\n    });\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    this._disposeEffect?.();\n  }\n\n  private _onVariantChange(e: Event) {\n    const select = e.target as HTMLSelectElement;\n    const variantId = parseInt(select.value, 10);\n    if (!isNaN(variantId)) {\n      changeCardVariant(this.cardId, variantId);\n    }\n  }\n\n  render() {\n    // Don't render if there's only one variant or no variants\n    if (this._variants.length <= 1) {\n      return html`<div class=\"variant-select-placeholder\"></div>`;\n    }\n\n    return html`\n      <div class=\"product-form__input product-form__input--dropdown w-full h-[42px] rounded-sm border border-[var(--color-neutral-300)] bg-white transition-colors duration-200 focus-within:border-[var(--color-secondary-500)] focus-within:ring-2 focus-within:ring-[var(--color-secondary-200)]\">\n        <div class=\"select relative h-full\">\n          <select\n            @change=${this._onVariantChange}\n            .value=${this._selectedId != null ? String(this._selectedId) : \"\"}\n            class=\"peer select__select h-full w-full appearance-none pr-12 pl-3 text-xs font-medium uppercase leading-[18px] text-[var(--color-neutral-700)] outline-none tracking-wider\"\n            aria-label=\"Select variant\"\n          >\n            ${this._variants.map(\n              (v: any) => html`\n                <option\n                  value=\"${v.id}\"\n                  ?selected=${this._selectedId === v.id}\n                >\n                  ${v.title}\n                </option>\n              `\n            )}\n          </select>\n          <svg\n            aria-hidden=\"true\"\n            focusable=\"false\"\n            viewBox=\"0 0 10 6\"\n            class=\"pointer-events-none absolute right-4 top-1/2 h-[8px] w-[14px] -translate-y-1/2 text-[var(--color-neutral-700)] transition-colors duration-200 peer-focus:text-[var(--color-secondary-500)]\"\n          >\n            <path\n              fill-rule=\"evenodd\"\n              clip-rule=\"evenodd\"\n              d=\"M9.354.646a.5.5 0 00-.708 0L5 4.293 1.354.646a.5.5 0 00-.708.708l4 4a.5.5 0 00.708 0l4-4a.5.5 0 000-.708z\"\n              fill=\"currentColor\"\n            ></path>\n          </svg>\n        </div>\n      </div>\n    `;\n  }\n}\n","import { LitElement, html } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { effect } from \"@preact/signals-core\";\nimport { getCardSignals } from \"../store/collection-store\";\n\n/**\n * Image switcher for collection product cards.\n * Wraps the image containers and reactively shows/hides variant images\n * based on the selected variant from the collection store.\n *\n * Usage:\n * <card-image-switcher data-card-id=\"p-12345\">\n *   <div class=\"media--product\">...</div>\n *   <div class=\"media--variants\">...</div>\n * </card-image-switcher>\n */\n@customElement(\"card-image-switcher\")\nexport class CardImageSwitcher extends LitElement {\n  @property({ type: String, attribute: \"data-card-id\" }) cardId = \"\";\n\n  private productImagesWrapper: HTMLElement | null = null;\n  private variantImagesWrapper: HTMLElement | null = null;\n  private variantImages: HTMLImageElement[] = [];\n\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this;\n  }\n\n  connectedCallback() {\n    super.connectedCallback();\n    this._findImageElements();\n\n    // Subscribe to variant changes AFTER elements are found\n    effect(() => {\n      if (!this.cardId) return;\n\n      const signals = getCardSignals(this.cardId);\n      if (!signals) return;\n\n      const selectedVariant = signals.selectedVariant.value;\n      if (selectedVariant) {\n        this._switchImage(selectedVariant.id);\n      }\n    });\n  }\n\n  private _findImageElements() {\n    // Find the image container elements\n    this.productImagesWrapper = this.querySelector(\".media--product\");\n    this.variantImagesWrapper = this.querySelector(\".media--variants\");\n    this.variantImages = Array.from(\n      this.variantImagesWrapper?.querySelectorAll(\"img[data-variant-id]\") ?? []\n    );\n  }\n\n  private _switchImage(variantId: number) {\n    if (!this.productImagesWrapper || !this.variantImagesWrapper) {\n      console.warn(`card-image-switcher [${this.cardId}]: DOM elements not found`);\n      return;\n    }\n\n    const variantIdStr = variantId.toString();\n    // console.log(`card-image-switcher [${this.cardId}]: switching to variant ${variantIdStr}`);\n\n    // Find the variant image matching the selected variant\n    const selectedVariantImage = this.variantImages.find((image) => {\n      const datasetVariantId = image.dataset.variantId;\n      if (!datasetVariantId) {\n        console.error(\"datasetVariantId not found\");\n        return false;\n      }\n      return datasetVariantId === variantIdStr;\n    });\n\n    if (selectedVariantImage) {\n      // Hide all variant images first\n      for (const image of this.variantImages) {\n        (image as HTMLElement).style.display = \"none\";\n      }\n\n      // Show variant images wrapper, hide product images\n      this.productImagesWrapper.style.display = \"none\";\n      this.variantImagesWrapper.style.display = \"block\";\n      selectedVariantImage.style.display = \"block\";\n      selectedVariantImage.style.opacity = \"1\";\n    } else {\n      // No variant-specific image found, show default product images\n      this.variantImagesWrapper.style.display = \"none\";\n      this.productImagesWrapper.style.display = \"block\";\n    }\n  }\n\n  render() {\n    return html`<slot></slot>`;\n  }\n}\n","import { LitElement, html } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { effect } from \"@preact/signals-core\";\nimport { getCardSignals } from \"../store/collection-store\";\nimport { calculateShippingDate } from \"../utils/knocking\";\n\n/**\n * Ships-by date display for collection product cards.\n * Replaces the legacy ships-by-notification component with a reactive Lit implementation.\n *\n * Displays the calculated shipping date in short format (e.g., \"Mar 11\").\n *\n * Usage: <card-ships-by data-card-id=\"p-12345\"></card-ships-by>\n */\n@customElement(\"card-ships-by\")\nexport class CardShipsBy extends LitElement {\n  @property({ type: String, attribute: \"data-card-id\" }) cardId = \"\";\n\n  @state() private _shippingDate: string | null = null;\n  @state() private _showSoldOut = false;\n\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this;\n  }\n\n  connectedCallback() {\n    super.connectedCallback();\n\n    // Subscribe to card signals and calculate shipping date\n    effect(() => {\n      if (!this.cardId) {\n        console.warn('card-ships-by: no cardId');\n        return;\n      }\n\n      const signals = getCardSignals(this.cardId);\n\n      if (!signals) {\n        console.warn(`card-ships-by [${this.cardId}]: no signals found`);\n        this._shippingDate = null;\n        this._showSoldOut = false;\n        return;\n      }\n\n      const buttonState = signals.buttonState.value;\n      const isNotifyState =\n        buttonState === \"extendedOffer-modal\" ||\n        buttonState === \"extendedOffer-redirect\" ||\n        buttonState === \"cbsNotify\";\n\n      if (isNotifyState) {\n        this._showSoldOut = true;\n        this._shippingDate = null;\n        return;\n      }\n\n      this._showSoldOut = false;\n\n      if (!signals.shipsBy) {\n        console.log(`card-ships-by [${this.cardId}]: no shipsBy value`);\n        this._shippingDate = null;\n        return;\n      }\n\n      try {\n        const calculated = calculateShippingDate(signals.shipsBy);\n        this._shippingDate = calculated.shortDate || calculated.longDate;\n      } catch (error) {\n        console.error(`card-ships-by [${this.cardId}]: failed to calculate date`, error);\n        this._shippingDate = null;\n      }\n    });\n  }\n\n  render() {\n    if (this._showSoldOut) {\n      return html`\n        <div\n          id=\"product-shipsby-notice\"\n          class=\"product__shipsby-notice h-full bg-[var(--color-secondary-50)] uppercase text-xs text-[var(--color-primary-950)] tracking-[0.1em] py-[5.5px] px-4 text-center flex flex-col justify-center items-center\"\n        >\n          <p class=\"flex flex-col text-center\">\n            <span class=\"text-sm font-bold text-[var(--color-secondary-950)]\">Sold Out</span>\n          </p>\n        </div>\n      `;\n    }\n\n    if (!this._shippingDate) {\n      return html`<!-- card-ships-by: no shipping date -->`;\n    }\n\n    return html`\n      <div\n        id=\"product-shipsby-notice\"\n          class=\"product__shipsby-notice bg-[var(--color-primary-100)] h-full uppercase text-xs text-[var(--color-primary-950)] tracking-[0.1em] py-[5.5px] px-4 text-center flex flex-col justify-center items-center\"\n      >\n        <p class=\"flex flex-col text-center\">\n          <span class=\"text-xs text-[var(--color-primary-950)] uppercase\">Ships by</span>\n          <span class=\"text-sm font-bold text-[var(--color-primary-950)]\">${this._shippingDate}</span>\n        </p>\n      </div>\n    `;\n  }\n}\n","import { LitElement } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\nimport { effect } from \"@preact/signals-core\";\nimport { ButtonState, getCardSignals } from \"../store/collection-store\";\n\n@customElement(\"card-background\")\nexport class CardBackground extends LitElement {\n  @property({ type: String, attribute: \"data-card-id\" }) cardId = \"\";\n  @property({ type: String, attribute: \"data-in-stock-gradient\" })\n  inStockGradient =\n    \"linear-gradient(140deg, var(--color-secondary-50) 0%, var(--color-primary-50) 100%)\";\n  @property({ type: String, attribute: \"data-unavailable-gradient\" })\n  unavailableGradient =\n    \"linear-gradient(120deg, var(--color-secondary-100) 0%, var(--color-secondary-100) 100%)\";\n\n  private _disposeEffect?: () => void;\n\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this;\n  }\n\n  connectedCallback() {\n    super.connectedCallback();\n\n    this._disposeEffect = effect(() => {\n      if (!this.cardId) return;\n\n      const card = this.closest(\"product-card\");\n      if (!card) return;\n\n      const cardBody = card.querySelector<HTMLElement>(\"[data-card-body]\");\n      if (!cardBody) return;\n\n      const signals = getCardSignals(this.cardId);\n      if (!signals) return;\n\n      const state = signals.buttonState.value;\n      cardBody.style.background = this._isUnavailableState(state)\n        ? this.unavailableGradient\n        : this.inStockGradient;\n    });\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    if (this._disposeEffect) this._disposeEffect();\n  }\n\n  private _isUnavailableState(state: ButtonState): boolean {\n    return state !== \"addToCart\" && state !== \"clickToBuy\" && state !== \"limitReached\";\n  }\n\n  render() {\n    return null;\n  }\n}\n","const GRID_SELECTOR = '.product-grid';\nconst ITEM_SELECTOR = '.grid__item';\nconst TITLE_SELECTOR = '[data-card-title]';\nconst ROW_TOP_TOLERANCE_PX = 4;\n\nlet resizeListenerAttached = false;\nlet gridResizeObserver: ResizeObserver | null = null;\nlet gridMutationObserver: MutationObserver | null = null;\nlet equalizeFrame = 0;\n\nfunction groupItemsByRow(items: HTMLElement[]): HTMLElement[][] {\n  const sorted = [...items].sort(\n    (a, b) => a.getBoundingClientRect().top - b.getBoundingClientRect().top,\n  );\n\n  const rows: HTMLElement[][] = [];\n\n  for (const item of sorted) {\n    const top = item.getBoundingClientRect().top;\n    const currentRow = rows[rows.length - 1];\n\n    if (!currentRow) {\n      rows.push([item]);\n      continue;\n    }\n\n    const rowTop = currentRow[0].getBoundingClientRect().top;\n    if (Math.abs(top - rowTop) <= ROW_TOP_TOLERANCE_PX) {\n      currentRow.push(item);\n    } else {\n      rows.push([item]);\n    }\n  }\n\n  return rows;\n}\n\nfunction equalizeRowTitles(titles: HTMLElement[]): void {\n  titles.forEach((title) => {\n    title.style.minHeight = '';\n  });\n\n  const maxHeight = Math.max(0, ...titles.map((title) => title.offsetHeight));\n  if (maxHeight === 0) return;\n\n  titles.forEach((title) => {\n    title.style.minHeight = `${maxHeight}px`;\n  });\n}\n\nexport function equalizeCardTitleHeights(): void {\n  document.querySelectorAll<HTMLElement>(GRID_SELECTOR).forEach((grid) => {\n    const items = Array.from(grid.querySelectorAll<HTMLElement>(ITEM_SELECTOR));\n    if (items.length === 0) return;\n\n    const rows = groupItemsByRow(items);\n\n    for (const rowItems of rows) {\n      const titles = rowItems\n        .map((item) => item.querySelector<HTMLElement>(TITLE_SELECTOR))\n        .filter((title): title is HTMLElement => title !== null);\n\n      if (titles.length > 1) {\n        equalizeRowTitles(titles);\n      }\n    }\n  });\n}\n\nfunction scheduleEqualizeCardTitleHeights(): void {\n  if (equalizeFrame) cancelAnimationFrame(equalizeFrame);\n\n  equalizeFrame = requestAnimationFrame(() => {\n    equalizeFrame = 0;\n    equalizeCardTitleHeights();\n  });\n}\n\nfunction observeGrid(grid: HTMLElement): void {\n  if (grid.dataset.titleHeightsObserved === 'true') return;\n  grid.dataset.titleHeightsObserved = 'true';\n\n  gridResizeObserver?.observe(grid);\n  gridMutationObserver?.observe(grid, { childList: true, subtree: true });\n}\n\nfunction observeProductGrids(): void {\n  document.querySelectorAll<HTMLElement>(GRID_SELECTOR).forEach(observeGrid);\n}\n\nfunction initGridObservers(): void {\n  if (gridResizeObserver || gridMutationObserver) return;\n\n  const handleChange = () => {\n    observeProductGrids();\n    scheduleEqualizeCardTitleHeights();\n  };\n\n  gridResizeObserver = new ResizeObserver(handleChange);\n  gridMutationObserver = new MutationObserver(handleChange);\n\n  observeProductGrids();\n\n  const collectionGrid = document.getElementById('CollectionProductGrid');\n  if (collectionGrid) {\n    gridMutationObserver.observe(collectionGrid, { childList: true, subtree: true });\n  }\n\n  const bodyObserver = new MutationObserver(() => {\n    observeProductGrids();\n    scheduleEqualizeCardTitleHeights();\n  });\n  bodyObserver.observe(document.body, { childList: true, subtree: true });\n}\n\nexport function initEqualizeCardTitleHeights(): void {\n  const run = () => scheduleEqualizeCardTitleHeights();\n\n  initGridObservers();\n  run();\n\n  if (!resizeListenerAttached) {\n    window.addEventListener('resize', run);\n    resizeListenerAttached = true;\n  }\n\n  if (document.fonts && document.fonts.ready) {\n    document.fonts.ready.then(run).catch(() => undefined);\n  }\n}\n","/**\n * CartDrawer — vanilla custom element (no Lit render).\n *\n * Responsibilities:\n *  - Reactively toggle the `cart-drawer-open` class and `inert` attribute\n *    based on the `isCartOpen` signal.\n *  - Wire up the close button, outside-click, and cart-icon click.\n *  - Manage a11y (aria-hidden + inert on background sections).\n *\n * Intentionally does NOT use Lit so the Liquid-rendered children\n * (header, item list, footer) are never overwritten by a render pass.\n */\n\nimport { effect } from \"@preact/signals-core\";\nimport { isCartOpen, openCart, closeCart } from \"../store/cart-store\";\n\nclass CartDrawer extends HTMLElement {\n  private _disposeEffect?: () => void;\n  private _outsideClickRaf: number | null = null;\n  private _handleOutsideClick = (event: MouseEvent) => {\n    if (!isCartOpen.value) return;\n\n    const target = event.target as Element;\n    if (!target.closest(\"#cart-icon\") && !target.closest(\"cart-drawer\")) {\n      closeCart();\n    }\n  };\n\n  /** Attach the outside-click listener one frame after opening, so the click\n   *  that opened the drawer (in the synchronous cart-icon case) can't\n   *  immediately close it again. */\n  private _attachOutsideClick() {\n    if (this._outsideClickRaf !== null) return;\n    this._outsideClickRaf = requestAnimationFrame(() => {\n      this._outsideClickRaf = null;\n      window.addEventListener(\"click\", this._handleOutsideClick);\n    });\n  }\n\n  private _detachOutsideClick() {\n    if (this._outsideClickRaf !== null) {\n      cancelAnimationFrame(this._outsideClickRaf);\n      this._outsideClickRaf = null;\n    }\n    window.removeEventListener(\"click\", this._handleOutsideClick);\n  }\n\n  connectedCallback() {\n    // Close button (rendered in Liquid)\n    const closeBtn = this.querySelector<HTMLElement>(\"#cart-drawer-close-x-lit\");\n    closeBtn?.addEventListener(\"click\", (e) => {\n      e.stopPropagation();\n      closeCart();\n    });\n\n    // Continue shopping button (rendered in Liquid footer)\n    const continueBtn = this.querySelector<HTMLElement>(\n      \"#continue-shopping-button-lit\"\n    );\n    continueBtn?.addEventListener(\"click\", () => closeCart());\n\n    // Cart icon in the header (exists outside this element)\n    const cartIcon = document.querySelector<HTMLElement>(\"#cart-icon\");\n    cartIcon?.addEventListener(\"click\", () => openCart());\n\n    // Reactive effect: open/close state → DOM\n    this._disposeEffect = effect(() => {\n      const open = isCartOpen.value;\n\n      if (open) {\n        this._attachOutsideClick();\n        this.classList.add(\"cart-drawer-open\");\n        this.inert = false;\n        this.removeAttribute(\"aria-hidden\");\n        this._setBackgroundHidden(true);\n        (window as any).knocking?.showBlur?.();\n        (window as any).knocking?.disableScroll?.();\n      } else {\n        this._detachOutsideClick();\n        this.classList.remove(\"cart-drawer-open\");\n        this.inert = true;\n        this._setBackgroundHidden(false);\n        (window as any).knocking?.hideBlur?.();\n        (window as any).knocking?.enableScroll?.();\n      }\n    });\n  }\n\n  disconnectedCallback() {\n    this._disposeEffect?.();\n    this._detachOutsideClick();\n  }\n\n  private _setBackgroundHidden(hide: boolean) {\n    const selectors = [\n      \"#shopify-section-announcement-bar\",\n      \"#shopify-section-header\",\n\n      \"main#MainContent\",\n      \"#shopify-section-footer\",\n    ];\n    selectors.forEach((sel) => {\n      const el = document.querySelector<HTMLElement>(sel);\n      if (!el) return;\n      if (hide) {\n        el.setAttribute(\"aria-hidden\", \"true\");\n        try {\n          el.inert = true;\n        } catch (_) {}\n      } else {\n        el.removeAttribute(\"aria-hidden\");\n        try {\n          el.inert = false;\n        } catch (_) {}\n      }\n    });\n  }\n}\n\ncustomElements.define(\"cart-drawer\", CartDrawer);\n","/**\n * MenuDrawer — vanilla custom element (no Lit render).\n *\n * Responsibilities:\n *  - Toggle the `menu-drawer-open` class and `inert` attribute on open/close\n *  - Wire up the close button, outside-click, and open button (#menu-drawer-open-btn)\n *  - Manage blur overlay and scroll lock (same pattern as CartDrawer)\n *  - Listen for `close-menu` custom event dispatched by StickyHeader\n */\n\nclass MenuDrawer extends HTMLElement {\n  private _handleOutsideClick = (event: MouseEvent) => {\n    if (!this.classList.contains(\"menu-drawer-open\")) return;\n    const target = event.target as Element;\n    if (\n      !target.closest(\"menu-drawer\") &&\n      !target.closest(\"#menu-drawer-open-btn\")\n    ) {\n      this._close();\n    }\n  };\n\n  connectedCallback() {\n    const closeBtn = document.getElementById(\"menu-drawer-close-btn\");\n    closeBtn && closeBtn.addEventListener(\"click\", () => this._close());\n\n    const openBtn = document.getElementById(\"menu-drawer-open-btn\");\n    openBtn && openBtn.addEventListener(\"click\", () => this._open());\n\n    this.addEventListener(\"close-menu\", () => this._close());\n\n    window.addEventListener(\"click\", this._handleOutsideClick);\n  }\n\n  disconnectedCallback() {\n    window.removeEventListener(\"click\", this._handleOutsideClick);\n  }\n\n  private _open() {\n    this.classList.add(\"menu-drawer-open\");\n    this.inert = false;\n    this.removeAttribute(\"aria-hidden\");\n\n    const openBtn = document.getElementById(\"menu-drawer-open-btn\");\n    if (openBtn) openBtn.setAttribute(\"aria-expanded\", \"true\");\n\n    this._setBackgroundHidden(true);\n    const knocking = (window as any).knocking;\n    if (knocking) {\n      knocking.showBlur && knocking.showBlur();\n      knocking.disableScroll && knocking.disableScroll();\n    }\n  }\n\n  private _close() {\n    this.classList.remove(\"menu-drawer-open\");\n    this.inert = true;\n\n    const openBtn = document.getElementById(\"menu-drawer-open-btn\");\n    if (openBtn) openBtn.setAttribute(\"aria-expanded\", \"false\");\n\n    this._setBackgroundHidden(false);\n\n    const cartDrawerOpen = document.querySelector(\".cart-drawer-open\");\n    if (!cartDrawerOpen) {\n      const knocking = (window as any).knocking;\n      if (knocking) {\n        knocking.hideBlur && knocking.hideBlur();\n        knocking.enableScroll && knocking.enableScroll();\n      }\n    }\n  }\n\n  private _setBackgroundHidden(hide: boolean) {\n    // Don't set #shopify-section-header inert — it contains the menu-drawer\n    const selectors = [\n      \"#shopify-section-announcement-bar\",\n      \"main#MainContent\",\n      \"#shopify-section-footer\",\n    ];\n    selectors.forEach((sel) => {\n      const el = document.querySelector<HTMLElement>(sel);\n      if (!el) return;\n      if (hide) {\n        el.setAttribute(\"aria-hidden\", \"true\");\n        try {\n          el.inert = true;\n        } catch (_) {}\n      } else {\n        el.removeAttribute(\"aria-hidden\");\n        try {\n          el.inert = false;\n        } catch (_) {}\n      }\n    });\n  }\n}\n\ncustomElements.define(\"menu-drawer\", MenuDrawer);\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t={ATTRIBUTE:1,CHILD:2,PROPERTY:3,BOOLEAN_ATTRIBUTE:4,EVENT:5,ELEMENT:6},e=t=>(...e)=>({_$litDirective$:t,values:e});class i{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,e,i){this._$Ct=t,this._$AM=e,this._$Ci=i}_$AS(t,e){return this.update(t,e)}update(t,e){return this.render(...e)}}export{i as Directive,t as PartType,e as directive};\n//# sourceMappingURL=directive.js.map\n","import{_$LH as o}from\"./lit-html.js\";\n/**\n * @license\n * Copyright 2020 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{I:t}=o,i=o=>o,n=o=>null===o||\"object\"!=typeof o&&\"function\"!=typeof o,e={HTML:1,SVG:2,MATHML:3},l=(o,t)=>void 0===t?void 0!==o?._$litType$:o?._$litType$===t,d=o=>null!=o?._$litType$?.h,c=o=>void 0!==o?._$litDirective$,f=o=>o?._$litDirective$,r=o=>void 0===o.strings,s=()=>document.createComment(\"\"),v=(o,n,e)=>{const l=o._$AA.parentNode,d=void 0===n?o._$AB:n._$AA;if(void 0===e){const i=l.insertBefore(s(),d),n=l.insertBefore(s(),d);e=new t(i,n,o,o.options)}else{const t=e._$AB.nextSibling,n=e._$AM,c=n!==o;if(c){let t;e._$AQ?.(o),e._$AM=o,void 0!==e._$AP&&(t=o._$AU)!==n._$AU&&e._$AP(t)}if(t!==d||c){let o=e._$AA;for(;o!==t;){const t=i(o).nextSibling;i(l).insertBefore(o,d),o=t}}}return e},u=(o,t,i=o)=>(o._$AI(t,i),o),m={},p=(o,t=m)=>o._$AH=t,M=o=>o._$AH,h=o=>{o._$AR(),o._$AA.remove()},j=o=>{o._$AR()};export{e as TemplateResultType,j as clearPart,M as getCommittedValue,f as getDirectiveClass,v as insertPart,d as isCompiledTemplateResult,c as isDirectiveResult,n as isPrimitive,r as isSingleExpression,l as isTemplateResult,h as removePart,u as setChildPartValue,p as setCommittedValue};\n//# sourceMappingURL=directive-helpers.js.map\n","import{noChange as e}from\"../lit-html.js\";import{directive as s,Directive as t,PartType as r}from\"../directive.js\";import{getCommittedValue as l,setChildPartValue as o,insertPart as i,removePart as n,setCommittedValue as f}from\"../directive-helpers.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst u=(e,s,t)=>{const r=new Map;for(let l=s;l<=t;l++)r.set(e[l],l);return r},c=s(class extends t{constructor(e){if(super(e),e.type!==r.CHILD)throw Error(\"repeat() can only be used in text expressions\")}dt(e,s,t){let r;void 0===t?t=s:void 0!==s&&(r=s);const l=[],o=[];let i=0;for(const s of e)l[i]=r?r(s,i):i,o[i]=t(s,i),i++;return{values:o,keys:l}}render(e,s,t){return this.dt(e,s,t).values}update(s,[t,r,c]){const d=l(s),{values:p,keys:a}=this.dt(t,r,c);if(!Array.isArray(d))return this.ut=a,p;const h=this.ut??=[],v=[];let m,y,x=0,j=d.length-1,k=0,w=p.length-1;for(;x<=j&&k<=w;)if(null===d[x])x++;else if(null===d[j])j--;else if(h[x]===a[k])v[k]=o(d[x],p[k]),x++,k++;else if(h[j]===a[w])v[w]=o(d[j],p[w]),j--,w--;else if(h[x]===a[w])v[w]=o(d[x],p[w]),i(s,v[w+1],d[x]),x++,w--;else if(h[j]===a[k])v[k]=o(d[j],p[k]),i(s,d[x],d[j]),j--,k++;else if(void 0===m&&(m=u(a,k,w),y=u(h,x,j)),m.has(h[x]))if(m.has(h[j])){const e=y.get(a[k]),t=void 0!==e?d[e]:null;if(null===t){const e=i(s,d[x]);o(e,p[k]),v[k]=e}else v[k]=o(t,p[k]),i(s,d[x],t),d[e]=null;k++}else n(d[j]),j--;else n(d[x]),x++;for(;k<=w;){const e=i(s,v[w+1]);o(e,p[k]),v[k++]=e}for(;x<=j;){const e=d[x++];null!==e&&n(e)}return this.ut=a,f(s,v),e}});export{c as repeat};\n//# sourceMappingURL=repeat.js.map\n","import { LitElement, html } from \"lit\";\nimport { repeat } from \"lit/directives/repeat.js\";\nimport { customElement, state } from \"lit/decorators.js\";\nimport { effect } from \"@preact/signals-core\";\nimport { cartData, isEmpty, isCartLoading, CartItem } from \"../store/cart-store\";\n\n/** Items visible in the list (excludes custom-sku fee items) */\nfunction partitionItems(items: CartItem[]): {\n  visible: CartItem[];\n  customSkuByParent: Map<string, CartItem>;\n} {\n  const customSkuByParent = new Map<string, CartItem>();\n  const visible: CartItem[] = [];\n\n  for (const item of items) {\n    const props = item.properties ?? {};\n    if (props[\"_custom-sku-variant\"]) {\n      const parentVariant = props[\"_variant-to-customize\"];\n      if (parentVariant) {\n        const yourText = props[\"Your Text\"] ?? \"\";\n        customSkuByParent.set(`${parentVariant}:${yourText}`, item);\n      }\n    } else {\n      visible.push(item);\n    }\n  }\n\n  return { visible, customSkuByParent };\n}\n\n/**\n * <cart-item-list>\n *\n * Renders the reactive list of cart items, or an empty-state message.\n * Lives inside the Liquid-rendered `<cart-drawer>` without owning it.\n *\n * Attributes (set in Liquid):\n *   data-empty-message  — translated empty cart string\n */\n@customElement(\"cart-item-list\")\nexport class CartItemList extends LitElement {\n  @state() private _items: CartItem[] = [];\n  @state() private _allItems: CartItem[] = [];\n  @state() private _customSkuByParent = new Map<string, CartItem>();\n  @state() private _isEmpty = true;\n  @state() private _loading = false;\n\n  private _emptyMessage = \"\";\n  private _dealsUrl = \"/collections/featured-deals\";\n  private _disposeEffect?: () => void;\n\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this;\n  }\n\n  connectedCallback() {\n    super.connectedCallback();\n    this._emptyMessage =\n      this.dataset.emptyMessage || \"Your cart is currently empty.\";\n    this._dealsUrl = this.dataset.dealsUrl || \"/collections/featured-deals\";\n\n    this._disposeEffect = effect(() => {\n      const allItems = cartData.value?.items ?? [];\n      this._allItems = allItems;\n      const { visible, customSkuByParent } = partitionItems(allItems);\n      this._items = visible;\n      this._customSkuByParent = customSkuByParent;\n      this._isEmpty = isEmpty.value;\n      this._loading = isCartLoading.value;\n    });\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    this._disposeEffect?.();\n  }\n\n  render() {\n    // First load — no items yet\n    if (this._loading && this._items.length === 0) {\n      return html`<div class=\"min-h-[120px] bg-gray-100/50 rounded\"></div>`;\n    }\n\n    if (this._isEmpty) {\n      return html`\n        <div class=\"flex flex-wrap items-center justify-center text-center flex-1 h-full py-8\">\n          <div class=\"flex flex-col items-center\">\n            <svg\n              id=\"Layer_2\"\n              xmlns=\"http://www.w3.org/2000/svg\"\n              class=\"icon icon-empty-cart block w-[140px] mx-auto mb-5\"\n              viewBox=\"0 0 126 125\"\n            >\n              <defs>\n                <clipPath id=\"clippath\">\n                  <circle cx=\"63.5\" cy=\"62.5\" r=\"62.5\" />\n                </clipPath>\n              </defs>\n              <g id=\"Layer_1-2\">\n                <g>\n                  <circle fill=\"#e5e7eb\" cx=\"62.5\" cy=\"62.5\" r=\"62.5\" />\n                  <g>\n                    <path fill=\"none\" stroke=\"#9ca3af\" stroke-width=\"2\" stroke-linecap=\"round\" d=\"M52.68,51.57l3.42,6.09\" />\n                    <path fill=\"none\" stroke=\"#9ca3af\" stroke-width=\"2\" stroke-linecap=\"round\" d=\"M65.92,47.92v10.28\" />\n                    <path fill=\"none\" stroke=\"#9ca3af\" stroke-width=\"2\" stroke-linecap=\"round\" d=\"M76.2,58.21l3.57-3.14\" />\n                    <path fill=\"none\" stroke=\"#9ca3af\" stroke-width=\"2\" stroke-linecap=\"round\" d=\"M39.89,40.03v5.82\" />\n                    <path fill=\"none\" stroke=\"#9ca3af\" stroke-width=\"2\" stroke-linecap=\"round\" d=\"M91.89,35.03v5.82\" />\n                    <path fill=\"none\" stroke=\"#9ca3af\" stroke-width=\"2\" stroke-linecap=\"round\" d=\"M36.98,42.94h5.93\" />\n                    <path fill=\"none\" stroke=\"#9ca3af\" stroke-width=\"2\" stroke-linecap=\"round\" d=\"M88.98,37.94h5.93\" />\n                    <circle fill=\"#9ca3af\" cx=\"58.52\" cy=\"29.5\" r=\"3\" />\n                    <circle fill=\"#9ca3af\" cx=\"79.52\" cy=\"39.5\" r=\"2\" />\n                    <circle fill=\"#9ca3af\" cx=\"94.52\" cy=\"57.5\" r=\"1\" />\n                    <circle fill=\"#9ca3af\" cx=\"40.02\" cy=\"59\" r=\"1.5\" />\n                  </g>\n                  <g clip-path=\"url(#clippath)\">\n                    <path\n                      fill=\"#9ca3af\"\n                      d=\"M43.69,157.14c-4.63,0-8.4-3.77-8.4-8.4s3.77-8.4,8.4-8.4,8.4,3.77,8.4,8.4-3.77,8.4-8.4,8.4Zm44.48-.04c-4.63,0-8.4-3.75-8.4-8.35s3.77-8.35,8.4-8.35,8.4,3.75,8.4,8.35-3.77,8.35-8.4,8.35Zm8.4-22.21H43.69c-2.98,0-5.67-1.53-7.2-4.1-1.54-2.59-1.59-5.72-.15-8.38l6-10.85,.12-.22-.11-.23-16.01-33.77-.14-.29h-8.71v-7.9h13.73l4.04,8.62,.13,.29H101.56c1.41,0,2.68,.73,3.39,1.95,.71,1.22,.73,2.67,.04,3.89l-15.92,28.88c-1.46,2.67-4.28,4.33-7.35,4.33H48.28l-.14,.26-4.89,8.9-.41,.74h53.73v7.9Zm-57.41-48.95l.34,.71,10.54,22.25,.14,.29h31.84l.14-.26,12.28-22.25,.41-.74H39.16Z\"\n                    />\n                  </g>\n                </g>\n              </g>\n            </svg>\n            <span class=\"font-semibold block mb-5\">${this._emptyMessage}</span>\n            <a class=\"btn\" href=${this._dealsUrl}>See Deals</a>\n          </div>\n        </div>\n      `;\n    }\n\n    return html`\n      <div class=\"flex flex-col gap-2.5 pt-2.5${this._loading ? \" opacity-60\" : \"\"}\">\n        ${repeat(\n          this._items,\n          (item) => item.key,\n          (item) => {\n            // Line index must reference the position in the FULL items array (1-based)\n            const line = this._allItems.indexOf(item) + 1;\n            const yourText = (item.properties ?? {})[\"Your Text\"] ?? \"\";\n            const customSkuItem = yourText\n              ? (this._customSkuByParent.get(`${item.variant_id}:${yourText}`) ?? null)\n              : null;\n            const customSkuLine = customSkuItem\n              ? this._allItems.indexOf(customSkuItem) + 1\n              : 0;\n            return html`\n              <cart-item-row\n                .item=${item}\n                .line=${line}\n                .customSkuItem=${customSkuItem}\n                .customSkuLine=${customSkuLine}\n              ></cart-item-row>\n            `;\n          }\n        )}\n      </div>\n    `;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    \"cart-item-list\": CartItemList;\n  }\n}\n","import { signal, computed } from \"@preact/signals-core\";\nimport { productData, selectedVariantId } from \"./product-store\";\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface CustomizationConfig {\n  customSkuCost: number;\n  minCharacters: number;\n  maxCharacters: number;\n  customSkuVariantId: string | null;\n  previewUrl: string | null;\n  isMandatory: boolean;\n  useCustomSku: boolean;\n  /**\n   * Raw `ships_by-*` tag value (tag with the `ships_by-` prefix stripped) read\n   * from the custom SKU product. Personalized items ship later than the base\n   * product, so this date is applied to the customized line item instead of the\n   * main product's ships-by date. `null` when the custom SKU has no such tag.\n   */\n  customSkuShipsBy: string | null;\n}\n\n// ─── Configuration ────────────────────────────────────────────────────────────\n\n/** Customization configuration (from Liquid/theme settings) */\nexport const config = signal<CustomizationConfig>({\n  customSkuCost: 10,\n  minCharacters: 1,\n  maxCharacters: 20,\n  customSkuVariantId: null,\n  previewUrl: null,\n  isMandatory: false,\n  useCustomSku: false,\n  customSkuShipsBy: null,\n});\n\n/**\n * Resolve the ships-by date for a personalized item: the custom SKU product's\n * `ships_by-*` tag when present, otherwise the `defaultShippingDate` theme\n * setting. Returns the raw tag value (e.g. \"5days\" / \"2026-12-01\"), or null.\n */\nexport const getCustomSkuShipsBy = (): string | null => {\n  return config.value.customSkuShipsBy || ((window as any).defaultShippingDate as string | undefined) || null;\n};\n\n// ─── Runtime State ────────────────────────────────────────────────────────────\n\n/** Custom text value entered by user */\nexport const customText = signal<string>(\"\");\n\n/** Whether the user wants to customize (for confirmation modal) */\nexport const userWantsToCustomize = signal<boolean>(false);\n\n/** Preview image URL (blob or regular URL) */\nexport const previewImageUrl = signal<string | null>(null);\n\n/** Loading state for preview image */\nexport const isLoadingPreview = signal<boolean>(false);\n\n/** Whether the customization modal is open */\nexport const isCustomizationModalOpen = signal<boolean>(false);\n\n/** Whether the confirmation modal is open */\nexport const isConfirmationModalOpen = signal<boolean>(false);\n\n// ─── Computed Values ──────────────────────────────────────────────────────────\n\n/** Whether the custom text is valid (meets minimum character requirement) */\nexport const isCustomTextValid = computed(() => {\n  const text = customText.value.trim();\n  return text.length >= config.value.minCharacters;\n});\n\n/** Whether the product has customization enabled (has \"customizable\" tag) */\nexport const isCustomizable = computed(() => {\n  const product = productData.value;\n  if (!product || !product.tags) return false;\n  return product.tags.includes(\"customizable\");\n});\n\n/** Whether to show the \"Customize It\" button */\nexport const shouldShowCustomizeButton = computed(() => {\n  return isCustomizable.value && !config.value.isMandatory;\n});\n\n// ─── Actions ──────────────────────────────────────────────────────────────────\n\n/**\n * Initialize customization system with configuration from Liquid.\n */\nexport const initCustomization = (customConfig: Partial<CustomizationConfig>) => {\n  config.value = { ...config.value, ...customConfig };\n};\n\n/**\n * Set custom text value and validate it.\n */\nexport const setCustomText = (text: string) => {\n  // Validate: only alphabetic + spaces, uppercase, max length\n  let sanitized = text\n    .replace(/[^A-Z\\s]/gi, \"\") // Remove non-alphabetic\n    .toUpperCase()\n    .substring(0, config.value.maxCharacters);\n  \n  customText.value = sanitized;\n};\n\n/**\n * Fetch and update the preview image.\n */\nexport const updatePreviewImage = async (text: string = customText.value) => {\n  const previewUrl = config.value.previewUrl;\n  const variantId = selectedVariantId.value;\n  \n  if (!previewUrl || !variantId) {\n    return;\n  }\n  \n  isLoadingPreview.value = true;\n  \n  const url = `${previewUrl}?variantId=gid://shopify/ProductVariant/${variantId}&text=${text}`;\n  \n  try {\n    const response = await fetch(url);\n    if (!response.ok) {\n      console.error(\"Failed to fetch preview image\");\n      isLoadingPreview.value = false;\n      return;\n    }\n    \n    const blob = await response.blob();\n    const blobUrl = URL.createObjectURL(blob);\n    \n    // Revoke old blob URL to prevent memory leaks\n    if (previewImageUrl.value && previewImageUrl.value.startsWith(\"blob:\")) {\n      URL.revokeObjectURL(previewImageUrl.value);\n    }\n    \n    previewImageUrl.value = blobUrl;\n    isLoadingPreview.value = false;\n  } catch (error) {\n    console.error(\"Error fetching preview image:\", error);\n    isLoadingPreview.value = false;\n  }\n};\n\n/**\n * Open the customization modal.\n */\nexport const openCustomizationModal = () => {\n  console.log(\"[customization-store] Opening modal\");\n  isCustomizationModalOpen.value = true;\n  userWantsToCustomize.value = true;\n  \n  // Load initial preview if we have a variant\n  if (selectedVariantId.value) {\n    updatePreviewImage(\"\");\n  }\n};\n\n/**\n * Close the customization modal.\n */\nexport const closeCustomizationModal = () => {\n  isCustomizationModalOpen.value = false;\n};\n\n/**\n * Open the confirmation modal.\n */\nexport const openConfirmationModal = () => {\n  isConfirmationModalOpen.value = true;\n};\n\n/**\n * Close the confirmation modal.\n */\nexport const closeConfirmationModal = () => {\n  isConfirmationModalOpen.value = false;\n};\n\n/**\n * Reset customization state (after add to cart or cancel).\n */\nexport const resetCustomization = () => {\n  customText.value = \"\";\n  userWantsToCustomize.value = false;\n  isCustomizationModalOpen.value = false;\n  isConfirmationModalOpen.value = false;\n  \n  // Revoke blob URL\n  if (previewImageUrl.value && previewImageUrl.value.startsWith(\"blob:\")) {\n    URL.revokeObjectURL(previewImageUrl.value);\n  }\n  previewImageUrl.value = null;\n  \n  // Reset preview to empty\n  if (selectedVariantId.value) {\n    updatePreviewImage(\"\");\n  }\n};\n\n/**\n * Add custom text to main product form as a hidden input.\n */\nexport const addCustomTextToForm = () => {\n  const mainForm = document.querySelector('form[id^=\"product-form-template\"]') as HTMLFormElement | null;\n  if (!mainForm) return;\n  \n  // Remove existing custom text input\n  const existing = mainForm.querySelector('input[name=\"properties[Your Text]\"]');\n  if (existing) {\n    existing.remove();\n  }\n  \n  // Add new hidden input with current value\n  if (customText.value.trim()) {\n    const input = document.createElement(\"input\");\n    input.type = \"hidden\";\n    input.name = \"properties[Your Text]\";\n    input.value = customText.value;\n    mainForm.appendChild(input);\n  }\n};\n","import { LitElement, html } from \"lit\";\nimport { effect } from \"@preact/signals-core\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport {\n  CartItem,\n  updateCartItem,\n  removeCartItem,\n  getLimitStatus,\n} from \"../store/cart-store\";\nimport {\n  compareAtByVariant,\n  getRetailUnitPrice,\n} from \"../store/retail-price-store\";\nimport { calculateShippingDate } from \"../utils/knocking\";\nimport { config as customizationConfig } from \"../store/customization-store\";\n\n/**\n * <cart-item-row>\n *\n * Renders a single cart line item: image, title, meta, qty selector, price,\n * and remove button. Properties are set by the parent <cart-item-list> on\n * every cart update, so no internal signal subscription is needed.\n *\n * Quantity changes are optimistic + debounced:\n *  - _pendingQty drives the displayed value immediately on click\n *  - The API call fires 500 ms after the last click\n *  - _pendingQty is cleared after the API responds (only if no new\n *    interaction has started), at which point item.quantity takes over\n *\n * Properties:\n *   item  — CartItem object from cartData.items\n *   line  — 1-based line index used by the Shopify /cart/change.js API\n */\n@customElement(\"cart-item-row\")\nexport class CartItemRow extends LitElement {\n  @property({ type: Object }) item!: CartItem;\n  @property({ type: Number }) line!: number;\n  @property({ type: Object }) customSkuItem: CartItem | null = null;\n  @property({ type: Number }) customSkuLine = 0;\n\n  /** Local quantity shown while a debounce is pending; null = use item.quantity */\n  @state() private _pendingQty: number | null = null;\n  @state() private _isRemoving = false;\n  @state() private _showLimitNotice = false;\n  @state() private _compareAt: Record<number, number> = {};\n\n  private _disposeCompareAt?: () => void;\n  private _debounceTimer: ReturnType<typeof setTimeout> | null = null;\n  private _limitNoticeTimer: ReturnType<typeof setTimeout> | null = null;\n  private _limitType: \"product\" | \"brand\" | \"global\" | \"none\" = \"none\";\n\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this;\n  }\n\n  connectedCallback() {\n    super.connectedCallback();\n    this._disposeCompareAt = effect(() => {\n      this._compareAt = compareAtByVariant.value;\n    });\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    this._disposeCompareAt?.();\n    if (this._debounceTimer !== null) clearTimeout(this._debounceTimer);\n    if (this._limitNoticeTimer !== null) clearTimeout(this._limitNoticeTimer);\n  }\n\n  updated(changed: Map<string, unknown>) {\n    if (changed.has(\"item\") && this.item) {\n      const status = getLimitStatus(this.item.product_id, this.item.vendor);\n      this._limitType = status.type;\n    }\n  }\n\n  private _triggerLimitNotice() {\n    if (this._limitNoticeTimer !== null) clearTimeout(this._limitNoticeTimer);\n    this._showLimitNotice = true;\n    this._limitNoticeTimer = setTimeout(() => {\n      this._showLimitNotice = false;\n      this._limitNoticeTimer = null;\n    }, 3000);\n  }\n\n  private get _displayQty(): number {\n    return this._pendingQty ?? this.item.quantity;\n  }\n\n  /**\n   * Fallback personalization fee total, in cents, for products where a\n   * Shopify Cart Transform Function (bundles) merged component variants into\n   * this line server-side (`has_components: true`) instead of the fee\n   * arriving as its own cart line. The merged line only retains the \"Your\n   * Text\" property — the fee variant's own id/price are dropped by the\n   * transform, and the AJAX cart.js API does not expose component data — so\n   * the amount shown here is derived from the configured per-unit\n   * customization cost times this line's quantity (the transform folds in\n   * exactly one fee per parent unit). Returns null when a real companion\n   * line exists (`customSkuItem`) or this item isn't a bundled\n   * personalization.\n   */\n  private get _bundledPersonalizationFeeCents(): number | null {\n    if (this.customSkuItem) return null;\n    if (!this.item.has_components) return null;\n    if (!this.item.properties?.[\"Your Text\"]) return null;\n    const perUnitCents = Math.round(\n      (customizationConfig.value.customSkuCost ?? 0) * 100\n    );\n    return perUnitCents * this.item.quantity;\n  }\n\n  private _formatPrice(cents: number): string {\n    const currency =\n      (window as any).__store?.cart?.cartData?.value?.currency ?? \"USD\";\n    return new Intl.NumberFormat(\"en-US\", {\n      style: \"currency\",\n      currency,\n    }).format(cents / 100);\n  }\n\n  /** Mirrors the old getItemMeta() logic — options + visible properties */\n  private _getMeta(): string[] {\n    const meta: string[] = [];\n\n    for (const opt of this.item.options_with_values ?? []) {\n      if (!opt.value.includes(\"Default Title\")) {\n        meta.push(`${opt.name}: ${opt.value}`);\n      }\n    }\n\n    const props = this.item.properties ?? {};\n    for (const [key, value] of Object.entries(props)) {\n      // Skip internal properties (prefixed with _)\n      if (key.charAt(0) === \"_\") continue;\n      if (value) meta.push(`${key}: ${value}`);\n    }\n\n    return meta;\n  }\n\n  private _onMinus() {\n    // Allow going to 0 — Shopify interprets qty=0 as remove\n    this._scheduleSave(this._displayQty - 1);\n  }\n\n  private _onPlus() {\n    const nextQty = this._displayQty + 1;\n    const status = getLimitStatus(this.item.product_id, this.item.vendor);\n    // `remaining` already counts every line of the same brand/product in the\n    // cart, so compare the increase over this line's committed quantity —\n    // not this line's total — against it (brand limits span variants).\n    if (\n      status.type !== \"none\" &&\n      nextQty - this.item.quantity > status.remaining\n    ) {\n      this._triggerLimitNotice();\n      return;\n    }\n    this._scheduleSave(nextQty);\n  }\n\n  private _scheduleSave(qty: number) {\n    this._pendingQty = qty;\n\n    if (this._debounceTimer !== null) clearTimeout(this._debounceTimer);\n\n    this._debounceTimer = setTimeout(async () => {\n      this._debounceTimer = null;\n      await updateCartItem(this.line, qty);\n      // Keep custom SKU fee item quantity in sync\n      if (this.customSkuLine > 0) {\n        await updateCartItem(this.customSkuLine, qty);\n      }\n      // Only clear the pending display if no new interaction started\n      // while the API call was in flight. If a new timer is running,\n      // that interaction is now responsible for updating the display.\n      if (this._debounceTimer === null) {\n        this._pendingQty = null;\n      }\n    }, 500);\n  }\n\n  private async _onRemove() {\n    if (this._debounceTimer !== null) {\n      clearTimeout(this._debounceTimer);\n      this._debounceTimer = null;\n    }\n    this._pendingQty = null;\n    this._isRemoving = true;\n    await removeCartItem(this.line);\n    // Remove the associated custom-sku fee item if present\n    if (this.customSkuLine > 0) {\n      await removeCartItem(this.customSkuLine);\n    }\n  }\n\n  /** \"+ $X Personalization\" banner — line total from a real companion line\n   * item when one exists, otherwise from the bundled-line fallback. */\n  private _renderPersonalizationBanner() {\n    const feeCents = this.customSkuItem\n      ? this.customSkuItem.final_line_price\n      : this._bundledPersonalizationFeeCents;\n    if (feeCents === null) return html``;\n\n    return html`<div class=\"w-full flex justify-end\">\n      <div\n        class=\"w-full flex justify-between items-center gap-1 rounded bg-[var(--color-secondary-100)] px-2 py-1 text-sm text-[var(--color-neutral-500)]\"\n      >\n        <span class=\"font-bold text-[var(--color-secondary-800)]\">Personalization</span>\n        <span class=\"font-bold text-[var(--color-secondary-500)]\"\n          >+ ${this._formatPrice(feeCents)}</span\n        >\n      </div>\n    </div>`;\n  }\n\n  render() {\n    const rawImage = this.item.image?.startsWith(\"//\")\n      ? `https:${this.item.image}`\n      : this.item.image;\n    const imageUrl = rawImage\n      ? rawImage.replace(/(\\.[^.]*)$/, \"_180x$1\")\n      : \"\";\n    const meta = this._getMeta();\n    const retailPrice = getRetailUnitPrice(this.item, this._compareAt);\n    const hasDiscount = retailPrice > this.item.final_price;\n    const qty = this._displayQty;\n\n    const shipsByRaw = this.item.properties?.[\"_ships-by\"];\n    let shipsByBlock = html``;\n    if (shipsByRaw) {\n      try {\n        const date = calculateShippingDate(shipsByRaw);\n        const dateLine = (date.shortDate ?? date.longDate).toUpperCase();\n        shipsByBlock = html`\n          <div\n            class=\"w-full rounded-sm rounded-t-none bg-[var(--color-primary-50)] p-1 flex flex-col items-center text-center\"\n            aria-label=${`Ships by ${date.longDate}`}\n          >\n            <span\n              class=\"text-[10px] font-medium uppercase tracking-wide text-[var(--color-primary-950)]\"\n              >Ships by</span\n            >\n            <span\n              class=\"text-xs font-bold uppercase leading-tight text-[var(--color-primary-950)]\"\n              >${dateLine}</span\n            >\n          </div>\n        `;\n      } catch {\n        shipsByBlock = html``;\n      }\n    }\n\n    return html`\n      <div\n        class=\"flex flex-wrap p-4 bg-white gap-x-4 rounded shadow-[0_3px_10px_rgba(0,0,0,0.04)] transition-all duration-300 relative${this._isRemoving ? \" ajaxcart__row--removing\" : \"\"}\"\n      >\n        <div class=\"w-[95px] shrink-0 flex flex-col\">\n          <a href=\"${this.item.url}\" tabindex=\"-1\" class=\"flex shrink-0\">\n            <img\n              src=\"${imageUrl}\"\n              alt=\"Image of ${this.item.product_title}\"\n              loading=\"lazy\"\n              class=\"w-[95px] h-[95px] object-contain border border-[var(--color-neutral-50)] rounded-sm rounded-b-none\"\n            />\n          </a>\n          ${shipsByBlock}\n        </div>\n\n        <div class=\"relative flex min-w-0 flex-1 flex-col gap-2.5\">\n          <button\n            type=\"button\"\n            class=\"absolute top-0 right-0 z-[1] flex h-[25px] w-[25px] shrink-0 items-center justify-center rounded-full bg-[var(--color-neutral-100)] text-[var(--color-neutral-600)] transition-colors hover:text-[var(--color-neutral-700)] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-[var(--color-primary-500)]\"\n            aria-label=${`Remove ${this.item.product_title}`}\n            @click=${this._onRemove}\n          >\n            <svg\n              xmlns=\"http://www.w3.org/2000/svg\"\n              fill=\"none\"\n              viewBox=\"0 0 24 24\"\n              stroke-width=\"1.5\"\n              stroke=\"currentColor\"\n              class=\"h-4 w-4\"\n              aria-hidden=\"true\"\n            >\n              <path\n                stroke-linecap=\"round\"\n                stroke-linejoin=\"round\"\n                d=\"M14.74 9l-.346 9m-4.788 0L9.26 9m9.968-3.21c.342.052.682.107 1.022.166m-1.022-.165L18.16 19.673a2.25 2.25 0 01-2.244 2.077H8.084a2.25 2.25 0 01-2.244-2.077L4.772 5.79m14.456 0a48.108 48.108 0 00-3.478-.397m-12 .562c.34-.059.68-.114 1.022-.165m0 0a48.11 48.11 0 013.478-.397m7.5 0v-.916c0-1.18-.91-2.164-2.09-2.201a51.644 51.644 0 00-3.32 0c-1.18.037-2.09 1.022-2.09 2.201v.916m7.5 0a48.667 48.667 0 00-7.5 0\"\n              />\n            </svg>\n          </button>\n\n          <div class=\"flex flex-wrap gap-y-2 pr-11\">\n            <a href=\"${this.item.url}\" class=\"font-bold text-sm block w-full\">\n              <div class=\"text-caption text-[10px]\">${this.item.vendor}</div>\n              ${this.item.product_title}\n            </a>\n            ${meta.map(\n              (m) =>\n                html`<span class=\"variant-label small mr-[5px] text-left\">${m}</span>`\n            )}\n          </div>\n\n          <div\n            class=\"relative overflow-hidden flex flex-wrap w-full items-center justify-between gap-y-2\"\n          >\n            <div\n              class=\"max-w-[120px] flex flex-col rounded py-1 px-2 bg-[var(--color-neutral-50)] justify-center\"\n            >\n              ${this.item.properties?.[\"_hideQtySelector\"]\n                ? html`<span\n                    class=\"text-sm font-bold text-center text-[var(--color-neutral-700)]\"\n                    >Qty: ${qty}</span\n                  >`\n                : html`<quantity-selector-cart\n                    .quantity=${qty}\n                    @quantity-minus=${this._onMinus}\n                    @quantity-plus=${this._onPlus}\n                  ></quantity-selector-cart>`}\n            </div>\n            <div class=\"flex flex-col items-end\">\n              ${hasDiscount\n                ? html`\n                    <div class=\"line-through text-[var(--color-base-text)]\">\n                      <strike\n                        >${this._formatPrice(retailPrice)}</strike\n                      >\n                    </div>\n                  `\n                : \"\"}\n              <div class=\"font-bold text-[var(--color-secondary-500)]\">\n                ${this._formatPrice(this.item.final_price)}\n              </div>\n            </div>\n            ${this._renderPersonalizationBanner()}\n          </div>\n        </div>\n\n        <div\n          class=\"w-full basis-full grid transition-[grid-template-rows] duration-300 ease-out ${this._showLimitNotice ? \"grid-rows-[1fr]\" : \"grid-rows-[0fr]\"}\"\n          aria-hidden=${String(!this._showLimitNotice)}\n        >\n          <div class=\"min-h-0 overflow-hidden\">\n            <div\n              class=\"relative mt-4 flex min-h-[2rem] w-full items-center justify-center rounded-sm bg-[var(--color-danger-200)] px-2 py-1 transition-opacity duration-300 ease-out ${this._showLimitNotice ? \"opacity-100\" : \"opacity-0\"}\"\n            >\n              <span\n                class=\"text-center text-[11px] leading-tight text-[var(--color-danger-950)]\"\n                >You've reached the limit for this\n                ${this._limitType === \"brand\" ? \"brand\" : \"product\"}</span\n              >\n            </div>\n          </div>\n        </div>\n      </div>\n    `;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    \"cart-item-row\": CartItemRow;\n  }\n}\n","import { LitElement, html } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\nimport { effect } from \"@preact/signals-core\";\nimport { totalPrice, cartData } from \"../store/cart-store\";\n\n/**\n * <cart-total>\n *\n * Renders the reactive cart subtotal. Sits inside the Liquid-rendered\n * footer so it updates whenever the cart changes without making the\n * entire footer a Lit component.\n */\n@customElement(\"cart-total\")\nexport class CartTotal extends LitElement {\n  @state() private _total = 0;\n  @state() private _currency = \"USD\";\n\n  private _disposeEffect?: () => void;\n\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this;\n  }\n\n  connectedCallback() {\n    super.connectedCallback();\n    this._disposeEffect = effect(() => {\n      this._total = totalPrice.value;\n      this._currency = cartData.value?.currency ?? \"USD\";\n    });\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    this._disposeEffect?.();\n  }\n\n  render() {\n    const formatted = new Intl.NumberFormat(\"en-US\", {\n      style: \"currency\",\n      currency: this._currency,\n    }).format(this._total / 100);\n\n    return html`<span class=\"font-bold text-lg uppercase text-right text-[var(--color-secondary-500)]\">${formatted}</span>`;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    \"cart-total\": CartTotal;\n  }\n}\n","import { LitElement, html, nothing } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\nimport { effect } from \"@preact/signals-core\";\nimport { cartData } from \"../store/cart-store\";\nimport { retailSubtotal, totalSavings } from \"../store/retail-price-store\";\n\n/**\n * <cart-savings>\n *\n * Retail subtotal and \"You save\" rows shown above the cart subtotal. Renders\n * nothing when the cart has no savings, so undiscounted carts never show a\n * \"$0.00 saved\" line.\n */\n@customElement(\"cart-savings\")\nexport class CartSavings extends LitElement {\n  @state() private _retail = 0;\n  @state() private _savings = 0;\n  @state() private _currency = \"USD\";\n\n  private _disposeEffect?: () => void;\n\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this;\n  }\n\n  connectedCallback() {\n    super.connectedCallback();\n    this._disposeEffect = effect(() => {\n      this._retail = retailSubtotal.value;\n      this._savings = totalSavings.value;\n      this._currency = cartData.value?.currency ?? \"USD\";\n    });\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    this._disposeEffect?.();\n  }\n\n  private _format(cents: number): string {\n    return new Intl.NumberFormat(\"en-US\", {\n      style: \"currency\",\n      currency: this._currency,\n    }).format(cents / 100);\n  }\n\n  render() {\n    if (this._savings <= 0) return nothing;\n\n    return html`\n      <div class=\"flex flex-col gap-1 text-sm\">\n        <div\n          class=\"flex items-center justify-between text-[var(--color-neutral-600)]\"\n        >\n          <span>Retail price</span>\n          <span class=\"line-through\">${this._format(this._retail)}</span>\n        </div>\n        <div\n          class=\"flex items-center justify-between font-bold text-[var(--color-success-700)]\"\n        >\n          <span>You save</span>\n          <span>−${this._format(this._savings)}</span>\n        </div>\n      </div>\n    `;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    \"cart-savings\": CartSavings;\n  }\n}\n","import { LitElement, html, css } from 'lit';\nimport { customElement, state } from 'lit/decorators.js';\nimport { effect } from '@preact/signals-core';\nimport { itemCount, isCartLoading } from '../store/cart-store';\n\n/**\n * Cart Count Component\n *\n * A simple reactive component that displays the current cart item count.\n * Automatically updates when the cart changes.\n *\n * Usage:\n * <cart-count></cart-count>\n */\n@customElement('cart-count')\nexport class CartCount extends LitElement {\n  // Local state that gets updated by the signal effect\n  @state() private count = 0;\n  @state() private loading = false;\n\n  // Store the effect cleanup function\n  private _disposeEffect?: () => void;\n\n  static styles = css`\n    :host {\n      display: inline-block;\n    }\n\n    .count {\n      font-weight: inherit;\n      font-size: inherit;\n    }\n\n    .loading {\n      opacity: 0.6;\n    }\n  `;\n\n  connectedCallback() {\n    super.connectedCallback();\n\n    // Set up reactive effect that runs whenever the signal changes\n    this._disposeEffect = effect(() => {\n      this.count = itemCount.value;\n      this.loading = isCartLoading.value;\n    });\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    // Clean up the effect when component is removed\n    this._disposeEffect?.();\n  }\n\n  render() {\n    const displayCount = this.count >= 100 ? '99+' : this.count;\n\n    return html`\n      <span class=\"count ${this.loading ? 'loading' : ''}\">\n        ${displayCount}\n      </span>\n    `;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'cart-count': CartCount;\n  }\n}\n","import { LitElement, html } from 'lit';\nimport { customElement, state } from 'lit/decorators.js';\nimport { effect } from '@preact/signals-core';\nimport { itemCount } from '../store/cart-store';\n\n/**\n * Cart count badge for the header — red circle with item count.\n * Subscribes to cart store and updates reactively (no page refresh needed).\n */\n@customElement('cart-count-badge')\nexport class CartCountBadge extends LitElement {\n  @state() private _count = 0;\n\n  private _disposeEffect?: () => void;\n\n  connectedCallback() {\n    super.connectedCallback();\n    // Subscribe here (not in the constructor) to match the pattern used by\n    // cart-count / cart-total: a constructor-time effect() writes reactive state\n    // during construction, before Lit has connected/rendered.\n    // NOTE: this did NOT resolve the lit-html \"Cannot set properties of null\n    // (setting 'data')\" error that re-renders of this badge still throw on\n    // cart update — that bug is still open (reproducible via requestUpdate()).\n    this._disposeEffect = effect(() => {\n      this._count = itemCount.value;\n    });\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    this._disposeEffect?.();\n  }\n\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this;\n  }\n\n  render() {\n    const displayCount = this._count >= 100 ? '99+' : String(this._count);\n    const hiddenClass = this._count === 0 ? ' hidden' : '';\n\n    return html`\n      <div class=\"cart-count-bubble absolute top-[-4px] right-[-4px] bg-[#e22020] h-[22px] w-[22px] rounded-full flex items-center justify-center text-white text-xs${hiddenClass}\">\n        <span id=\"item-count\" aria-hidden=\"true\">${displayCount}</span>\n      </div>\n    `;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'cart-count-badge': CartCountBadge;\n  }\n}\n","import { LitElement, html } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\nimport { effect } from \"@preact/signals-core\";\nimport {\n  cartData,\n  ShopifyCart,\n  addToCart,\n  publishKlaviyoAddedToCart,\n  deletedVariantIds,\n  addToDeletedVariants,\n} from \"../store/cart-store\";\nimport {\n  getCookie,\n  handleize,\n  getProductByHandle,\n  formatToDollarCurrencyString,\n  shopifyImageUrl,\n} from \"../utils/knocking\";\n\ninterface CrossSellingListItem {\n  imageUrl?: string;\n  productHandle?: string;\n  /** Product title — used to derive a handle via handleize() when productHandle is absent */\n  product?: string;\n  /** GID format: gid://shopify/ProductVariant/123 */\n  variantId?: string;\n  /** Numeric variant ID — fallback when variantId is absent */\n  variant?: number;\n}\n\nfunction parseVariantGid(gid: string): number {\n  return parseInt(gid.replace(\"gid://shopify/ProductVariant/\", \"\"), 10);\n}\n\n/** Returns a new array with the elements Fisher-Yates shuffled. */\nfunction shuffle<T>(items: T[]): T[] {\n  const result = items.slice();\n  for (let i = result.length - 1; i > 0; i--) {\n    const j = Math.floor(Math.random() * (i + 1));\n    [result[i], result[j]] = [result[j], result[i]];\n  }\n  return result;\n}\n\n/**\n * <cross-selling-cart>\n *\n * Reactive Lit replacement for the legacy CrossSellingCartComponent.\n * Subscribes to cartData and deletedVariantIds signals; finds the first\n * eligible cross-sell variant and renders it as a slide-up banner inside\n * the cart drawer footer.\n *\n * Attributes (set in Liquid):\n *   data-holiday-shipping  — \"true\" | \"false\", controls Ships-by property\n */\n@customElement(\"cross-selling-cart\")\nexport class CrossSellingCart extends LitElement {\n  @state() private _title = \"\";\n  @state() private _variantTitle = \"\";\n  @state() private _imageUrl = \"\";\n  @state() private _price = 0;\n  @state() private _compareAtPrice: number | null = null;\n  @state() private _productUrl = \"\";\n  @state() private _visible = false;\n  @state() private _adding = false;\n\n  private _variantId: number | null = null;\n  private _productId: number | null = null;\n  private _shipsByRaw: string | null = null;\n  private _crossSellingList: CrossSellingListItem[] = [];\n  private _holidayShipping = false;\n  private _randomSelection = false;\n  /** Incremented each time _findAndLoad is called; lets in-flight searches self-cancel. */\n  private _findSeq = 0;\n  /** Set to true when the user clicks the close button. Hides the entire banner for the current page. */\n  private _bannerClosed = false;\n  private _disposeEffect?: () => void;\n\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this;\n  }\n\n  connectedCallback() {\n    super.connectedCallback();\n    this._crossSellingList = (window as any).crossSellingVariantsJson ?? [];\n    this._holidayShipping = this.dataset.holidayShipping === \"true\";\n    this._randomSelection = this.dataset.randomSelection === \"true\";\n\n    this._disposeEffect = effect(() => {\n      // If the user closed the banner on this page, keep it hidden permanently.\n      if (this._bannerClosed) {\n        this._visible = false;\n        return;\n      }\n\n      const cart = cartData.value;\n      deletedVariantIds.value; // subscribe so effect re-runs on dismiss\n      if (cart !== null) {\n        this._findAndLoad(cart);\n      }\n    });\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    this._disposeEffect?.();\n  }\n\n  updated() {\n    // Actually hide/show the banner using Tailwind.\n    this.classList.toggle(\"hidden\", !this._visible);\n    this.toggleAttribute(\"inert\", !this._visible);\n    this.setAttribute(\"aria-hidden\", String(!this._visible));\n\n    const inner = document.querySelector(\".cart-drawer__inner-content\");\n    if (inner) inner.classList.toggle(\"has-cross-selling\", this._visible);\n\n    // Recalculate footer height so the item list scrolls correctly.\n    const footer = document.getElementById(\"cartDrawerFooter\");\n    const cartInner = document.getElementById(\"cartDrawerInner\");\n    if (footer && cartInner) {\n      cartInner.style.bottom = `${footer.offsetHeight}px`;\n    }\n  }\n\n  private async _findAndLoad(cart: ShopifyCart): Promise<void> {\n    const seq = ++this._findSeq;\n    const variantIdsInCart = cart.items.map((item) => item.variant_id);\n    const deleted = deletedVariantIds.value;\n\n    // When random selection is enabled, shuffle a copy of the list so the first\n    // eligible candidate is picked at random rather than always the list's head.\n    // Shuffling up front preserves the early-exit on the async availability\n    // checks below (no need to fetch every product to pick a random one).\n    const list = this._randomSelection\n      ? shuffle(this._crossSellingList)\n      : this._crossSellingList;\n\n    for (const item of list) {\n      const variantId = item.variantId\n        ? parseVariantGid(item.variantId)\n        : (item.variant ?? null);\n\n      if (variantId === null) continue;\n      if (variantIdsInCart.includes(variantId)) continue;\n      if (deleted.includes(variantId)) continue;\n\n      const handle =\n        item.productHandle ?? (item.product ? handleize(item.product) : null);\n      if (!handle) continue;\n\n      const product = await getProductByHandle(handle);\n\n      // A newer _findAndLoad call started while we were awaiting — bail out.\n      if (seq !== this._findSeq) return;\n\n      if (!product) continue;\n\n      const isCustomizable = product.tags.some(\n        (tag) => tag.includes(\"customtext\") || tag.includes(\"custom-sku\")\n      );\n      if (isCustomizable) continue;\n\n      const variant = product.variants.find((v) => v.id === variantId);\n      if (!variant?.available) continue;\n\n      // Valid candidate found — populate state and show.\n      let imageUrl = item.imageUrl ?? \"\";\n      if (!imageUrl && variant.featured_image) imageUrl = variant.featured_image.src;\n      if (!imageUrl) imageUrl = product.featured_image;\n\n      this._variantId = variant.id;\n      this._productId = product.id;\n      // Mirror product-store / collection-store: use the product's `ships_by-`\n      // tag when present, otherwise fall back to the `defaultShippingDate` theme\n      // setting. Without the fallback, cross-sell items lost the ships-by that\n      // the product page and cards apply to the same product.\n      const shippingTag = product.tags.find((t) => t.startsWith(\"ships_by-\"));\n      const fallbackShipsBy = (window as any).defaultShippingDate as string | undefined;\n      this._shipsByRaw = shippingTag\n        ? shippingTag.replace(\"ships_by-\", \"\")\n        : (fallbackShipsBy || null);\n      this._title = product.title;\n      this._variantTitle = variant.title === \"Default Title\" ? \"\" : variant.title;\n      this._imageUrl = imageUrl;\n      this._price = variant.price;\n      this._compareAtPrice = variant.compare_at_price;\n      this._productUrl = `/products/${product.handle}?variant=${variant.id}`;\n      this._visible = true;\n      return;\n    }\n\n    // No valid candidate — hide.\n    this._visible = false;\n    this._variantId = null;\n  }\n\n  private _onClose(event: Event) {\n    event.preventDefault();\n    event.stopPropagation();\n\n    // Cancel any in-flight _findAndLoad so it can't re-show the banner.\n    ++this._findSeq;\n\n    // Permanently hide the banner for the current page.\n    this._bannerClosed = true;\n    this._visible = false;\n\n    if (this._variantId !== null) {\n      // Persist the discarded variant id so it is excluded on future pages\n      // in the same tab session.\n      addToDeletedVariants(this._variantId);\n    }\n  }\n\n  private async _onAdd() {\n    if (this._variantId === null) return;\n    this._adding = true;\n    try {\n      const properties: Record<string, any> = {\n        \"_promo-code\": getCookie(\"promo_code\"),\n      };\n      if (this._shipsByRaw) {\n        properties[\"_ships-by\"] = this._shipsByRaw;\n      }\n      const added = await addToCart(this._variantId, 1, properties, undefined, {\n        source: \"cross-selling-cart\",\n        productId: this._productId ?? undefined,\n      });\n      if (added) {\n        // `kn_add_to_cart` already fired inside executeCartAdd (per line).\n        // Klaviyo's whole-cart event fires once here for the user action.\n        publishKlaviyoAddedToCart();\n      }\n      this._visible = false;\n      this._scrollCartToShowNewItem();\n    } finally {\n      this._adding = false;\n    }\n  }\n\n  private _scrollCartToShowNewItem() {\n    const scrollArea = document.getElementById(\"cartScrollArea\");\n    if (!scrollArea) return;\n    const scrollToTop = () => {\n      scrollArea.scrollTo({ top: 0, behavior: \"smooth\" });\n    };\n    requestAnimationFrame(() => {\n      setTimeout(scrollToTop, 350);\n    });\n  }\n\n  render() {\n    return html`\n      <div class=\"bg-[var(--color-primary-50)] p-[15px] flex w-full gap-2.5 items-center relative\">\n        <button\n          type=\"button\"\n          class=\"cross-selling__close-button absolute top-[10px] right-[10px] w-[12px] h-[12px] flex items-center justify-center p-0 [&_svg]:w-[12px] [&_svg]:h-[12px]\"\n          aria-label=\"Close suggestion\"\n          @click=${this._onClose}\n        >\n          <svg\n            xmlns=\"http://www.w3.org/2000/svg\"\n            aria-hidden=\"true\"\n            focusable=\"false\"\n            role=\"presentation\"\n            viewBox=\"0 0 18 17\"\n            fill=\"none\"\n            class=\"icon icon-close\"\n          >\n            <path\n              d=\"M.865 15.978a.5.5 0 00.707.707l7.433-7.431 7.579 7.282a.501.501 0 00.846-.37.5.5 0 00-.153-.351L9.712 8.546l7.417-7.416a.5.5 0 10-.707-.708L8.991 7.853 1.413.573a.5.5 0 10-.693.72l7.563 7.268-7.418 7.417z\"\n              fill=\"currentColor\"\n            />\n          </svg>\n        </button>\n\n        <div class=\"ajaxcart__product-image\">\n          <a href=\"${this._productUrl}\">\n            <img\n              class=\"w-[95px] h-[95px] object-contain rounded\"\n              width=\"95\"\n              height=\"95\"\n              loading=\"lazy\"\n              decoding=\"async\"\n              src=\"${shopifyImageUrl(this._imageUrl, 190)}\"\n              alt=\"${this._title}\"\n            />\n          </a>\n        </div>\n\n        <div class=\"ajaxcart__product-content flex flex-col gap-2.5 flex-1 min-w-0\">\n          <div>\n            <div class=\"text-caption font-bold text-[var(--color-primary-950)]\">You might also like</div>\n            <a href=\"${this._productUrl}\">\n              <div class=\"text-sm font-bold my-[5px]\">${this._title}</div>\n              ${this._variantTitle\n        ? html`<div class=\"variant-label small\">${this._variantTitle}</div>`\n        : \"\"}\n            </a>\n          </div>\n\n          <div class=\"ajaxcart__product-add flex gap-2.5 align-center justify-between\">\n            <div class=\"range flex items-center gap-1.5\">\n              <span class=\"ajaxcart__price text-[var(--color-primary-950)] font-bold\">\n                ${this._price ? formatToDollarCurrencyString(this._price) : \"\"}\n              </span>\n              ${this._compareAtPrice\n        ? html`<s class=\"ajaxcart__price text-xs font-medium text-[var(--color-secondary-800)]\">\n                    ${formatToDollarCurrencyString(this._compareAtPrice)}\n                  </s>`\n        : \"\"}\n            </div>\n            <button\n              class=\"btn size-auto p-[10px] text-xs font-bold text-white py-[6px] px-[8px] rounded\"\n              type=\"button\"\n              ?disabled=${this._adding}\n              @click=${this._onAdd}\n            >\n              ${this._adding ? \"Adding…\" : \"Add to Cart\"}\n            </button>\n          </div>\n        </div>\n      </div>\n    `;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    \"cross-selling-cart\": CrossSellingCart;\n  }\n}\n","import { LitElement, html } from \"lit\";\nimport { customElement, property } from \"lit/decorators.js\";\n\n/**\n * <quantity-selector-cart>\n *\n * Quantity selector for cart items. Displays current quantity with +/- buttons.\n * Used in cart drawer and cart page contexts where each line item needs\n * independent quantity controls.\n *\n * Properties:\n *   quantity  — Current quantity to display\n *   atLimit   — Whether purchase limit is reached (disables + button)\n *   disabled  — Overall disable state (optional)\n *\n * Events:\n *   quantity-minus — Fired when minus button is clicked\n *   quantity-plus  — Fired when plus button is clicked\n *\n * Usage:\n *   <quantity-selector-cart\n *     .quantity=${qty}\n *     .atLimit=${atLimit}\n *     @quantity-minus=${handleMinus}\n *     @quantity-plus=${handlePlus}\n *   ></quantity-selector-cart>\n */\n@customElement(\"quantity-selector-cart\")\nexport class QuantitySelectorCart extends LitElement {\n  @property({ type: Number }) quantity = 1;\n  @property({ type: Boolean }) disabled = false;\n\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this;\n  }\n\n  private _handleMinus() {\n    if (this.disabled || this.quantity <= 1) return;\n    this.dispatchEvent(new CustomEvent(\"quantity-minus\"));\n  }\n\n  private _handlePlus() {\n    if (this.disabled) return;\n    this.dispatchEvent(new CustomEvent(\"quantity-plus\"));\n  }\n\n  render() {\n    const buttonClass =\n      \"shrink-0 w-[25px] h-[25px] flex items-center justify-center rounded-[9999px] border border-[var(--color-neutral-500)] bg-transparent p-0 cursor-pointer [&_svg]:w-3 [&_svg]:h-3 [&_svg]:pointer-events-none\";\n    const isMinusDisabled = this.disabled || this.quantity <= 1;\n    return html`\n      <div class=\"quantity relative flex items-center gap-2\">\n        <button\n          class=\"${buttonClass}${isMinusDisabled\n            ? \" opacity-50 cursor-not-allowed pointer-events-none\"\n            : \"\"}\"\n          type=\"button\"\n          ?disabled=${isMinusDisabled}\n          @click=${this._handleMinus}\n          aria-label=\"Decrease quantity\"\n        >\n          <svg\n            xmlns=\"http://www.w3.org/2000/svg\"\n            aria-hidden=\"true\"\n            focusable=\"false\"\n            viewBox=\"0 0 10 2\"\n          >\n            <path\n              fill-rule=\"evenodd\"\n              clip-rule=\"evenodd\"\n              d=\"M.5 1C.5.7.7.5 1 .5h8a.5.5 0 110 1H1A.5.5 0 01.5 1z\"\n              fill=\"currentColor\"\n            />\n          </svg>\n        </button>\n        <div class=\"flex-1 min-w-0 text-center font-medium\">\n          ${this.quantity}\n        </div>\n        <button\n          class=\"${buttonClass}\"\n          type=\"button\"\n          @click=${this._handlePlus}\n          aria-label=\"Increase quantity\"\n        >\n          <svg\n            xmlns=\"http://www.w3.org/2000/svg\"\n            aria-hidden=\"true\"\n            focusable=\"false\"\n            viewBox=\"0 0 10 10\"\n          >\n            <path\n              fill-rule=\"evenodd\"\n              clip-rule=\"evenodd\"\n              d=\"M1 4.51a.5.5 0 000 1h3.5l.01 3.5a.5.5 0 001-.01V5.5l3.5-.01a.5.5 0 00-.01-1H5.5L5.49.99a.5.5 0 00-1 .01v3.5l-3.5.01H1z\"\n              fill=\"currentColor\"\n            />\n          </svg>\n        </button>\n      </div>\n    `;\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    \"quantity-selector-cart\": QuantitySelectorCart;\n  }\n}\n","/*!\n* tabbable 6.4.0\n* @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE\n*/\n// NOTE: separate `:not()` selectors has broader browser support than the newer\n//  `:not([inert], [inert] *)` (Feb 2023)\nvar candidateSelectors = ['input:not([inert]):not([inert] *)', 'select:not([inert]):not([inert] *)', 'textarea:not([inert]):not([inert] *)', 'a[href]:not([inert]):not([inert] *)', 'button:not([inert]):not([inert] *)', '[tabindex]:not(slot):not([inert]):not([inert] *)', 'audio[controls]:not([inert]):not([inert] *)', 'video[controls]:not([inert]):not([inert] *)', '[contenteditable]:not([contenteditable=\"false\"]):not([inert]):not([inert] *)', 'details>summary:first-of-type:not([inert]):not([inert] *)', 'details:not([inert]):not([inert] *)'];\nvar candidateSelector = /* #__PURE__ */candidateSelectors.join(',');\nvar NoElement = typeof Element === 'undefined';\nvar matches = NoElement ? function () {} : Element.prototype.matches || Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;\nvar getRootNode = !NoElement && Element.prototype.getRootNode ? function (element) {\n  var _element$getRootNode;\n  return element === null || element === void 0 ? void 0 : (_element$getRootNode = element.getRootNode) === null || _element$getRootNode === void 0 ? void 0 : _element$getRootNode.call(element);\n} : function (element) {\n  return element === null || element === void 0 ? void 0 : element.ownerDocument;\n};\n\n/**\n * Determines if a node is inert or in an inert ancestor.\n * @param {Node} [node]\n * @param {boolean} [lookUp] If true and `node` is not inert, looks up at ancestors to\n *  see if any of them are inert. If false, only `node` itself is considered.\n * @returns {boolean} True if inert itself or by way of being in an inert ancestor.\n *  False if `node` is falsy.\n */\nvar _isInert = function isInert(node, lookUp) {\n  var _node$getAttribute;\n  if (lookUp === void 0) {\n    lookUp = true;\n  }\n  // CAREFUL: JSDom does not support inert at all, so we can't use the `HTMLElement.inert`\n  //  JS API property; we have to check the attribute, which can either be empty or 'true';\n  //  if it's `null` (not specified) or 'false', it's an active element\n  var inertAtt = node === null || node === void 0 ? void 0 : (_node$getAttribute = node.getAttribute) === null || _node$getAttribute === void 0 ? void 0 : _node$getAttribute.call(node, 'inert');\n  var inert = inertAtt === '' || inertAtt === 'true';\n\n  // NOTE: this could also be handled with `node.matches('[inert], :is([inert] *)')`\n  //  if it weren't for `matches()` not being a function on shadow roots; the following\n  //  code works for any kind of node\n  var result = inert || lookUp && node && (\n  // closest does not exist on shadow roots, so we fall back to a manual\n  // lookup upward, in case it is not defined.\n  typeof node.closest === 'function' ? node.closest('[inert]') : _isInert(node.parentNode));\n  return result;\n};\n\n/**\n * Determines if a node's content is editable.\n * @param {Element} [node]\n * @returns True if it's content-editable; false if it's not or `node` is falsy.\n */\nvar isContentEditable = function isContentEditable(node) {\n  var _node$getAttribute2;\n  // CAREFUL: JSDom does not support the `HTMLElement.isContentEditable` API so we have\n  //  to use the attribute directly to check for this, which can either be empty or 'true';\n  //  if it's `null` (not specified) or 'false', it's a non-editable element\n  var attValue = node === null || node === void 0 ? void 0 : (_node$getAttribute2 = node.getAttribute) === null || _node$getAttribute2 === void 0 ? void 0 : _node$getAttribute2.call(node, 'contenteditable');\n  return attValue === '' || attValue === 'true';\n};\n\n/**\n * @param {Element} el container to check in\n * @param {boolean} includeContainer add container to check\n * @param {(node: Element) => boolean} filter filter candidates\n * @returns {Element[]}\n */\nvar getCandidates = function getCandidates(el, includeContainer, filter) {\n  // even if `includeContainer=false`, we still have to check it for inertness because\n  //  if it's inert (either by itself or via its parent), then all its children are inert\n  if (_isInert(el)) {\n    return [];\n  }\n  var candidates = Array.prototype.slice.apply(el.querySelectorAll(candidateSelector));\n  if (includeContainer && matches.call(el, candidateSelector)) {\n    candidates.unshift(el);\n  }\n  candidates = candidates.filter(filter);\n  return candidates;\n};\n\n/**\n * @callback GetShadowRoot\n * @param {Element} element to check for shadow root\n * @returns {ShadowRoot|boolean} ShadowRoot if available or boolean indicating if a shadowRoot is attached but not available.\n */\n\n/**\n * @callback ShadowRootFilter\n * @param {Element} shadowHostNode the element which contains shadow content\n * @returns {boolean} true if a shadow root could potentially contain valid candidates.\n */\n\n/**\n * @typedef {Object} CandidateScope\n * @property {Element} scopeParent contains inner candidates\n * @property {Element[]} candidates list of candidates found in the scope parent\n */\n\n/**\n * @typedef {Object} IterativeOptions\n * @property {GetShadowRoot|boolean} getShadowRoot true if shadow support is enabled; falsy if not;\n *  if a function, implies shadow support is enabled and either returns the shadow root of an element\n *  or a boolean stating if it has an undisclosed shadow root\n * @property {(node: Element) => boolean} filter filter candidates\n * @property {boolean} flatten if true then result will flatten any CandidateScope into the returned list\n * @property {ShadowRootFilter} shadowRootFilter filter shadow roots;\n */\n\n/**\n * @param {Element[]} elements list of element containers to match candidates from\n * @param {boolean} includeContainer add container list to check\n * @param {IterativeOptions} options\n * @returns {Array.<Element|CandidateScope>}\n */\nvar _getCandidatesIteratively = function getCandidatesIteratively(elements, includeContainer, options) {\n  var candidates = [];\n  var elementsToCheck = Array.from(elements);\n  while (elementsToCheck.length) {\n    var element = elementsToCheck.shift();\n    if (_isInert(element, false)) {\n      // no need to look up since we're drilling down\n      // anything inside this container will also be inert\n      continue;\n    }\n    if (element.tagName === 'SLOT') {\n      // add shadow dom slot scope (slot itself cannot be focusable)\n      var assigned = element.assignedElements();\n      var content = assigned.length ? assigned : element.children;\n      var nestedCandidates = _getCandidatesIteratively(content, true, options);\n      if (options.flatten) {\n        candidates.push.apply(candidates, nestedCandidates);\n      } else {\n        candidates.push({\n          scopeParent: element,\n          candidates: nestedCandidates\n        });\n      }\n    } else {\n      // check candidate element\n      var validCandidate = matches.call(element, candidateSelector);\n      if (validCandidate && options.filter(element) && (includeContainer || !elements.includes(element))) {\n        candidates.push(element);\n      }\n\n      // iterate over shadow content if possible\n      var shadowRoot = element.shadowRoot ||\n      // check for an undisclosed shadow\n      typeof options.getShadowRoot === 'function' && options.getShadowRoot(element);\n\n      // no inert look up because we're already drilling down and checking for inertness\n      //  on the way down, so all containers to this root node should have already been\n      //  vetted as non-inert\n      var validShadowRoot = !_isInert(shadowRoot, false) && (!options.shadowRootFilter || options.shadowRootFilter(element));\n      if (shadowRoot && validShadowRoot) {\n        // add shadow dom scope IIF a shadow root node was given; otherwise, an undisclosed\n        //  shadow exists, so look at light dom children as fallback BUT create a scope for any\n        //  child candidates found because they're likely slotted elements (elements that are\n        //  children of the web component element (which has the shadow), in the light dom, but\n        //  slotted somewhere _inside_ the undisclosed shadow) -- the scope is created below,\n        //  _after_ we return from this recursive call\n        var _nestedCandidates = _getCandidatesIteratively(shadowRoot === true ? element.children : shadowRoot.children, true, options);\n        if (options.flatten) {\n          candidates.push.apply(candidates, _nestedCandidates);\n        } else {\n          candidates.push({\n            scopeParent: element,\n            candidates: _nestedCandidates\n          });\n        }\n      } else {\n        // there's not shadow so just dig into the element's (light dom) children\n        //  __without__ giving the element special scope treatment\n        elementsToCheck.unshift.apply(elementsToCheck, element.children);\n      }\n    }\n  }\n  return candidates;\n};\n\n/**\n * @private\n * Determines if the node has an explicitly specified `tabindex` attribute.\n * @param {HTMLElement} node\n * @returns {boolean} True if so; false if not.\n */\nvar hasTabIndex = function hasTabIndex(node) {\n  return !isNaN(parseInt(node.getAttribute('tabindex'), 10));\n};\n\n/**\n * Determine the tab index of a given node.\n * @param {HTMLElement} node\n * @returns {number} Tab order (negative, 0, or positive number).\n * @throws {Error} If `node` is falsy.\n */\nvar getTabIndex = function getTabIndex(node) {\n  if (!node) {\n    throw new Error('No node provided');\n  }\n  if (node.tabIndex < 0) {\n    // in Chrome, <details/>, <audio controls/> and <video controls/> elements get a default\n    // `tabIndex` of -1 when the 'tabindex' attribute isn't specified in the DOM,\n    // yet they are still part of the regular tab order; in FF, they get a default\n    // `tabIndex` of 0; since Chrome still puts those elements in the regular tab\n    // order, consider their tab index to be 0.\n    // Also browsers do not return `tabIndex` correctly for contentEditable nodes;\n    // so if they don't have a tabindex attribute specifically set, assume it's 0.\n    if ((/^(AUDIO|VIDEO|DETAILS)$/.test(node.tagName) || isContentEditable(node)) && !hasTabIndex(node)) {\n      return 0;\n    }\n  }\n  return node.tabIndex;\n};\n\n/**\n * Determine the tab index of a given node __for sort order purposes__.\n * @param {HTMLElement} node\n * @param {boolean} [isScope] True for a custom element with shadow root or slot that, by default,\n *  has tabIndex -1, but needs to be sorted by document order in order for its content to be\n *  inserted into the correct sort position.\n * @returns {number} Tab order (negative, 0, or positive number).\n */\nvar getSortOrderTabIndex = function getSortOrderTabIndex(node, isScope) {\n  var tabIndex = getTabIndex(node);\n  if (tabIndex < 0 && isScope && !hasTabIndex(node)) {\n    return 0;\n  }\n  return tabIndex;\n};\nvar sortOrderedTabbables = function sortOrderedTabbables(a, b) {\n  return a.tabIndex === b.tabIndex ? a.documentOrder - b.documentOrder : a.tabIndex - b.tabIndex;\n};\nvar isInput = function isInput(node) {\n  return node.tagName === 'INPUT';\n};\nvar isHiddenInput = function isHiddenInput(node) {\n  return isInput(node) && node.type === 'hidden';\n};\nvar isDetailsWithSummary = function isDetailsWithSummary(node) {\n  var r = node.tagName === 'DETAILS' && Array.prototype.slice.apply(node.children).some(function (child) {\n    return child.tagName === 'SUMMARY';\n  });\n  return r;\n};\nvar getCheckedRadio = function getCheckedRadio(nodes, form) {\n  for (var i = 0; i < nodes.length; i++) {\n    if (nodes[i].checked && nodes[i].form === form) {\n      return nodes[i];\n    }\n  }\n};\nvar isTabbableRadio = function isTabbableRadio(node) {\n  if (!node.name) {\n    return true;\n  }\n  var radioScope = node.form || getRootNode(node);\n  var queryRadios = function queryRadios(name) {\n    return radioScope.querySelectorAll('input[type=\"radio\"][name=\"' + name + '\"]');\n  };\n  var radioSet;\n  if (typeof window !== 'undefined' && typeof window.CSS !== 'undefined' && typeof window.CSS.escape === 'function') {\n    radioSet = queryRadios(window.CSS.escape(node.name));\n  } else {\n    try {\n      radioSet = queryRadios(node.name);\n    } catch (err) {\n      // eslint-disable-next-line no-console\n      console.error('Looks like you have a radio button with a name attribute containing invalid CSS selector characters and need the CSS.escape polyfill: %s', err.message);\n      return false;\n    }\n  }\n  var checked = getCheckedRadio(radioSet, node.form);\n  return !checked || checked === node;\n};\nvar isRadio = function isRadio(node) {\n  return isInput(node) && node.type === 'radio';\n};\nvar isNonTabbableRadio = function isNonTabbableRadio(node) {\n  return isRadio(node) && !isTabbableRadio(node);\n};\n\n// determines if a node is ultimately attached to the window's document\nvar isNodeAttached = function isNodeAttached(node) {\n  var _nodeRoot;\n  // The root node is the shadow root if the node is in a shadow DOM; some document otherwise\n  //  (but NOT _the_ document; see second 'If' comment below for more).\n  // If rootNode is shadow root, it'll have a host, which is the element to which the shadow\n  //  is attached, and the one we need to check if it's in the document or not (because the\n  //  shadow, and all nodes it contains, is never considered in the document since shadows\n  //  behave like self-contained DOMs; but if the shadow's HOST, which is part of the document,\n  //  is hidden, or is not in the document itself but is detached, it will affect the shadow's\n  //  visibility, including all the nodes it contains). The host could be any normal node,\n  //  or a custom element (i.e. web component). Either way, that's the one that is considered\n  //  part of the document, not the shadow root, nor any of its children (i.e. the node being\n  //  tested).\n  // To further complicate things, we have to look all the way up until we find a shadow HOST\n  //  that is attached (or find none) because the node might be in nested shadows...\n  // If rootNode is not a shadow root, it won't have a host, and so rootNode should be the\n  //  document (per the docs) and while it's a Document-type object, that document does not\n  //  appear to be the same as the node's `ownerDocument` for some reason, so it's safer\n  //  to ignore the rootNode at this point, and use `node.ownerDocument`. Otherwise,\n  //  using `rootNode.contains(node)` will _always_ be true we'll get false-positives when\n  //  node is actually detached.\n  // NOTE: If `nodeRootHost` or `node` happens to be the `document` itself (which is possible\n  //  if a tabbable/focusable node was quickly added to the DOM, focused, and then removed\n  //  from the DOM as in https://github.com/focus-trap/focus-trap-react/issues/905), then\n  //  `ownerDocument` will be `null`, hence the optional chaining on it.\n  var nodeRoot = node && getRootNode(node);\n  var nodeRootHost = (_nodeRoot = nodeRoot) === null || _nodeRoot === void 0 ? void 0 : _nodeRoot.host;\n\n  // in some cases, a detached node will return itself as the root instead of a document or\n  //  shadow root object, in which case, we shouldn't try to look further up the host chain\n  var attached = false;\n  if (nodeRoot && nodeRoot !== node) {\n    var _nodeRootHost, _nodeRootHost$ownerDo, _node$ownerDocument;\n    attached = !!((_nodeRootHost = nodeRootHost) !== null && _nodeRootHost !== void 0 && (_nodeRootHost$ownerDo = _nodeRootHost.ownerDocument) !== null && _nodeRootHost$ownerDo !== void 0 && _nodeRootHost$ownerDo.contains(nodeRootHost) || node !== null && node !== void 0 && (_node$ownerDocument = node.ownerDocument) !== null && _node$ownerDocument !== void 0 && _node$ownerDocument.contains(node));\n    while (!attached && nodeRootHost) {\n      var _nodeRoot2, _nodeRootHost2, _nodeRootHost2$ownerD;\n      // since it's not attached and we have a root host, the node MUST be in a nested shadow DOM,\n      //  which means we need to get the host's host and check if that parent host is contained\n      //  in (i.e. attached to) the document\n      nodeRoot = getRootNode(nodeRootHost);\n      nodeRootHost = (_nodeRoot2 = nodeRoot) === null || _nodeRoot2 === void 0 ? void 0 : _nodeRoot2.host;\n      attached = !!((_nodeRootHost2 = nodeRootHost) !== null && _nodeRootHost2 !== void 0 && (_nodeRootHost2$ownerD = _nodeRootHost2.ownerDocument) !== null && _nodeRootHost2$ownerD !== void 0 && _nodeRootHost2$ownerD.contains(nodeRootHost));\n    }\n  }\n  return attached;\n};\nvar isZeroArea = function isZeroArea(node) {\n  var _node$getBoundingClie = node.getBoundingClientRect(),\n    width = _node$getBoundingClie.width,\n    height = _node$getBoundingClie.height;\n  return width === 0 && height === 0;\n};\nvar isHidden = function isHidden(node, _ref) {\n  var displayCheck = _ref.displayCheck,\n    getShadowRoot = _ref.getShadowRoot;\n  if (displayCheck === 'full-native') {\n    if ('checkVisibility' in node) {\n      // Chrome >= 105, Edge >= 105, Firefox >= 106, Safari >= 17.4\n      // @see https://developer.mozilla.org/en-US/docs/Web/API/Element/checkVisibility#browser_compatibility\n      var visible = node.checkVisibility({\n        // Checking opacity might be desirable for some use cases, but natively,\n        // opacity zero elements _are_ focusable and tabbable.\n        checkOpacity: false,\n        opacityProperty: false,\n        contentVisibilityAuto: true,\n        visibilityProperty: true,\n        // This is an alias for `visibilityProperty`. Contemporary browsers\n        // support both. However, this alias has wider browser support (Chrome\n        // >= 105 and Firefox >= 106, vs. Chrome >= 121 and Firefox >= 122), so\n        // we include it anyway.\n        checkVisibilityCSS: true\n      });\n      return !visible;\n    }\n    // Fall through to manual visibility checks\n  }\n\n  // NOTE: visibility will be `undefined` if node is detached from the document\n  //  (see notes about this further down), which means we will consider it visible\n  //  (this is legacy behavior from a very long way back)\n  // NOTE: we check this regardless of `displayCheck=\"none\"` because this is a\n  //  _visibility_ check, not a _display_ check\n  if (getComputedStyle(node).visibility === 'hidden') {\n    return true;\n  }\n  var isDirectSummary = matches.call(node, 'details>summary:first-of-type');\n  var nodeUnderDetails = isDirectSummary ? node.parentElement : node;\n  if (matches.call(nodeUnderDetails, 'details:not([open]) *')) {\n    return true;\n  }\n  if (!displayCheck || displayCheck === 'full' ||\n  // full-native can run this branch when it falls through in case\n  // Element#checkVisibility is unsupported\n  displayCheck === 'full-native' || displayCheck === 'legacy-full') {\n    if (typeof getShadowRoot === 'function') {\n      // figure out if we should consider the node to be in an undisclosed shadow and use the\n      //  'non-zero-area' fallback\n      var originalNode = node;\n      while (node) {\n        var parentElement = node.parentElement;\n        var rootNode = getRootNode(node);\n        if (parentElement && !parentElement.shadowRoot && getShadowRoot(parentElement) === true // check if there's an undisclosed shadow\n        ) {\n          // node has an undisclosed shadow which means we can only treat it as a black box, so we\n          //  fall back to a non-zero-area test\n          return isZeroArea(node);\n        } else if (node.assignedSlot) {\n          // iterate up slot\n          node = node.assignedSlot;\n        } else if (!parentElement && rootNode !== node.ownerDocument) {\n          // cross shadow boundary\n          node = rootNode.host;\n        } else {\n          // iterate up normal dom\n          node = parentElement;\n        }\n      }\n      node = originalNode;\n    }\n    // else, `getShadowRoot` might be true, but all that does is enable shadow DOM support\n    //  (i.e. it does not also presume that all nodes might have undisclosed shadows); or\n    //  it might be a falsy value, which means shadow DOM support is disabled\n\n    // Since we didn't find it sitting in an undisclosed shadow (or shadows are disabled)\n    //  now we can just test to see if it would normally be visible or not, provided it's\n    //  attached to the main document.\n    // NOTE: We must consider case where node is inside a shadow DOM and given directly to\n    //  `isTabbable()` or `isFocusable()` -- regardless of `getShadowRoot` option setting.\n\n    if (isNodeAttached(node)) {\n      // this works wherever the node is: if there's at least one client rect, it's\n      //  somehow displayed; it also covers the CSS 'display: contents' case where the\n      //  node itself is hidden in place of its contents; and there's no need to search\n      //  up the hierarchy either\n      return !node.getClientRects().length;\n    }\n\n    // Else, the node isn't attached to the document, which means the `getClientRects()`\n    //  API will __always__ return zero rects (this can happen, for example, if React\n    //  is used to render nodes onto a detached tree, as confirmed in this thread:\n    //  https://github.com/facebook/react/issues/9117#issuecomment-284228870)\n    //\n    // It also means that even window.getComputedStyle(node).display will return `undefined`\n    //  because styles are only computed for nodes that are in the document.\n    //\n    // NOTE: THIS HAS BEEN THE CASE FOR YEARS. It is not new, nor is it caused by tabbable\n    //  somehow. Though it was never stated officially, anyone who has ever used tabbable\n    //  APIs on nodes in detached containers has actually implicitly used tabbable in what\n    //  was later (as of v5.2.0 on Apr 9, 2021) called `displayCheck=\"none\"` mode -- essentially\n    //  considering __everything__ to be visible because of the innability to determine styles.\n    //\n    // v6.0.0: As of this major release, the default 'full' option __no longer treats detached\n    //  nodes as visible with the 'none' fallback.__\n    if (displayCheck !== 'legacy-full') {\n      return true; // hidden\n    }\n    // else, fallback to 'none' mode and consider the node visible\n  } else if (displayCheck === 'non-zero-area') {\n    // NOTE: Even though this tests that the node's client rect is non-zero to determine\n    //  whether it's displayed, and that a detached node will __always__ have a zero-area\n    //  client rect, we don't special-case for whether the node is attached or not. In\n    //  this mode, we do want to consider nodes that have a zero area to be hidden at all\n    //  times, and that includes attached or not.\n    return isZeroArea(node);\n  }\n\n  // visible, as far as we can tell, or per current `displayCheck=none` mode, we assume\n  //  it's visible\n  return false;\n};\n\n// form fields (nested) inside a disabled fieldset are not focusable/tabbable\n//  unless they are in the _first_ <legend> element of the top-most disabled\n//  fieldset\nvar isDisabledFromFieldset = function isDisabledFromFieldset(node) {\n  if (/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(node.tagName)) {\n    var parentNode = node.parentElement;\n    // check if `node` is contained in a disabled <fieldset>\n    while (parentNode) {\n      if (parentNode.tagName === 'FIELDSET' && parentNode.disabled) {\n        // look for the first <legend> among the children of the disabled <fieldset>\n        for (var i = 0; i < parentNode.children.length; i++) {\n          var child = parentNode.children.item(i);\n          // when the first <legend> (in document order) is found\n          if (child.tagName === 'LEGEND') {\n            // if its parent <fieldset> is not nested in another disabled <fieldset>,\n            // return whether `node` is a descendant of its first <legend>\n            return matches.call(parentNode, 'fieldset[disabled] *') ? true : !child.contains(node);\n          }\n        }\n        // the disabled <fieldset> containing `node` has no <legend>\n        return true;\n      }\n      parentNode = parentNode.parentElement;\n    }\n  }\n\n  // else, node's tabbable/focusable state should not be affected by a fieldset's\n  //  enabled/disabled state\n  return false;\n};\nvar isNodeMatchingSelectorFocusable = function isNodeMatchingSelectorFocusable(options, node) {\n  if (node.disabled || isHiddenInput(node) || isHidden(node, options) ||\n  // For a details element with a summary, the summary element gets the focus\n  isDetailsWithSummary(node) || isDisabledFromFieldset(node)) {\n    return false;\n  }\n  return true;\n};\nvar isNodeMatchingSelectorTabbable = function isNodeMatchingSelectorTabbable(options, node) {\n  if (isNonTabbableRadio(node) || getTabIndex(node) < 0 || !isNodeMatchingSelectorFocusable(options, node)) {\n    return false;\n  }\n  return true;\n};\nvar isShadowRootTabbable = function isShadowRootTabbable(shadowHostNode) {\n  var tabIndex = parseInt(shadowHostNode.getAttribute('tabindex'), 10);\n  if (isNaN(tabIndex) || tabIndex >= 0) {\n    return true;\n  }\n  // If a custom element has an explicit negative tabindex,\n  // browsers will not allow tab targeting said element's children.\n  return false;\n};\n\n/**\n * @param {Array.<Element|CandidateScope>} candidates\n * @returns Element[]\n */\nvar _sortByOrder = function sortByOrder(candidates) {\n  var regularTabbables = [];\n  var orderedTabbables = [];\n  candidates.forEach(function (item, i) {\n    var isScope = !!item.scopeParent;\n    var element = isScope ? item.scopeParent : item;\n    var candidateTabindex = getSortOrderTabIndex(element, isScope);\n    var elements = isScope ? _sortByOrder(item.candidates) : element;\n    if (candidateTabindex === 0) {\n      isScope ? regularTabbables.push.apply(regularTabbables, elements) : regularTabbables.push(element);\n    } else {\n      orderedTabbables.push({\n        documentOrder: i,\n        tabIndex: candidateTabindex,\n        item: item,\n        isScope: isScope,\n        content: elements\n      });\n    }\n  });\n  return orderedTabbables.sort(sortOrderedTabbables).reduce(function (acc, sortable) {\n    sortable.isScope ? acc.push.apply(acc, sortable.content) : acc.push(sortable.content);\n    return acc;\n  }, []).concat(regularTabbables);\n};\nvar tabbable = function tabbable(container, options) {\n  options = options || {};\n  var candidates;\n  if (options.getShadowRoot) {\n    candidates = _getCandidatesIteratively([container], options.includeContainer, {\n      filter: isNodeMatchingSelectorTabbable.bind(null, options),\n      flatten: false,\n      getShadowRoot: options.getShadowRoot,\n      shadowRootFilter: isShadowRootTabbable\n    });\n  } else {\n    candidates = getCandidates(container, options.includeContainer, isNodeMatchingSelectorTabbable.bind(null, options));\n  }\n  return _sortByOrder(candidates);\n};\nvar focusable = function focusable(container, options) {\n  options = options || {};\n  var candidates;\n  if (options.getShadowRoot) {\n    candidates = _getCandidatesIteratively([container], options.includeContainer, {\n      filter: isNodeMatchingSelectorFocusable.bind(null, options),\n      flatten: true,\n      getShadowRoot: options.getShadowRoot\n    });\n  } else {\n    candidates = getCandidates(container, options.includeContainer, isNodeMatchingSelectorFocusable.bind(null, options));\n  }\n  return candidates;\n};\nvar isTabbable = function isTabbable(node, options) {\n  options = options || {};\n  if (!node) {\n    throw new Error('No node provided');\n  }\n  if (matches.call(node, candidateSelector) === false) {\n    return false;\n  }\n  return isNodeMatchingSelectorTabbable(options, node);\n};\nvar focusableCandidateSelector = /* #__PURE__ */candidateSelectors.concat('iframe:not([inert]):not([inert] *)').join(',');\nvar isFocusable = function isFocusable(node, options) {\n  options = options || {};\n  if (!node) {\n    throw new Error('No node provided');\n  }\n  if (matches.call(node, focusableCandidateSelector) === false) {\n    return false;\n  }\n  return isNodeMatchingSelectorFocusable(options, node);\n};\n\nexport { focusable, getTabIndex, isFocusable, isTabbable, tabbable };\n//# sourceMappingURL=index.esm.js.map\n","/*!\n* focus-trap 8.0.0\n* @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE\n*/\nimport { isFocusable, tabbable, focusable, isTabbable, getTabIndex } from 'tabbable';\n\nfunction _arrayLikeToArray(r, a) {\n  (null == a || a > r.length) && (a = r.length);\n  for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n  return n;\n}\nfunction _arrayWithoutHoles(r) {\n  if (Array.isArray(r)) return _arrayLikeToArray(r);\n}\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) {\n  try {\n    var i = n[a](c),\n      u = i.value;\n  } catch (n) {\n    return void e(n);\n  }\n  i.done ? t(u) : Promise.resolve(u).then(r, o);\n}\nfunction _asyncToGenerator(n) {\n  return function () {\n    var t = this,\n      e = arguments;\n    return new Promise(function (r, o) {\n      var a = n.apply(t, e);\n      function _next(n) {\n        asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n);\n      }\n      function _throw(n) {\n        asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n);\n      }\n      _next(void 0);\n    });\n  };\n}\nfunction _createForOfIteratorHelper(r, e) {\n  var t = \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n  if (!t) {\n    if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e) {\n      t && (r = t);\n      var n = 0,\n        F = function () {};\n      return {\n        s: F,\n        n: function () {\n          return n >= r.length ? {\n            done: true\n          } : {\n            done: false,\n            value: r[n++]\n          };\n        },\n        e: function (r) {\n          throw r;\n        },\n        f: F\n      };\n    }\n    throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n  }\n  var o,\n    a = true,\n    u = false;\n  return {\n    s: function () {\n      t = t.call(r);\n    },\n    n: function () {\n      var r = t.next();\n      return a = r.done, r;\n    },\n    e: function (r) {\n      u = true, o = r;\n    },\n    f: function () {\n      try {\n        a || null == t.return || t.return();\n      } finally {\n        if (u) throw o;\n      }\n    }\n  };\n}\nfunction _defineProperty(e, r, t) {\n  return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n    value: t,\n    enumerable: true,\n    configurable: true,\n    writable: true\n  }) : e[r] = t, e;\n}\nfunction _iterableToArray(r) {\n  if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r);\n}\nfunction _nonIterableSpread() {\n  throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction ownKeys(e, r) {\n  var t = Object.keys(e);\n  if (Object.getOwnPropertySymbols) {\n    var o = Object.getOwnPropertySymbols(e);\n    r && (o = o.filter(function (r) {\n      return Object.getOwnPropertyDescriptor(e, r).enumerable;\n    })), t.push.apply(t, o);\n  }\n  return t;\n}\nfunction _objectSpread2(e) {\n  for (var r = 1; r < arguments.length; r++) {\n    var t = null != arguments[r] ? arguments[r] : {};\n    r % 2 ? ownKeys(Object(t), true).forEach(function (r) {\n      _defineProperty(e, r, t[r]);\n    }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n      Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n    });\n  }\n  return e;\n}\nfunction _regenerator() {\n  /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */\n  var e,\n    t,\n    r = \"function\" == typeof Symbol ? Symbol : {},\n    n = r.iterator || \"@@iterator\",\n    o = r.toStringTag || \"@@toStringTag\";\n  function i(r, n, o, i) {\n    var c = n && n.prototype instanceof Generator ? n : Generator,\n      u = Object.create(c.prototype);\n    return _regeneratorDefine(u, \"_invoke\", function (r, n, o) {\n      var i,\n        c,\n        u,\n        f = 0,\n        p = o || [],\n        y = false,\n        G = {\n          p: 0,\n          n: 0,\n          v: e,\n          a: d,\n          f: d.bind(e, 4),\n          d: function (t, r) {\n            return i = t, c = 0, u = e, G.n = r, a;\n          }\n        };\n      function d(r, n) {\n        for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) {\n          var o,\n            i = p[t],\n            d = G.p,\n            l = i[2];\n          r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0));\n        }\n        if (o || r > 1) return a;\n        throw y = true, n;\n      }\n      return function (o, p, l) {\n        if (f > 1) throw TypeError(\"Generator is already running\");\n        for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) {\n          i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u);\n          try {\n            if (f = 2, i) {\n              if (c || (o = \"next\"), t = i[o]) {\n                if (!(t = t.call(i, u))) throw TypeError(\"iterator result is not an object\");\n                if (!t.done) return t;\n                u = t.value, c < 2 && (c = 0);\n              } else 1 === c && (t = i.return) && t.call(i), c < 2 && (u = TypeError(\"The iterator does not provide a '\" + o + \"' method\"), c = 1);\n              i = e;\n            } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break;\n          } catch (t) {\n            i = e, c = 1, u = t;\n          } finally {\n            f = 1;\n          }\n        }\n        return {\n          value: t,\n          done: y\n        };\n      };\n    }(r, o, i), true), u;\n  }\n  var a = {};\n  function Generator() {}\n  function GeneratorFunction() {}\n  function GeneratorFunctionPrototype() {}\n  t = Object.getPrototypeOf;\n  var c = [][n] ? t(t([][n]())) : (_regeneratorDefine(t = {}, n, function () {\n      return this;\n    }), t),\n    u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c);\n  function f(e) {\n    return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine(e, o, \"GeneratorFunction\")), e.prototype = Object.create(u), e;\n  }\n  return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine(u, \"constructor\", GeneratorFunctionPrototype), _regeneratorDefine(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction), GeneratorFunction.displayName = \"GeneratorFunction\", _regeneratorDefine(GeneratorFunctionPrototype, o, \"GeneratorFunction\"), _regeneratorDefine(u), _regeneratorDefine(u, o, \"Generator\"), _regeneratorDefine(u, n, function () {\n    return this;\n  }), _regeneratorDefine(u, \"toString\", function () {\n    return \"[object Generator]\";\n  }), (_regenerator = function () {\n    return {\n      w: i,\n      m: f\n    };\n  })();\n}\nfunction _regeneratorDefine(e, r, n, t) {\n  var i = Object.defineProperty;\n  try {\n    i({}, \"\", {});\n  } catch (e) {\n    i = 0;\n  }\n  _regeneratorDefine = function (e, r, n, t) {\n    function o(r, n) {\n      _regeneratorDefine(e, r, function (e) {\n        return this._invoke(r, n, e);\n      });\n    }\n    r ? i ? i(e, r, {\n      value: n,\n      enumerable: !t,\n      configurable: !t,\n      writable: !t\n    }) : e[r] = n : (o(\"next\", 0), o(\"throw\", 1), o(\"return\", 2));\n  }, _regeneratorDefine(e, r, n, t);\n}\nfunction _toConsumableArray(r) {\n  return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread();\n}\nfunction _toPrimitive(t, r) {\n  if (\"object\" != typeof t || !t) return t;\n  var e = t[Symbol.toPrimitive];\n  if (void 0 !== e) {\n    var i = e.call(t, r);\n    if (\"object\" != typeof i) return i;\n    throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n  }\n  return (\"string\" === r ? String : Number)(t);\n}\nfunction _toPropertyKey(t) {\n  var i = _toPrimitive(t, \"string\");\n  return \"symbol\" == typeof i ? i : i + \"\";\n}\nfunction _unsupportedIterableToArray(r, a) {\n  if (r) {\n    if (\"string\" == typeof r) return _arrayLikeToArray(r, a);\n    var t = {}.toString.call(r).slice(8, -1);\n    return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;\n  }\n}\n\nvar activeFocusTraps = {\n  // Returns the trap from the top of the stack.\n  getActiveTrap: function getActiveTrap(trapStack) {\n    if ((trapStack === null || trapStack === void 0 ? void 0 : trapStack.length) > 0) {\n      return trapStack[trapStack.length - 1];\n    }\n    return null;\n  },\n  // Pauses the currently active trap, then adds a new trap to the stack.\n  activateTrap: function activateTrap(trapStack, trap) {\n    var activeTrap = activeFocusTraps.getActiveTrap(trapStack);\n    if (trap !== activeTrap) {\n      activeFocusTraps.pauseTrap(trapStack);\n    }\n    var trapIndex = trapStack.indexOf(trap);\n    if (trapIndex === -1) {\n      trapStack.push(trap);\n    } else {\n      // move this existing trap to the front of the queue\n      trapStack.splice(trapIndex, 1);\n      trapStack.push(trap);\n    }\n  },\n  // Removes the trap from the top of the stack, then unpauses the next trap down.\n  deactivateTrap: function deactivateTrap(trapStack, trap) {\n    var trapIndex = trapStack.indexOf(trap);\n    if (trapIndex !== -1) {\n      trapStack.splice(trapIndex, 1);\n    }\n    activeFocusTraps.unpauseTrap(trapStack);\n  },\n  // Pauses the trap at the top of the stack.\n  pauseTrap: function pauseTrap(trapStack) {\n    var activeTrap = activeFocusTraps.getActiveTrap(trapStack);\n    activeTrap === null || activeTrap === void 0 || activeTrap._setPausedState(true);\n  },\n  // Unpauses the trap at the top of the stack.\n  unpauseTrap: function unpauseTrap(trapStack) {\n    var activeTrap = activeFocusTraps.getActiveTrap(trapStack);\n    if (activeTrap && !activeTrap._isManuallyPaused()) {\n      activeTrap._setPausedState(false);\n    }\n  }\n};\nvar isSelectableInput = function isSelectableInput(node) {\n  return node.tagName && node.tagName.toLowerCase() === 'input' && typeof node.select === 'function';\n};\nvar isEscapeEvent = function isEscapeEvent(e) {\n  return (e === null || e === void 0 ? void 0 : e.key) === 'Escape' || (e === null || e === void 0 ? void 0 : e.key) === 'Esc' || (e === null || e === void 0 ? void 0 : e.keyCode) === 27;\n};\nvar isTabEvent = function isTabEvent(e) {\n  return (e === null || e === void 0 ? void 0 : e.key) === 'Tab' || (e === null || e === void 0 ? void 0 : e.keyCode) === 9;\n};\n\n// checks for TAB by default\nvar isKeyForward = function isKeyForward(e) {\n  return isTabEvent(e) && !e.shiftKey;\n};\n\n// checks for SHIFT+TAB by default\nvar isKeyBackward = function isKeyBackward(e) {\n  return isTabEvent(e) && e.shiftKey;\n};\nvar delay = function delay(fn) {\n  return setTimeout(fn, 0);\n};\n\n/**\n * Get an option's value when it could be a plain value, or a handler that provides\n *  the value.\n * @param {*} value Option's value to check.\n * @param {...*} [params] Any parameters to pass to the handler, if `value` is a function.\n * @returns {*} The `value`, or the handler's returned value.\n */\nvar valueOrHandler = function valueOrHandler(value) {\n  for (var _len = arguments.length, params = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n    params[_key - 1] = arguments[_key];\n  }\n  return typeof value === 'function' ? value.apply(void 0, params) : value;\n};\nvar getActualTarget = function getActualTarget(event) {\n  // NOTE: If the trap is _inside_ a shadow DOM, event.target will always be the\n  //  shadow host. However, event.target.composedPath() will be an array of\n  //  nodes \"clicked\" from inner-most (the actual element inside the shadow) to\n  //  outer-most (the host HTML document). If we have access to composedPath(),\n  //  then use its first element; otherwise, fall back to event.target (and\n  //  this only works for an _open_ shadow DOM; otherwise,\n  //  composedPath()[0] === event.target always).\n  return event.target.shadowRoot && typeof event.composedPath === 'function' ? event.composedPath()[0] : event.target;\n};\n\n// NOTE: this must be _outside_ `createFocusTrap()` to make sure all traps in this\n//  current instance use the same stack if `userOptions.trapStack` isn't specified\nvar internalTrapStack = [];\nvar createFocusTrap = function createFocusTrap(elements, userOptions) {\n  // SSR: a live trap shouldn't be created in this type of environment so this\n  //  should be safe code to execute if the `document` option isn't specified\n  var doc = (userOptions === null || userOptions === void 0 ? void 0 : userOptions.document) || document;\n  var trapStack = (userOptions === null || userOptions === void 0 ? void 0 : userOptions.trapStack) || internalTrapStack;\n  var config = _objectSpread2({\n    returnFocusOnDeactivate: true,\n    escapeDeactivates: true,\n    delayInitialFocus: true,\n    isolateSubtrees: false,\n    isKeyForward: isKeyForward,\n    isKeyBackward: isKeyBackward\n  }, userOptions);\n  var state = {\n    // containers given to createFocusTrap()\n    /** @type {Array<HTMLElement>} */\n    containers: [],\n    // list of objects identifying tabbable nodes in `containers` in the trap\n    // NOTE: it's possible that a group has no tabbable nodes if nodes get removed while the trap\n    //  is active, but the trap should never get to a state where there isn't at least one group\n    //  with at least one tabbable node in it (that would lead to an error condition that would\n    //  result in an error being thrown)\n    /** @type {Array<{\n     *    container: HTMLElement,\n     *    tabbableNodes: Array<HTMLElement>, // empty if none\n     *    focusableNodes: Array<HTMLElement>, // empty if none\n     *    posTabIndexesFound: boolean,\n     *    firstTabbableNode: HTMLElement|undefined,\n     *    lastTabbableNode: HTMLElement|undefined,\n     *    firstDomTabbableNode: HTMLElement|undefined,\n     *    lastDomTabbableNode: HTMLElement|undefined,\n     *    nextTabbableNode: (node: HTMLElement, forward: boolean) => HTMLElement|undefined\n     *  }>}\n     */\n    containerGroups: [],\n    // same order/length as `containers` list\n\n    // references to objects in `containerGroups`, but only those that actually have\n    //  tabbable nodes in them\n    // NOTE: same order as `containers` and `containerGroups`, but __not necessarily__\n    //  the same length\n    tabbableGroups: [],\n    // references to nodes that are siblings to the ancestors of this trap's containers.\n    /** @type {Set<HTMLElement>} */\n    adjacentElements: new Set(),\n    // references to nodes that were inert or aria-hidden before the trap was activated.\n    /** @type {Set<HTMLElement>} */\n    alreadySilent: new Set(),\n    nodeFocusedBeforeActivation: null,\n    mostRecentlyFocusedNode: null,\n    active: false,\n    paused: false,\n    manuallyPaused: false,\n    // timer ID for when delayInitialFocus is true and initial focus in this trap\n    //  has been delayed during activation\n    delayInitialFocusTimer: undefined,\n    // the most recent KeyboardEvent for the configured nav key (typically [SHIFT+]TAB), if any\n    recentNavEvent: undefined\n  };\n  var trap; // eslint-disable-line prefer-const -- some private functions reference it, and its methods reference private functions, so we must declare here and define later\n\n  /**\n   * Gets a configuration option value.\n   * @param {Object|undefined} configOverrideOptions If true, and option is defined in this set,\n   *  value will be taken from this object. Otherwise, value will be taken from base configuration.\n   * @param {string} optionName Name of the option whose value is sought.\n   * @param {string|undefined} [configOptionName] Name of option to use __instead of__ `optionName`\n   *  IIF `configOverrideOptions` is not defined. Otherwise, `optionName` is used.\n   */\n  var getOption = function getOption(configOverrideOptions, optionName, configOptionName) {\n    return configOverrideOptions && configOverrideOptions[optionName] !== undefined ? configOverrideOptions[optionName] : config[configOptionName || optionName];\n  };\n\n  /**\n   * Finds the index of the container that contains the element.\n   * @param {HTMLElement} element\n   * @param {Event} [event] If available, and `element` isn't directly found in any container,\n   *  the event's composed path is used to see if includes any known trap containers in the\n   *  case where the element is inside a Shadow DOM.\n   * @returns {number} Index of the container in either `state.containers` or\n   *  `state.containerGroups` (the order/length of these lists are the same); -1\n   *  if the element isn't found.\n   */\n  var findContainerIndex = function findContainerIndex(element, event) {\n    var composedPath = typeof (event === null || event === void 0 ? void 0 : event.composedPath) === 'function' ? event.composedPath() : undefined;\n    // NOTE: search `containerGroups` because it's possible a group contains no tabbable\n    //  nodes, but still contains focusable nodes (e.g. if they all have `tabindex=-1`)\n    //  and we still need to find the element in there\n    return state.containerGroups.findIndex(function (_ref) {\n      var container = _ref.container,\n        tabbableNodes = _ref.tabbableNodes;\n      return container.contains(element) || (// fall back to explicit tabbable search which will take into consideration any\n      //  web components if the `tabbableOptions.getShadowRoot` option was used for\n      //  the trap, enabling shadow DOM support in tabbable (`Node.contains()` doesn't\n      //  look inside web components even if open)\n      composedPath === null || composedPath === void 0 ? void 0 : composedPath.includes(container)) || tabbableNodes.find(function (node) {\n        return node === element;\n      });\n    });\n  };\n\n  /**\n   * Gets the node for the given option, which is expected to be an option that\n   *  can be either a DOM node, a string that is a selector to get a node, `false`\n   *  (if a node is explicitly NOT given), or a function that returns any of these\n   *  values.\n   * @param {string} optionName\n   * @param {Object} options\n   * @param {boolean} [options.hasFallback] True if the option could be a selector string\n   *  and the option allows for a fallback scenario in the case where the selector is\n   *  valid but does not match a node (i.e. the queried node doesn't exist in the DOM).\n   * @param {Array} [options.params] Params to pass to the option if it's a function.\n   * @returns {undefined | null | false | HTMLElement | SVGElement} Returns\n   *  `undefined` if the option is not specified; `null` if the option didn't resolve\n   *  to a node but `options.hasFallback=true`, `false` if the option resolved to `false`\n   *  (node explicitly not given); otherwise, the resolved DOM node.\n   * @throws {Error} If the option is set, not `false`, and is not, or does not\n   *  resolve to a node, unless the option is a selector string and `options.hasFallback=true`.\n   */\n  var getNodeForOption = function getNodeForOption(optionName) {\n    var _ref2 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n      _ref2$hasFallback = _ref2.hasFallback,\n      hasFallback = _ref2$hasFallback === void 0 ? false : _ref2$hasFallback,\n      _ref2$params = _ref2.params,\n      params = _ref2$params === void 0 ? [] : _ref2$params;\n    var optionValue = config[optionName];\n    if (typeof optionValue === 'function') {\n      optionValue = optionValue.apply(void 0, _toConsumableArray(params));\n    }\n    if (optionValue === true) {\n      optionValue = undefined; // use default value\n    }\n    if (!optionValue) {\n      if (optionValue === undefined || optionValue === false) {\n        return optionValue;\n      }\n      // else, empty string (invalid), null (invalid), 0 (invalid)\n\n      throw new Error(\"`\".concat(optionName, \"` was specified but was not a node, or did not return a node\"));\n    }\n    var node = optionValue; // could be HTMLElement, SVGElement, or non-empty string at this point\n\n    if (typeof optionValue === 'string') {\n      try {\n        node = doc.querySelector(optionValue); // resolve to node, or null if fails\n      } catch (err) {\n        throw new Error(\"`\".concat(optionName, \"` appears to be an invalid selector; error=\\\"\").concat(err.message, \"\\\"\"));\n      }\n      if (!node) {\n        if (!hasFallback) {\n          throw new Error(\"`\".concat(optionName, \"` as selector refers to no known node\"));\n        }\n        // else, `node` MUST be `null` because that's what `Document.querySelector()` returns\n        //  if the selector is valid but doesn't match anything\n      }\n    }\n    return node;\n  };\n  var getInitialFocusNode = function getInitialFocusNode() {\n    var node = getNodeForOption('initialFocus', {\n      hasFallback: true\n    });\n\n    // false explicitly indicates we want no initialFocus at all\n    if (node === false) {\n      return false;\n    }\n    if (node === undefined || node && !isFocusable(node, config.tabbableOptions)) {\n      // option not specified nor focusable: use fallback options\n      if (findContainerIndex(doc.activeElement) >= 0) {\n        node = doc.activeElement;\n      } else {\n        var firstTabbableGroup = state.tabbableGroups[0];\n        var firstTabbableNode = firstTabbableGroup && firstTabbableGroup.firstTabbableNode;\n\n        // NOTE: `fallbackFocus` option function cannot return `false` (not supported)\n        node = firstTabbableNode || getNodeForOption('fallbackFocus');\n      }\n    } else if (node === null) {\n      // option is a VALID selector string that doesn't yield a node: use the `fallbackFocus`\n      //  option instead of the default behavior when the option isn't specified at all\n      node = getNodeForOption('fallbackFocus');\n    }\n    if (!node) {\n      throw new Error('Your focus-trap needs to have at least one focusable element');\n    }\n    return node;\n  };\n  var updateTabbableNodes = function updateTabbableNodes() {\n    state.containerGroups = state.containers.map(function (container) {\n      var tabbableNodes = tabbable(container, config.tabbableOptions);\n\n      // NOTE: if we have tabbable nodes, we must have focusable nodes; focusable nodes\n      //  are a superset of tabbable nodes since nodes with negative `tabindex` attributes\n      //  are focusable but not tabbable\n      var focusableNodes = focusable(container, config.tabbableOptions);\n      var firstTabbableNode = tabbableNodes.length > 0 ? tabbableNodes[0] : undefined;\n      var lastTabbableNode = tabbableNodes.length > 0 ? tabbableNodes[tabbableNodes.length - 1] : undefined;\n      var firstDomTabbableNode = focusableNodes.find(function (node) {\n        return isTabbable(node);\n      });\n      var lastDomTabbableNode = focusableNodes.slice().reverse().find(function (node) {\n        return isTabbable(node);\n      });\n      var posTabIndexesFound = !!tabbableNodes.find(function (node) {\n        return getTabIndex(node) > 0;\n      });\n      return {\n        container: container,\n        tabbableNodes: tabbableNodes,\n        focusableNodes: focusableNodes,\n        /** True if at least one node with positive `tabindex` was found in this container. */\n        posTabIndexesFound: posTabIndexesFound,\n        /** First tabbable node in container, __tabindex__ order; `undefined` if none. */\n        firstTabbableNode: firstTabbableNode,\n        /** Last tabbable node in container, __tabindex__ order; `undefined` if none. */\n        lastTabbableNode: lastTabbableNode,\n        // NOTE: DOM order is NOT NECESSARILY \"document position\" order, but figuring that out\n        //  would require more than just https://developer.mozilla.org/en-US/docs/Web/API/Node/compareDocumentPosition\n        //  because that API doesn't work with Shadow DOM as well as it should (@see\n        //  https://github.com/whatwg/dom/issues/320) and since this first/last is only needed, so far,\n        //  to address an edge case related to positive tabindex support, this seems like a much easier,\n        //  \"close enough most of the time\" alternative for positive tabindexes which should generally\n        //  be avoided anyway...\n        /** First tabbable node in container, __DOM__ order; `undefined` if none. */\n        firstDomTabbableNode: firstDomTabbableNode,\n        /** Last tabbable node in container, __DOM__ order; `undefined` if none. */\n        lastDomTabbableNode: lastDomTabbableNode,\n        /**\n         * Finds the __tabbable__ node that follows the given node in the specified direction,\n         *  in this container, if any.\n         * @param {HTMLElement} node\n         * @param {boolean} [forward] True if going in forward tab order; false if going\n         *  in reverse.\n         * @returns {HTMLElement|undefined} The next tabbable node, if any.\n         */\n        nextTabbableNode: function nextTabbableNode(node) {\n          var forward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n          var nodeIdx = tabbableNodes.indexOf(node);\n          if (nodeIdx < 0) {\n            // either not tabbable nor focusable, or was focused but not tabbable (negative tabindex):\n            //  since `node` should at least have been focusable, we assume that's the case and mimic\n            //  what browsers do, which is set focus to the next node in __document position order__,\n            //  regardless of positive tabindexes, if any -- and for reasons explained in the NOTE\n            //  above related to `firstDomTabbable` and `lastDomTabbable` properties, we fall back to\n            //  basic DOM order\n            if (forward) {\n              return focusableNodes.slice(focusableNodes.indexOf(node) + 1).find(function (el) {\n                return isTabbable(el);\n              });\n            }\n            return focusableNodes.slice(0, focusableNodes.indexOf(node)).reverse().find(function (el) {\n              return isTabbable(el);\n            });\n          }\n          return tabbableNodes[nodeIdx + (forward ? 1 : -1)];\n        }\n      };\n    });\n    state.tabbableGroups = state.containerGroups.filter(function (group) {\n      return group.tabbableNodes.length > 0;\n    });\n\n    // throw if no groups have tabbable nodes and we don't have a fallback focus node either\n    if (state.tabbableGroups.length <= 0 && !getNodeForOption('fallbackFocus') // returning false not supported for this option\n    ) {\n      throw new Error('Your focus-trap must have at least one container with at least one tabbable node in it at all times');\n    }\n\n    // NOTE: Positive tabindexes are only properly supported in single-container traps because\n    //  doing it across multiple containers where tabindexes could be all over the place\n    //  would require Tabbable to support multiple containers, would require additional\n    //  specialized Shadow DOM support, and would require Tabbable's multi-container support\n    //  to look at those containers in document position order rather than user-provided\n    //  order (as they are treated in Focus-trap, for legacy reasons). See discussion on\n    //  https://github.com/focus-trap/focus-trap/issues/375 for more details.\n    if (state.containerGroups.find(function (g) {\n      return g.posTabIndexesFound;\n    }) && state.containerGroups.length > 1) {\n      throw new Error(\"At least one node with a positive tabindex was found in one of your focus-trap's multiple containers. Positive tabindexes are only supported in single-container focus-traps.\");\n    }\n  };\n\n  /**\n   * Gets the current activeElement. If it's a web-component and has open shadow-root\n   * it will recursively search inside shadow roots for the \"true\" activeElement.\n   *\n   * @param {Document | ShadowRoot} el\n   *\n   * @returns {HTMLElement} The element that currently has the focus\n   **/\n  var _getActiveElement = function getActiveElement(el) {\n    var activeElement = el.activeElement;\n    if (!activeElement) {\n      return;\n    }\n    if (activeElement.shadowRoot && activeElement.shadowRoot.activeElement !== null) {\n      return _getActiveElement(activeElement.shadowRoot);\n    }\n    return activeElement;\n  };\n  var _tryFocus = function tryFocus(node) {\n    if (node === false) {\n      return;\n    }\n    if (node === _getActiveElement(document)) {\n      return;\n    }\n    if (!node || !node.focus) {\n      _tryFocus(getInitialFocusNode());\n      return;\n    }\n    node.focus({\n      preventScroll: !!config.preventScroll\n    });\n    // NOTE: focus() API does not trigger focusIn event so set MRU node manually\n    state.mostRecentlyFocusedNode = node;\n    if (isSelectableInput(node)) {\n      node.select();\n    }\n  };\n  var getReturnFocusNode = function getReturnFocusNode(previousActiveElement) {\n    var node = getNodeForOption('setReturnFocus', {\n      params: [previousActiveElement]\n    });\n    return node ? node : node === false ? false : previousActiveElement;\n  };\n\n  /**\n   * Finds the next node (in either direction) where focus should move according to a\n   *  keyboard focus-in event.\n   * @param {Object} params\n   * @param {Node} [params.target] Known target __from which__ to navigate, if any.\n   * @param {KeyboardEvent|FocusEvent} [params.event] Event to use if `target` isn't known (event\n   *  will be used to determine the `target`). Ignored if `target` is specified.\n   * @param {boolean} [params.isBackward] True if focus should move backward.\n   * @returns {Node|undefined} The next node, or `undefined` if a next node couldn't be\n   *  determined given the current state of the trap.\n   */\n  var findNextNavNode = function findNextNavNode(_ref3) {\n    var target = _ref3.target,\n      event = _ref3.event,\n      _ref3$isBackward = _ref3.isBackward,\n      isBackward = _ref3$isBackward === void 0 ? false : _ref3$isBackward;\n    target = target || getActualTarget(event);\n    updateTabbableNodes();\n    var destinationNode = null;\n    if (state.tabbableGroups.length > 0) {\n      // make sure the target is actually contained in a group\n      // NOTE: the target may also be the container itself if it's focusable\n      //  with tabIndex='-1' and was given initial focus\n      var containerIndex = findContainerIndex(target, event);\n      var containerGroup = containerIndex >= 0 ? state.containerGroups[containerIndex] : undefined;\n      if (containerIndex < 0) {\n        // target not found in any group: quite possible focus has escaped the trap,\n        //  so bring it back into...\n        if (isBackward) {\n          // ...the last node in the last group\n          destinationNode = state.tabbableGroups[state.tabbableGroups.length - 1].lastTabbableNode;\n        } else {\n          // ...the first node in the first group\n          destinationNode = state.tabbableGroups[0].firstTabbableNode;\n        }\n      } else if (isBackward) {\n        // REVERSE\n\n        // is the target the first tabbable node in a group?\n        var startOfGroupIndex = state.tabbableGroups.findIndex(function (_ref4) {\n          var firstTabbableNode = _ref4.firstTabbableNode;\n          return target === firstTabbableNode;\n        });\n        if (startOfGroupIndex < 0 && (containerGroup.container === target || isFocusable(target, config.tabbableOptions) && !isTabbable(target, config.tabbableOptions) && !containerGroup.nextTabbableNode(target, false))) {\n          // an exception case where the target is either the container itself, or\n          //  a non-tabbable node that was given focus (i.e. tabindex is negative\n          //  and user clicked on it or node was programmatically given focus)\n          //  and is not followed by any other tabbable node, in which\n          //  case, we should handle shift+tab as if focus were on the container's\n          //  first tabbable node, and go to the last tabbable node of the LAST group\n          startOfGroupIndex = containerIndex;\n        }\n        if (startOfGroupIndex >= 0) {\n          // YES: then shift+tab should go to the last tabbable node in the\n          //  previous group (and wrap around to the last tabbable node of\n          //  the LAST group if it's the first tabbable node of the FIRST group)\n          var destinationGroupIndex = startOfGroupIndex === 0 ? state.tabbableGroups.length - 1 : startOfGroupIndex - 1;\n          var destinationGroup = state.tabbableGroups[destinationGroupIndex];\n          destinationNode = getTabIndex(target) >= 0 ? destinationGroup.lastTabbableNode : destinationGroup.lastDomTabbableNode;\n        } else if (!isTabEvent(event)) {\n          // user must have customized the nav keys so we have to move focus manually _within_\n          //  the active group: do this based on the order determined by tabbable()\n          destinationNode = containerGroup.nextTabbableNode(target, false);\n        }\n      } else {\n        // FORWARD\n\n        // is the target the last tabbable node in a group?\n        var lastOfGroupIndex = state.tabbableGroups.findIndex(function (_ref5) {\n          var lastTabbableNode = _ref5.lastTabbableNode;\n          return target === lastTabbableNode;\n        });\n        if (lastOfGroupIndex < 0 && (containerGroup.container === target || isFocusable(target, config.tabbableOptions) && !isTabbable(target, config.tabbableOptions) && !containerGroup.nextTabbableNode(target))) {\n          // an exception case where the target is the container itself, or\n          //  a non-tabbable node that was given focus (i.e. tabindex is negative\n          //  and user clicked on it or node was programmatically given focus)\n          //  and is not followed by any other tabbable node, in which\n          //  case, we should handle tab as if focus were on the container's\n          //  last tabbable node, and go to the first tabbable node of the FIRST group\n          lastOfGroupIndex = containerIndex;\n        }\n        if (lastOfGroupIndex >= 0) {\n          // YES: then tab should go to the first tabbable node in the next\n          //  group (and wrap around to the first tabbable node of the FIRST\n          //  group if it's the last tabbable node of the LAST group)\n          var _destinationGroupIndex = lastOfGroupIndex === state.tabbableGroups.length - 1 ? 0 : lastOfGroupIndex + 1;\n          var _destinationGroup = state.tabbableGroups[_destinationGroupIndex];\n          destinationNode = getTabIndex(target) >= 0 ? _destinationGroup.firstTabbableNode : _destinationGroup.firstDomTabbableNode;\n        } else if (!isTabEvent(event)) {\n          // user must have customized the nav keys so we have to move focus manually _within_\n          //  the active group: do this based on the order determined by tabbable()\n          destinationNode = containerGroup.nextTabbableNode(target);\n        }\n      }\n    } else {\n      // no groups available\n      // NOTE: the fallbackFocus option does not support returning false to opt-out\n      destinationNode = getNodeForOption('fallbackFocus');\n    }\n    return destinationNode;\n  };\n\n  // This needs to be done on mousedown and touchstart instead of click\n  // so that it precedes the focus event.\n  var checkPointerDown = function checkPointerDown(e) {\n    var target = getActualTarget(e);\n    if (findContainerIndex(target, e) >= 0) {\n      // allow the click since it occurred inside the trap\n      return;\n    }\n    if (valueOrHandler(config.clickOutsideDeactivates, e)) {\n      // immediately deactivate the trap\n      trap.deactivate({\n        // NOTE: by setting `returnFocus: false`, deactivate() will do nothing,\n        //  which will result in the outside click setting focus to the node\n        //  that was clicked (and if not focusable, to \"nothing\"); by setting\n        //  `returnFocus: true`, we'll attempt to re-focus the node originally-focused\n        //  on activation (or the configured `setReturnFocus` node), whether the\n        //  outside click was on a focusable node or not\n        returnFocus: config.returnFocusOnDeactivate\n      });\n      return;\n    }\n\n    // This is needed for mobile devices.\n    // (If we'll only let `click` events through,\n    // then on mobile they will be blocked anyways if `touchstart` is blocked.)\n    if (valueOrHandler(config.allowOutsideClick, e)) {\n      // allow the click outside the trap to take place\n      return;\n    }\n\n    // otherwise, prevent the click\n    e.preventDefault();\n  };\n\n  // In case focus escapes the trap for some strange reason, pull it back in.\n  // NOTE: the focusIn event is NOT cancelable, so if focus escapes, it may cause unexpected\n  //  scrolling if the node that got focused was out of view; there's nothing we can do to\n  //  prevent that from happening by the time we discover that focus escaped\n  var checkFocusIn = function checkFocusIn(event) {\n    var target = getActualTarget(event);\n    var targetContained = findContainerIndex(target, event) >= 0;\n\n    // In Firefox when you Tab out of an iframe the Document is briefly focused.\n    if (targetContained || target instanceof Document) {\n      if (targetContained) {\n        state.mostRecentlyFocusedNode = target;\n      }\n    } else {\n      // escaped! pull it back in to where it just left\n      event.stopImmediatePropagation();\n\n      // focus will escape if the MRU node had a positive tab index and user tried to nav forward;\n      //  it will also escape if the MRU node had a 0 tab index and user tried to nav backward\n      //  toward a node with a positive tab index\n      var nextNode; // next node to focus, if we find one\n      var navAcrossContainers = true;\n      if (state.mostRecentlyFocusedNode) {\n        if (getTabIndex(state.mostRecentlyFocusedNode) > 0) {\n          // MRU container index must be >=0 otherwise we wouldn't have it as an MRU node...\n          var mruContainerIdx = findContainerIndex(state.mostRecentlyFocusedNode);\n          // there MAY not be any tabbable nodes in the container if there are at least 2 containers\n          //  and the MRU node is focusable but not tabbable (focus-trap requires at least 1 container\n          //  with at least one tabbable node in order to function, so this could be the other container\n          //  with nothing tabbable in it)\n          var tabbableNodes = state.containerGroups[mruContainerIdx].tabbableNodes;\n          if (tabbableNodes.length > 0) {\n            // MRU tab index MAY not be found if the MRU node is focusable but not tabbable\n            var mruTabIdx = tabbableNodes.findIndex(function (node) {\n              return node === state.mostRecentlyFocusedNode;\n            });\n            if (mruTabIdx >= 0) {\n              if (config.isKeyForward(state.recentNavEvent)) {\n                if (mruTabIdx + 1 < tabbableNodes.length) {\n                  nextNode = tabbableNodes[mruTabIdx + 1];\n                  navAcrossContainers = false;\n                }\n                // else, don't wrap within the container as focus should move to next/previous\n                //  container\n              } else {\n                if (mruTabIdx - 1 >= 0) {\n                  nextNode = tabbableNodes[mruTabIdx - 1];\n                  navAcrossContainers = false;\n                }\n                // else, don't wrap within the container as focus should move to next/previous\n                //  container\n              }\n              // else, don't find in container order without considering direction too\n            }\n          }\n          // else, no tabbable nodes in that container (which means we must have at least one other\n          //  container with at least one tabbable node in it, otherwise focus-trap would've thrown\n          //  an error the last time updateTabbableNodes() was run): find next node among all known\n          //  containers\n        } else {\n          // check to see if there's at least one tabbable node with a positive tab index inside\n          //  the trap because focus seems to escape when navigating backward from a tabbable node\n          //  with tabindex=0 when this is the case (instead of wrapping to the tabbable node with\n          //  the greatest positive tab index like it should)\n          if (!state.containerGroups.some(function (g) {\n            return g.tabbableNodes.some(function (n) {\n              return getTabIndex(n) > 0;\n            });\n          })) {\n            // no containers with tabbable nodes with positive tab indexes which means the focus\n            //  escaped for some other reason and we should just execute the fallback to the\n            //  MRU node or initial focus node, if any\n            navAcrossContainers = false;\n          }\n        }\n      } else {\n        // no MRU node means we're likely in some initial condition when the trap has just\n        //  been activated and initial focus hasn't been given yet, in which case we should\n        //  fall through to trying to focus the initial focus node, which is what should\n        //  happen below at this point in the logic\n        navAcrossContainers = false;\n      }\n      if (navAcrossContainers) {\n        nextNode = findNextNavNode({\n          // move FROM the MRU node, not event-related node (which will be the node that is\n          //  outside the trap causing the focus escape we're trying to fix)\n          target: state.mostRecentlyFocusedNode,\n          isBackward: config.isKeyBackward(state.recentNavEvent)\n        });\n      }\n      if (nextNode) {\n        _tryFocus(nextNode);\n      } else {\n        _tryFocus(state.mostRecentlyFocusedNode || getInitialFocusNode());\n      }\n    }\n    state.recentNavEvent = undefined; // clear\n  };\n\n  // Hijack key nav events on the first and last focusable nodes of the trap,\n  // in order to prevent focus from escaping. If it escapes for even a\n  // moment it can end up scrolling the page and causing confusion so we\n  // kind of need to capture the action at the keydown phase.\n  var checkKeyNav = function checkKeyNav(event) {\n    var isBackward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n    state.recentNavEvent = event;\n    var destinationNode = findNextNavNode({\n      event: event,\n      isBackward: isBackward\n    });\n    if (destinationNode) {\n      if (isTabEvent(event)) {\n        // since tab natively moves focus, we wouldn't have a destination node unless we\n        //  were on the edge of a container and had to move to the next/previous edge, in\n        //  which case we want to prevent default to keep the browser from moving focus\n        //  to where it normally would\n        event.preventDefault();\n      }\n      _tryFocus(destinationNode);\n    }\n    // else, let the browser take care of [shift+]tab and move the focus\n  };\n  var checkTabKey = function checkTabKey(event) {\n    if (config.isKeyForward(event) || config.isKeyBackward(event)) {\n      checkKeyNav(event, config.isKeyBackward(event));\n    }\n  };\n\n  // we use a different event phase for the Escape key to allow canceling the event and checking for this in escapeDeactivates\n  var checkEscapeKey = function checkEscapeKey(event) {\n    if (isEscapeEvent(event) && valueOrHandler(config.escapeDeactivates, event) !== false) {\n      event.preventDefault();\n      trap.deactivate();\n    }\n  };\n  var checkClick = function checkClick(e) {\n    var target = getActualTarget(e);\n    if (findContainerIndex(target, e) >= 0) {\n      return;\n    }\n    if (valueOrHandler(config.clickOutsideDeactivates, e)) {\n      return;\n    }\n    if (valueOrHandler(config.allowOutsideClick, e)) {\n      return;\n    }\n    e.preventDefault();\n    e.stopImmediatePropagation();\n  };\n\n  //\n  // EVENT LISTENERS\n  //\n\n  /**\n   * Adds listeners to the document necessary for trapping focus and attempts to set focus\n   *  to the configured initial focus node. Does nothing if the trap isn't active.\n   * @returns {Promise<void>} Resolved (always) once the initial focus node has been focused.\n   *  Also resolved if the trap isn't active.\n   */\n  var addListeners = function addListeners() {\n    if (!state.active) {\n      return Promise.resolve();\n    }\n\n    // There can be only one listening focus trap at a time\n    activeFocusTraps.activateTrap(trapStack, trap);\n\n    // Delay ensures that the focused element doesn't capture the event\n    // that caused the focus trap activation.\n    /** @type {Promise<void>} */\n    var promise;\n    if (config.delayInitialFocus) {\n      // NOTE: Promise constructor callback is called synchronously, which is what we want\n      //  since we need to capture the timer ID immediately\n      promise = new Promise(function (resolve) {\n        state.delayInitialFocusTimer = delay(function () {\n          _tryFocus(getInitialFocusNode());\n          resolve();\n        });\n      });\n    } else {\n      promise = Promise.resolve();\n      _tryFocus(getInitialFocusNode());\n    }\n    doc.addEventListener('focusin', checkFocusIn, true);\n    doc.addEventListener('mousedown', checkPointerDown, {\n      capture: true,\n      passive: false\n    });\n    doc.addEventListener('touchstart', checkPointerDown, {\n      capture: true,\n      passive: false\n    });\n    doc.addEventListener('click', checkClick, {\n      capture: true,\n      passive: false\n    });\n    doc.addEventListener('keydown', checkTabKey, {\n      capture: true,\n      passive: false\n    });\n    doc.addEventListener('keydown', checkEscapeKey);\n    return promise;\n  };\n\n  /**\n   * Traverses up the DOM from each of `containers`, collecting references to\n   * the elements that are siblings to `container` or an ancestor of `container`.\n   * @param {Array<HTMLElement>} containers\n   */\n  var collectAdjacentElements = function collectAdjacentElements(containers) {\n    // Re-activate all adjacent elements & clear previous collection.\n    if (state.active && !state.paused) {\n      trap._setSubtreeIsolation(false);\n    }\n    state.adjacentElements.clear();\n    state.alreadySilent.clear();\n\n    // Collect all ancestors of all containers to avoid redundant processing.\n    var containerAncestors = new Set();\n    var adjacentElements = new Set();\n\n    // Compile all elements adjacent to the focus trap containers & lineage.\n    var _iterator = _createForOfIteratorHelper(containers),\n      _step;\n    try {\n      for (_iterator.s(); !(_step = _iterator.n()).done;) {\n        var container = _step.value;\n        containerAncestors.add(container);\n        var insideShadowRoot = typeof ShadowRoot !== 'undefined' && container.getRootNode() instanceof ShadowRoot;\n        var current = container;\n        while (current) {\n          containerAncestors.add(current);\n          var parent = current.parentElement;\n          var siblings = [];\n          if (parent) {\n            siblings = parent.children;\n          } else if (!parent && insideShadowRoot) {\n            siblings = current.getRootNode().children;\n            parent = current.getRootNode().host;\n            insideShadowRoot = typeof ShadowRoot !== 'undefined' && parent.getRootNode() instanceof ShadowRoot;\n          }\n\n          // Add all the children, we'll remove container lineage later.\n          var _iterator2 = _createForOfIteratorHelper(siblings),\n            _step2;\n          try {\n            for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n              var child = _step2.value;\n              adjacentElements.add(child);\n            }\n          } catch (err) {\n            _iterator2.e(err);\n          } finally {\n            _iterator2.f();\n          }\n          current = parent;\n        }\n      }\n\n      // Multi-container traps may overlap.\n      // Remove elements within container lineages.\n    } catch (err) {\n      _iterator.e(err);\n    } finally {\n      _iterator.f();\n    }\n    containerAncestors.forEach(function (el) {\n      adjacentElements[\"delete\"](el);\n    });\n    state.adjacentElements = adjacentElements;\n  };\n  var removeListeners = function removeListeners() {\n    if (!state.active) {\n      return;\n    }\n    doc.removeEventListener('focusin', checkFocusIn, true);\n    doc.removeEventListener('mousedown', checkPointerDown, true);\n    doc.removeEventListener('touchstart', checkPointerDown, true);\n    doc.removeEventListener('click', checkClick, true);\n    doc.removeEventListener('keydown', checkTabKey, true);\n    doc.removeEventListener('keydown', checkEscapeKey);\n    return trap;\n  };\n\n  //\n  // MUTATION OBSERVER\n  //\n\n  var checkDomRemoval = function checkDomRemoval(mutations) {\n    var isFocusedNodeRemoved = mutations.some(function (mutation) {\n      var removedNodes = Array.from(mutation.removedNodes);\n      return removedNodes.some(function (node) {\n        return node === state.mostRecentlyFocusedNode;\n      });\n    });\n\n    // If the currently focused is removed then browsers will move focus to the\n    // <body> element. If this happens, try to move focus back into the trap.\n    if (isFocusedNodeRemoved) {\n      _tryFocus(getInitialFocusNode());\n    }\n  };\n\n  // Use MutationObserver - if supported - to detect if focused node is removed\n  // from the DOM.\n  var mutationObserver = typeof window !== 'undefined' && 'MutationObserver' in window ? new MutationObserver(checkDomRemoval) : undefined;\n  var updateObservedNodes = function updateObservedNodes() {\n    if (!mutationObserver) {\n      return;\n    }\n    mutationObserver.disconnect();\n    if (state.active && !state.paused) {\n      state.containers.map(function (container) {\n        mutationObserver.observe(container, {\n          subtree: true,\n          childList: true\n        });\n      });\n    }\n  };\n\n  //\n  // TRAP DEFINITION\n  //\n\n  trap = {\n    get active() {\n      return state.active;\n    },\n    get paused() {\n      return state.paused;\n    },\n    activate: function activate(activateOptions) {\n      if (state.active) {\n        return this;\n      }\n      var onActivate = getOption(activateOptions, 'onActivate');\n      var onPostActivate = getOption(activateOptions, 'onPostActivate');\n      var checkCanFocusTrap = getOption(activateOptions, 'checkCanFocusTrap');\n\n      // If a currently-active trap is isolating its subtree, we need to remove\n      // that isolation to allow the new trap to find tabbable nodes.\n      var preexistingTrap = activeFocusTraps.getActiveTrap(trapStack);\n      var revertState = false;\n      if (preexistingTrap && !preexistingTrap.paused) {\n        var _preexistingTrap$_set;\n        // [#1729] method MAY not exist if using `trapStack` option to share stack with older\n        //  versions of Focus-trap in the same DOM so use optional chaining here just in case\n        //  since this is a trap we may not have created from this instance of the library\n        (_preexistingTrap$_set = preexistingTrap._setSubtreeIsolation) === null || _preexistingTrap$_set === void 0 || _preexistingTrap$_set.call(preexistingTrap, false);\n        revertState = true;\n      }\n      try {\n        if (!checkCanFocusTrap) {\n          updateTabbableNodes();\n        }\n        state.active = true;\n        state.paused = false;\n        state.nodeFocusedBeforeActivation = _getActiveElement(doc);\n        onActivate === null || onActivate === void 0 || onActivate();\n        var finishActivation = /*#__PURE__*/function () {\n          var _ref6 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {\n            return _regenerator().w(function (_context) {\n              while (1) switch (_context.n) {\n                case 0:\n                  if (checkCanFocusTrap) {\n                    updateTabbableNodes();\n                  }\n\n                  // NOTE: wait for initial focus node to get focused before we potentially isolate\n                  //  the subtrees with aria-hidden while focus is still in some other subtree and\n                  //  not yet in the trap, resulting in some browsers (e.g. Chrome) logging to the\n                  //  console that they, \"Blocked aria-hidden on an element because its descendant\n                  //  retained focus...\"\n                  _context.n = 1;\n                  return addListeners();\n                case 1:\n                  trap._setSubtreeIsolation(true);\n                  updateObservedNodes();\n                  onPostActivate === null || onPostActivate === void 0 || onPostActivate();\n                case 2:\n                  return _context.a(2);\n              }\n            }, _callee);\n          }));\n          return function finishActivation() {\n            return _ref6.apply(this, arguments);\n          };\n        }();\n        if (checkCanFocusTrap) {\n          checkCanFocusTrap(state.containers.concat()).then(finishActivation, finishActivation);\n          return this;\n        }\n        finishActivation();\n      } catch (error) {\n        // If our activation throws an exception and the stack hasn't changed,\n        // we need to re-enable the prior trap's subtree isolation.\n        if (preexistingTrap === activeFocusTraps.getActiveTrap(trapStack) && revertState) {\n          var _preexistingTrap$_set2;\n          // [#1729] method MAY not exist if using `trapStack` option to share stack with older\n          //  versions of Focus-trap in the same DOM so use optional chaining here just in case\n          //  since this is a trap we may not have created from this instance of the library\n          (_preexistingTrap$_set2 = preexistingTrap._setSubtreeIsolation) === null || _preexistingTrap$_set2 === void 0 || _preexistingTrap$_set2.call(preexistingTrap, true);\n        }\n        throw error;\n      }\n      return this;\n    },\n    deactivate: function deactivate(deactivateOptions) {\n      if (!state.active) {\n        return this;\n      }\n      var options = _objectSpread2({\n        onDeactivate: config.onDeactivate,\n        onPostDeactivate: config.onPostDeactivate,\n        checkCanReturnFocus: config.checkCanReturnFocus\n      }, deactivateOptions);\n      clearTimeout(state.delayInitialFocusTimer); // noop if undefined\n      state.delayInitialFocusTimer = undefined;\n\n      // Prior to removing this trap from the trapStack, we need to remove any applications of `inert`.\n      // This allows the next trap down to update its tabbable nodes properly.\n      //\n      // If this trap is not top of the stack, don't change any current isolation.\n      if (!state.paused) {\n        trap._setSubtreeIsolation(false);\n      }\n      state.alreadySilent.clear();\n      removeListeners();\n      state.active = false;\n      state.paused = false;\n      updateObservedNodes();\n      activeFocusTraps.deactivateTrap(trapStack, trap);\n      var onDeactivate = getOption(options, 'onDeactivate');\n      var onPostDeactivate = getOption(options, 'onPostDeactivate');\n      var checkCanReturnFocus = getOption(options, 'checkCanReturnFocus');\n      var returnFocus = getOption(options, 'returnFocus', 'returnFocusOnDeactivate');\n      onDeactivate === null || onDeactivate === void 0 || onDeactivate();\n      var finishDeactivation = function finishDeactivation() {\n        delay(function () {\n          if (returnFocus) {\n            _tryFocus(getReturnFocusNode(state.nodeFocusedBeforeActivation));\n          }\n          onPostDeactivate === null || onPostDeactivate === void 0 || onPostDeactivate();\n        });\n      };\n      if (returnFocus && checkCanReturnFocus) {\n        checkCanReturnFocus(getReturnFocusNode(state.nodeFocusedBeforeActivation)).then(finishDeactivation, finishDeactivation);\n        return this;\n      }\n      finishDeactivation();\n      return this;\n    },\n    pause: function pause(pauseOptions) {\n      if (!state.active) {\n        return this;\n      }\n      state.manuallyPaused = true;\n      return this._setPausedState(true, pauseOptions);\n    },\n    unpause: function unpause(unpauseOptions) {\n      if (!state.active) {\n        return this;\n      }\n      state.manuallyPaused = false;\n      if (trapStack[trapStack.length - 1] !== this) {\n        return this;\n      }\n      return this._setPausedState(false, unpauseOptions);\n    },\n    updateContainerElements: function updateContainerElements(containerElements) {\n      var elementsAsArray = [].concat(containerElements).filter(Boolean);\n      state.containers = elementsAsArray.map(function (element) {\n        return typeof element === 'string' ? doc.querySelector(element) : element;\n      });\n      if (config.isolateSubtrees) {\n        collectAdjacentElements(state.containers);\n      }\n      if (state.active) {\n        updateTabbableNodes();\n        if (!state.paused) {\n          trap._setSubtreeIsolation(true);\n        }\n      }\n      updateObservedNodes();\n      return this;\n    }\n  };\n  Object.defineProperties(trap, {\n    _isManuallyPaused: {\n      value: function value() {\n        return state.manuallyPaused;\n      }\n    },\n    _setPausedState: {\n      value: function value(paused, options) {\n        if (state.paused === paused) {\n          return this;\n        }\n        state.paused = paused;\n        if (paused) {\n          var onPause = getOption(options, 'onPause');\n          var onPostPause = getOption(options, 'onPostPause');\n          onPause === null || onPause === void 0 || onPause();\n          removeListeners();\n          trap._setSubtreeIsolation(false);\n          updateObservedNodes();\n          onPostPause === null || onPostPause === void 0 || onPostPause();\n        } else {\n          var onUnpause = getOption(options, 'onUnpause');\n          var onPostUnpause = getOption(options, 'onPostUnpause');\n          onUnpause === null || onUnpause === void 0 || onUnpause();\n          var finishUnpause = /*#__PURE__*/function () {\n            var _ref7 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2() {\n              return _regenerator().w(function (_context2) {\n                while (1) switch (_context2.n) {\n                  case 0:\n                    updateTabbableNodes();\n\n                    // NOTE: wait for initial focus node to get focused before we potentially isolate\n                    //  the subtrees with aria-hidden while focus is still in some other subtree and\n                    //  not yet in the trap, resulting in some browsers (e.g. Chrome) logging to the\n                    //  console that they, \"Blocked aria-hidden on an element because its descendant\n                    //  retained focus...\"\n                    _context2.n = 1;\n                    return addListeners();\n                  case 1:\n                    trap._setSubtreeIsolation(true);\n                    updateObservedNodes();\n                    onPostUnpause === null || onPostUnpause === void 0 || onPostUnpause();\n                  case 2:\n                    return _context2.a(2);\n                }\n              }, _callee2);\n            }));\n            return function finishUnpause() {\n              return _ref7.apply(this, arguments);\n            };\n          }();\n          finishUnpause();\n        }\n        return this;\n      }\n    },\n    _setSubtreeIsolation: {\n      value: function value(isEnabled) {\n        if (config.isolateSubtrees) {\n          state.adjacentElements.forEach(function (el) {\n            var _el$getAttribute;\n            if (isEnabled) {\n              switch (config.isolateSubtrees) {\n                case 'aria-hidden':\n                  // check both attribute and property to ensure initial state is captured\n                  // correctly across different browsers and test environments (like JSDOM)\n                  if (el.ariaHidden === 'true' || ((_el$getAttribute = el.getAttribute('aria-hidden')) === null || _el$getAttribute === void 0 ? void 0 : _el$getAttribute.toLowerCase()) === 'true') {\n                    state.alreadySilent.add(el);\n                  }\n                  el.setAttribute('aria-hidden', 'true');\n                  break;\n                default:\n                  // check both attribute and property to ensure initial state is captured\n                  // correctly across different browsers and test environments (like JSDOM)\n                  if (el.inert || el.hasAttribute('inert')) {\n                    state.alreadySilent.add(el);\n                  }\n                  el.setAttribute('inert', true);\n                  break;\n              }\n            } else {\n              if (state.alreadySilent.has(el)) ; else {\n                switch (config.isolateSubtrees) {\n                  case 'aria-hidden':\n                    el.removeAttribute('aria-hidden');\n                    break;\n                  default:\n                    el.removeAttribute('inert');\n                    break;\n                }\n              }\n            }\n          });\n        }\n      }\n    }\n  });\n\n  // initialize container elements\n  trap.updateContainerElements(elements);\n  return trap;\n};\n\nexport { createFocusTrap };\n//# sourceMappingURL=focus-trap.esm.js.map\n","import type { ReactiveController, ReactiveControllerHost } from \"lit\";\nimport { createFocusTrap, FocusTrap } from \"focus-trap\";\n\n/**\n * Dialog Accessibility Controller\n *\n * Owns the accessibility behaviour every modal dialog needs: focus trap,\n * Escape-to-dismiss, body scroll lock, focus restoration, and hiding the\n * background from assistive technology.\n *\n * Exists as a controller rather than a base class because a single component\n * can host more than one dialog — `customization-modal` renders a trigger\n * button plus two dialogs, so it instantiates this twice. `modal-base` uses a\n * single instance.\n *\n * Usage:\n *   private _a11y = new DialogA11y(this, {\n *     getDialog: () => this.querySelector(\".modal-dialog\"),\n *     onDismiss: () => this.handleCancel(),\n *   });\n *   // then, whenever the open state changes:\n *   this._a11y.setOpen(isOpen);\n */\n\n// ─── Module-level shared state ────────────────────────────────────────────────\n\n/**\n * Ref count of open dialogs. The body scroll lock and the background\n * aria-hidden/inert are shared resources: releasing them on the first close\n * would unlock the page while a second dialog is still open. Only the\n * transition 0 → 1 applies them and 1 → 0 releases them.\n */\nlet openDialogCount = 0;\n\n/** Body overflow value captured before the first dialog locked it. */\nlet previousBodyOverflow: string | null = null;\n\n/**\n * Top-level sections hidden from assistive technology while a dialog is open.\n *\n * `main#MainContent` is deliberately absent: the dialogs are rendered inside it\n * (see `sections/main-product.liquid`), so inerting it would inert the dialog\n * itself. The focus trap plus `aria-modal=\"true\"` covers keyboard containment;\n * portalling the overlay to <body> would be needed to inert main as well.\n */\nconst BACKGROUND_SELECTORS = [\n  \"#shopify-section-announcement-bar\",\n  \"#shopify-section-header\",\n  \"#shopify-section-footer\",\n];\n\nfunction setBackgroundHidden(hide: boolean) {\n  BACKGROUND_SELECTORS.forEach((sel) => {\n    const el = document.querySelector<HTMLElement>(sel);\n    if (!el) return;\n    if (hide) {\n      el.setAttribute(\"aria-hidden\", \"true\");\n      try {\n        el.inert = true;\n      } catch (_) {}\n    } else {\n      el.removeAttribute(\"aria-hidden\");\n      try {\n        el.inert = false;\n      } catch (_) {}\n    }\n  });\n}\n\nfunction acquirePageLock() {\n  if (openDialogCount === 0) {\n    previousBodyOverflow = document.body.style.overflow;\n    document.body.style.overflow = \"hidden\";\n    setBackgroundHidden(true);\n  }\n  openDialogCount++;\n}\n\nfunction releasePageLock() {\n  openDialogCount = Math.max(0, openDialogCount - 1);\n  if (openDialogCount === 0) {\n    document.body.style.overflow = previousBodyOverflow ?? \"\";\n    previousBodyOverflow = null;\n    setBackgroundHidden(false);\n  }\n}\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface DialogA11yOptions {\n  /** Returns the element carrying `role=\"dialog\"` — the focus trap container. */\n  getDialog: () => HTMLElement | null;\n\n  /**\n   * Called when the *user* dismisses the dialog (Escape). Not called when the\n   * dialog is closed programmatically via `setOpen(false)`.\n   */\n  onDismiss: () => void;\n\n  /**\n   * Allow clicks outside the dialog to pass through to the page. Read lazily at\n   * trap-activation time, since hosts may set it from an attribute or in a\n   * subclass constructor, after this controller is constructed.\n   */\n  allowOutsideClick?: () => boolean;\n\n  /**\n   * Preferred element to return focus to on close. Falls back to whatever was\n   * focused when the dialog opened.\n   */\n  getReturnFocus?: () => HTMLElement | null;\n}\n\n// ─── Controller ───────────────────────────────────────────────────────────────\n\nexport class DialogA11y implements ReactiveController {\n  private _host: ReactiveControllerHost;\n  private _options: DialogA11yOptions;\n\n  private _isOpen = false;\n  private _focusTrap: FocusTrap | null = null;\n  private _previouslyFocused: HTMLElement | null = null;\n\n  /**\n   * True while we are tearing the trap down ourselves. focus-trap fires\n   * `onDeactivate` for *every* deactivation, including programmatic ones, so\n   * without this guard a normal close would also report a user dismissal and\n   * trigger a spurious cancel.\n   */\n  private _deactivating = false;\n\n  constructor(host: ReactiveControllerHost, options: DialogA11yOptions) {\n    this._host = host;\n    this._options = options;\n    host.addController(this);\n  }\n\n  hostDisconnected() {\n    // Leaving the DOM while open must still release the shared page lock.\n    if (this._isOpen) {\n      this._isOpen = false;\n      this._teardownTrap();\n      releasePageLock();\n    }\n  }\n\n  /** Whether the dialog is currently open, as far as this controller knows. */\n  get isOpen() {\n    return this._isOpen;\n  }\n\n  /**\n   * Drive the controller from the host's open state. Safe to call on every\n   * render — transitions are deduplicated internally.\n   */\n  setOpen(open: boolean) {\n    if (open === this._isOpen) return;\n    this._isOpen = open;\n\n    if (open) {\n      this._onOpen();\n    } else {\n      this._onClose();\n    }\n  }\n\n  // ─── Open / close ───────────────────────────────────────────────────────────\n\n  private _onOpen() {\n    this._previouslyFocused = document.activeElement as HTMLElement | null;\n    acquirePageLock();\n\n    // The dialog is rendered by the host, so wait for that render to land\n    // before looking for the trap container.\n    this._host.updateComplete.then(() => {\n      // Guard against a close that raced the render.\n      if (!this._isOpen) return;\n      this._activateTrap();\n    });\n  }\n\n  private _onClose() {\n    this._teardownTrap();\n    releasePageLock();\n    this._restoreFocus();\n  }\n\n  private _restoreFocus() {\n    const target =\n      this._options.getReturnFocus?.() ?? this._previouslyFocused ?? null;\n    this._previouslyFocused = null;\n\n    if (!target || typeof target.focus !== \"function\") return;\n\n    // In a modal chain (confirmation → customization) one dialog closes and the\n    // next opens in the same tick. Restoring focus to the trigger in between\n    // makes focus visibly bounce out of the flow, so defer the restore and skip\n    // it if another dialog has taken over by then.\n    requestAnimationFrame(() => {\n      if (openDialogCount > 0) return;\n      if (!target.isConnected) return;\n      target.focus();\n    });\n  }\n\n  // ─── Focus trap ─────────────────────────────────────────────────────────────\n\n  private _activateTrap() {\n    const dialog = this._options.getDialog();\n    if (!dialog) {\n      console.warn(\"[dialog-a11y] No dialog element found for focus trap\");\n      return;\n    }\n\n    try {\n      this._focusTrap = createFocusTrap(dialog, {\n        initialFocus: () => {\n          // Prefer the primary form field so keyboard users can start typing\n          // immediately; fall back to the first interactive element.\n          const firstInput = dialog.querySelector<HTMLElement>(\n            \"input:not([type='hidden']), textarea, select\"\n          );\n          if (firstInput) return firstInput;\n\n          const firstFocusable = dialog.querySelector<HTMLElement>(\n            'button, [href], [tabindex]:not([tabindex=\"-1\"])'\n          );\n          return firstFocusable || dialog;\n        },\n        escapeDeactivates: true,\n        allowOutsideClick: this._options.allowOutsideClick ?? true,\n        // Focus restoration is handled in `_onClose` so it behaves the same for\n        // every dismissal route (Escape, close button, overlay click).\n        returnFocusOnDeactivate: false,\n        onDeactivate: () => {\n          if (this._deactivating) return;\n          // Not a programmatic teardown, so the user pressed Escape.\n          this._options.onDismiss();\n        },\n      });\n\n      this._focusTrap.activate();\n    } catch (error) {\n      console.error(\"[dialog-a11y] Error creating focus trap:\", error);\n    }\n  }\n\n  private _teardownTrap() {\n    if (!this._focusTrap) return;\n    this._deactivating = true;\n    try {\n      this._focusTrap.deactivate();\n    } finally {\n      this._deactivating = false;\n      this._focusTrap = null;\n    }\n  }\n}\n\n/**\n * Whether the user has asked for reduced motion. Dialogs use this to skip their\n * close animation so dismissal and focus return are immediate.\n */\nexport function prefersReducedMotion(): boolean {\n  return window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches ?? false;\n}\n","import { LitElement, html } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { effect } from \"@preact/signals-core\";\nimport { DialogA11y } from \"../controllers/dialog-a11y\";\nimport {\n  activeModal,\n  approveModal,\n  cancelModal,\n  modalContext,\n} from \"../store/modal-store\";\n\n/**\n * Base modal component with accessibility features.\n * All modals should extend this class for consistent behavior.\n *\n * Features:\n * - Light DOM (Tailwind styles work directly)\n * - Click outside to close (optional)\n * - Focus trap, Escape to close, scroll lock and focus restoration, all\n *   delegated to the shared `DialogA11y` controller\n *\n * Usage:\n * 1. Extend this class\n * 2. Set the `name` property to match your modal registration\n * 3. Override `render()` to provide custom content, keeping a `.modal-dialog`\n *    element (or overriding `dialogSelector`) so the focus trap finds it\n * 4. Call `handleApprove()` or `handleCancel()` from your buttons\n */\n@customElement(\"modal-base\")\nexport class ModalBase extends LitElement {\n  /** Modal name (must match registration in modal-store) */\n  @property() name = \"\";\n\n  /** Allow closing by clicking outside the modal */\n  @property({ type: Boolean }) allowOutsideClick = true;\n\n  /** Show close button in header */\n  @property({ type: Boolean }) showCloseButton = true;\n\n  /**\n   * Accessible name for the dialog, used by the fallback `render()` below.\n   * Subclasses that render their own markup normally supply a visible heading\n   * and point `aria-labelledby` at it instead.\n   */\n  @property() label = \"Dialog\";\n\n  @state() protected _isOpen = false;\n\n  /**\n   * Selector for the element carrying `role=\"dialog\"` — the focus trap\n   * container. Subclasses that render a different structure can override it.\n   */\n  protected dialogSelector = \".modal-dialog\";\n\n  /** Focus trap, Escape handling, scroll lock and focus restoration. */\n  protected _a11y = new DialogA11y(this, {\n    getDialog: () => this.querySelector<HTMLElement>(this.dialogSelector),\n    onDismiss: () => this.handleCancel(),\n    allowOutsideClick: () => this.allowOutsideClick,\n    getReturnFocus: () => modalContext.value?.triggerButton ?? null,\n  });\n\n  constructor() {\n    super();\n\n    // Subscribe to activeModal signal\n    effect(() => {\n      const shouldBeOpen = activeModal.value === this.name;\n\n      if (shouldBeOpen !== this._isOpen) {\n        this._isOpen = shouldBeOpen;\n        this._a11y.setOpen(this._isOpen);\n      }\n    });\n  }\n\n  // Light DOM — no shadow root (allows Tailwind to work)\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this;\n  }\n\n  // ─── Event Handlers ───────────────────────────────────────────────────────\n\n  private _handleOverlayClick(e: Event) {\n    if (!this.allowOutsideClick) return;\n\n    // Only close if clicking the overlay itself, not child elements\n    if (e.target === e.currentTarget) {\n      this.handleCancel();\n    }\n  }\n\n  // ─── Public Actions ───────────────────────────────────────────────────────\n\n  /**\n   * Approve/confirm the modal.\n   * Override this method to add custom validation before approval.\n   */\n  protected handleApprove() {\n    approveModal();\n  }\n\n  /**\n   * Cancel/close the modal.\n   * Override this method to add custom cleanup on cancel.\n   */\n  protected handleCancel() {\n    cancelModal();\n  }\n\n  // ─── Render ───────────────────────────────────────────────────────────────\n\n  render() {\n    if (!this._isOpen) return html``;\n\n    return html`\n      <div\n        class=\"modal-overlay fixed inset-0 bg-black/50 z-50 flex items-center justify-center p-4\"\n        @click=${this._handleOverlayClick}\n      >\n        <div\n          class=\"modal-dialog bg-white rounded-lg shadow-xl max-w-lg w-full max-h-[90vh] overflow-y-auto relative\"\n          @click=${(e: Event) => e.stopPropagation()}\n          role=\"dialog\"\n          aria-modal=\"true\"\n          aria-label=${this.label}\n        >\n          ${this.showCloseButton\n            ? html`\n                <button\n                  class=\"modal-close absolute top-4 right-4 text-gray-500 hover:text-gray-700 text-2xl leading-none w-8 h-8 flex items-center justify-center\"\n                  @click=${this.handleCancel}\n                  aria-label=\"Close modal\"\n                  type=\"button\"\n                >\n                  <span aria-hidden=\"true\">×</span>\n                </button>\n              `\n            : \"\"}\n\n          <div class=\"modal-content p-6\"></div>\n        </div>\n      </div>\n    `;\n  }\n}\n","import { LitElement, html } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\nimport { effect } from \"@preact/signals-core\";\nimport { ModalBase } from \"./modal-base\";\nimport { registerModal } from \"../store/modal-store\";\nimport {\n  hasExpired,\n  getFormattedCutoffDate,\n  giftCardUrl,\n} from \"../store/holiday-store\";\nimport { productData } from \"../store/product-store\";\n\n/**\n * Holiday Shipping Warning Modal\n *\n * Shows when users try to add to cart after the holiday shipping cutoff date.\n * Offers two options:\n * 1. Continue with order (may not arrive in time)\n * 2. Purchase a gift card instead (instant delivery)\n *\n * Reads state from holiday-store signals.\n *\n * Usage in Liquid:\n * <holiday-shipping-modal></holiday-shipping-modal>\n */\n@customElement(\"holiday-shipping-modal\")\nexport class HolidayShippingModal extends ModalBase {\n  @state() private _hasExpired = false;\n  @state() private _cutoffDate: string | null = null;\n  @state() private _giftCardUrl = \"/products/gift-card\";\n\n  constructor() {\n    super();\n    this.name = \"holiday-shipping\";\n    this.allowOutsideClick = false; // Force user to make a choice\n\n    // Subscribe to holiday store signals\n    effect(() => {\n      this._hasExpired = hasExpired.value;\n      this._cutoffDate = getFormattedCutoffDate();\n      this._giftCardUrl = giftCardUrl.value;\n    });\n\n    // Register with modal orchestrator\n    registerModal({\n      name: \"holiday-shipping\",\n      priority: 10, // Low priority (show first if needed)\n      shouldShow: (context) => {\n        // The cutoff date lives in the main product's store (set only by\n        // product-provider), so this modal must only fire for the main product\n        // CTA. Collection cards (e.g. recommended products) share this modal\n        // chain but have no holiday data of their own — otherwise the main\n        // product's cutoff would warn when adding an unrelated card to the cart.\n        if (\n          context.productId === undefined ||\n          context.productId !== productData.value?.id\n        ) {\n          return false;\n        }\n\n        // Only show if past cutoff date\n        if (!hasExpired.value) return false;\n\n        // Don't show if button is disabled\n        if (context.triggerButton?.disabled) return false;\n\n        return true;\n      },\n      onApprove: (context) => {\n        console.log(\"[holiday-shipping] User acknowledged warning, continuing\");\n      },\n      onCancel: (context) => {\n        console.log(\"[holiday-shipping] User cancelled add-to-cart\");\n      },\n    });\n  }\n\n  private _handleGiftCard() {\n    // Redirect to gift card product page\n    window.location.href = this._giftCardUrl;\n  }\n\n  render() {\n    if (!this._isOpen) return html``;\n\n    return html`\n      <div\n        class=\"modal-overlay fixed inset-0 bg-black/60 z-50 flex items-center justify-center p-4\"\n        role=\"dialog\"\n        aria-modal=\"true\"\n        aria-labelledby=\"holiday-shipping-title\"\n      >\n        <div\n          class=\"modal-dialog bg-white rounded-lg shadow-xl max-w-md w-full p-6\"\n          @click=${(e: Event) => e.stopPropagation()}\n        >\n          <div class=\"text-center mb-4\">\n            <div class=\"inline-block p-3 bg-yellow-100 rounded-full mb-3\">\n              <svg\n                class=\"w-8 h-8 text-yellow-600\"\n                fill=\"none\"\n                stroke=\"currentColor\"\n                viewBox=\"0 0 24 24\"\n              >\n                <path\n                  stroke-linecap=\"round\"\n                  stroke-linejoin=\"round\"\n                  stroke-width=\"2\"\n                  d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\"\n                />\n              </svg>\n            </div>\n            <h2 id=\"holiday-shipping-title\" class=\"text-xl font-bold text-gray-900 mb-2\">\n              Holiday Shipping Deadline Passed\n            </h2>\n          </div>\n\n          <div class=\"text-center mb-6\">\n            <p class=\"text-sm text-gray-600 mb-3\">\n              The holiday shipping deadline was\n              <strong>${this._cutoffDate}</strong>.\n            </p>\n            <p class=\"text-sm text-gray-700 mb-4\">\n              Orders placed now may not arrive before the holidays.\n            </p>\n            <p class=\"text-sm text-blue-600 font-medium\">\n              Consider purchasing a gift card for instant delivery!\n            </p>\n          </div>\n\n          <div class=\"flex flex-col gap-3\">\n            <button\n              class=\"btn-gift-card w-full px-4 py-3 bg-green-600 text-white rounded-lg font-medium hover:bg-green-700 transition-colors flex items-center justify-center gap-2\"\n              @click=${this._handleGiftCard}\n              type=\"button\"\n            >\n              <svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n              </svg>\n              Purchase a Gift Card\n            </button>\n            <button\n              class=\"btn-primary w-full px-4 py-3 bg-blue-600 text-white rounded-lg font-medium hover:bg-blue-700 transition-colors\"\n              @click=${this.handleApprove}\n              type=\"button\"\n            >\n              Continue with Order Anyway\n            </button>\n            <button\n              class=\"btn-secondary w-full px-4 py-3 border border-gray-300 text-gray-700 rounded-lg font-medium hover:bg-gray-50 transition-colors\"\n              @click=${this.handleCancel}\n              type=\"button\"\n            >\n              Cancel\n            </button>\n          </div>\n        </div>\n      </div>\n    `;\n  }\n}\n","import { LitElement, html } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { effect } from \"@preact/signals-core\";\nimport { ModalBase } from \"./modal-base\";\nimport { registerModal, modalContext } from \"../store/modal-store\";\nimport { productData } from \"../store/product-store\";\n\n/**\n * Confirm Custom Text Modal\n *\n * Shows a confirmation dialog when adding a product with custom text/personalization.\n * Validates that all mandatory fields are filled in and displays a preview.\n *\n * Usage in Liquid:\n * <confirm-custom-text-modal\n *   data-na-text=\"N/A\"\n *   data-mandatory-message=\"Please fill in all required customization fields.\"\n * ></confirm-custom-text-modal>\n */\n@customElement(\"confirm-custom-text-modal\")\nexport class ConfirmCustomTextModal extends ModalBase {\n  @property({ attribute: \"data-na-text\" }) naText = \"N/A\";\n  @property({ attribute: \"data-mandatory-message\" }) mandatoryMessage =\n    \"Please fill in all required customization fields before adding to cart.\";\n\n  @state() private _customizationData: Record<string, string> = {};\n  @state() private _hasInvalidFields = false;\n  @state() private _missingFields: string[] = [];\n\n  constructor() {\n    super();\n    this.name = \"confirm-custom-text\";\n    this.allowOutsideClick = false; // Force user to make a choice\n\n    // Register with modal orchestrator\n    registerModal({\n      name: \"confirm-custom-text\",\n      priority: 20, // After holiday shipping warning (priority 10)\n      shouldShow: (context) => {\n        // The <custom-text> elements only exist on the main product page, so this\n        // modal must only fire for the main product CTA. Collection cards (e.g.\n        // recommended products) share this modal chain — without this guard the\n        // main product's custom text would be confirmed and injected into an\n        // unrelated card's cart line item via onApprove.\n        if (\n          context.productId === undefined ||\n          context.productId !== productData.value?.id\n        ) {\n          return false;\n        }\n\n        // Check if product has custom text elements\n        const customTextElements = document.querySelectorAll(\"custom-text\");\n        if (customTextElements.length === 0) return false;\n\n        // Validate custom text inputs\n        const validation = this._validateCustomText();\n        this._hasInvalidFields = validation.hasInvalid;\n        this._missingFields = validation.missingFields;\n        this._customizationData = validation.data;\n\n        // Show modal if there are custom fields (either to confirm or to warn about missing)\n        return true;\n      },\n      onApprove: (context) => {\n        // Add customization to context\n        if (!context.customization) {\n          context.customization = {};\n        }\n        Object.assign(context.customization, this._customizationData);\n        console.log(\n          \"[confirm-custom-text] Approved with customization:\",\n          this._customizationData\n        );\n      },\n      onCancel: (context) => {\n        console.log(\"[confirm-custom-text] User cancelled\");\n      },\n    });\n\n    // Subscribe to modal context for reactivity\n    effect(() => {\n      if (modalContext.value && this._isOpen) {\n        // Re-validate when modal opens\n        const validation = this._validateCustomText();\n        this._hasInvalidFields = validation.hasInvalid;\n        this._missingFields = validation.missingFields;\n        this._customizationData = validation.data;\n      }\n    });\n  }\n\n  /**\n   * Validate custom text inputs and return validation result\n   */\n  private _validateCustomText(): {\n    hasInvalid: boolean;\n    missingFields: string[];\n    data: Record<string, string>;\n  } {\n    const customTextElements = document.querySelectorAll(\"custom-text\");\n    const data: Record<string, string> = {};\n    const missingFields: string[] = [];\n\n    customTextElements.forEach((element) => {\n      const label =\n        element.getAttribute(\"data-label\") ||\n        element.querySelector(\"label\")?.textContent?.trim() ||\n        \"Custom Text\";\n      const isMandatory = element.hasAttribute(\"data-mandatory\");\n      const input = element.querySelector(\"input, textarea\") as\n        | HTMLInputElement\n        | HTMLTextAreaElement\n        | null;\n\n      if (input) {\n        const value = input.value.trim();\n        data[label] = value;\n\n        if (isMandatory && !value) {\n          missingFields.push(label);\n        }\n      }\n    });\n\n    return {\n      hasInvalid: missingFields.length > 0,\n      missingFields,\n      data,\n    };\n  }\n\n  protected override handleApprove() {\n    // Only allow approval if all mandatory fields are filled\n    if (this._hasInvalidFields) {\n      console.warn(\n        \"[confirm-custom-text] Cannot approve: missing mandatory fields\"\n      );\n      return;\n    }\n    super.handleApprove();\n  }\n\n  render() {\n    if (!this._isOpen) return html``;\n\n    const hasCustomization = Object.keys(this._customizationData).length > 0;\n\n    return html`\n      <div\n        class=\"modal-overlay fixed inset-0 bg-black/60 z-50 flex items-center justify-center p-4\"\n        role=\"dialog\"\n        aria-modal=\"true\"\n        aria-labelledby=\"confirm-custom-text-title\"\n      >\n        <div\n          class=\"modal-dialog bg-white rounded-lg shadow-xl max-w-lg w-full max-h-[80vh] overflow-y-auto\"\n          @click=${(e: Event) => e.stopPropagation()}\n        >\n          <div class=\"p-6\">\n            <h2\n              id=\"confirm-custom-text-title\"\n              class=\"text-xl font-bold text-gray-900 mb-4\"\n            >\n              Confirm Your Customization\n            </h2>\n\n            ${this._hasInvalidFields\n              ? html`\n                  <div\n                    class=\"bg-red-50 border border-red-200 rounded-lg p-4 mb-4\"\n                  >\n                    <div class=\"flex items-start\">\n                      <svg\n                        class=\"w-5 h-5 text-red-600 mt-0.5 mr-3 flex-shrink-0\"\n                        fill=\"currentColor\"\n                        viewBox=\"0 0 20 20\"\n                      >\n                        <path\n                          fill-rule=\"evenodd\"\n                          d=\"M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z\"\n                          clip-rule=\"evenodd\"\n                        />\n                      </svg>\n                      <div class=\"flex-1\">\n                        <h3 class=\"text-sm font-medium text-red-800 mb-1\">\n                          Missing Required Fields\n                        </h3>\n                        <p class=\"text-sm text-red-700 mb-2\">\n                          ${this.mandatoryMessage}\n                        </p>\n                        <ul class=\"list-disc list-inside text-sm text-red-700\">\n                          ${this._missingFields.map(\n                            (field) => html`<li>${field}</li>`\n                          )}\n                        </ul>\n                      </div>\n                    </div>\n                  </div>\n                `\n              : \"\"}\n\n            <div class=\"space-y-3 mb-6\">\n              ${hasCustomization\n                ? Object.entries(this._customizationData).map(\n                    ([label, value]) => html`\n                      <div\n                        class=\"border-b border-gray-200 pb-2 last:border-b-0\"\n                      >\n                        <div class=\"text-sm font-medium text-gray-700 mb-1\">\n                          ${label}\n                        </div>\n                        <div class=\"text-sm text-gray-900\">\n                          ${value || html`<span class=\"text-gray-400\">${this.naText}</span>`}\n                        </div>\n                      </div>\n                    `\n                  )\n                : html`\n                    <p class=\"text-sm text-gray-600\">\n                      No customization fields found.\n                    </p>\n                  `}\n            </div>\n\n            <div class=\"flex flex-col gap-3\">\n              ${this._hasInvalidFields\n                ? html`\n                    <button\n                      class=\"btn-secondary w-full px-4 py-3 border border-gray-300 text-gray-700 rounded-lg font-medium hover:bg-gray-50 transition-colors\"\n                      @click=${this.handleCancel}\n                      type=\"button\"\n                    >\n                      Go Back and Edit\n                    </button>\n                  `\n                : html`\n                    <button\n                      class=\"btn-primary w-full px-4 py-3 bg-blue-600 text-white rounded-lg font-medium hover:bg-blue-700 transition-colors\"\n                      @click=${this.handleApprove}\n                      type=\"button\"\n                    >\n                      Confirm and Add to Cart\n                    </button>\n                    <button\n                      class=\"btn-secondary w-full px-4 py-3 border border-gray-300 text-gray-700 rounded-lg font-medium hover:bg-gray-50 transition-colors\"\n                      @click=${this.handleCancel}\n                      type=\"button\"\n                    >\n                      Edit Customization\n                    </button>\n                  `}\n            </div>\n          </div>\n        </div>\n      </div>\n    `;\n  }\n}\n","import { LitElement, html } from \"lit\";\nimport { customElement, property, state } from \"lit/decorators.js\";\nimport { effect } from \"@preact/signals-core\";\nimport {\n  isHolidayShippingEnabled,\n  hasExpired,\n  timeRemaining,\n  getFormattedCutoffDate,\n} from \"../store/holiday-store\";\n\n/**\n * Holiday Shipping Countdown Component\n *\n * Displays a countdown timer until the holiday shipping cutoff date.\n * After expiration, shows a notice that holiday shipping is not guaranteed.\n *\n * Features:\n * - Reactive to holiday-store signals\n * - Countdown: days, hours, minutes\n * - Expired notice with icon\n * - Info button to open modal with shipping details\n * - Fully styled with Tailwind\n *\n * Usage in Liquid:\n * <holiday-shipping-countdown\n *   data-info-text=\"Orders placed by {date} will arrive before the holidays.\"\n *   data-expired-text=\"Orders placed now may not arrive before the holidays.\"\n * ></holiday-shipping-countdown>\n */\n@customElement(\"holiday-shipping-countdown\")\nexport class HolidayShippingCountdown extends LitElement {\n  @property({ attribute: \"data-info-text\" }) infoText =\n    \"Orders placed by {date} will arrive before the holidays.\";\n  @property({ attribute: \"data-expired-text\" }) expiredText =\n    \"Orders placed now may not arrive before the holidays. Consider purchasing a gift card.\";\n\n  @state() private _isEnabled = false;\n  @state() private _hasExpired = false;\n  @state() private _timeRemaining: { days: number; hours: number; minutes: number } | null = null;\n  @state() private _showInfoModal = false;\n  @state() private _showExpiredModal = false;\n\n  constructor() {\n    super();\n\n    // Subscribe to holiday store signals\n    effect(() => {\n      this._isEnabled = isHolidayShippingEnabled.value;\n      this._hasExpired = hasExpired.value;\n      this._timeRemaining = timeRemaining.value;\n    });\n  }\n\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this; // Light DOM for Tailwind\n  }\n\n  private _openInfoModal() {\n    this._showInfoModal = true;\n  }\n\n  private _closeInfoModal() {\n    this._showInfoModal = false;\n  }\n\n  private _openExpiredModal() {\n    this._showExpiredModal = true;\n  }\n\n  private _closeExpiredModal() {\n    this._showExpiredModal = false;\n  }\n\n  private _renderCountdown() {\n    const time = this._timeRemaining;\n    if (!time) return html``;\n\n    return html`\n      <div class=\"holiday-shipping-countdown bg-[#FFEBD3] py-3 px-4 rounded-lg mb-4\">\n        <div class=\"flex items-center gap-3\">\n          <!-- Gift Icon -->\n          <div class=\"flex-shrink-0\">\n            <svg class=\"w-8 h-8 text-[#913200]\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n              <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 8v13m0-13V6a2 2 0 112 2h-2zm0 0V5.5A2.5 2.5 0 109.5 8H12zm-7 4h14M5 12a2 2 0 110-4h14a2 2 0 110 4M5 12v7a2 2 0 002 2h10a2 2 0 002-2v-7\" />\n            </svg>\n          </div>\n\n          <!-- Countdown Content -->\n          <div class=\"flex-1\">\n            <div class=\"text-sm font-bold text-[#913200] mb-1\">\n              Order by ${getFormattedCutoffDate()} for holiday shipping!\n            </div>\n            <div class=\"flex items-center gap-4 text-xs text-[#913200]\">\n              ${time.days > 0 ? html`<div class=\"font-medium\">${time.days} <span class=\"font-normal\">day${time.days !== 1 ? \"s\" : \"\"}</span></div>` : \"\"}\n              ${time.hours > 0 ? html`<div class=\"font-medium\">${time.hours} <span class=\"font-normal\">hour${time.hours !== 1 ? \"s\" : \"\"}</span></div>` : \"\"}\n              <div class=\"font-medium\">${time.minutes} <span class=\"font-normal\">minute${time.minutes !== 1 ? \"s\" : \"\"}</span></div>\n            </div>\n          </div>\n\n          <!-- Info Button -->\n          <button\n            @click=${this._openInfoModal}\n            class=\"flex-shrink-0 text-[#913200] hover:text-[#7a2a00] transition-colors\"\n            aria-label=\"Holiday shipping information\"\n            type=\"button\"\n          >\n            <svg class=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n              <path fill-rule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\" clip-rule=\"evenodd\" />\n            </svg>\n          </button>\n        </div>\n\n        <!-- Info Modal -->\n        ${this._showInfoModal ? this._renderInfoModal() : \"\"}\n      </div>\n    `;\n  }\n\n  private _renderExpiredNotice() {\n    return html`\n      <div class=\"holiday-shipping-expired bg-red-50 border border-red-200 py-3 px-4 rounded-lg mb-4\">\n        <div class=\"flex items-center gap-3\">\n          <!-- Warning Icon -->\n          <div class=\"flex-shrink-0\">\n            <svg class=\"w-8 h-8 text-red-600\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n              <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z\" />\n            </svg>\n          </div>\n\n          <!-- Content -->\n          <div class=\"flex-1\">\n            <div class=\"text-sm font-bold text-red-800 mb-1\">\n              Holiday Shipping Deadline Passed\n            </div>\n            <div class=\"text-xs text-red-700\">\n              Orders may not arrive before the holidays.\n            </div>\n          </div>\n\n          <!-- Info Button -->\n          <button\n            @click=${this._openExpiredModal}\n            class=\"flex-shrink-0 text-red-600 hover:text-red-800 transition-colors\"\n            aria-label=\"More information\"\n            type=\"button\"\n          >\n            <svg class=\"w-5 h-5\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n              <path fill-rule=\"evenodd\" d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z\" clip-rule=\"evenodd\" />\n            </svg>\n          </button>\n        </div>\n\n        <!-- Expired Info Modal -->\n        ${this._showExpiredModal ? this._renderExpiredInfoModal() : \"\"}\n      </div>\n    `;\n  }\n\n  private _renderInfoModal() {\n    return html`\n      <div\n        class=\"fixed inset-0 bg-black/50 z-50 flex items-center justify-center p-4\"\n        @click=${this._closeInfoModal}\n      >\n        <div\n          class=\"bg-white rounded-lg shadow-xl max-w-md w-full p-6\"\n          @click=${(e: Event) => e.stopPropagation()}\n          role=\"dialog\"\n          aria-modal=\"true\"\n        >\n          <div class=\"flex items-start justify-between mb-4\">\n            <h2 class=\"text-lg font-bold text-gray-900\">Holiday Shipping Information</h2>\n            <button\n              @click=${this._closeInfoModal}\n              class=\"text-gray-400 hover:text-gray-600\"\n              aria-label=\"Close\"\n              type=\"button\"\n            >\n              <svg class=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n              </svg>\n            </button>\n          </div>\n\n          <div class=\"text-sm text-gray-700 mb-4\">\n            ${this.infoText.replace(\"{date}\", getFormattedCutoffDate() || \"\")}\n          </div>\n\n          <div class=\"text-xs text-gray-500 mb-6\">\n            <p class=\"mb-2\">Please note:</p>\n            <ul class=\"list-disc list-inside space-y-1\">\n              <li>Shipping times may vary by location</li>\n              <li>Carrier delays may occur during holidays</li>\n              <li>Order early to ensure delivery</li>\n            </ul>\n          </div>\n\n          <button\n            @click=${this._closeInfoModal}\n            class=\"w-full px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors\"\n            type=\"button\"\n          >\n            Got It\n          </button>\n        </div>\n      </div>\n    `;\n  }\n\n  private _renderExpiredInfoModal() {\n    return html`\n      <div\n        class=\"fixed inset-0 bg-black/50 z-50 flex items-center justify-center p-4\"\n        @click=${this._closeExpiredModal}\n      >\n        <div\n          class=\"bg-white rounded-lg shadow-xl max-w-md w-full p-6\"\n          @click=${(e: Event) => e.stopPropagation()}\n          role=\"dialog\"\n          aria-modal=\"true\"\n        >\n          <div class=\"flex items-start justify-between mb-4\">\n            <h2 class=\"text-lg font-bold text-gray-900\">Holiday Shipping Deadline Passed</h2>\n            <button\n              @click=${this._closeExpiredModal}\n              class=\"text-gray-400 hover:text-gray-600\"\n              aria-label=\"Close\"\n              type=\"button\"\n            >\n              <svg class=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n                <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M6 18L18 6M6 6l12 12\" />\n              </svg>\n            </button>\n          </div>\n\n          <div class=\"text-sm text-gray-700 mb-4\">\n            ${this.expiredText}\n          </div>\n\n          <div class=\"text-xs text-gray-500 mb-6\">\n            <p class=\"mb-2\">Alternative options:</p>\n            <ul class=\"list-disc list-inside space-y-1\">\n              <li>Purchase a gift card for instant delivery</li>\n              <li>Consider digital gift options</li>\n              <li>Standard shipping still available</li>\n            </ul>\n          </div>\n\n          <button\n            @click=${this._closeExpiredModal}\n            class=\"w-full px-4 py-2 bg-gray-600 text-white rounded-lg hover:bg-gray-700 transition-colors\"\n            type=\"button\"\n          >\n            Close\n          </button>\n        </div>\n      </div>\n    `;\n  }\n\n  render() {\n    // Don't render if feature is disabled\n    if (!this._isEnabled) {\n      return html``;\n    }\n\n    // Don't render if no cutoff date set\n    if (!this._timeRemaining && !this._hasExpired) {\n      return html``;\n    }\n\n    return this._hasExpired ? this._renderExpiredNotice() : this._renderCountdown();\n  }\n}\n","import { LitElement, html, nothing } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\nimport { effect } from \"@preact/signals-core\";\nimport {\n  isCustomizationModalOpen,\n  isConfirmationModalOpen,\n  closeCustomizationModal,\n  closeConfirmationModal,\n  openCustomizationModal,\n  resetCustomization,\n  userWantsToCustomize,\n  config,\n  isCustomTextValid,\n  customText,\n  previewImageUrl,\n  isLoadingPreview,\n  shouldShowCustomizeButton,\n  getCustomSkuShipsBy,\n} from \"../store/customization-store\";\nimport { productData, selectedVariant, selectedQuantity, isAvailable } from \"../store/product-store\";\nimport { isExtendedOfferEnabled } from \"../store/extended-offer-store\";\nimport {\n  registerModal,\n  startModalChain,\n  activeModal,\n  approveModal,\n  cancelModal,\n  modalContext,\n  type ModalContext,\n} from \"../store/modal-store\";\nimport { DialogA11y, prefersReducedMotion } from \"../controllers/dialog-a11y\";\n\n/**\n * Customization Modal Component\n *\n * Wrapper component that manages product customization modals.\n * Only renders when product has \"customizable\" tag.\n *\n * Features:\n * - Confirmation modal (asks if user wants to customize)\n * - Customization modal (text input + live preview)\n * - Integrates with modal orchestrator\n * - Sub-components for text inputs\n *\n * Usage in Liquid:\n * <customization-modal\n *   data-custom-sku-variant-id=\"12345\"\n *   data-preview-url=\"https://...\"\n *   data-is-mandatory=\"true\"\n * ></customization-modal>\n */\nconst FADE_DURATION_MS = 300;\n\n@customElement(\"customization-modal\")\nexport class CustomizationModal extends LitElement {\n  @state() private _isCustomizationOpen = false;\n  @state() private _isConfirmationOpen = false;\n  @state() private _showCustomizeButton = false;\n  @state() private _isExtendedOffer = false;\n  @state() private _isTextValid = false;\n  @state() private _previewUrl: string | null = null;\n  @state() private _isLoadingPreview = false;\n  @state() private _productTitle = \"\";\n  @state() private _variantTitle = \"\";\n  @state() private _isClosing = false;\n  @state() private _isAnimatedIn = false;\n  @state() private _isDisclaimerOpen = false;\n  private _closeTimeoutId: number | null = null;\n\n  /**\n   * This component hosts two dialogs, so it needs two independent focus traps —\n   * which is why it uses the DialogA11y controller directly instead of\n   * extending ModalBase (which is bound to a single modal name).\n   */\n  private _confirmationA11y = new DialogA11y(this, {\n    getDialog: () => this.querySelector<HTMLElement>(\".confirmation-dialog\"),\n    onDismiss: () => this._handleCloseConfirmation(),\n    getReturnFocus: () => modalContext.value?.triggerButton ?? null,\n  });\n\n  private _customizationA11y = new DialogA11y(this, {\n    getDialog: () => this.querySelector<HTMLElement>(\".customization-dialog\"),\n    onDismiss: () => this._handleCancelCustomization(),\n    getReturnFocus: () => modalContext.value?.triggerButton ?? null,\n  });\n\n  constructor() {\n    super();\n\n    // Watch activeModal signal — open the right modal when this component is\n    // activated by the modal-store chain.\n    effect(() => {\n      const active = activeModal.value;\n      if (active === \"custom-text-customization\") {\n        openCustomizationModal();\n      } else if (active === \"custom-text-confirmation\") {\n        isConfirmationModalOpen.value = true;\n      }\n    });\n\n    // Subscribe to store\n    effect(() => {\n      this._isCustomizationOpen = isCustomizationModalOpen.value;\n      this._isConfirmationOpen = isConfirmationModalOpen.value;\n      this._showCustomizeButton = shouldShowCustomizeButton.value;\n      // Sold-out (extended-offer) variants can't be added to cart, so personalizing\n      // them is pointless — grey out and disable the \"Personalize it\" button.\n      this._isExtendedOffer = !isAvailable.value && Boolean(isExtendedOfferEnabled.value);\n      this._isTextValid = isCustomTextValid.value;\n      this._previewUrl = previewImageUrl.value;\n      this._isLoadingPreview = isLoadingPreview.value;\n      this._productTitle = productData.value?.title || \"\";\n      this._variantTitle = selectedVariant.value?.title || \"\";\n\n      if (!this._isCustomizationOpen) {\n        this._isAnimatedIn = false;\n        this._isDisclaimerOpen = false;\n      }\n\n      // Focus trap, Escape, scroll lock and focus restoration for each dialog.\n      this._confirmationA11y.setOpen(this._isConfirmationOpen);\n      this._customizationA11y.setOpen(this._isCustomizationOpen);\n\n      this.requestUpdate();\n    });\n  }\n\n\n  connectedCallback() {\n    super.connectedCallback();\n\n    // Read configuration from attributes\n    const customSkuVariantId = this.getAttribute(\"data-custom-sku-variant-id\");\n    const previewUrl = this.getAttribute(\"data-preview-url\");\n    const isMandatory = this.getAttribute(\"data-is-mandatory\") === \"true\";\n\n    config.value = {\n      ...config.value,\n      customSkuVariantId,\n      previewUrl,\n      isMandatory,\n    };\n\n    // Register modals with orchestrator\n    this._registerModals();\n  }\n\n  disconnectedCallback() {\n    super.disconnectedCallback();\n    if (this._closeTimeoutId) {\n      clearTimeout(this._closeTimeoutId);\n    }\n  }\n\n  updated(changedProperties: Map<string, unknown>) {\n    super.updated?.(changedProperties);\n    if (this._isCustomizationOpen && !this._isClosing && !this._isAnimatedIn) {\n      requestAnimationFrame(() => {\n        this._isAnimatedIn = true;\n      });\n    }\n  }\n\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this; // Light DOM for Tailwind\n  }\n\n  private _registerModals() {\n    // The customization config/state lives in the main product's store, so these\n    // modals must only ever fire for the main product page CTA. Collection cards\n    // (e.g. recommended products) run the same shared modal chain, so guard on the\n    // context's product id — otherwise a customizable main product would pop the\n    // customization modal when adding an unrelated card to the cart.\n    const isMainProductContext = (context: ModalContext) =>\n      context.productId !== undefined &&\n      context.productId === productData.value?.id;\n\n    // Register confirmation modal (priority 40 - after holiday shipping)\n    registerModal({\n      name: \"custom-text-confirmation\",\n      priority: 40,\n      shouldShow: (context) => {\n        if (!isMainProductContext(context)) return false;\n        // Only show if customization is optional (not mandatory) and user hasn't chosen yet\n        if (context.userWantsToCustomize || config.value.isMandatory) {\n          return false;\n        }\n        return shouldShowCustomizeButton.value;\n      },\n    });\n\n    // Register customization modal (priority 50 - after confirmation)\n    registerModal({\n      name: \"custom-text-customization\",\n      priority: 50,\n      shouldShow: (context) => {\n        if (!isMainProductContext(context)) return false;\n        // Show if user wants to customize OR customization is mandatory\n        return context.userWantsToCustomize || config.value.isMandatory;\n      },\n    });\n  }\n\n  // ─── Confirmation Modal Handlers ──────────────────────────────────────────\n\n  private _handleYesCustomize() {\n    closeConfirmationModal();\n    userWantsToCustomize.value = true;\n    // Mark context so custom-text-customization.shouldShow returns true\n    if (modalContext.value) {\n      modalContext.value.userWantsToCustomize = true;\n    }\n    approveModal();\n  }\n\n  private _handleNoAddToCart() {\n    closeConfirmationModal();\n    userWantsToCustomize.value = false;\n    // Advance chain — customization modal won't show because !userWantsToCustomize && !isMandatory\n    approveModal();\n  }\n\n  private _handleCloseConfirmation() {\n    closeConfirmationModal();\n    cancelModal();\n  }\n\n  // ─── Customization Modal Handlers ─────────────────────────────────────────\n\n  private _handleAddToCart() {\n    // The button stays focusable while the text is invalid (so keyboard users\n    // can reach it and hear why it is unavailable), so enforce validity here\n    // rather than relying on the `disabled` attribute.\n    if (!this._isTextValid) return;\n\n    const ctx = modalContext.value;\n    if (ctx && customText.value.trim()) {\n      if (!ctx.customization) {\n        ctx.customization = {};\n      }\n      ctx.customization[\"Your Text\"] = customText.value;\n\n      // Personalized items ship later than the base product, so the customized\n      // line item takes its ships-by date from the custom SKU product's tag\n      // (falling back to the default shipping date), overriding the main\n      // product's date that add-to-cart.ts may have set on the context.\n      const customShipsBy = getCustomSkuShipsBy();\n      if (customShipsBy) {\n        ctx.customization[\"_ships-by\"] = customShipsBy;\n      }\n\n      // If useCustomSku is enabled, pass the custom SKU variant ID so\n      // executeAddToCart can add it as a second line item (personalization fee)\n      if (config.value.useCustomSku && config.value.customSkuVariantId) {\n        // Support both plain numeric IDs and Shopify GID strings\n        // (e.g. \"gid://shopify/ProductVariant/12345\" → 12345)\n        const raw = config.value.customSkuVariantId;\n        const id = parseInt(raw.split(\"/\").pop() ?? raw, 10);\n        if (!isNaN(id)) {\n          ctx.customSkuVariantId = id;\n        }\n      }\n    }\n\n    resetCustomization();\n    approveModal();\n  }\n\n  private _handleCancelCustomization() {\n    this._closeWithAnimation();\n  }\n\n  private _closeWithAnimation() {\n    if (this._isClosing) return;\n    this._isClosing = true;\n\n    const finish = () => {\n      this._closeTimeoutId = null;\n      this._isClosing = false;\n      this._isAnimatedIn = false;\n      resetCustomization();\n      closeCustomizationModal();\n      cancelModal();\n    };\n\n    // Waiting out the fade would also delay the focus return, so close\n    // immediately when the user has asked for reduced motion.\n    if (prefersReducedMotion()) {\n      finish();\n      return;\n    }\n\n    this._closeTimeoutId = window.setTimeout(finish, FADE_DURATION_MS);\n  }\n\n  private _handleOpenCustomization(e: Event) {\n    userWantsToCustomize.value = true;\n    const variant = selectedVariant.value;\n    let imageUrl = variant?.featured_image?.src ||\n      variant?.image ||\n      productData.value?.featured_image ||\n      \"\";\n    if (imageUrl.startsWith(\"//\")) {\n      imageUrl = \"https:\" + imageUrl;\n    }\n    imageUrl = imageUrl.split('?')[0];\n\n    startModalChain({\n      productId: productData.value?.id,\n      variantId: variant?.id,\n      quantity: selectedQuantity.value,\n      productTitle: productData.value?.title,\n      variantTitle: variant?.title,\n      vendor: productData.value?.vendor,\n      imageUrl,\n      customization: {},\n      userWantsToCustomize: true,\n      source: \"customize-button\",\n      // Where focus returns when the modal closes.\n      triggerButton: e.currentTarget as HTMLButtonElement,\n    });\n  }\n\n  // ─── Disclaimer Toggle ────────────────────────────────────────────────────\n\n  private _handleDisclaimerToggle() {\n    this._isDisclaimerOpen = !this._isDisclaimerOpen;\n  }\n\n  // ─── Render Methods ───────────────────────────────────────────────────────\n\n  /**\n   * Alt text for the live preview. Includes the entered text so screen reader\n   * users get the same confirmation of what was rendered that sighted users do.\n   */\n  private _previewAltText() {\n    const text = customText.value.trim();\n    const product = this._productTitle || \"product\";\n    return text\n      ? `Preview of your ${product} personalized with \"${text}\"`\n      : `Preview of your ${product}, not yet personalized`;\n  }\n\n  private _renderCustomizeButton() {\n    if (!this._showCustomizeButton) return html``;\n\n    return html`\n      <div class=\"product__custom-sku bg-[var(--color-secondary-100)] rounded p-4 my-4 gap-3 flex flex-col\">\n        <div class=\"container flex flex-wrap justify-between items-center gap-x-4 gap-y-1\">\n          <h4 class=\"text-sm font-bold text-[var(--color-secondary-800)] md:text-base\">Personalize your charger</h4>\n          <p class=\"text-caption text-[var(--color-neutral-950)]\">\n            With extra cost $${config.value.customSkuCost.toFixed(2)}\n            <span class=\"font-bold\">optional</span>\n          </p>\n        </div>\n        <button\n          @click=${this._handleOpenCustomization}\n          class=\"button w-full btn btn w-full bg-[var(--color-secondary-900)] hover:bg-[var(--color-secondary-800)] ${this\n        ._isExtendedOffer\n        ? \"opacity-50 cursor-not-allowed pointer-events-none\"\n        : \"\"}\"\n          type=\"button\"\n          ?disabled=${this._isExtendedOffer}\n          aria-disabled=${this._isExtendedOffer}\n        >\n          Personalize it\n        </button>\n      </div>\n    `;\n  }\n\n  private _renderConfirmationModal() {\n    if (!this._isConfirmationOpen) return html``;\n\n    return html`\n      <div\n        class=\"fixed inset-0 z-50 flex items-center justify-center p-4 bg-black/20 backdrop-blur-sm\"\n        @click=${this._handleCloseConfirmation}\n      >\n        <div\n          class=\"confirmation-dialog bg-[var(--color-secondary-50)] rounded-lg shadow-xl max-w-xl w-full p-6 relative\"\n          @click=${(e: Event) => e.stopPropagation()}\n          role=\"dialog\"\n          aria-modal=\"true\"\n          aria-labelledby=\"confirmation-title\"\n        >\n          <button\n            @click=${this._handleCloseConfirmation}\n            class=\"absolute right-3 top-3 flex h-8 w-8 items-center justify-center rounded text-xl leading-none text-[var(--color-secondary-600)] hover:opacity-90 transition-opacity\"\n            aria-label=\"Close\"\n            type=\"button\"\n          >\n            <span aria-hidden=\"true\">×</span>\n          </button>\n          <div class=\"confirmation-modal__content\">\n            <div class=\"confirmation-modal__header mb-6 pr-8\">\n              <h3 id=\"confirmation-title\" class=\"text-xl font-bold text-[var(--color-neutral-950)]\">\n                Make it yours and personalize your charger?\n              </h3>\n            </div>\n            <div class=\"confirmation-modal__buttons flex flex-col min-[560px]:flex-row gap-3\">\n              <button\n                @click=${this._handleYesCustomize}\n                class=\"button btn w-full min-[560px]:flex-1 border border-[var(--color-secondary-500)] bg-[var(--color-secondary-50)] text-[var(--color-secondary-600)] hover:opacity-90 transition-opacity\"\n                type=\"button\"\n              >\n                Yes, personalize it\n              </button>\n              <button\n                @click=${this._handleNoAddToCart}\n                class=\"button btn w-full min-[560px]:flex-1\"\n                type=\"button\"\n              >\n               Add without personalization\n              </button>\n            </div>\n          </div>\n        </div>\n      </div>\n    `;\n  }\n\n  private _renderCustomizationModal() {\n    if (!this._isCustomizationOpen) return html``;\n\n    const isVisible = this._isAnimatedIn && !this._isClosing;\n\n    return html`\n      <div\n        class=\"fixed inset-0 z-50 flex items-end lg:items-center justify-center p-4 bg-black/20 backdrop-blur-sm transition-opacity duration-300 ease-out ${isVisible ? \"opacity-100\" : \"opacity-0\"}\"\n        @click=${this._handleCancelCustomization}\n      >\n        <div\n          class=\"customization-dialog bg-[var(--color-secondary-50)] rounded-lg shadow-xl w-[90vw] lg:w-[70vw] max-h-[90vh] overflow-hidden flex flex-col relative transition-all duration-300 ease-out ${isVisible ? \"opacity-100 translate-y-0\" : \"opacity-0 translate-y-full\"}\"\n          @click=${(e: Event) => e.stopPropagation()}\n          role=\"dialog\"\n          aria-modal=\"true\"\n          aria-labelledby=\"customization-title\"\n        >\n          <button\n            @click=${this._handleCancelCustomization}\n            class=\"absolute right-[10px] top-[10px] lg:right-auto lg:left-[20px] lg:top-[20px] z-10 flex items-center justify-center px-3 py-2 rounded bg-[var(--color-secondary-50)] text-[var(--color-secondary-600)] font-medium text-sm hover:opacity-90 transition-opacity\"\n            type=\"button\"\n          >\n            Close\n          </button>\n\n          <!-- Content: Image | Form -->\n          <div class=\"flex min-h-0 flex-1 flex-col lg:flex-row lg:overflow-hidden\">\n            <!-- Preview Image (left) -->\n            <div class=\"lg:w-1/2 flex items-center justify-center bg-white rounded lg:rounded-r-none relative min-h-[200px] lg:min-h-[60vh]\">\n              ${this._isLoadingPreview\n        ? html`\n                    <div class=\"absolute inset-0 flex items-center justify-center bg-white/80 rounded-lg\" role=\"status\">\n                      <div class=\"w-8 h-8 border-4 border-[var(--color-secondary-500)] border-t-transparent rounded-full animate-spin\"></div>\n                      <span class=\"sr-only\">Loading preview</span>\n                    </div>\n                  `\n        : \"\"}\n              ${this._previewUrl\n        ? html`\n                    <img\n                      src=\"${this._previewUrl}\"\n                      alt=${this._previewAltText()}\n                      class=\"max-w-full max-h-[400px] lg:max-h-[90vh] object-contain rounded-lg\"\n                    />\n                  `\n        : html`\n                    <div class=\"text-[var(--color-neutral-400)] text-sm p-8\">\n                      Preview will appear here\n                    </div>\n                  `}\n            </div>\n\n            <!-- Form panel (right) -->\n            <div class=\"flex min-h-0 min-w-0 flex-1 flex-col p-3 md:p-8\">\n              <div class=\"flex min-h-0 min-w-0 flex-1 flex-col gap-6 overflow-y-auto\">\n              <!-- Header -->\n              <div class=\"flex min-w-0 flex-col gap-6\">\n                <div class=\"flex min-w-0 flex-wrap items-center gap-4\">\n                  <h3 id=\"customization-title\" class=\"min-w-0 max-w-full break-words text-xl font-bold text-[var(--color-secondary-800)] md:text-3xl\">\n                    Customize your ${this._productTitle}\n                  </h3>\n                  <p class=\"variant-label small max-w-full shrink-0\">\n                    ${this._variantTitle}\n                  </p>\n                </div>\n\n                <!-- Custom Text Input -->\n                <custom-text-input></custom-text-input>\n              </div>\n\n              <!-- Disclaimer -->\n              <div class=\"product__customized-disclaimer flex flex-col rounded-[5px] overflow-hidden bg-[var(--color-secondary-100)]\">\n                <h4 class=\"shrink-0\">\n                  <button\n                    @click=${this._handleDisclaimerToggle}\n                    class=\"disclaimer-toggle w-full p-3 md:p-4 md:text-xs text-left flex items-center justify-between gap-2 hover:opacity-90 transition-opacity bg-[var(--color-secondary-100)] rounded-md text-sm font-bold text-[var(--color-secondary-800)] md:text-base\"\n                    type=\"button\"\n                    id=\"customization-disclaimer-toggle\"\n                    aria-expanded=${this._isDisclaimerOpen ? \"true\" : \"false\"}\n                    aria-controls=\"customization-disclaimer-content\"\n                  >\n                    Customization &amp; Returns/Exchange Policy\n                    <span class=\"toggle-icon text-[var(--color-secondary-500)] font-bold text-xl\" aria-hidden=\"true\"\n                      >${this._isDisclaimerOpen ? \"−\" : \"+\"}</span\n                    >\n                  </button>\n                </h4>\n                <div\n                  id=\"customization-disclaimer-content\"\n                  role=\"region\"\n                  aria-labelledby=\"customization-disclaimer-toggle\"\n                  class=\"disclaimer-content min-h-0 px-4 pt-0 pb-4 text-sm text-[var(--color-secondary-700)] space-y-4 max-h-[180px] overflow-y-scroll\"\n                  ?hidden=${!this._isDisclaimerOpen}\n                >\n                  <p>\n                    Items that are <strong>personalized to your specifications</strong> cannot be\n                    returned or exchanged, and all sales of personalized items are considered final.\n                  </p>\n                  <p>\n                    If you receive a personalized item that is <strong>damaged</strong>, contains the\n                    <strong>wrong initial</strong>, or if <strong>we've made an error</strong> in\n                    customization, please contact us within <strong>14 days of receiving your order</strong>,\n                    and we will gladly remake the item for you.\n                  </p>\n                  <p>\n                    <strong>Non-personalized items</strong> are eligible for return or exchange in\n                    accordance with our standard return policy.\n                  </p>\n                </div>\n              </div>\n              </div>\n\n              <!-- Footer Buttons -->\n              <div class=\"flex shrink-0 gap-2.5 pt-4\">\n                <button\n                  @click=${this._handleCancelCustomization}\n                  class=\"btn w-1/2 bg-[var(--color-secondary-100)] text-[var(--color-secondary-500)]\"\n                  type=\"button\"\n                >\n                  <span>Cancel</span>\n                </button>\n                <button\n                  @click=${this._handleAddToCart}\n                  aria-disabled=${this._isTextValid ? \"false\" : \"true\"}\n                  aria-describedby=${this._isTextValid ? nothing : \"customization-text-hint\"}\n                  class=\"btn w-1/2 ${this._isTextValid\n        ? \"bg-[var(--color-primary-500)] hover:opacity-90\"\n        : \"bg-[var(--color-neutral-300)] text-[var(--color-neutral-500)] cursor-not-allowed\"}\"\n                  type=\"button\"\n                >\n                  Add to cart\n                </button>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    `;\n  }\n\n  render() {\n    return html`\n      ${this._renderCustomizeButton()}\n      ${this._renderConfirmationModal()}\n      ${this._renderCustomizationModal()}\n    `;\n  }\n}\n","import { LitElement, html } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\nimport { effect } from \"@preact/signals-core\";\nimport {\n  customText,\n  setCustomText,\n  updatePreviewImage,\n  config,\n  isCustomTextValid,\n} from \"../store/customization-store\";\n\n/**\n * Custom Text Input Component\n *\n * Text input field with validation for product customization.\n * - Only allows alphabetic characters and spaces\n * - Auto-converts to uppercase\n * - Validates min/max length\n * - Debounced preview updates\n *\n * Usage:\n * <custom-text-input></custom-text-input>\n */\n@customElement(\"custom-text-input\")\nexport class CustomTextInput extends LitElement {\n  @state() private _value = \"\";\n  @state() private _minCharacters = 1;\n  @state() private _maxCharacters = 20;\n  @state() private _isValid = false;\n\n  private _debounceTimer: number | null = null;\n\n  constructor() {\n    super();\n\n    // Subscribe to store\n    effect(() => {\n      this._value = customText.value;\n      this._minCharacters = config.value.minCharacters;\n      this._maxCharacters = config.value.maxCharacters;\n      this._isValid = isCustomTextValid.value;\n    });\n  }\n\n  protected createRenderRoot(): HTMLElement | DocumentFragment {\n    return this; // Light DOM for Tailwind\n  }\n\n  private _handleInput(e: Event) {\n    const target = e.target as HTMLInputElement;\n    const rawValue = target.value;\n\n    // Sanitize in store (strips numbers, special chars; uppercases)\n    setCustomText(rawValue);\n\n    // Immediately correct the visible input value so invalid chars never flash\n    const cursorPos = target.selectionStart ?? target.value.length;\n    target.value = customText.value;\n    // Restore cursor, accounting for any stripped characters\n    const stripped = rawValue.length - customText.value.length;\n    target.setSelectionRange(cursorPos - stripped, cursorPos - stripped);\n\n    // Debounced preview update (400ms)\n    if (this._debounceTimer) {\n      clearTimeout(this._debounceTimer);\n    }\n\n    this._debounceTimer = window.setTimeout(() => {\n      updatePreviewImage(customText.value);\n    }, 400);\n  }\n\n  render() {\n    const showError = !this._isValid && this._value.length > 0;\n\n    return html`\n      <div class=\"form__prints_input flex flex-col gap-3\">\n        <label\n          for=\"customization-text-input\"\n          class=\"form__label text-xs font-semibold uppercase tracking-widest\"\n        >\n          Please input your custom text\n        </label>\n        <input\n          id=\"customization-text-input\"\n          type=\"text\"\n          name=\"properties[Your Text]\"\n          .value=${this._value}\n          @input=${this._handleInput}\n          maxlength=\"${this._maxCharacters}\"\n          placeholder=\"Enter ${this._minCharacters}-${this._maxCharacters} characters\"\n          required\n          autocomplete=\"off\"\n          spellcheck=\"false\"\n          aria-invalid=${showError ? \"true\" : \"false\"}\n          aria-describedby=${showError\n            ? \"customization-text-hint customization-text-error\"\n            : \"customization-text-hint\"}\n          class=\"w-full px-3 py-3 md:px-4 md:py-4 rounded-md bg-white border border-[var(--color-secondary-300)] text-sm font-medium text-[var(--color-neutral-950)] placeholder:text-[var(--color-neutral-500)] focus:outline-none focus:ring-2 focus:ring-[var(--color-secondary-300)] focus:border-[var(--color-secondary-500)] transition-colors\"\n        />\n        <!--\n          Typed characters are silently stripped and uppercased by setCustomText,\n          which sighted users see happen in the field. Spell it out for screen\n          reader users, who otherwise get unannounced data loss.\n        -->\n        <p id=\"customization-text-hint\" class=\"sr-only\">\n          Letters and spaces only, automatically capitalised.\n          Enter between ${this._minCharacters} and ${this._maxCharacters} characters.\n        </p>\n        ${showError\n          ? html`\n              <p\n                id=\"customization-text-error\"\n                role=\"alert\"\n                class=\"text-xs text-[var(--color-danger-600)] mt-1\"\n              >\n                Minimum ${this._minCharacters} character${this._minCharacters !== 1 ? \"s\" : \"\"} required\n              </p>\n            `\n          : \"\"}\n      </div>\n    `;\n  }\n}\n","/**\n * Lazy Video\n *\n * Defers a background video's download until it is about to enter the viewport,\n * and pauses it once it leaves. Wraps a `<video>` that Liquid renders **without\n * a src** — the URL travels on `data-src` and is only assigned when the element\n * intersects, so the file is genuinely not requested on page load rather than\n * relying on `preload=\"none\"` being honoured.\n *\n * Usage:\n *   <lazy-video data-src=\"https://cdn.shopify.com/videos/....mp4\">\n *     <video class=\"…\" loop muted playsinline preload=\"none\" poster=\"…\"></video>\n *   </lazy-video>\n *\n * Progressive enhancement: the `<video>` and its poster are server-rendered, so\n * with JavaScript broken the shopper sees the poster rather than a blank box.\n *\n * Deliberately a plain custom element rather than Lit. It owns no state and\n * renders no template — it only attaches behaviour to a child that Liquid\n * already rendered. A light-DOM Lit component would clear that child on its\n * first render pass.\n */\n\nconst REDUCED_MOTION = \"(prefers-reduced-motion: reduce)\";\n\n/** Start fetching slightly before the section scrolls in, so playback looks instant. */\nconst DEFAULT_ROOT_MARGIN = \"200px 0px\";\n\nexport class LazyVideo extends HTMLElement {\n  private _observer: IntersectionObserver | null = null;\n  private _video: HTMLVideoElement | null = null;\n  private _loaded = false;\n\n  connectedCallback(): void {\n    this._video = this.querySelector(\"video\");\n    if (!this._video || !this.dataset.src) return;\n\n    // Reduced motion: never load the file at all. The poster is already\n    // painted, so the section still looks complete.\n    if (window.matchMedia?.(REDUCED_MOTION).matches) return;\n\n    if (!(\"IntersectionObserver\" in window)) {\n      // No observer support — load immediately rather than never showing it.\n      this._load();\n      return;\n    }\n\n    this._observer = new IntersectionObserver(\n      (entries) => {\n        for (const entry of entries) {\n          if (entry.isIntersecting) {\n            this._load();\n            void this._video?.play().catch(() => {\n              /* Autoplay can still be refused; the poster remains. */\n            });\n          } else if (this._loaded) {\n            // Stop decode work while off-screen.\n            this._video?.pause();\n          }\n        }\n      },\n      { rootMargin: this.dataset.rootMargin || DEFAULT_ROOT_MARGIN },\n    );\n\n    this._observer.observe(this);\n  }\n\n  disconnectedCallback(): void {\n    this._observer?.disconnect();\n    this._observer = null;\n  }\n\n  private _load(): void {\n    if (this._loaded || !this._video || !this.dataset.src) return;\n    this._loaded = true;\n    this._video.src = this.dataset.src;\n    this._video.load();\n  }\n}\n\nif (!customElements.get(\"lazy-video\")) {\n  customElements.define(\"lazy-video\", LazyVideo);\n}\n","/**\n * Main Entry Point for Reactive Shopify Theme\n *\n * This file imports all Lit components and initializes the cart store.\n * Vite will bundle this into assets/theme-bundle.js\n */\n\n// Tailwind CSS\nimport \"./tailwind.css\";\n\n// Import cart store and initialize\nimport { initCart } from \"./store/cart-store\";\ninitCart();\nimport { initRetailPrices } from \"./store/retail-price-store\";\ninitRetailPrices();\nimport {\n  productData,\n  selectedVariantId,\n  selectedVariant,\n  isAvailable,\n  selectedQuantity,\n  activeMediaId,\n} from \"./store/product-store\";\nimport {\n  cartData,\n  isCartLoading,\n  itemCount,\n  isEmpty,\n} from \"./store/cart-store\";\nimport {\n  getCardSignals,\n  registerCard,\n  changeCardVariant,\n} from \"./store/collection-store\";\n\n// Import all components\nimport \"./components/theme-settings-provider\";\nimport \"./components/consent-gated-scripts\";\nimport \"./components/product-provider\";\nimport \"./components/variant-selects\";\nimport \"./components/variant-radios\";\nimport \"./components/price-pp\";\nimport \"./components/badges-pp\";\nimport \"./components/product-gallery\";\nimport \"./components/add-to-cart\";\nimport \"./components/quantity-selector-pp\";\nimport \"./components/extended-offer-modal\";\nimport \"./components/promo-code-modal\";\nimport \"./components/sticky-add-to-cart\";\nimport \"./components/ships-by-pp\";\n\n// Collection card components\nimport \"./components/card-provider\";\nimport \"./components/card-price\";\nimport \"./components/card-badge\";\nimport \"./components/card-button\";\nimport \"./components/card-variant-selector\";\nimport \"./components/card-image-switcher\";\nimport \"./components/card-ships-by\";\nimport \"./components/card-background\";\nimport { initEqualizeCardTitleHeights } from \"./utils/equalize-card-title-heights\";\ninitEqualizeCardTitleHeights();\n// import \"./assets/product-card\"; // Legacy product card component (kept for reference)\n\n// Cart components\nimport \"./components/cart-drawer\";\nimport \"./components/menu-drawer\";\nimport \"./components/cart-item-list\";\nimport \"./components/cart-item-row\";\nimport \"./components/cart-total\";\nimport \"./components/cart-savings\";\nimport \"./components/cart-count\";\nimport \"./components/cart-count-badge\";\nimport \"./components/cross-selling-cart\";\nimport \"./components/quantity-selector-cart\";\n\n// Expose window.knocking shim for legacy inline scripts (e.g. multicolumn-cbs-deals-box.liquid)\nimport {\n  getTagShippingDate,\n  formatToDollarCurrencyString,\n} from \"./utils/knocking\";\n(window as any).knocking = {\n  getTagShippingDate,\n  formatToDollarCurrencyString,\n  calculateDiscountPercent(variant: { price: number; compare_at_price: number | null }) {\n    if (variant.compare_at_price && variant.compare_at_price > variant.price) {\n      const discount =\n        ((variant.compare_at_price - variant.price) * 100) /\n        variant.compare_at_price;\n      return (window as any).alwaysRoundDown\n        ? Math.floor(discount)\n        : Math.round(discount);\n    }\n    return \"Exclusive Offer\";\n  },\n};\n\n// Log to confirm the bundle is loaded\nconsole.log(\"🚀 Reactive theme bundle loaded (Lit + Signals)\");\n\n// Dev-only store inspector — use window.__store in the console to read/mutate signals\nif (import.meta.env.DEV) {\n  (window as any).__store = {\n    product: {\n      productData,\n      selectedVariantId,\n      selectedVariant,\n      isAvailable,\n      selectedQuantity,\n      activeMediaId,\n    },\n    cart: { cartData, isCartLoading, itemCount, isEmpty },\n    collection: { getCardSignals, registerCard, changeCardVariant },\n  };\n  console.log(\"🔍 __store exposed for debugging\");\n}\n\n// Export store functions for use in other scripts if needed\n// These are available directly from the cart-store module\n// export {\n//   refreshCart,\n//   addToCart,\n//   updateCartItem,\n//   removeCartItem,\n//   clearCart,\n//   cartData,\n//   itemCount,\n//   totalPrice,\n//   isEmpty,\n//   isCartLoading,\n//   isCartOpen,\n//   openCart,\n//   closeCart,\n// } from \"./store/cart-store\";\n\n// Modal components\nimport \"./components/modal-base\";\nimport \"./components/holiday-shipping-modal\";\nimport \"./components/confirm-custom-text-modal\";\n\n// Holiday shipping components\nimport \"./components/holiday-shipping-countdown\";\n\n// Customization components\nimport \"./components/customization-modal\";\nimport \"./components/custom-text-input\";\n\n// Generic section behaviours\nimport \"./components/lazy-video\";\n\n// Export initialization functions for Liquid templates\nexport { initHolidayShipping } from \"./store/holiday-store\";\nexport { initCustomization } from \"./store/customization-store\";\n"],"names":["i","t","s","h","n","v","a","r","o","u","e","d","m","c","l","y","w","b","_","p","g","S","addDays","days","addBusinessDays","date","added","dow","DATE_FMT_LONG","DATE_FMT_SHORT","formatShippingDate","calculateShippingDate","tag","getTagShippingDate","tags","fallback","shippingTag","trimmed","getProductByHandle","handle","res","formatToDollarCurrencyString","priceCents","str","dollars","cents","getCookie","name","prefix","raw","setCookie","value","expires","handleize","scrollToVariantPicker","picker","top","shopifyImageUrl","src","width","url","buildVariantUrl","base","variantId","isMarketingAllowed","onMarketingAllowed","callback","handler","CACHE_KEY","CACHE_TTL","DEBUG_CACHE_KEY","DEBUG_TIMESTAMP_KEY","isDebugEnabled","debugLog","args","cartData","signal","isCartLoading","cartError","isCartOpen","itemCount","computed","totalPrice","isEmpty","productQtyInCart","map","item","brandQtyInCart","vendor","getLimitStatus","productId","pid","productLimit","inCart","remaining","brandLimit","globalLimit","set","cartLimitError","_limitErrorTimer","setLimitError","status","DELETED_VARIANTS_STORAGE_KEY","loadDeletedVariantIdsFromStorage","deletedVariantIds","addToDeletedVariants","id","current","next","loadCartFromCache","cached","cache","error","isCacheValid","age","isValid","saveCartToCache","cart","retryError","hasCartChanged","fresh","changed","latestRefreshTimestamp","refreshCart","isBackgroundRefresh","thisRefresh","rootUrl","freshData","templateName","executeCartAdd","quantity","properties","analytics","promoProps","promoCode","referralProps","renamingMap","key","rawKey","propName","mergedProperties","body","baseAddUrl","addUrl","publishKnAddToCart","trackKlaviyoAddedToCart","_learnq","klaviyoCart","source","payload","publishKlaviyoAddedToCart","publishKlaviyoIdentify","email","addToCart","limitContext","updateCartItem","line","hasVoucherCodesOutOfSync","voucherStore","reconcileVoucherCodes","updateCartProperty","property","openCart","closeCart","removeCartItem","sessionStorageDebounce","saveCartToSessionStorage","cartJson","initCart","init","effect","compareAtByVariant","requestedHandles","hydrateHandle","product","variant","getRetailUnitPrice","compareAt","retailSubtotal","items","sum","totalSavings","started","initRetailPrices","productData","selectedVariantId","activeMediaId","selectedQuantity","productMedia","shipsBy","selectedVariant","variantBadges","badge","computeBadge","isAvailable","currentPrice","compareAtPrice","changeVariant","syncUrlWithVariant","updateQuantity","newQuantity","setActiveMedia","mediaId","price","percentageSaved","specialOfferEnabled","pct","computeButtonState","config","productType","isGiftCard","qty","cardRegistry","registerCard","cardId","initialVariantId","rawTags","shipsByTag","fallbackShipsBy","variants","found","buttonState","signals","changeCardVariant","entry","newButtonState","isExtendedOffer","getCardSignals","getCardData","getCardConfig","n$3","f","y$1","$","x","E","A","C","P","V","N","I","L","z","H","M","R","k","Z","j","B","D","themeSettings","isExtendedOfferEnabled","settings","hasKlaviyoId","featureEnabled","result","submitBackInStockRequest","request","response","ThemeSettingsProvider","LitElement","code","__decorateClass","customElement","ConsentGatedScripts","shopId","script","isHolidayShippingEnabled","globalCutoffDate","brandCutoffDates","giftCardUrl","productCutoffDate","productCutoffTimestamp","cutoff","hasExpired","timestamp","timeRemaining","countdownInterval","initHolidayShipping","enabled","globalCutoff","brandsJson","giftCardProductUrl","brandMap","brand","startCountdown","setProductCutoff","collection","stopCountdown","updateCountdown","now","distance","hours","minutes","getFormattedCutoffDate","ProductProvider","scriptTag","data","collectionsTag","collections","quantitiesId","qtyEl","qtys","urlParam","urlVariantId","validVariant","VariantSelect","select","optionLabel","html","VariantRadios","selectedOptions","fieldset","options","opt","idx","optionKey","optionValue","radio","state","PricePP","priceFormatted","compareCents","compareFormatted","isCompact","BadgesPP","selectedId","badges","type","ProductGallery","lastMedia","containerSelector","axis","container","activeLi","desktopList","mobileList","direction","list","currentIndex","nextIndex","media","side","mediaType","nothing","size","thumbSrc","isActive","sizeClass","disabled","activeMedia","isFirst","isLast","hasMultiple","registeredModals","activeModal","modalContext","isProcessing","sortedModals","currentModalConfig","_resolveChain","registerModal","startModalChain","context","nextModal","resolve","executeAddToCart","resetModalState","approveModal","cancelModal","cartStore","addVoucherProductToCart","skuProperties","VOUCHER_TAGS","MERGE_TAG","VOUCHER_PROP","LAMBDA_URL_PATTERN","FALLBACK_DEV_URL","FALLBACK_PROD_URL","voucherError","isVoucherProductTags","shouldMergeVouchers","isValidLambdaUrl","resolveLambdaUrl","metafieldUrl","storeName","fetchVoucherCodes","sku","query","err","parseVoucherProp","parsed","codes","merge","customization","anyAdded","changesMade","codesToAdd","newCodes","merged","AddToCart","pd","modal","button","imageUrl","isVoucher","label","styleClass","styleOverride","isDisabled","CartLimitNotice","nextStatus","notice","limitType","QuantitySelectorPP","val","buttonClass","FADE_DURATION_MS","ExtendedOfferModal","changedProperties","emailInput","input","checkbox","productVendor","productTitle","isCbsBox","productTitleClass","showNewsletter","isVisible","variantOptions","optionNames","imageSrc","dialogHeading","hasMultipleVariants","PROMO_COOKIE","COOKIE_DAYS","appliedPromoCode","validPromoCodes","isPromoCodeModalEnabled","validatePromoCode","normalized","getUrlPromoCode","applyPromoCode","initPromoCode","fromUrl","fromCookie","PromoCodeModal","bgStyle","StickyAddToCart","calculated","rect","bar","height","visibilityClasses","buttonConfig","buttonLabel","buttonStyleOverride","showSoldOutShipsBy","showShipsByPanel","rawImageSrc","imageAlt","ShipsByPP","CardProvider","card","productEl","pinned","hiddenEl","hiddenVariantIds","arr","visible","initialId","link","variantInput","CardPrice","priceStr","CardBadge","CardButton","form","props","match","baseClasses","btn","CardVariantSelector","allVariants","CardImageSwitcher","variantIdStr","selectedVariantImage","image","datasetVariantId","CardShipsBy","CardBackground","cardBody","GRID_SELECTOR","ITEM_SELECTOR","TITLE_SELECTOR","ROW_TOP_TOLERANCE_PX","resizeListenerAttached","gridResizeObserver","gridMutationObserver","equalizeFrame","groupItemsByRow","sorted","rows","currentRow","rowTop","equalizeRowTitles","titles","title","maxHeight","equalizeCardTitleHeights","grid","rowItems","scheduleEqualizeCardTitleHeights","observeGrid","observeProductGrids","initGridObservers","handleChange","collectionGrid","initEqualizeCardTitleHeights","run","CartDrawer","event","target","hide","sel","el","MenuDrawer","closeBtn","openBtn","knocking","i$1","partitionItems","customSkuByParent","parentVariant","yourText","CartItemList","allItems","repeat","customSkuItem","customSkuLine","getCustomSkuShipsBy","customText","userWantsToCustomize","previewImageUrl","isLoadingPreview","isCustomizationModalOpen","isConfirmationModalOpen","isCustomTextValid","isCustomizable","shouldShowCustomizeButton","initCustomization","customConfig","setCustomText","text","sanitized","updatePreviewImage","previewUrl","blob","blobUrl","openCustomizationModal","closeCustomizationModal","closeConfirmationModal","resetCustomization","CartItemRow","customizationConfig","currency","meta","nextQty","feeCents","rawImage","retailPrice","hasDiscount","shipsByRaw","shipsByBlock","dateLine","CartTotal","formatted","CartSavings","CartCount","displayCount","css","CartCountBadge","hiddenClass","parseVariantGid","gid","shuffle","CrossSellingCart","inner","footer","cartInner","seq","variantIdsInCart","deleted","scrollArea","scrollToTop","QuantitySelectorCart","isMinusDisabled","candidateSelectors","candidateSelector","NoElement","matches","getRootNode","element","_element$getRootNode","_isInert","node","lookUp","_node$getAttribute","inertAtt","inert","isContentEditable","_node$getAttribute2","attValue","getCandidates","includeContainer","filter","candidates","_getCandidatesIteratively","elements","elementsToCheck","assigned","content","nestedCandidates","validCandidate","shadowRoot","validShadowRoot","_nestedCandidates","hasTabIndex","getTabIndex","getSortOrderTabIndex","isScope","tabIndex","sortOrderedTabbables","isInput","isHiddenInput","isDetailsWithSummary","child","getCheckedRadio","nodes","isTabbableRadio","radioScope","queryRadios","radioSet","checked","isRadio","isNonTabbableRadio","isNodeAttached","_nodeRoot","nodeRoot","nodeRootHost","attached","_nodeRootHost","_nodeRootHost$ownerDo","_node$ownerDocument","_nodeRoot2","_nodeRootHost2","_nodeRootHost2$ownerD","isZeroArea","_node$getBoundingClie","isHidden","_ref","displayCheck","getShadowRoot","isDirectSummary","nodeUnderDetails","originalNode","parentElement","rootNode","isDisabledFromFieldset","parentNode","isNodeMatchingSelectorFocusable","isNodeMatchingSelectorTabbable","isShadowRootTabbable","shadowHostNode","_sortByOrder","regularTabbables","orderedTabbables","candidateTabindex","acc","sortable","tabbable","focusable","isTabbable","focusableCandidateSelector","isFocusable","_arrayLikeToArray","_arrayWithoutHoles","asyncGeneratorStep","_asyncToGenerator","_next","_throw","_createForOfIteratorHelper","_unsupportedIterableToArray","F","_defineProperty","_toPropertyKey","_iterableToArray","_nonIterableSpread","ownKeys","_objectSpread2","_regenerator","Generator","_regeneratorDefine","G","GeneratorFunction","GeneratorFunctionPrototype","_toConsumableArray","_toPrimitive","activeFocusTraps","trapStack","trap","activeTrap","trapIndex","isSelectableInput","isEscapeEvent","isTabEvent","isKeyForward","isKeyBackward","delay","fn","valueOrHandler","_len","params","_key","getActualTarget","internalTrapStack","createFocusTrap","userOptions","doc","getOption","configOverrideOptions","optionName","configOptionName","findContainerIndex","composedPath","tabbableNodes","getNodeForOption","_ref2","_ref2$hasFallback","hasFallback","_ref2$params","getInitialFocusNode","firstTabbableGroup","firstTabbableNode","updateTabbableNodes","focusableNodes","lastTabbableNode","firstDomTabbableNode","lastDomTabbableNode","posTabIndexesFound","forward","nodeIdx","group","_getActiveElement","activeElement","_tryFocus","getReturnFocusNode","previousActiveElement","findNextNavNode","_ref3","_ref3$isBackward","isBackward","destinationNode","containerIndex","containerGroup","startOfGroupIndex","_ref4","destinationGroupIndex","destinationGroup","lastOfGroupIndex","_ref5","_destinationGroupIndex","_destinationGroup","checkPointerDown","checkFocusIn","targetContained","nextNode","navAcrossContainers","mruContainerIdx","mruTabIdx","checkKeyNav","checkTabKey","checkEscapeKey","checkClick","addListeners","promise","collectAdjacentElements","containers","containerAncestors","adjacentElements","_iterator","_step","insideShadowRoot","parent","siblings","_iterator2","_step2","removeListeners","checkDomRemoval","mutations","isFocusedNodeRemoved","mutation","removedNodes","mutationObserver","updateObservedNodes","activateOptions","onActivate","onPostActivate","checkCanFocusTrap","preexistingTrap","revertState","_preexistingTrap$_set","finishActivation","_ref6","_callee","_context","_preexistingTrap$_set2","deactivateOptions","onDeactivate","onPostDeactivate","checkCanReturnFocus","returnFocus","finishDeactivation","pauseOptions","unpauseOptions","containerElements","elementsAsArray","paused","onPause","onPostPause","onUnpause","onPostUnpause","finishUnpause","_ref7","_callee2","_context2","isEnabled","_el$getAttribute","openDialogCount","previousBodyOverflow","BACKGROUND_SELECTORS","setBackgroundHidden","acquirePageLock","releasePageLock","DialogA11y","host","open","dialog","firstInput","prefersReducedMotion","ModalBase","shouldBeOpen","HolidayShippingModal","ConfirmCustomTextModal","validation","customTextElements","missingFields","isMandatory","hasCustomization","field","HolidayShippingCountdown","time","CustomizationModal","active","customSkuVariantId","isMainProductContext","ctx","customShipsBy","finish","CustomTextInput","rawValue","cursorPos","stripped","showError","REDUCED_MOTION","DEFAULT_ROOT_MARGIN","LazyVideo","entries","discount"],"mappings":"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","x_google_ignoreList":[0,7,8,9,10,11,12,13,44,45,46,56,57]}