@occluze/tether 0.9.3 → 0.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/README.md +1 -1
  2. package/dist/esm/astro.js +1 -1
  3. package/dist/esm/chunks/account-2467DHLU.js +1 -0
  4. package/dist/esm/chunks/{account-pages-OZHK5HHY.js → account-pages-X7U3E7D7.js} +1 -1
  5. package/dist/esm/chunks/{analytics-QHX2YHZS.js → analytics-TF7M4KI2.js} +1 -1
  6. package/dist/esm/chunks/{chunk-GCGRUVYO.js → chunk-4QINHHE4.js} +1 -1
  7. package/dist/esm/chunks/chunk-5TS6IBBB.js +1 -0
  8. package/dist/esm/chunks/{chunk-NF5H2Q7V.js → chunk-646NGAEM.js} +1 -1
  9. package/dist/esm/chunks/chunk-67MCLHFS.js +1 -0
  10. package/dist/esm/chunks/{chunk-WHNUPECA.js → chunk-6FWNC7QH.js} +1 -1
  11. package/dist/esm/chunks/{chunk-74SGIWQE.js → chunk-AHYDU7Z6.js} +1 -1
  12. package/dist/esm/chunks/{chunk-A3GZFAB3.js → chunk-B2X6ZOKA.js} +1 -1
  13. package/dist/esm/chunks/chunk-C2GKO34C.js +1 -0
  14. package/dist/esm/chunks/chunk-EYVBEFKK.js +1 -0
  15. package/dist/esm/chunks/{chunk-SOLTIZAI.js → chunk-F3OXGENC.js} +1 -1
  16. package/dist/esm/chunks/{chunk-ZB4FBE6W.js → chunk-HEK66LYK.js} +1 -1
  17. package/dist/esm/chunks/{chunk-RVWHBZAF.js → chunk-I7XE7GQR.js} +1 -1
  18. package/dist/esm/chunks/chunk-KIZBET7N.js +1 -0
  19. package/dist/esm/chunks/chunk-UJYL5G7T.js +1 -0
  20. package/dist/esm/chunks/{chunk-LSB7RVRZ.js → chunk-UM37ZVSP.js} +1 -1
  21. package/dist/esm/chunks/chunk-YW3ZIFWB.js +1 -0
  22. package/dist/esm/chunks/{diagnose-O3QCZTHT.js → diagnose-AOSBLXOJ.js} +1 -1
  23. package/dist/esm/chunks/{extras-O6ZRL5FK.js → extras-THTXX76O.js} +1 -1
  24. package/dist/esm/chunks/lists-UJMD7BCQ.js +1 -0
  25. package/dist/esm/chunks/{markets-ui-V2ROBFZP.js → markets-ui-PTAY3FHU.js} +1 -1
  26. package/dist/esm/chunks/search-G2SRQXDG.js +1 -0
  27. package/dist/esm/index.js +1 -1
  28. package/dist/esm/server.js +1 -1
  29. package/dist/tether.account-pages.js +1 -1
  30. package/dist/tether.account-pages.min.js +1 -1
  31. package/dist/tether.account.js +16 -13
  32. package/dist/tether.account.min.js +1 -1
  33. package/dist/tether.analytics.js +1 -1
  34. package/dist/tether.analytics.min.js +1 -1
  35. package/dist/tether.diagnose.js +1 -1
  36. package/dist/tether.diagnose.min.js +1 -1
  37. package/dist/tether.js +145 -68
  38. package/dist/tether.lists.js +1 -1
  39. package/dist/tether.lists.min.js +1 -1
  40. package/dist/tether.markets.js +1 -1
  41. package/dist/tether.markets.min.js +1 -1
  42. package/dist/tether.min.js +1 -1
  43. package/dist/tether.min.js.map +4 -4
  44. package/dist/tether.search.js +56 -17
  45. package/dist/tether.search.min.js +1 -1
  46. package/dist/types/src/account/server-client.d.ts +2 -1
  47. package/dist/types/src/analytics-queue.d.ts +9 -0
  48. package/dist/types/src/cart/checkout.d.ts +2 -2
  49. package/dist/types/src/cart/drawer.d.ts +9 -4
  50. package/dist/types/src/cart/store.d.ts +2 -0
  51. package/dist/types/src/cart.d.ts +1 -1
  52. package/dist/types/src/client.d.ts +6 -0
  53. package/dist/types/src/dom.d.ts +13 -1
  54. package/dist/types/src/index.d.ts +1 -1
  55. package/dist/types/src/search.d.ts +1 -1
  56. package/dist/types/src/version.d.ts +1 -1
  57. package/package.json +1 -1
  58. package/dist/esm/chunks/account-3MYRPPTR.js +0 -1
  59. package/dist/esm/chunks/chunk-24KD36UC.js +0 -1
  60. package/dist/esm/chunks/chunk-2G6U6ZYV.js +0 -1
  61. package/dist/esm/chunks/chunk-A6BZFYZY.js +0 -1
  62. package/dist/esm/chunks/chunk-EYG7QGPA.js +0 -1
  63. package/dist/esm/chunks/chunk-FX7EJ6RB.js +0 -1
  64. package/dist/esm/chunks/chunk-PZERNTCD.js +0 -1
  65. package/dist/esm/chunks/chunk-SJNNEEDX.js +0 -1
  66. package/dist/esm/chunks/lists-XF33XENI.js +0 -1
  67. package/dist/esm/chunks/search-ZLKIFARH.js +0 -1
package/dist/tether.js CHANGED
@@ -313,22 +313,29 @@
313
313
  debug: false
314
314
  };
315
315
  var cfg = { ...DEFAULTS };
316
+ function refuseChange(key) {
317
+ warn(`Tether.config is read-only (${String(key)}): pass options to Tether.init() instead`);
318
+ return false;
319
+ }
320
+ var readOnlyViews = /* @__PURE__ */ new WeakMap();
321
+ var READ_ONLY = {
322
+ get(object, key) {
323
+ const value = Reflect.get(object, key);
324
+ return typeof value === "object" && value !== null ? readOnlyView(value) : value;
325
+ },
326
+ set: (_object, key) => refuseChange(key),
327
+ deleteProperty: (_object, key) => refuseChange(key),
328
+ defineProperty: (_object, key) => refuseChange(key)
329
+ };
316
330
  function readOnlyView(target) {
317
- const refuse = (key) => {
318
- warn(`Tether.config is read-only (${String(key)}): pass options to Tether.init() instead`);
319
- return false;
320
- };
321
- return new Proxy(target, {
322
- get(object, key) {
323
- const value = Reflect.get(object, key);
324
- return typeof value === "object" && value !== null ? readOnlyView(value) : value;
325
- },
326
- set: (_object, key) => refuse(key),
327
- deleteProperty: (_object, key) => refuse(key),
328
- defineProperty: (_object, key) => refuse(key)
329
- });
331
+ let view = readOnlyViews.get(target);
332
+ if (!view) {
333
+ view = new Proxy(target, READ_ONLY);
334
+ readOnlyViews.set(target, view);
335
+ }
336
+ return view;
330
337
  }
331
- var configView = readOnlyView(cfg);
338
+ var configView = new Proxy(cfg, READ_ONLY);
332
339
  var PREFIX = /^[a-z][a-z0-9-]*$/;
333
340
  var SWITCH_OPTIONS = [
334
341
  "revalidate",
@@ -1168,13 +1175,33 @@
1168
1175
  }
1169
1176
  el.style.display = "none";
1170
1177
  }
1178
+ var CHECKABLE = 'input[type="radio"],input[type="checkbox"]';
1179
+ var CHECKED_ROLES = ["radio", "checkbox", "switch", "menuitemradio", "menuitemcheckbox"];
1180
+ var BUTTON_INPUTS = ["button", "submit", "reset"];
1181
+ function chosenState(el) {
1182
+ const role = el.getAttribute("role");
1183
+ if (role === "button") return "aria-pressed";
1184
+ if (role && CHECKED_ROLES.includes(role)) return "aria-checked";
1185
+ if (role === "option" || role === "tab") return "aria-selected";
1186
+ if (role) return null;
1187
+ if (isInput(el)) return BUTTON_INPUTS.includes(el.type) ? "aria-pressed" : null;
1188
+ return el.querySelector(CHECKABLE) ? null : "aria-pressed";
1189
+ }
1171
1190
  function setSelected(el, selected) {
1172
1191
  el.classList.toggle("is-selected", selected);
1173
- el.setAttribute("aria-pressed", selected ? "true" : "false");
1174
- if (isInput(el) && (el.type === "radio" || el.type === "checkbox")) el.checked = selected;
1175
- const input = el.querySelector('input[type="radio"],input[type="checkbox"]');
1192
+ const state = chosenState(el);
1193
+ if (state === "aria-pressed" && el.tagName !== "BUTTON" && !isInput(el)) el.setAttribute("role", "button");
1194
+ if (state) el.setAttribute(state, String(selected));
1195
+ if (isInput(el) && el.matches(CHECKABLE)) el.checked = selected;
1196
+ const input = el.querySelector(CHECKABLE);
1176
1197
  if (input && isInput(input)) input.checked = selected;
1177
1198
  }
1199
+ function setUnavailable(el, unavailable) {
1200
+ el.classList.toggle("is-unavailable", unavailable);
1201
+ const isControl = chosenState(el) !== null || isInput(el);
1202
+ const control = isControl ? el : el.querySelector(CHECKABLE);
1203
+ control?.setAttribute("aria-disabled", String(unavailable));
1204
+ }
1178
1205
  var layoutTimer;
1179
1206
  var pageGlobal = (name) => Reflect.get(window, name);
1180
1207
  function refreshScrollTrigger() {
@@ -1475,28 +1502,43 @@
1475
1502
  var FOCUSABLE = 'a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex="-1"])';
1476
1503
  var FOCUS_AFTER_OPEN_MS = 60;
1477
1504
  var openWithoutDrawer = false;
1505
+ var announcedOpen = false;
1478
1506
  var returnFocus = null;
1507
+ var classWatcher = null;
1479
1508
  var isFocusable = (el) => el !== null && "focus" in el;
1480
1509
  var focusables = (drawer) => qsa(drawer, FOCUSABLE).filter((el) => el.offsetParent !== null || el === document.activeElement);
1481
1510
  var drawers = () => qsa(document, sel("cart-drawer"));
1482
1511
  var isOpenDrawer = (drawer) => drawer.classList.contains(cfg.cartDrawerOpenClass);
1512
+ var hasFocusInside = (all) => all.some((drawer) => drawer.contains(document.activeElement));
1513
+ var isManual = (drawer) => get(drawer, "cart-drawer") === "manual";
1483
1514
  function isOpen() {
1484
1515
  const all = drawers();
1485
1516
  return all.length ? all.some(isOpenDrawer) : openWithoutDrawer;
1486
1517
  }
1487
- function syncDrawerAria(open) {
1518
+ function watchOpenClass(drawer) {
1519
+ classWatcher ?? (classWatcher = new MutationObserver(() => {
1520
+ const open = isOpen();
1521
+ if (open === announcedOpen) return;
1522
+ const all = drawers();
1523
+ if (open) announceOpen(all.filter(isOpenDrawer));
1524
+ else announceClosed(all, hasFocusInside(all));
1525
+ }));
1526
+ classWatcher.observe(drawer, { attributes: true, attributeFilter: ["class"] });
1527
+ }
1528
+ function syncDrawerAria() {
1488
1529
  qsa(document, sel("cart-open")).forEach((button) => {
1489
- button.setAttribute("aria-expanded", String(open));
1530
+ button.setAttribute("aria-expanded", String(isOpen()));
1490
1531
  });
1491
1532
  drawers().forEach((drawer) => {
1492
1533
  if (!drawer.hasAttribute("role")) drawer.setAttribute("role", "dialog");
1493
1534
  if (!drawer.hasAttribute("aria-label") && !drawer.hasAttribute("aria-labelledby")) {
1494
1535
  drawer.setAttribute("aria-label", get(drawer, "cart-label") || "Cart");
1495
1536
  }
1537
+ const open = isOpenDrawer(drawer);
1496
1538
  drawer.setAttribute("aria-modal", String(open));
1497
- if (isOpenDrawer(drawer)) return;
1498
- drawer.setAttribute("aria-hidden", "true");
1499
- if (cfg.cartFocus) drawer.inert = true;
1539
+ drawer.setAttribute("aria-hidden", String(!open));
1540
+ drawer.inert = !open;
1541
+ watchOpenClass(drawer);
1500
1542
  });
1501
1543
  }
1502
1544
  function focusInto(drawer) {
@@ -1504,16 +1546,9 @@
1504
1546
  if (target === drawer && !drawer.hasAttribute("tabindex")) drawer.tabIndex = -1;
1505
1547
  target.focus({ preventScroll: true });
1506
1548
  }
1507
- function openCart() {
1508
- if (isOpen()) return;
1509
- openWithoutDrawer = true;
1510
- const opened = drawers().filter((drawer) => get(drawer, "cart-drawer") !== "manual");
1511
- opened.forEach((drawer) => {
1512
- drawer.inert = false;
1513
- drawer.classList.add(cfg.cartDrawerOpenClass);
1514
- drawer.setAttribute("aria-hidden", "false");
1515
- });
1516
- syncDrawerAria(true);
1549
+ function announceOpen(opened) {
1550
+ announcedOpen = true;
1551
+ syncDrawerAria();
1517
1552
  const [first] = opened;
1518
1553
  if (cfg.cartFocus && first) {
1519
1554
  returnFocus = isFocusable(document.activeElement) ? document.activeElement : null;
@@ -1524,21 +1559,34 @@
1524
1559
  cfg.onCartOpen?.(opened);
1525
1560
  emit("cart-toggled", { open: true });
1526
1561
  }
1562
+ function announceClosed(all, hadFocus) {
1563
+ announcedOpen = false;
1564
+ syncDrawerAria();
1565
+ if (hadFocus && returnFocus?.isConnected) returnFocus.focus({ preventScroll: true });
1566
+ returnFocus = null;
1567
+ cfg.onCartClose?.(all);
1568
+ emit("cart-toggled", { open: false });
1569
+ }
1570
+ function openCart() {
1571
+ if (isOpen()) return;
1572
+ const all = drawers();
1573
+ const opened = all.filter((drawer) => !isManual(drawer));
1574
+ if (all.length && !opened.length) return;
1575
+ openWithoutDrawer = true;
1576
+ opened.forEach((drawer) => {
1577
+ drawer.classList.add(cfg.cartDrawerOpenClass);
1578
+ });
1579
+ announceOpen(opened);
1580
+ }
1527
1581
  function closeCart() {
1528
1582
  if (!isOpen()) return;
1529
1583
  openWithoutDrawer = false;
1530
1584
  const all = drawers();
1531
- const hadFocus = all.some((drawer) => drawer.contains(document.activeElement));
1585
+ const hadFocus = hasFocusInside(all);
1532
1586
  all.forEach((drawer) => {
1533
1587
  drawer.classList.remove(cfg.cartDrawerOpenClass);
1534
- drawer.setAttribute("aria-hidden", "true");
1535
- if (cfg.cartFocus) drawer.inert = true;
1536
1588
  });
1537
- syncDrawerAria(false);
1538
- if (hadFocus && returnFocus?.isConnected) returnFocus.focus({ preventScroll: true });
1539
- returnFocus = null;
1540
- cfg.onCartClose?.(all);
1541
- emit("cart-toggled", { open: false });
1589
+ announceClosed(all, hadFocus);
1542
1590
  }
1543
1591
  function toggleCart() {
1544
1592
  if (isOpen()) closeCart();
@@ -2010,7 +2058,7 @@
2010
2058
  function renderCart(view) {
2011
2059
  const { cart } = view;
2012
2060
  const money = (key) => cart ? formatMoney2(cart.cost[key]) : "";
2013
- syncDrawerAria(isOpen());
2061
+ syncDrawerAria();
2014
2062
  qsa(document, sel("cart-count")).forEach((el) => {
2015
2063
  setTextTracked(el, cart?.totalQuantity ?? 0);
2016
2064
  });
@@ -2323,14 +2371,23 @@
2323
2371
  } catch {
2324
2372
  }
2325
2373
  }
2326
- async function checkout(target = cfg.checkoutTarget) {
2327
- const cartId = savedCartId();
2374
+ function cartToCheckOut() {
2328
2375
  const cart = currentCart();
2329
- if (!cartId || cart && !cart.totalQuantity) return null;
2376
+ return cart && !cart.totalQuantity ? null : savedCartId();
2377
+ }
2378
+ async function checkout(target = cfg.checkoutTarget) {
2379
+ if (!cartToCheckOut()) return null;
2330
2380
  const tab = target === "_blank" ? window.open("", "_blank") : null;
2331
2381
  if (tab) detachOpenerIfAllowed(tab);
2332
2382
  try {
2333
- const url2 = await checkoutUrl(cartId);
2383
+ const url2 = await runInOrder(async () => {
2384
+ const cartId = cartToCheckOut();
2385
+ return cartId && checkoutUrl(cartId);
2386
+ });
2387
+ if (!url2) {
2388
+ tab?.close();
2389
+ return null;
2390
+ }
2334
2391
  if (!isHttpsUrl(url2)) throw new TetherError("The checkout URL is not https: not opened");
2335
2392
  emit("checkout", { url: url2, cart: currentCart() });
2336
2393
  if (tab && !tab.closed) tab.location.href = url2;
@@ -2573,7 +2630,8 @@
2573
2630
  *
2574
2631
  * @throws {TetherError} `INVALID_DISCOUNT` (rejected) when Shopify doesn't accept the code.
2575
2632
  */
2576
- async applyDiscount(code) {
2633
+ async applyDiscount(typed) {
2634
+ const code = typed.trim();
2577
2635
  const cart = await Cart.setDiscountCodes((current) => [.../* @__PURE__ */ new Set([...current, code])]);
2578
2636
  const wanted = code.toLowerCase();
2579
2637
  const applied = (cart?.discountCodes ?? []).find((discount) => discount.code.toLowerCase() === wanted);
@@ -2586,7 +2644,7 @@
2586
2644
  throw new TetherError(`Discount code not valid: ${code}`, { code: "INVALID_DISCOUNT" });
2587
2645
  },
2588
2646
  removeDiscount(code) {
2589
- const unwanted = code.toLowerCase();
2647
+ const unwanted = code.trim().toLowerCase();
2590
2648
  return Cart.setDiscountCodes((current) => current.filter((existing) => existing.toLowerCase() !== unwanted));
2591
2649
  },
2592
2650
  /**
@@ -2844,7 +2902,7 @@
2844
2902
  const value = get(node, "option-value") ?? "";
2845
2903
  setSelected(node, view.selected[name] === value);
2846
2904
  const unavailable = !isValueAvailable(product, view.selected, name, value);
2847
- node.classList.toggle("is-unavailable", unavailable);
2905
+ setUnavailable(node, unavailable);
2848
2906
  node.setAttribute("data-unavailable", unavailable ? "true" : "false");
2849
2907
  });
2850
2908
  });
@@ -2864,13 +2922,12 @@
2864
2922
  }
2865
2923
  const mode = get(el, "purchase");
2866
2924
  setSelected(el, mode === purchase.kind);
2867
- const unavailable = mode === "subscription" ? !view.subscriptionAvailable : scope.product.requiresSellingPlan;
2868
- el.classList.toggle("is-unavailable", unavailable);
2925
+ setUnavailable(el, mode === "subscription" ? !view.subscriptionAvailable : scope.product.requiresSellingPlan);
2869
2926
  });
2870
2927
  scope.$(sel("plan-value")).forEach((node) => {
2871
2928
  const planId = get(node, "plan-value") ?? "";
2872
2929
  setSelected(node, line.kind === "subscription" && planId === line.planId);
2873
- node.classList.toggle("is-unavailable", !allocationFor(variant, planId));
2930
+ setUnavailable(node, !allocationFor(variant, planId));
2874
2931
  const plan = scope.plans.find((candidate) => candidate.id === planId);
2875
2932
  const texts = planBindTexts(variant, planId, plan, FORMAT);
2876
2933
  qsa(node, sel("plan-bind")).forEach((el) => {
@@ -3264,7 +3321,12 @@
3264
3321
  function applyPageTitle(el, product) {
3265
3322
  const template = get(el, "page-title");
3266
3323
  if (!template || typeof document === "undefined") return;
3267
- document.title = template.replace(/\{title\}/g, product.title).replace(/\{vendor\}/g, product.vendor || "").replace(/\{type\}/g, product.productType || "");
3324
+ const fields = /* @__PURE__ */ new Map([
3325
+ ["title", product.title],
3326
+ ["vendor", product.vendor || ""],
3327
+ ["type", product.productType || ""]
3328
+ ]);
3329
+ document.title = template.replace(/\{(\w+)\}/g, (placeholder, name) => fields.get(name) ?? placeholder);
3268
3330
  }
3269
3331
  function mountWithoutKey(el, { fromUrl, raw }) {
3270
3332
  if (fromUrl) {
@@ -3481,7 +3543,7 @@
3481
3543
  }
3482
3544
 
3483
3545
  // src/part-integrity.ts
3484
- var PART_INTEGRITY = { "tether.diagnose.js": "sha384-V4pclvaqH/qR/arn2rEkiL09rESoS1Z5AEE01ZSaFNlDU+sXXpOhKprwno6MT998", "tether.markets.js": "sha384-5wg1XGIKHX3Q4SX9E1xoYiJT653F0uCs7WCJ36Rf+YX6o1VJhuK6m59ZuUuqgxXw", "tether.search.js": "sha384-KMmZKdaQq6+LzU7kFva2DYZ7dh425RhHClXfVPHp8dNDGn1eG2UEMuPooowJOQtt", "tether.lists.js": "sha384-L/+3bMN1EifET4EcFWBk5IAFywRaC0uilAX3eYLeGqmX9zkPFjS/SvVSklpRwSSA", "tether.extras.js": "sha384-/SMjz6qCFAOV0wwvEVNhQxtT/1pyx4hRxDJHOxHB6M3uclAvItSULKZqJvaehH+i", "tether.account.js": "sha384-CVXd+K/5Wc9mSdfMM6cE1BYN4kjFWCXpEfoLq/jU0zy1C+V4SXfyTCyXloVFMMs7", "tether.account-pages.js": "sha384-bUUsp/0dKGSGzjctzF1FgLcCvgBGh+wQw95IhbjU+ckMo78vzetzlI2+QuNQugaI", "tether.analytics.js": "sha384-DBXy5gOU7crMr0xSS4TjnZN1Q8Slz3h18Ih/jLBjwYRVFE1fGzdR9PBuHnKOxc0E" };
3546
+ var PART_INTEGRITY = { "tether.diagnose.js": "sha384-CqtXzvWbLD8aIgyTM43+KMXEFA7r7lhG+0XyQAw3Sp7B5qrzPsxlA9QfzBjoPqZz", "tether.markets.js": "sha384-WjowbRhM7OzzZOrCPZWSZqN7EjIiiR7u9cGmdI+9kgFVgmEQS8lVGWjgx+8jILOf", "tether.search.js": "sha384-fLQ7eKc5XOv0Cg2FfrZyeFAkRR4wDMjUWFpwvKrfPRnT2NvTuhKg80+KVu8Qce/G", "tether.lists.js": "sha384-l2uyr96zTetjo2WWhGsBamd1ZYkC3OB3G3+OScLEvxdok0c8k9GXLAh1WRALUr4S", "tether.extras.js": "sha384-/SMjz6qCFAOV0wwvEVNhQxtT/1pyx4hRxDJHOxHB6M3uclAvItSULKZqJvaehH+i", "tether.account.js": "sha384-XUPSX/7R9chq2KlQ1RzLiV7jYcWGe7o5tj4rLZMnf8MEa2aDOOCW2269Bj/ZkbmX", "tether.account-pages.js": "sha384-ND3kIaRypgnHG3QMDb8CqDxt7fuukDCdHsIAHoOUUsz3+FjvBqXgRDV4Mjp6x8jr", "tether.analytics.js": "sha384-jnLesn/+edWBSPuXLj7VX1kSAGwEqtb0VbHjuU//ofqgxkndHlDFsS8Bc8htlGt8" };
3485
3547
 
3486
3548
  // src/part-registry.ts
3487
3549
  function isTetherInternals(value) {
@@ -3489,7 +3551,7 @@
3489
3551
  }
3490
3552
 
3491
3553
  // src/version.ts
3492
- var VERSION = "0.9.3";
3554
+ var VERSION = "0.9.4";
3493
3555
 
3494
3556
  // src/lazy-iife.ts
3495
3557
  var coreModules = {
@@ -3497,7 +3559,7 @@
3497
3559
  return [cfg, isConfigured, log, MARKET_SOURCES, parseMarkets, reportError, warn];
3498
3560
  },
3499
3561
  get "client.ts"() {
3500
- return [endpoint, gql, matches, orNull, shaped, TetherError];
3562
+ return [endpoint, gql, matches, orNull, shaped, TetherError, withTimeout];
3501
3563
  },
3502
3564
  get "dom.ts"() {
3503
3565
  return [
@@ -3647,6 +3709,23 @@
3647
3709
  };
3648
3710
  }
3649
3711
 
3712
+ // src/analytics-queue.ts
3713
+ function queueAnalyticsEvents(load) {
3714
+ const queue = [];
3715
+ const listening = new window.AbortController();
3716
+ const options = { signal: listening.signal };
3717
+ ANALYTICS_EVENTS.forEach((name) => {
3718
+ document.addEventListener(`${cfg.prefix}:${name}`, (event) => queue.push(event), options);
3719
+ });
3720
+ document.addEventListener("astro:page-load", (event) => queue.push(event), options);
3721
+ load().then((part) => part.startAnalytics(queue)).catch((error) => {
3722
+ listening.abort();
3723
+ queue.length = 0;
3724
+ reportError(error, "analytics");
3725
+ });
3726
+ return queue;
3727
+ }
3728
+
3650
3729
  // src/account-marks.ts
3651
3730
  var hintKey = () => `${cfg.prefix}:account-hint:${cfg.domain}`;
3652
3731
  function removeFromBothAreas(key) {
@@ -3777,12 +3856,21 @@
3777
3856
  line.setAttribute("aria-busy", "true");
3778
3857
  reportFailure(change, context);
3779
3858
  }
3859
+ function onQuantityInput(input, { line, id }) {
3860
+ const typed = input.value.trim();
3861
+ if (INTEGER_TEXT.test(typed)) {
3862
+ showLineBusy(line, Cart.updateLine(id, Number(typed)), "cart line");
3863
+ return;
3864
+ }
3865
+ const current = Cart.lines.find((candidate) => candidate.id === id);
3866
+ if (current) input.value = String(Cart.quantityOf(current));
3867
+ }
3780
3868
  function onChange2(event) {
3781
3869
  const { target } = event;
3782
3870
  if (!isElement2(target)) return;
3783
3871
  const found = lineOf(target);
3784
3872
  if (found && target instanceof window.HTMLInputElement && target.matches(sel("line", "quantity"))) {
3785
- showLineBusy(found.line, Cart.updateLine(found.id, parseInt(target.value, 10) || 0), "cart line");
3873
+ onQuantityInput(target, found);
3786
3874
  } else if (found && target instanceof window.HTMLSelectElement && target.matches(sel("line-plan"))) {
3787
3875
  showLineBusy(found.line, Cart.updateLine(found.id, { sellingPlanId: target.value || null }), "cart line plan");
3788
3876
  } else if (hasValue(target) && target.matches(sel("cart-note"))) {
@@ -4033,17 +4121,6 @@
4033
4121
  bindExtrasControls();
4034
4122
  bindNavigation({ ready: () => initPromise ?? Promise.resolve(null), mount, unmount });
4035
4123
  }
4036
- function startAnalyticsQueue() {
4037
- const queue = [];
4038
- analyticsQueue = queue;
4039
- ANALYTICS_EVENTS.forEach((name) => {
4040
- document.addEventListener(`${cfg.prefix}:${name}`, (event) => queue.push(event));
4041
- });
4042
- document.addEventListener("astro:page-load", (event) => queue.push(event));
4043
- loadPart("analytics").then((part) => part.startAnalytics(queue)).catch((error) => {
4044
- reportError(error, "analytics");
4045
- });
4046
- }
4047
4124
  async function cartInPageMarket(cart) {
4048
4125
  const country = cfg.country;
4049
4126
  const cartCountry = cart?.buyerIdentity.countryCode;
@@ -4066,7 +4143,7 @@
4066
4143
  forgetBrowserModeTokens();
4067
4144
  bindControls();
4068
4145
  if (cfg.observe) startObserver();
4069
- if (cfg.analytics && !analyticsQueue) startAnalyticsQueue();
4146
+ if (cfg.analytics) analyticsQueue ?? (analyticsQueue = queueAnalyticsEvents(() => loadPart("analytics")));
4070
4147
  initPromise = applyStartMarket(overrides).then(() => Cart.init()).then(cartInPageMarket).then((cart) => {
4071
4148
  emit("ready", { cart });
4072
4149
  return api;
@@ -21,7 +21,7 @@
21
21
 
22
22
  // tether-core:client.ts
23
23
  var m2 = window.Tether.__core["client.ts"];
24
- var [endpoint, gql, matches, orNull, shaped, TetherError] = m2;
24
+ var [endpoint, gql, matches, orNull, shaped, TetherError, withTimeout] = m2;
25
25
 
26
26
  // tether-core:dom.ts
27
27
  var m3 = window.Tether.__core["dom.ts"];
@@ -1 +1 @@
1
- (()=>{var b=Object.defineProperty;var rt=(e,t,o)=>t in e?b(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o;var nt=(e,t)=>{for(var o in t)b(e,o,{get:t[o],enumerable:!0})};var a=(e,t,o)=>rt(e,typeof t!="symbol"?t+"":t,o);var O={};nt(O,{getProducts:()=>X,getRecommendations:()=>G,loadList:()=>yt});var st=window.Tether.__core["config.ts"],[P,Et,xt,It,Ct,A,Nt]=st;var it=window.Tether.__core["client.ts"],[$t,l,ct,T,u,E]=it;var at=window.Tether.__core["dom.ts"],[kt,x,Ot,L,p,St,bt,s,m,At,M,Lt,K,Mt,Kt,Ut,U,F,c,q,v,I,f]=at;var dt=window.Tether.__core["fragments.ts"],[D]=dt;var lt=window.Tether.__core["loader.ts"],[vt,Dt,H,h,g]=lt;function d(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var C={amount:"string",currencyCode:"string"},Q={id:"string",handle:"string",title:"string",options:["object"],images:{nodes:["object"]},priceRange:{minVariantPrice:C,maxVariantPrice:C},variants:{nodes:[{id:"string",price:C,selectedOptions:["object"]}]}},Y={nodes:[Q],pageInfo:{hasNextPage:"boolean"}};var j=u({collection:T({handle:"string",products:Y})}),z=u({products:Y}),B=u({productRecommendations:T([Q])});var ut=window.Tether.__core["status.ts"],[Vt,N,R,$]=ut;var pt=window.Tether.__core["collection.ts"],[_]=pt;var mt=window.Tether.__core["shopify-values.ts"],[Jt,V]=mt;var W="url:",ft=`query TetherCollection($handle:String!,$first:Int!,$after:String,$sortKey:ProductCollectionSortKeys,$reverse:Boolean,$filters:[ProductFilter!]){collection(handle:$handle){${D()} products(first:$first,after:$after,sortKey:$sortKey,reverse:$reverse,filters:$filters){nodes{...TetherProduct}pageInfo{hasNextPage endCursor}}}}`,ht="query TetherSearch($first:Int!,$after:String,$query:String,$sortKey:ProductSortKeys,$reverse:Boolean){products(first:$first,after:$after,query:$query,sortKey:$sortKey,reverse:$reverse){nodes{...TetherProduct}pageInfo{hasNextPage endCursor}}}";async function X({collection:e,query:t,first:o=P.collectionFirst,after:r=null,sortKey:n,reverse:i=!1,filters:et}={}){if(e){let S=await l(g(ft),{handle:e,first:o,after:r,sortKey:n||void 0,reverse:i,filters:et??void 0},j);if(!S.collection)throw new E(`Collection not found: ${e}`,{code:"NOT_FOUND"});let{products:y,...ot}=S.collection;return y.nodes.forEach(h),{collection:ot,products:y.nodes,pageInfo:y.pageInfo}}let w=await l(g(ht),{first:o,after:r,query:t||void 0,sortKey:n||void 0,reverse:i},z);return w.products.nodes.forEach(h),{collection:null,products:w.products.nodes,pageInfo:w.products.pageInfo}}async function G(e,t="RELATED"){let o=H(typeof e=="object"?e?.id:e);if(!o)throw new E("No product for recommendations",{code:"NOT_FOUND"});let r=o.startsWith("gid://"),i=(await l(g(`query TetherRecs(${r?"$id: ID!":"$handle: String!"},$intent:ProductRecommendationIntent){productRecommendations(${r?"productId: $id":"productHandle: $handle"},intent:$intent){...TetherProduct}}`),r?{id:o,intent:t}:{handle:o,intent:t},B)).productRecommendations??[];return i.forEach(h),i}var gt=e=>e instanceof window.Element,Z=(e,t)=>M(e,"limit",{min:1,max:V,fallback:t}),wt=e=>e==="COMPLEMENTARY"?"COMPLEMENTARY":"RELATED",k=class{constructor(t){a(this,"root");a(this,"products",[]);a(this,"pageInfo",null);a(this,"collection",null);a(this,"loadToken",0);this.root=t,t.addEventListener("click",o=>{if(!gt(o.target))return;let r=o.target.closest(c("load-more"));r?.closest(_())===t&&(o.preventDefault(),L(r,()=>this.load(!0)))})}$(t){return F(this.root,t,_())}options(){let{root:t}=this,o={reverse:s(t,"reverse")==="true",first:Z(t,P.collectionFirst)},r=s(t,"sort");if(r&&(o.sortKey=r),m(t,"collection"))return o.collection=s(t,"collection")??"",o;let n=s(t,"products")??"";return o.query=n.startsWith(W)?new URL(window.location.href).searchParams.get(n.slice(W.length))||"":n,o}async loadRecommendations(){let{key:t}=R(this.root,window.location,"recommendations"),o=this.root.closest(c("product"));return!t&&o&&({key:t}=R(o)),G(t,wt(s(this.root,"intent")))}async load(t=!1){this.loadToken+=1;let o=this.loadToken,r=()=>o!==this.loadToken;try{if(m(this.root,"recommendations")){let n=await this.loadRecommendations();if(r())return;this.products=n.slice(0,Z(this.root,n.length))}else{let n=await X({...this.options(),after:t?this.pageInfo?.endCursor??null:null});if(r())return;this.collection=n.collection,this.pageInfo=n.pageInfo,this.products=t?[...this.products,...n.products]:n.products}this.render(),$(this.root,"ready"),p("list-ready",{products:this.products,collection:this.collection},this.root)}catch(n){if(r())return;t||$(this.root,N(n)?"not-found":"error",n),N(n)&&m(this.root,"recommendations")||A(n,"list load failed"),p("error",{error:n,context:"list"},this.root)}}render(){let{collection:t}=this;this.$(c("collection-bind")).forEach(r=>{switch(s(r,"collection-bind")??""){case"title":I(r,t?.title??"");break;case"description":v(r,t?.descriptionHtml);break;case"image":q(r,t?.image?.url,t?.image?.altText||t?.title);break;case"count":I(r,this.products.length);break}}),this.$(c("list")).forEach(r=>{U(r,this.products,(n,i)=>{n.setAttribute(x("product"),i.handle),n.removeAttribute(x("state"))}),p("list-rendered",{container:r},this.root)});let o=this.products.length===0;this.$(c("show")).forEach(r=>{let n=s(r,"show");n==="list-empty"&&f(r,o),n==="list-filled"&&f(r,!o)}),this.$(c("load-more")).forEach(r=>{f(r,!!this.pageInfo?.hasNextPage)}),K("list")}},J=new WeakMap;function yt(e){let t=J.get(e);return t||(t=new k(e),J.set(e,t)),t.load()}function Pt(e){return d(e)&&d(e.__core)&&d(e.__parts)}function tt(e,t){let o=Reflect.get(window,"Tether");if(!Pt(o))throw new Error(`tether.${e}.js runs after the Tether script, which loads it, and needs its window.Tether`);o.__parts[e]=t}tt("lists",O);})();
1
+ (()=>{var b=Object.defineProperty;var rt=(e,t,o)=>t in e?b(e,t,{enumerable:!0,configurable:!0,writable:!0,value:o}):e[t]=o;var nt=(e,t)=>{for(var o in t)b(e,o,{get:t[o],enumerable:!0})};var a=(e,t,o)=>rt(e,typeof t!="symbol"?t+"":t,o);var O={};nt(O,{getProducts:()=>X,getRecommendations:()=>G,loadList:()=>yt});var st=window.Tether.__core["config.ts"],[P,Et,xt,It,Ct,A,Nt]=st;var it=window.Tether.__core["client.ts"],[$t,l,ct,T,u,E,_t]=it;var at=window.Tether.__core["dom.ts"],[Ot,x,St,L,m,bt,At,s,p,Lt,M,Mt,K,Kt,Ut,Ft,U,F,c,q,v,I,f]=at;var dt=window.Tether.__core["fragments.ts"],[D]=dt;var lt=window.Tether.__core["loader.ts"],[Dt,Ht,H,h,g]=lt;function d(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}var C={amount:"string",currencyCode:"string"},Q={id:"string",handle:"string",title:"string",options:["object"],images:{nodes:["object"]},priceRange:{minVariantPrice:C,maxVariantPrice:C},variants:{nodes:[{id:"string",price:C,selectedOptions:["object"]}]}},Y={nodes:[Q],pageInfo:{hasNextPage:"boolean"}};var j=u({collection:T({handle:"string",products:Y})}),z=u({products:Y}),B=u({productRecommendations:T([Q])});var ut=window.Tether.__core["status.ts"],[Wt,N,R,$]=ut;var mt=window.Tether.__core["collection.ts"],[_]=mt;var pt=window.Tether.__core["shopify-values.ts"],[Xt,V]=pt;var W="url:",ft=`query TetherCollection($handle:String!,$first:Int!,$after:String,$sortKey:ProductCollectionSortKeys,$reverse:Boolean,$filters:[ProductFilter!]){collection(handle:$handle){${D()} products(first:$first,after:$after,sortKey:$sortKey,reverse:$reverse,filters:$filters){nodes{...TetherProduct}pageInfo{hasNextPage endCursor}}}}`,ht="query TetherSearch($first:Int!,$after:String,$query:String,$sortKey:ProductSortKeys,$reverse:Boolean){products(first:$first,after:$after,query:$query,sortKey:$sortKey,reverse:$reverse){nodes{...TetherProduct}pageInfo{hasNextPage endCursor}}}";async function X({collection:e,query:t,first:o=P.collectionFirst,after:r=null,sortKey:n,reverse:i=!1,filters:et}={}){if(e){let S=await l(g(ft),{handle:e,first:o,after:r,sortKey:n||void 0,reverse:i,filters:et??void 0},j);if(!S.collection)throw new E(`Collection not found: ${e}`,{code:"NOT_FOUND"});let{products:y,...ot}=S.collection;return y.nodes.forEach(h),{collection:ot,products:y.nodes,pageInfo:y.pageInfo}}let w=await l(g(ht),{first:o,after:r,query:t||void 0,sortKey:n||void 0,reverse:i},z);return w.products.nodes.forEach(h),{collection:null,products:w.products.nodes,pageInfo:w.products.pageInfo}}async function G(e,t="RELATED"){let o=H(typeof e=="object"?e?.id:e);if(!o)throw new E("No product for recommendations",{code:"NOT_FOUND"});let r=o.startsWith("gid://"),i=(await l(g(`query TetherRecs(${r?"$id: ID!":"$handle: String!"},$intent:ProductRecommendationIntent){productRecommendations(${r?"productId: $id":"productHandle: $handle"},intent:$intent){...TetherProduct}}`),r?{id:o,intent:t}:{handle:o,intent:t},B)).productRecommendations??[];return i.forEach(h),i}var gt=e=>e instanceof window.Element,Z=(e,t)=>M(e,"limit",{min:1,max:V,fallback:t}),wt=e=>e==="COMPLEMENTARY"?"COMPLEMENTARY":"RELATED",k=class{constructor(t){a(this,"root");a(this,"products",[]);a(this,"pageInfo",null);a(this,"collection",null);a(this,"loadToken",0);this.root=t,t.addEventListener("click",o=>{if(!gt(o.target))return;let r=o.target.closest(c("load-more"));r?.closest(_())===t&&(o.preventDefault(),L(r,()=>this.load(!0)))})}$(t){return F(this.root,t,_())}options(){let{root:t}=this,o={reverse:s(t,"reverse")==="true",first:Z(t,P.collectionFirst)},r=s(t,"sort");if(r&&(o.sortKey=r),p(t,"collection"))return o.collection=s(t,"collection")??"",o;let n=s(t,"products")??"";return o.query=n.startsWith(W)?new URL(window.location.href).searchParams.get(n.slice(W.length))||"":n,o}async loadRecommendations(){let{key:t}=R(this.root,window.location,"recommendations"),o=this.root.closest(c("product"));return!t&&o&&({key:t}=R(o)),G(t,wt(s(this.root,"intent")))}async load(t=!1){this.loadToken+=1;let o=this.loadToken,r=()=>o!==this.loadToken;try{if(p(this.root,"recommendations")){let n=await this.loadRecommendations();if(r())return;this.products=n.slice(0,Z(this.root,n.length))}else{let n=await X({...this.options(),after:t?this.pageInfo?.endCursor??null:null});if(r())return;this.collection=n.collection,this.pageInfo=n.pageInfo,this.products=t?[...this.products,...n.products]:n.products}this.render(),$(this.root,"ready"),m("list-ready",{products:this.products,collection:this.collection},this.root)}catch(n){if(r())return;t||$(this.root,N(n)?"not-found":"error",n),N(n)&&p(this.root,"recommendations")||A(n,"list load failed"),m("error",{error:n,context:"list"},this.root)}}render(){let{collection:t}=this;this.$(c("collection-bind")).forEach(r=>{switch(s(r,"collection-bind")??""){case"title":I(r,t?.title??"");break;case"description":v(r,t?.descriptionHtml);break;case"image":q(r,t?.image?.url,t?.image?.altText||t?.title);break;case"count":I(r,this.products.length);break}}),this.$(c("list")).forEach(r=>{U(r,this.products,(n,i)=>{n.setAttribute(x("product"),i.handle),n.removeAttribute(x("state"))}),m("list-rendered",{container:r},this.root)});let o=this.products.length===0;this.$(c("show")).forEach(r=>{let n=s(r,"show");n==="list-empty"&&f(r,o),n==="list-filled"&&f(r,!o)}),this.$(c("load-more")).forEach(r=>{f(r,!!this.pageInfo?.hasNextPage)}),K("list")}},J=new WeakMap;function yt(e){let t=J.get(e);return t||(t=new k(e),J.set(e,t)),t.load()}function Pt(e){return d(e)&&d(e.__core)&&d(e.__parts)}function tt(e,t){let o=Reflect.get(window,"Tether");if(!Pt(o))throw new Error(`tether.${e}.js runs after the Tether script, which loads it, and needs its window.Tether`);o.__parts[e]=t}tt("lists",O);})();
@@ -20,7 +20,7 @@
20
20
 
21
21
  // tether-core:client.ts
22
22
  var m2 = window.Tether.__core["client.ts"];
23
- var [endpoint, gql, matches, orNull, shaped, TetherError] = m2;
23
+ var [endpoint, gql, matches, orNull, shaped, TetherError, withTimeout] = m2;
24
24
 
25
25
  // tether-core:cart.ts
26
26
  var m3 = window.Tether.__core["cart.ts"];
@@ -1 +1 @@
1
- (()=>{var G=Object.defineProperty;var V=(e,t)=>{for(var n in t)G(e,n,{get:t[n],enumerable:!0})};var b={};V(b,{detectMarket:()=>K,getLocalization:()=>J,renderCountrySelects:()=>L,setCountry:()=>Ee});var Z=window.Tether.__core["config.ts"],[i,Ae,Ne,M,S,C,ve]=Z;var Q=window.Tether.__core["client.ts"],[Ie,x,ze,Re,T,E]=Q;var X=window.Tether.__core["cart.ts"],[g]=X;var ee=window.Tether.__core["collection.ts"],[P]=ee;var te=window.Tether.__core["loader.ts"],[_,De,je,Ke,$e]=te;var ne=window.Tether.__core["dom.ts"],[Je,m,Ye,Be,A,We,Ge,N,Ve,Ze,Qe,Xe,et,tt,nt,ot,rt,at,w,it,ct,ut,lt]=ne;var oe=window.Tether.__core["mounting.ts"],[v,O,I,z,R,k]=oe;var re=window.Tether.__core["market-codes.ts"],[s,d]=re;function U(e,t="localStorage"){try{return window[t].getItem(e)}catch{return null}}function H(e,t,n="localStorage"){try{window[n].setItem(e,t)}catch{}}function F(e){try{return decodeURIComponent(e)}catch(t){if(t instanceof URIError)return e;throw t}}var ae="tether_country",D=()=>`${i.prefix}:market:${i.domain}`,j={getItem:e=>U(e)};function ie(){let e=typeof window<"u";return{document:typeof document<"u"?document:null,location:e?window.location:null,storage:j,global:e?window:{}}}function ce(e){try{return JSON.parse(e)}catch(t){if(t instanceof SyntaxError)return null;throw t}}function ue(e){if(typeof e!="object"||e===null)return null;let t=s(Reflect.get(e,"country"));if(!t)return null;let n=Reflect.get(e,"locale");return{country:t,language:d(Reflect.get(e,"language"))??void 0,locale:typeof n=="string"&&n?n:void 0}}var le=e=>ue(ce(e));function se(e=j){let t=e.getItem(D());return t?le(t):null}function de(e,t){if(!e||!t)return null;let n=e.cookie.split(";").map(a=>a.trim()).find(a=>a.startsWith(`${t}=`));return n?F(n.slice(t.length+1)):null}function h(e,t){if(!e||!t)return null;let n=t.toLowerCase(),a=Object.keys(e).find(o=>o.toLowerCase()===n);return a?e[a]??null:null}function ge(e,t){let n=r=>t.document?.querySelector(`meta[name="${r}"]`)?.getAttribute("content"),a=Reflect.get(t.global,"TETHER_COUNTRY"),o=Reflect.get(t.global,"TETHER_LANGUAGE"),c=n("tether-country")||de(t.document,e.cookie||ae);return{country:a||c,language:o||n("tether-language")}}function fe(e,t){let n=(t.location?.pathname??"/").split("/").find(u=>u!==""),a=h(e.locales,n);if(a)return a;let o=t.document?.documentElement.getAttribute("lang");if(!o)return null;let c=h(e.locales,o)??h(e.locales,o.split("-")[0]);if(c)return{locale:o,...c};if(e.locales&&e.strict)return null;let r=o.split("-")[1];return{language:o,country:r?.length===2?r:null,locale:o}}function me(e,t,n){switch(e){case"saved":return t.remember===!1?null:se(n.storage);case"server":return ge(t,n);case"webflow":return fe(t,n)}}function pe(e){return e?e===!0?M:e:["saved"]}function K(e=i.markets,t=ie()){let n=(e===i.markets?e:S(e))??{};if(n.detect===!1)return{};let a={},o={sources:a};for(let c of pe(n.detect)){let r=me(c,n,t);if(!r)continue;let u=s(r.country),l=d(r.language),f=typeof r.locale=="string"&&r.locale?r.locale:null;u&&!o.country&&(o.country=u,a.country=c),l&&!o.language&&(o.language=l,a.language=c),f&&!o.locale&&(o.locale=f,a.locale=c)}return o}function $(e){if(i.markets?.remember===!1)return;let t={country:e.country,language:e.language||void 0,locale:e.locale||void 0};H(D(),JSON.stringify(t))}var ye="{name} ({currency})",Ce="name",p=null;function we(){p=null}var ke="query TetherLocalization{localization{country{isoCode name currency{isoCode symbol}}language{isoCode name}availableCountries{isoCode name currency{isoCode symbol}availableLanguages{isoCode name}}}}",q={isoCode:"string",name:"string",currency:"object"},he=T({localization:{country:q,availableCountries:[q]}});function J(){return p??(p=x(ke,{},he).then(e=>e.localization,e=>{throw p=null,e})),p}function Y(e,t){switch(t){case"name":return e.name;case"code":return e.isoCode;case"currency":return e.currency.isoCode;case"symbol":return e.currency.symbol;default:return""}}var Le=(e,t)=>e.replace(/\{(name|code|currency|symbol)\}/g,(n,a)=>Y(t,a));function be(e,t,n){let a=e.getAttribute(m("country-label"))||ye,o=(e.getAttribute(m("countries"))||"").toUpperCase().split(/[\s,]+/).filter(Boolean),c=o.length?o.map(r=>t.find(u=>u.isoCode===r)).filter(r=>r!==void 0):t;e.replaceChildren(...c.map(r=>new Option(Le(a,r),r.isoCode))),e.value=n,e.value!==n&&(e.selectedIndex=-1),e.disabled=c.length<2&&!e.hasAttribute(m("always-enabled"))}function Me(e,t,n){let a=(i.country||n.country.isoCode).toUpperCase(),o=[...n.availableCountries].sort((r,u)=>r.name.localeCompare(u.name,i.locale||void 0)),c=o.find(r=>r.isoCode===a)??n.country;e.forEach(r=>{be(r,o,a)}),t.forEach(r=>{r.textContent=Y(c,N(r,"country-bind")||Ce)})}function L(e=document){let t=k(e,`select${w("country-select")}`),n=k(e,w("country-bind"));return!t.length&&!n.length?Promise.resolve():J().then(a=>{Me(t,n,a)}).catch(a=>{C(a,"country select")})}var Se=e=>Object.values(i.markets?.locales??{}).find(t=>s(t.country)===e);function xe(e,t){return e!==void 0?d(e):t?t.language?d(t.language):void 0:i.language}function Te(e){_();let t=[];return g.id()&&t.push(g.setBuyerIdentity({countryCode:e},{create:!1}).catch(n=>{C(n,"cart country")})),R(),v.forEach(n=>t.push(n.load())),O.forEach(n=>{n.closest(P())||(I.delete(n),z(n))}),t}async function Ee(e,{language:t,locale:n,remember:a=!0}={}){let o=s(e);if(!o)throw new E(`Not a country code: ${e}`,{code:"INVALID_COUNTRY"});let c=Se(o),r=n||c?.locale,u=r||i.locale,l=xe(t,c),f=o!==i.country||l!==i.language||u!==i.locale;if(i.country=o,i.language=l||void 0,i.locale=u,a&&$({country:o,language:l,locale:r}),!f)return L(),g.state;t!==void 0&&we();let W=Te(o);return L(),A("country-changed",{country:o,language:i.language}),await Promise.all(W),g.state}function y(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Pe(e){return y(e)&&y(e.__core)&&y(e.__parts)}function B(e,t){let n=Reflect.get(window,"Tether");if(!Pe(n))throw new Error(`tether.${e}.js runs after the Tether script, which loads it, and needs its window.Tether`);n.__parts[e]=t}B("markets",b);})();
1
+ (()=>{var G=Object.defineProperty;var V=(e,t)=>{for(var n in t)G(e,n,{get:t[n],enumerable:!0})};var b={};V(b,{detectMarket:()=>K,getLocalization:()=>J,renderCountrySelects:()=>L,setCountry:()=>Ee});var Z=window.Tether.__core["config.ts"],[i,Ae,Ne,M,S,C,ve]=Z;var Q=window.Tether.__core["client.ts"],[Ie,x,ze,Re,T,E,Ue]=Q;var X=window.Tether.__core["cart.ts"],[g]=X;var ee=window.Tether.__core["collection.ts"],[P]=ee;var te=window.Tether.__core["loader.ts"],[_,je,Ke,$e,qe]=te;var ne=window.Tether.__core["dom.ts"],[Ye,m,Be,We,A,Ge,Ve,N,Ze,Qe,Xe,et,tt,nt,ot,rt,at,it,w,ct,ut,lt,st]=ne;var oe=window.Tether.__core["mounting.ts"],[v,O,I,z,R,k]=oe;var re=window.Tether.__core["market-codes.ts"],[s,d]=re;function U(e,t="localStorage"){try{return window[t].getItem(e)}catch{return null}}function H(e,t,n="localStorage"){try{window[n].setItem(e,t)}catch{}}function F(e){try{return decodeURIComponent(e)}catch(t){if(t instanceof URIError)return e;throw t}}var ae="tether_country",D=()=>`${i.prefix}:market:${i.domain}`,j={getItem:e=>U(e)};function ie(){let e=typeof window<"u";return{document:typeof document<"u"?document:null,location:e?window.location:null,storage:j,global:e?window:{}}}function ce(e){try{return JSON.parse(e)}catch(t){if(t instanceof SyntaxError)return null;throw t}}function ue(e){if(typeof e!="object"||e===null)return null;let t=s(Reflect.get(e,"country"));if(!t)return null;let n=Reflect.get(e,"locale");return{country:t,language:d(Reflect.get(e,"language"))??void 0,locale:typeof n=="string"&&n?n:void 0}}var le=e=>ue(ce(e));function se(e=j){let t=e.getItem(D());return t?le(t):null}function de(e,t){if(!e||!t)return null;let n=e.cookie.split(";").map(a=>a.trim()).find(a=>a.startsWith(`${t}=`));return n?F(n.slice(t.length+1)):null}function h(e,t){if(!e||!t)return null;let n=t.toLowerCase(),a=Object.keys(e).find(o=>o.toLowerCase()===n);return a?e[a]??null:null}function ge(e,t){let n=r=>t.document?.querySelector(`meta[name="${r}"]`)?.getAttribute("content"),a=Reflect.get(t.global,"TETHER_COUNTRY"),o=Reflect.get(t.global,"TETHER_LANGUAGE"),c=n("tether-country")||de(t.document,e.cookie||ae);return{country:a||c,language:o||n("tether-language")}}function fe(e,t){let n=(t.location?.pathname??"/").split("/").find(u=>u!==""),a=h(e.locales,n);if(a)return a;let o=t.document?.documentElement.getAttribute("lang");if(!o)return null;let c=h(e.locales,o)??h(e.locales,o.split("-")[0]);if(c)return{locale:o,...c};if(e.locales&&e.strict)return null;let r=o.split("-")[1];return{language:o,country:r?.length===2?r:null,locale:o}}function me(e,t,n){switch(e){case"saved":return t.remember===!1?null:se(n.storage);case"server":return ge(t,n);case"webflow":return fe(t,n)}}function pe(e){return e?e===!0?M:e:["saved"]}function K(e=i.markets,t=ie()){let n=(e===i.markets?e:S(e))??{};if(n.detect===!1)return{};let a={},o={sources:a};for(let c of pe(n.detect)){let r=me(c,n,t);if(!r)continue;let u=s(r.country),l=d(r.language),f=typeof r.locale=="string"&&r.locale?r.locale:null;u&&!o.country&&(o.country=u,a.country=c),l&&!o.language&&(o.language=l,a.language=c),f&&!o.locale&&(o.locale=f,a.locale=c)}return o}function $(e){if(i.markets?.remember===!1)return;let t={country:e.country,language:e.language||void 0,locale:e.locale||void 0};H(D(),JSON.stringify(t))}var ye="{name} ({currency})",Ce="name",p=null;function we(){p=null}var ke="query TetherLocalization{localization{country{isoCode name currency{isoCode symbol}}language{isoCode name}availableCountries{isoCode name currency{isoCode symbol}availableLanguages{isoCode name}}}}",q={isoCode:"string",name:"string",currency:"object"},he=T({localization:{country:q,availableCountries:[q]}});function J(){return p??(p=x(ke,{},he).then(e=>e.localization,e=>{throw p=null,e})),p}function Y(e,t){switch(t){case"name":return e.name;case"code":return e.isoCode;case"currency":return e.currency.isoCode;case"symbol":return e.currency.symbol;default:return""}}var Le=(e,t)=>e.replace(/\{(name|code|currency|symbol)\}/g,(n,a)=>Y(t,a));function be(e,t,n){let a=e.getAttribute(m("country-label"))||ye,o=(e.getAttribute(m("countries"))||"").toUpperCase().split(/[\s,]+/).filter(Boolean),c=o.length?o.map(r=>t.find(u=>u.isoCode===r)).filter(r=>r!==void 0):t;e.replaceChildren(...c.map(r=>new Option(Le(a,r),r.isoCode))),e.value=n,e.value!==n&&(e.selectedIndex=-1),e.disabled=c.length<2&&!e.hasAttribute(m("always-enabled"))}function Me(e,t,n){let a=(i.country||n.country.isoCode).toUpperCase(),o=[...n.availableCountries].sort((r,u)=>r.name.localeCompare(u.name,i.locale||void 0)),c=o.find(r=>r.isoCode===a)??n.country;e.forEach(r=>{be(r,o,a)}),t.forEach(r=>{r.textContent=Y(c,N(r,"country-bind")||Ce)})}function L(e=document){let t=k(e,`select${w("country-select")}`),n=k(e,w("country-bind"));return!t.length&&!n.length?Promise.resolve():J().then(a=>{Me(t,n,a)}).catch(a=>{C(a,"country select")})}var Se=e=>Object.values(i.markets?.locales??{}).find(t=>s(t.country)===e);function xe(e,t){return e!==void 0?d(e):t?t.language?d(t.language):void 0:i.language}function Te(e){_();let t=[];return g.id()&&t.push(g.setBuyerIdentity({countryCode:e},{create:!1}).catch(n=>{C(n,"cart country")})),R(),v.forEach(n=>t.push(n.load())),O.forEach(n=>{n.closest(P())||(I.delete(n),z(n))}),t}async function Ee(e,{language:t,locale:n,remember:a=!0}={}){let o=s(e);if(!o)throw new E(`Not a country code: ${e}`,{code:"INVALID_COUNTRY"});let c=Se(o),r=n||c?.locale,u=r||i.locale,l=xe(t,c),f=o!==i.country||l!==i.language||u!==i.locale;if(i.country=o,i.language=l||void 0,i.locale=u,a&&$({country:o,language:l,locale:r}),!f)return L(),g.state;t!==void 0&&we();let W=Te(o);return L(),A("country-changed",{country:o,language:i.language}),await Promise.all(W),g.state}function y(e){return e!==null&&typeof e=="object"&&!Array.isArray(e)}function Pe(e){return y(e)&&y(e.__core)&&y(e.__parts)}function B(e,t){let n=Reflect.get(window,"Tether");if(!Pe(n))throw new Error(`tether.${e}.js runs after the Tether script, which loads it, and needs its window.Tether`);n.__parts[e]=t}B("markets",b);})();