@occluze/tether 0.6.6 → 0.6.7
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.
- package/README.md +2 -2
- package/dist/esm/chunks/account-Q6E2TFEV.js +1 -0
- package/dist/esm/chunks/account-pages-UZXR4R5F.js +1 -0
- package/dist/esm/chunks/{analytics-SLATWPLC.js → analytics-IJBKATUP.js} +1 -1
- package/dist/esm/chunks/chunk-4QJKLPYR.js +1 -0
- package/dist/esm/chunks/{chunk-ZIUIWEON.js → chunk-KIDH76B7.js} +1 -1
- package/dist/esm/chunks/chunk-PAYT5ZD7.js +1 -0
- package/dist/esm/chunks/{chunk-VCPI7MJ2.js → chunk-SSJT43CJ.js} +1 -1
- package/dist/esm/chunks/{diagnose-VXQBSD3A.js → diagnose-3WVAWNTX.js} +1 -1
- package/dist/esm/chunks/{extras-R4X34VQL.js → extras-7I7WJX35.js} +1 -1
- package/dist/esm/chunks/{markets-ui-F3R5T5EL.js → markets-ui-545XLFTE.js} +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/tether.account-pages.js +25 -12
- package/dist/tether.account-pages.min.js +1 -1
- package/dist/tether.account.js +17 -13
- package/dist/tether.account.min.js +1 -1
- package/dist/tether.diagnose.js +3 -1
- package/dist/tether.diagnose.min.js +1 -1
- package/dist/tether.js +32 -20
- package/dist/tether.min.js +2 -2
- package/dist/tether.min.js.map +3 -3
- package/package.json +1 -1
- package/src/account-pages.js +25 -12
- package/src/account.js +17 -10
- package/src/cart.js +26 -17
- package/src/diagnose.js +1 -1
- package/src/index.js +5 -3
- package/dist/esm/chunks/account-QUBHQG3C.js +0 -1
- package/dist/esm/chunks/account-pages-VWDHF6WA.js +0 -1
- package/dist/esm/chunks/chunk-L2TRRKYV.js +0 -1
- package/dist/esm/chunks/chunk-VPVJPNB4.js +0 -1
package/dist/tether.min.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/config.js", "../src/client.js", "../src/cart.js", "../src/fragments.js", "../src/loader.js", "../src/selling-plans.js", "../src/dom.js", "../src/product.js", "../src/status.js", "../src/collection.js", "../src/mounting.js", "../src/lazy-iife.js", "../src/index.js"],
|
|
4
|
-
"sourcesContent": ["/**\n * Runtime config. One shared object, mutated by configure(), read everywhere.\n */\n\nexport const DEFAULTS = {\n // Shopify Storefront API\n domain: '', // 'your-store.myshopify.com'\n token: '', // public Storefront API access token\n apiVersion: '2026-07',\n country: undefined, // ISO code, e.g. 'NL' -> @inContext(country: NL)\n language: undefined, // e.g. 'NL' -> @inContext(language: NL)\n locale: undefined, // Intl locale for money/dates, e.g. 'nl-NL'\n markets: null, // { detect: true, locales: { de: { country: 'DE', language: 'DE' } }, cookie, remember } (markets.js)\n\n // Markup\n prefix: 'tether', // attribute prefix: tether-product, tether-bind, ...\n productPath: '/product', // Webflow CMS template path for products\n collectionPath: '/collection',\n\n // Fetching\n metafields: [], // ['custom.material', { namespace, key }]\n imagesFirst: 25,\n variantsFirst: 100,\n sellingPlanGroupsFirst: 10,\n sellingPlansFirst: 25,\n collectionFirst: 24,\n retries: 2,\n revalidate: true, // products from the server (tether/server hydrate()): refresh once in the background\n\n // Cart\n storageKey: null, // defaults to `tether:cart:<domain>`\n cartDrawerOpenClass: 'is-open',\n openCartOnAdd: true,\n cartFocus: true, // move focus into the open cart, keep Tab inside it, restore it on close\n checkoutTarget: '_self', // '_self' or '_blank'\n\n // Subscriptions\n defaultPurchase: 'one-time', // 'one-time' | 'subscription'\n variantUrl: false, // true: ?variant= follows the visitor's choice on the main product (shareable links)\n maxAge: 60, // seconds a Shopify answer may be cached (0 = Shopify's own caching, can be hours)\n lowStock: 5, // tether-show=\"low-stock\" at this many or fewer (needs inventory access)\n\n // Mounting\n autoMount: true, // mount document on DOMContentLoaded\n observe: false, // auto-mount nodes added later (CMS load-more, filters)\n astro: true, // mount on Astro View Transitions (astro:page-load); false if you do it yourself\n partsUrl: null, // folder of tether.markets/diagnose(.min).js for the <script> build (default: next to it)\n\n // Formatting\n formatMoney: null, // (money, locale) => string\n\n // Hooks (all optional)\n onLayoutChange: null, // (reason) => void. Default refreshes ScrollTrigger if present\n onCartOpen: null, // (drawers) => void, e.g. lock scroll\n onCartClose: null, // (drawers) => void\n onLineEnter: null, // (node) => void, animate a new cart line in\n onLineLeave: null, // (node, done) => void, animate out, then call done()\n onValueChange: null, // (el, previousText) => void, e.g. text scramble\n onError: null, // (error, context) => void\n\n debug: false,\n};\n\nexport const cfg = { ...DEFAULTS };\n\nexport function configure(overrides = {}) {\n Object.keys(cfg).forEach((k) => delete cfg[k]);\n Object.assign(cfg, DEFAULTS, overrides);\n if (cfg.domain) cfg.domain = String(cfg.domain).replace(/^https?:\\/\\//, '').replace(/\\/.*$/, '');\n if (!cfg.storageKey) cfg.storageKey = `${cfg.prefix}:cart:${cfg.domain}`;\n if (cfg.apiVersion === 'unstable') warn('apiVersion \"unstable\" changes without notice. Pin a dated version (e.g. 2026-07).');\n return cfg;\n}\n\nexport const isConfigured = () => Boolean(cfg.domain && cfg.token);\n\nexport function log(...a) { if (cfg.debug) console.log(`[${cfg.prefix}]`, ...a); }\nexport function warn(...a) { console.warn(`[${cfg.prefix}]`, ...a); }\n\nexport function reportError(err, context) {\n warn(context, err && (err.message || err.code) ? err.message || err.code : err);\n if (typeof cfg.onError === 'function') {\n try { cfg.onError(err, context); } catch { /* never let a hook break us */ }\n }\n}\n", "/**\n * Storefront API client: one fetch wrapper with @inContext, retries and\n * readable errors. Exposed as Tether.query() for anything Tether doesn't cover.\n */\nimport { cfg, log } from './config.js';\n\nexport class TetherError extends Error {\n constructor(message, { status, errors, userErrors, code } = {}) {\n super(message);\n this.name = 'TetherError';\n this.code = code || (status ? `HTTP_${status}` : 'ERROR');\n this.status = status;\n this.errors = errors;\n this.userErrors = userErrors;\n }\n}\n\nexport function endpoint(conf = cfg) {\n return `https://${conf.domain}/api/${conf.apiVersion}/graphql.json`;\n}\n\n/**\n * Adds @inContext(country, language) to the first operation in the document,\n * so prices, currency and translations follow the configured market.\n * Operations are always written first, fragments after, so the first match is\n * the operation.\n */\nexport function withContext(query, ctx = cfg) {\n const args = [];\n if (ctx.country) args.push(`country: ${String(ctx.country).toUpperCase()}`);\n if (ctx.language) args.push(`language: ${String(ctx.language).toUpperCase().replace('-', '_')}`);\n if (!args.length || /@inContext/.test(query)) return query;\n\n const tag = `@inContext(${args.join(', ')})`;\n // Named (query Name($x: T)), anonymous (query { \u2026 }) and shorthand ({ \u2026 }) queries.\n if (/^\\s*\\{/.test(query)) return `query ${tag} ${query.trimStart()}`;\n return query.replace(/^(\\s*(?:query|mutation)(?:\\s+\\w+)?\\s*(?:\\([^)]*\\))?)/, `$1 ${tag}`);\n}\n\nconst sleep = (ms) => new Promise((r) => setTimeout(r, ms));\n\n/** What a status means, for errors Shopify sends without a message (401/403 have none). */\nfunction statusText(status, conf) {\n if (status === 401 || status === 403) {\n return `Shopify rejected the Storefront token for ${conf.domain} (${status}): use the public Storefront API token (Headless channel)${/^shpat_/.test(conf.token) ? ', not an Admin API token (shpat_\u2026)' : ''}`;\n }\n return status === 404 ? `Store or API version not found (404): check domain ${conf.domain} and apiVersion ${conf.apiVersion}` : `HTTP ${status} from ${conf.domain}`;\n}\n\n/**\n * One Storefront API request with retries, for any config object (the browser's shared config,\n * or the server module's own). gql() below is the browser version.\n */\nexport async function request(conf, query, variables = {}, { context = true } = {}) {\n if (!conf.domain || !conf.token) {\n throw new TetherError('Tether is not configured: domain and token are required', { code: 'NOT_CONFIGURED' });\n }\n\n // Shopify caches the response of an identical query text (prices included, for hours after a\n // change). A time bucket in a comment keeps answers at most maxAge seconds old (default 60).\n let text = context ? withContext(query, conf) : query;\n const age = conf.maxAge ?? 60;\n if (age > 0 && !/^\\s*mutation\\b/.test(text)) text += ` #${Math.floor(Date.now() / (age * 1000))}`;\n const body = JSON.stringify({ query: text, variables });\n let attempt = 0;\n\n for (;;) {\n let res;\n try {\n res = await (conf.fetch || fetch)(endpoint(conf), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Shopify-Storefront-Access-Token': conf.token,\n },\n body,\n });\n } catch (err) {\n if (attempt++ < conf.retries) { await sleep(300 * 2 ** attempt); continue; }\n throw new TetherError(`Network error: ${err.message}`, { code: 'NETWORK' });\n }\n\n if (res.status === 430) throw new TetherError('Shopify security rejection (430)', { status: 430 });\n\n const retryable = res.status === 429 || res.status >= 500;\n if (retryable && attempt++ < conf.retries) {\n log('retry', res.status, attempt);\n await sleep(300 * 2 ** attempt);\n continue;\n }\n\n let json;\n try { json = await res.json(); } catch {\n throw new TetherError(res.ok ? `Invalid response (${res.status})` : statusText(res.status, conf), { status: res.status });\n }\n\n if (json.errors?.length) {\n // Token without unauthenticated_read_product_inventory: drop the field and retry.\n const inventoryDenied = json.errors.some((e) => /quantityAvailable/.test(e.message || ''));\n if (inventoryDenied && /\\bquantityAvailable\\b/.test(body)) {\n log('no inventory permission, retrying without quantityAvailable');\n return request(conf, query.replace(/\\bquantityAvailable\\b/g, ''), variables, { context });\n }\n // An older apiVersion without cart warnings (before 2024-07): retry without them.\n if (json.errors.some((e) => /'warnings'/.test(e.message || '')) && /warnings \\{ code message target \\}/.test(query)) {\n return request(conf, query.replace(/ warnings \\{ code message target \\}/g, ''), variables, { context });\n }\n const throttled = json.errors.some((e) => e.extensions?.code === 'THROTTLED');\n if (throttled && attempt++ < conf.retries) { await sleep(500 * 2 ** attempt); continue; }\n const message = json.errors.map((e) => e.message).filter(Boolean).join(' | ');\n throw new TetherError(res.ok ? message || 'Storefront API error' : (res.status === 401 || res.status === 403 || !message ? statusText(res.status, conf) : message), {\n status: res.status, errors: json.errors,\n });\n }\n if (!res.ok) throw new TetherError(statusText(res.status, conf), { status: res.status });\n\n return json.data;\n }\n}\n\nexport const gql = (query, variables, opts) => request(cfg, query, variables, opts);\n\n/** Throws on mutation userErrors, returns the payload otherwise. */\nexport function unwrap(payload, name) {\n if (!payload) throw new TetherError(`${name}: empty response`);\n const errs = payload.userErrors || [];\n if (errs.length) {\n throw new TetherError(errs.map((e) => e.message).join(' | '), { userErrors: errs });\n }\n return payload;\n}\n", "/**\n * Cart: Shopify Cart API, state in localStorage, document-wide rendering.\n *\n * Every mutation is queued, so fast clicking never races. All public methods\n * return the updated cart.\n */\nimport { cfg, log, reportError } from './config.js';\nimport { gql, unwrap, TetherError } from './client.js';\nimport { cartFragment } from './fragments.js';\nimport { getProduct } from './loader.js';\nimport { allPlans, GID } from './selling-plans.js';\nimport {\n attr, sel, get, qsa, emit, formatMoney, setText, setTextTracked, setImage, show,\n repeat, repeatKeyed, toAttributes, productUrl, notifyLayoutChanged,\n} from './dom.js';\n\n/** Accepts many shapes and returns a Shopify CartLineInput. */\nexport function toLineInput(input, quantity = 1, opts = {}) {\n const src = typeof input === 'object' && input !== null ? input : { variantId: input, quantity, ...opts };\n const merchandiseId = GID.variant(src.merchandiseId || src.variantId || src.id);\n if (!merchandiseId) throw new TetherError('add(): variantId is required');\n const line = { merchandiseId, quantity: Math.max(1, parseInt(src.quantity ?? 1, 10) || 1) };\n const plan = src.sellingPlanId || src.sellingPlan;\n if (plan) line.sellingPlanId = GID.sellingPlan(plan);\n const attrs = toAttributes(src.attributes);\n if (attrs.length) line.attributes = attrs;\n return line;\n}\n\nfunction mutation(name, args, inner) {\n return `mutation Tether_${name}(${args}){${name}(${inner}){cart{...TetherCart}userErrors{field message}warnings{code message target}}}${cartFragment()}`;\n}\n\nconst FOCUSABLE = 'a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])';\nlet returnFocus = null;\n\n/** Focusable elements inside an open drawer, in order (visible ones only). */\nexport const focusables = (d) => qsa(d, FOCUSABLE).filter((el) => el.offsetParent !== null || el === document.activeElement);\n\n/** aria-expanded on the open buttons; dialog semantics on drawers (unless the markup has its own). */\nfunction ariaState(open) {\n qsa(document, sel('cart-open')).forEach((b) => b.setAttribute('aria-expanded', String(open)));\n qsa(document, sel('cart-drawer')).forEach((d) => {\n if (!d.hasAttribute('role')) d.setAttribute('role', 'dialog');\n if (!d.hasAttribute('aria-label') && !d.hasAttribute('aria-labelledby')) d.setAttribute('aria-label', get(d, 'cart-label') || 'Cart');\n d.setAttribute('aria-modal', String(open));\n // Closed: hidden from screen readers and out of the Tab order (inert), like a closed dialog.\n if (!d.classList.contains(cfg.cartDrawerOpenClass)) { d.setAttribute('aria-hidden', 'true'); if (cfg.cartFocus !== false) d.inert = true; }\n });\n}\n\nconst isMissingCart = (err) => /does not exist|not found|invalid id/i.test(err?.message || '');\n\nexport const Cart = {\n state: null,\n _chain: Promise.resolve(),\n\n id() { try { return localStorage.getItem(cfg.storageKey); } catch { return null; } },\n _setId(id) {\n try {\n if (id) localStorage.setItem(cfg.storageKey, id);\n else localStorage.removeItem(cfg.storageKey);\n } catch { /* private mode */ }\n },\n\n get lines() { return this.state?.lines?.nodes || []; },\n get count() { return this.state?.totalQuantity || 0; },\n\n lastError: null,\n /** Set by the account part while a customer is logged in (Customer Account API token). */\n customerAccessToken: null,\n /** line id -> { qty, done }: what quick +/- clicks asked for, shown until Shopify has answered. */\n pendingQty: new Map(),\n /** Shopify's notes on the last change, e.g. less stock than asked: [{ code, message }]. */\n warnings: [],\n /** true once the saved cart (or the absence of one) is known. */\n loaded: false,\n\n _take(payload, name) {\n const p = unwrap(payload, name);\n // Shopify can repeat a warning per line or code: each message once.\n this.warnings = (p.warnings || []).filter((w, i, all) => all.findIndex((x) => x.message === w.message) === i)\n .map((w) => ({ ...w, message: (typeof cfg.warningText === 'function' && cfg.warningText(w)) || w.message }));\n if (this.warnings.length) emit('cart-warning', { warnings: this.warnings });\n return p.cart;\n },\n\n _queue(fn) {\n const run = this._chain.then(fn, fn).then((value) => {\n if (this.lastError) { this.lastError = null; this.render(); }\n return value;\n }, (err) => {\n // tether-show=\"cart-error\" becomes visible until the next successful cart call.\n this.lastError = err;\n this.render();\n emit('cart-error', { error: err });\n throw err;\n });\n this._chain = run.catch(() => {});\n return run;\n },\n\n _commit(cart, reason) {\n this.state = cart;\n if (cart?.id) this._setId(cart.id);\n // Other tabs reload the cart (storage event); the count also shows at once on the next page.\n try { localStorage.setItem(`${cfg.storageKey}:seen`, `${Date.now()}|${cart?.totalQuantity || 0}`); } catch { /* private mode */ }\n this.render();\n emit('cart-updated', { cart, reason });\n return cart;\n },\n\n async init() {\n const id = this.id();\n if (!id) { this.state = null; this.loaded = true; this.render(); emit('cart-updated', { cart: null, reason: 'load' }); return null; }\n // Until the saved cart has loaded, show its last known count instead of the page's 0.\n if (!this.loaded) {\n try {\n const n = (localStorage.getItem(`${cfg.storageKey}:seen`) || '').split('|')[1];\n if (n) qsa(document, sel('cart-count')).forEach((el) => { if (/^\\s*0?\\s*$/.test(el.textContent)) el.textContent = n; });\n } catch { /* private mode */ }\n }\n try {\n const data = await gql(`query TetherCart($id:ID!){cart(id:$id){...TetherCart}}${cartFragment()}`, { id });\n if (!data.cart) { this._setId(null); this.state = null; } else this.state = data.cart;\n } catch (err) {\n reportError(err, 'cart load failed');\n this.lastError = err;\n // Keep the cart id on network/API errors: the cart is probably fine, Shopify isn't reachable.\n if (isMissingCart(err)) this._setId(null);\n this.state = null;\n }\n this.loaded = true;\n this.render();\n emit('cart-updated', { cart: this.state, reason: 'load' }); // islands (cart.subscribe) hear the loaded cart\n return this.state;\n },\n\n async _create(input = {}) {\n const buyerIdentity = cfg.country || this.customerAccessToken ? {\n ...(cfg.country ? { countryCode: String(cfg.country).toUpperCase() } : {}),\n ...(this.customerAccessToken ? { customerAccessToken: this.customerAccessToken } : {}),\n } : undefined;\n const data = await gql(\n mutation('cartCreate', '$input: CartInput!', 'input: $input'),\n { input: { buyerIdentity, ...input } },\n );\n return this._take(data.cartCreate, 'cartCreate');\n },\n\n /** Runs a cart mutation; creates a fresh cart if ours expired. */\n async _mutate(name, args, inner, variables, createInput) {\n const cartId = this.id();\n if (!cartId) return createInput ? this._create(createInput) : null;\n try {\n const data = await gql(mutation(name, `$cartId: ID!, ${args}`, `cartId: $cartId, ${inner}`), { ...variables, cartId });\n return this._take(data[name], name);\n } catch (err) {\n if (createInput && isMissingCart(err)) {\n log('cart expired, creating a new one');\n this._setId(null);\n return this._create(createInput);\n }\n throw err;\n }\n },\n\n /**\n * add('gid://shopify/ProductVariant/1', 2)\n * add({ variantId, quantity, sellingPlanId, attributes })\n * add([line, line]) // bundles / build-a-box in one request\n */\n add(input, quantity = 1, opts = {}) {\n const lines = (Array.isArray(input) ? input : [input]).map((l) => toLineInput(l, quantity, opts));\n return this._queue(async () => {\n const cart = await this._mutate('cartLinesAdd', '$lines: [CartLineInput!]!', 'lines: $lines', { lines }, { lines });\n this._commit(cart, 'add');\n emit('added', { cart, lines });\n if (cfg.openCartOnAdd) this.open();\n return cart;\n });\n },\n\n /**\n * updateLine(lineId, 3)\n * updateLine(lineId, { quantity, sellingPlanId, attributes })\n * sellingPlanId: null switches a line back to one-time purchase.\n */\n updateLine(lineId, patch) {\n const p = typeof patch === 'number' ? { quantity: patch } : { ...patch };\n if (p.quantity !== undefined && p.quantity <= 0) return this.removeLine(lineId);\n\n const line = { id: lineId };\n if (p.quantity !== undefined) line.quantity = p.quantity;\n if ('sellingPlanId' in p) line.sellingPlanId = p.sellingPlanId ? GID.sellingPlan(p.sellingPlanId) : null;\n if (p.attributes) line.attributes = toAttributes(p.attributes);\n if (p.merchandiseId || p.variantId) line.merchandiseId = GID.variant(p.merchandiseId || p.variantId);\n\n return this._queue(async () => this._commit(\n await this._mutate('cartLinesUpdate', '$lines: [CartLineUpdateInput!]!', 'lines: $lines', { lines: [line] }),\n 'update',\n ));\n },\n\n /**\n * +1 / -1 for a line. Quick clicks add up: each builds on the quantity the last click asked for,\n * which shows at once (tether-line=\"quantity\", Cart.lines) until Shopify has answered.\n */\n changeQuantity(lineId, delta) {\n const current = this.lines.find((l) => l.id === lineId);\n if (!current) return Promise.resolve(this.state);\n const target = Math.max(0, (this.pendingQty.get(lineId)?.qty ?? current.quantity) + delta);\n const job = { qty: target, done: false };\n this.pendingQty.set(lineId, job);\n this.render();\n emit('cart-updated', { cart: this.state, reason: 'pending' });\n const latest = () => this.pendingQty.get(lineId) === job;\n return this._queue(async () => {\n // Quick clicks: only the latest target goes to Shopify; the ones it replaced are skipped.\n if (!latest()) return this.state;\n const now = this.lines.find((l) => l.id === lineId);\n if (now && now.quantity === target) return this.state; // e.g. + then -: nothing to change\n const cart = target > 0\n ? await this._mutate('cartLinesUpdate', '$lines: [CartLineUpdateInput!]!', 'lines: $lines', { lines: [{ id: lineId, quantity: target }] })\n : await this._mutate('cartLinesRemove', '$lineIds: [ID!]!', 'lineIds: $lineIds', { lineIds: [lineId] });\n // A newer click is on its way: keep this answer, but show totals and count only once that\n // one is in (no stepping through every reply).\n if (!latest()) { this.state = cart; if (cart?.id) this._setId(cart.id); return cart; }\n return this._commit(cart, target > 0 ? 'update' : 'remove');\n }).finally(() => {\n if (latest()) { this.pendingQty.delete(lineId); this.render(); emit('cart-updated', { cart: this.state, reason: 'settled' }); }\n });\n },\n\n /** Quantity to show for a line: the one asked for while an update is on its way. */\n quantityOf(line) { return this.pendingQty.get(line.id)?.qty ?? line.quantity; },\n\n removeLine(lineIds) {\n const ids = Array.isArray(lineIds) ? lineIds : [lineIds];\n return this._queue(async () => this._commit(\n await this._mutate('cartLinesRemove', '$lineIds: [ID!]!', 'lineIds: $lineIds', { lineIds: ids }),\n 'remove',\n ));\n },\n\n clear() {\n const ids = this.lines.map((l) => l.id);\n if (!ids.length) return Promise.resolve(this.state);\n return this.removeLine(ids);\n },\n\n setNote(note) {\n return this._queue(async () => this._commit(\n await this._mutate('cartNoteUpdate', '$note: String!', 'note: $note', { note: note ?? '' }, { note: note ?? '' }),\n 'note',\n ));\n },\n\n /** Cart-level attributes, merged with existing ones. Value '' removes a key. */\n setAttributes(obj) {\n const merged = new Map((this.state?.attributes || []).map((a) => [a.key, a.value]));\n toAttributes(obj).forEach((a) => merged.set(a.key, a.value));\n const attributes = [...merged].filter(([, v]) => v !== '').map(([key, value]) => ({ key, value }));\n return this._queue(async () => this._commit(\n await this._mutate('cartAttributesUpdate', '$attributes: [AttributeInput!]!', 'attributes: $attributes', { attributes }, { attributes }),\n 'attributes',\n ));\n },\n\n /** Replaces the discount codes. Pass [] to remove all. */\n setDiscountCodes(codes) {\n const discountCodes = (Array.isArray(codes) ? codes : [codes]).map((c) => String(c).trim()).filter(Boolean);\n return this._queue(async () => this._commit(\n await this._mutate('cartDiscountCodesUpdate', '$discountCodes: [String!]!', 'discountCodes: $discountCodes', { discountCodes }, { discountCodes }),\n 'discount',\n ));\n },\n\n /**\n * Adds a code. A code Shopify doesn't accept isn't kept in the cart (it would warn on every change):\n * it's removed again and the promise rejects with code INVALID_DISCOUNT.\n */\n async applyDiscount(code) {\n const current = (this.state?.discountCodes || []).map((d) => d.code);\n const cart = await this.setDiscountCodes([...new Set([...current, code])]);\n const hit = (cart?.discountCodes || []).find((d) => d.code.toLowerCase() === String(code).toLowerCase());\n if (hit?.applicable) return cart;\n await this.removeDiscount(code).catch(() => {});\n throw new TetherError(`Discount code not valid: ${code}`, { code: 'INVALID_DISCOUNT' });\n },\n\n removeDiscount(code) {\n const k = String(code).toLowerCase();\n return this.setDiscountCodes((this.state?.discountCodes || []).map((d) => d.code).filter((c) => c.toLowerCase() !== k));\n },\n\n /** { countryCode, email, phone } \u2014 changes currency/prices for that market. */\n setBuyerIdentity(buyerIdentity, { create = true } = {}) {\n return this._queue(async () => {\n const cart = await this._mutate('cartBuyerIdentityUpdate', '$buyerIdentity: CartBuyerIdentityInput!', 'buyerIdentity: $buyerIdentity', { buyerIdentity }, create ? { buyerIdentity } : null)\n .catch((err) => {\n if (create || !isMissingCart(err)) throw err;\n this._setId(null); // expired cart: forget it instead of creating an empty one\n return null;\n });\n return this._commit(cart, 'buyer-identity');\n });\n },\n\n /**\n * Goes to Shopify checkout. With checkoutTarget '_blank' the tab is opened\n * inside the click (Safari blocks window.open after an await) and gets its\n * URL once we have it.\n */\n async checkout(target = cfg.checkoutTarget) {\n const id = this.id();\n if (!id || (this.state && !this.count)) return null; // nothing to check out\n const tab = target === '_blank' ? window.open('', '_blank') : null;\n if (tab) { try { tab.opener = null; } catch { /* ignore */ } }\n\n try {\n const data = await gql('query TetherCheckout($id: ID!) { cart(id: $id) { checkoutUrl } }', { id });\n let url = (this.beforeCheckout && await this.beforeCheckout().catch(() => null)) || data.cart?.checkoutUrl;\n if (url && this.customerAccessToken) url += `${url.includes('?') ? '&' : '?'}logged_in=true`;\n if (!url) throw new TetherError('No checkoutUrl (cart empty or expired)');\n emit('checkout', { url, cart: this.state });\n if (tab && !tab.closed) tab.location.href = url;\n else window.location.href = url;\n return url;\n } catch (err) {\n if (tab) tab.close();\n reportError(err, 'checkout failed');\n return null;\n }\n },\n\n // -------------------------------------------------------------- drawer\n\n drawers() { return qsa(document, sel('cart-drawer')); },\n\n /** Without a tether-cart-drawer (a React/Svelte/Vue cart), open/close still work: as state for subscribe. */\n _open: false,\n isOpen() {\n const ds = this.drawers();\n return ds.length ? ds.some((d) => d.classList.contains(cfg.cartDrawerOpenClass)) : this._open;\n },\n\n open() {\n if (this.isOpen()) return;\n this._open = true;\n const ds = this.drawers().filter((d) => get(d, 'cart-drawer') !== 'manual');\n ds.forEach((d) => { d.inert = false; d.classList.add(cfg.cartDrawerOpenClass); d.setAttribute('aria-hidden', 'false'); });\n ariaState(true);\n if (cfg.cartFocus !== false && ds[0]) {\n // Move focus into the cart (after the open transition has made it visible).\n returnFocus = document.activeElement;\n setTimeout(() => {\n const target = focusables(ds[0])[0] || ds[0];\n if (target === ds[0] && !ds[0].hasAttribute('tabindex')) ds[0].tabIndex = -1;\n target.focus?.({ preventScroll: true });\n }, 60);\n }\n if (typeof cfg.onCartOpen === 'function') cfg.onCartOpen(ds);\n emit('cart-toggled', { open: true });\n },\n\n close() {\n if (!this.isOpen()) return;\n this._open = false;\n const ds = this.drawers();\n const hadFocus = ds.some((d) => d.contains(document.activeElement));\n ds.forEach((d) => { d.classList.remove(cfg.cartDrawerOpenClass); d.setAttribute('aria-hidden', 'true'); if (cfg.cartFocus !== false) d.inert = true; });\n ariaState(false);\n if (hadFocus && returnFocus?.isConnected) returnFocus.focus({ preventScroll: true });\n returnFocus = null;\n if (typeof cfg.onCartClose === 'function') cfg.onCartClose(ds);\n emit('cart-toggled', { open: false });\n },\n\n toggle() { if (this.isOpen()) this.close(); else this.open(); },\n\n /**\n * For framework islands (React, Svelte, Vue): fn(cart, { open }) now and on every change.\n * Returns a function that stops listening.\n */\n subscribe(fn) {\n const call = () => fn(this.state, { open: this.isOpen(), count: this.count, loaded: this.loaded, warnings: this.warnings });\n const h = () => call();\n ['cart-updated', 'cart-toggled'].forEach((e) => document.addEventListener(`${cfg.prefix}:${e}`, h));\n call();\n return () => ['cart-updated', 'cart-toggled'].forEach((e) => document.removeEventListener(`${cfg.prefix}:${e}`, h));\n },\n\n // -------------------------------------------------------------- render\n\n render() {\n const cart = this.state;\n const count = cart ? cart.totalQuantity : 0;\n const money = (k) => (cart ? formatMoney(cart.cost?.[k]) : '');\n\n ariaState(this.isOpen());\n qsa(document, sel('cart-count')).forEach((el) => setTextTracked(el, count));\n qsa(document, sel('cart-subtotal')).forEach((el) => setTextTracked(el, money('subtotalAmount')));\n qsa(document, sel('cart-total')).forEach((el) => setTextTracked(el, money('totalAmount')));\n qsa(document, sel('cart-checkout-charge')).forEach((el) => setTextTracked(el, money('checkoutChargeAmount')));\n\n const hasSub = this.lines.some((l) => l.sellingPlanAllocation);\n const conds = {\n 'cart-empty': count === 0,\n 'cart-filled': count > 0,\n 'cart-has-subscription': hasSub,\n 'cart-no-subscription': !hasSub,\n 'cart-has-discount': (cart?.discountCodes || []).some((d) => d.applicable),\n 'cart-error': Boolean(this.lastError),\n 'cart-warning': this.warnings.length > 0,\n };\n qsa(document, sel('cart-warning')).forEach((el) => setTextTracked(el, [...new Set(this.warnings.map((w) => w.message))].join(' ')));\n qsa(document, sel('show')).forEach((el) => {\n const k = get(el, 'show');\n if (k in conds && !el.closest(sel('product'))) show(el, conds[k]);\n });\n qsa(document, sel('checkout')).forEach((el) => {\n el.classList.toggle('is-disabled', !count);\n el.setAttribute('aria-disabled', String(!count));\n });\n\n qsa(document, `textarea${sel('cart-note')},input${sel('cart-note')}`).forEach((el) => {\n if (document.activeElement !== el) el.value = cart?.note || '';\n });\n\n qsa(document, sel('cart-discounts')).forEach((container) => {\n repeat(container, cart?.discountCodes || [], (node, d) => {\n node.setAttribute(attr('discount-code'), d.code);\n const t = node.querySelector(sel('discount', 'code')) || (node.firstElementChild ? null : node);\n if (t) setText(t, d.code);\n node.classList.toggle('is-inapplicable', !d.applicable);\n });\n });\n\n qsa(document, sel('cart-lines')).forEach((container) => {\n repeatKeyed(container, this.lines, (l) => l.id, (node, line) => renderLine(node, line), {\n onEnter: cfg.onLineEnter, onLeave: cfg.onLineLeave,\n });\n });\n\n if (cart) notifyLayoutChanged('cart');\n },\n};\n\nfunction lineValue(line, key) {\n const m = line.merchandise || {};\n const plan = line.sellingPlanAllocation?.sellingPlan;\n switch (key) {\n case 'title': return m.product?.title;\n case 'product-title': return m.product?.title;\n case 'variant-title': return m.title === 'Default Title' ? '' : m.title;\n case 'options': return (m.selectedOptions || [])\n .filter((o) => o.value !== 'Default Title').map((o) => `${o.name}: ${o.value}`).join(', ');\n case 'vendor': return m.product?.vendor;\n case 'sku': return m.sku;\n case 'price': return formatMoney(line.cost?.amountPerQuantity || m.price);\n case 'compare-at-price': return formatMoney(line.cost?.compareAtAmountPerQuantity || m.compareAtPrice);\n case 'line-total': return formatMoney(line.cost?.totalAmount);\n case 'line-subtotal': return formatMoney(line.cost?.subtotalAmount);\n case 'quantity': return Cart.quantityOf(line);\n case 'plan': return plan?.name || '';\n case 'plan-description': return plan?.description || '';\n case 'components': return (line.lineComponents || [])\n .map((c) => `${c.quantity} \u00D7 ${c.merchandise?.product?.title || ''}`).join(', ');\n default:\n if (key.startsWith('attribute:')) {\n const k = key.slice('attribute:'.length);\n return (line.attributes || []).find((a) => a.key === k)?.value || '';\n }\n return undefined;\n }\n}\n\nfunction renderLine(node, line) {\n const m = line.merchandise || {};\n const isSub = Boolean(line.sellingPlanAllocation);\n node.setAttribute(attr('line-id'), line.id);\n node.classList.toggle('is-subscription', isSub);\n\n qsa(node, sel('line')).forEach((el) => {\n const key = get(el, 'line');\n if (key === 'image') return setImage(el, m.image?.url || m.product?.featuredImage?.url, m.product?.title);\n if (key === 'url') {\n const u = productUrl(m.product?.handle, m.product?.id);\n const q = new URLSearchParams();\n if (m.id) q.set('variant', String(m.id).split('/').pop());\n const plan = line.sellingPlanAllocation?.sellingPlan?.id;\n if (plan) q.set('selling_plan', plan.split('/').pop());\n const qs = q.toString();\n return el.setAttribute('href', qs ? `${u}${u.includes('?') ? '&' : '?'}${qs}` : u);\n }\n const v = lineValue(line, key);\n if (v !== undefined) setTextTracked(el, v);\n return undefined;\n });\n\n // Shopify's note about this line (e.g. less stock than asked): class is-warning, tether-line=\"warning\".\n const warning = Cart.warnings.find((w) => w.target === line.id);\n node.classList.toggle('is-warning', Boolean(warning));\n const pending = Cart.pendingQty.has(line.id);\n node.classList.toggle('is-busy', pending);\n if (pending) node.setAttribute('aria-busy', 'true'); else node.removeAttribute('aria-busy');\n qsa(node, sel('line', 'warning')).forEach((el) => setTextTracked(el, warning?.message || ''));\n const lineConds = {\n subscription: isSub,\n 'one-time': !isSub,\n 'on-sale': parseFloat(line.cost?.compareAtAmountPerQuantity?.amount) > parseFloat(line.cost?.amountPerQuantity?.amount),\n 'has-components': (line.lineComponents || []).length > 0,\n warning: Boolean(warning),\n };\n qsa(node, sel('line-show')).forEach((el) => {\n const k = get(el, 'line-show');\n if (k in lineConds) show(el, lineConds[k]);\n });\n\n // Change frequency in the cart: <select tether-line-plan> lists the product's plans.\n qsa(node, `select${sel('line-plan')}`).forEach((select) => {\n const handle = m.product?.handle;\n if (!handle) return;\n getProduct(handle).then((product) => {\n const plans = allPlans(product);\n const allowOneTime = !product.requiresSellingPlan && get(select, 'line-plan') !== 'subscription-only';\n const want = [\n ...(allowOneTime ? [{ value: '', label: select.getAttribute(attr('one-time-label')) || 'One-time purchase' }] : []),\n ...plans.map((p) => ({ value: p.id, label: p.name })),\n ];\n const sig = want.map((w) => w.value).join('|');\n if (select.dataset.tetherSig !== sig) {\n select.innerHTML = '';\n want.forEach((w) => {\n const o = document.createElement('option');\n o.value = w.value; o.textContent = w.label;\n select.appendChild(o);\n });\n select.dataset.tetherSig = sig;\n }\n select.value = line.sellingPlanAllocation?.sellingPlan?.id || '';\n show(select, plans.length > 0);\n }).catch((err) => reportError(err, 'line plan options'));\n });\n}\n\n", "/**\n * GraphQL fragments. Built at call time because counts and metafields come\n * from config. Operations put these AFTER the operation (see withContext).\n */\nimport { cfg } from './config.js';\n\nconst MONEY = 'amount currencyCode';\nconst IMAGE = 'url altText width height';\n\nexport function metafieldIdentifiers(o = cfg) {\n return (o.metafields || []).map((m) => {\n if (typeof m === 'string') {\n const i = m.indexOf('.');\n return { namespace: m.slice(0, i), key: m.slice(i + 1) };\n }\n return m;\n }).filter((m) => m.namespace && m.key);\n}\n\nfunction metafieldsField(o = cfg) {\n const ids = metafieldIdentifiers(o);\n if (!ids.length) return '';\n const list = ids\n .map((m) => `{namespace: ${JSON.stringify(m.namespace)}, key: ${JSON.stringify(m.key)}}`)\n .join(', ');\n return `metafields(identifiers:[${list}]){namespace key type value reference{... on MediaImage{image{${IMAGE}}}}}`;\n}\n\nexport const SELLING_PLAN_FIELDS = ` id name description recurringDeliveries options{name value}priceAdjustments{orderCount adjustmentValue{__typename ... on SellingPlanPercentagePriceAdjustment{adjustmentPercentage}... on SellingPlanFixedAmountPriceAdjustment{adjustmentAmount{${MONEY}}}... on SellingPlanFixedPriceAdjustment{price{${MONEY}}}}}`;\n\nexport const ALLOCATION_FIELDS = ` sellingPlan{id}checkoutChargeAmount{${MONEY}}remainingBalanceChargeAmount{${MONEY}}priceAdjustments{price{${MONEY}}compareAtPrice{${MONEY}}perDeliveryPrice{${MONEY}}unitPrice{${MONEY}}}`;\n\n/** The product fields Tether renders. `o` = config (counts, metafields); the server module passes its own. */\nexport function productFragment(o = cfg) {\n return ` fragment TetherProduct on Product{id handle title description descriptionHtml productType vendor tags availableForSale publishedAt onlineStoreUrl requiresSellingPlan seo{title description}featuredImage{${IMAGE}}images(first:${o.imagesFirst}){nodes{${IMAGE}}}options{name optionValues{name swatch{color image{previewImage{${IMAGE}}}}}}priceRange{minVariantPrice{${MONEY}}maxVariantPrice{${MONEY}}}compareAtPriceRange{minVariantPrice{${MONEY}}maxVariantPrice{${MONEY}}}${metafieldsField(o)} sellingPlanGroups(first:${o.sellingPlanGroupsFirst}){nodes{name appName options{name values}sellingPlans(first:${o.sellingPlansFirst}){nodes{${SELLING_PLAN_FIELDS}}}}}variants(first:${o.variantsFirst}){nodes{id title availableForSale currentlyNotInStock quantityAvailable sku barcode selectedOptions{name value}image{${IMAGE}}price{${MONEY}}compareAtPrice{${MONEY}}unitPrice{${MONEY}}sellingPlanAllocations(first:${o.sellingPlansFirst}){nodes{${ALLOCATION_FIELDS}}}}}}`;\n}\n\nexport function cartFragment() {\n return ` fragment TetherCart on Cart{id checkoutUrl totalQuantity note createdAt updatedAt attributes{key value}buyerIdentity{countryCode email}discountCodes{code applicable}cost{subtotalAmount{${MONEY}}totalAmount{${MONEY}}checkoutChargeAmount{${MONEY}}}lines(first:100){nodes{id quantity attributes{key value}cost{totalAmount{${MONEY}}subtotalAmount{${MONEY}}amountPerQuantity{${MONEY}}compareAtAmountPerQuantity{${MONEY}}}discountAllocations{discountedAmount{${MONEY}}}sellingPlanAllocation{sellingPlan{id name description recurringDeliveries options{name value}}checkoutChargeAmount{${MONEY}}priceAdjustments{price{${MONEY}}compareAtPrice{${MONEY}}perDeliveryPrice{${MONEY}}}}merchandise{... on ProductVariant{id title sku availableForSale requiresShipping quantityAvailable image{${IMAGE}}price{${MONEY}}compareAtPrice{${MONEY}}selectedOptions{name value}product{id title handle vendor featuredImage{${IMAGE}}}}}... on ComponentizableCartLine{lineComponents{id quantity merchandise{... on ProductVariant{id title product{title handle}}}}}}}}`;\n}\n\nexport function collectionFields() {\n return `\n id handle title description descriptionHtml\n image { ${IMAGE} }\n seo { title description }`;\n}\n", "/**\n * Data loading. Products are batched per tick into one request and cached for\n * the lifetime of the page (survives Barba/Swup page swaps).\n */\nimport { cfg, log } from './config.js';\nimport { gql, TetherError } from './client.js';\nimport { productFragment, collectionFields } from './fragments.js';\n\nconst productCache = new Map(); // key -> Promise<product>\nlet pending = [];\nconst resolvers = new Map();\nlet scheduled = false;\n// Bumped by clearProductCache(): responses to requests sent before that (e.g. in the old\n// market after a country switch) still reach their callers but never refill the cache.\nlet generation = 0;\n\nconst isGid = (v) => typeof v === 'string' && v.startsWith('gid://');\n\n/** Accepts a handle, numeric id, gid or a full product URL. */\nexport function normalizeProductKey(raw) {\n const v = String(raw ?? '').trim();\n if (!v) return null;\n if (isGid(v)) return v;\n if (/^\\d+$/.test(v)) return `gid://shopify/Product/${v}`;\n const m = v.match(/\\/products\\/([^/?#]+)/);\n return m ? m[1] : v;\n}\n\n/** Put a product we already have (from a collection query) in the cache. */\nexport function primeProduct(product) {\n if (!product) return;\n const p = Promise.resolve(product);\n productCache.set(product.handle, p);\n productCache.set(product.id, p);\n}\n\nexport function getProduct(rawKey) {\n const key = normalizeProductKey(rawKey);\n if (!key) return Promise.reject(new TetherError('empty product key', { code: 'NOT_FOUND' }));\n if (productCache.has(key)) return productCache.get(key);\n\n const p = new Promise((resolve, reject) => {\n resolvers.set(key, { resolve, reject });\n pending.push(key);\n if (!scheduled) {\n scheduled = true;\n setTimeout(flush, 0);\n }\n });\n productCache.set(key, p);\n return p;\n}\n\nasync function flush() {\n scheduled = false;\n const gen = generation;\n const keys = pending.splice(0);\n if (!keys.length) return;\n\n const ids = keys.filter(isGid);\n const handles = keys.filter((k) => !isGid(k));\n const defs = [];\n const parts = [];\n const vars = {};\n\n if (ids.length) {\n defs.push('$ids: [ID!]!');\n vars.ids = ids;\n parts.push('byId: nodes(ids: $ids) { ... on Product { ...TetherProduct } }');\n }\n handles.forEach((h, i) => {\n defs.push(`$h${i}: String!`);\n vars[`h${i}`] = h;\n parts.push(`h${i}: product(handle: $h${i}) { ...TetherProduct }`);\n });\n\n const query = `query TetherProducts(${defs.join(',')}){${parts.join(' ')}}${productFragment()}`;\n log('fetch products', keys);\n\n const settle = (k, fn) => {\n const r = resolvers.get(k);\n resolvers.delete(k);\n if (r) fn(r);\n };\n\n try {\n const data = await gql(query, vars);\n const got = new Map();\n (data.byId || []).forEach((p) => { if (p) got.set(p.id, p); });\n handles.forEach((h, i) => { if (data[`h${i}`]) got.set(h, data[`h${i}`]); });\n\n keys.forEach((k) => settle(k, (r) => {\n if (got.has(k)) {\n const p = got.get(k);\n if (gen === generation) { primeProduct(p); freshAt.set(p.handle, Date.now()); freshAt.set(p.id, Date.now()); }\n r.resolve(p);\n } else {\n // A miss is remembered for a few seconds (one page load asking twice makes one request),\n // not longer: a product published in Shopify shows up on the next visit.\n const miss = productCache.get(k);\n if (gen === generation) setTimeout(() => { if (productCache.get(k) === miss) productCache.delete(k); }, 10000);\n r.reject(new TetherError(`Product not found: ${k}`, { code: 'NOT_FOUND' }));\n }\n }));\n } catch (err) {\n keys.forEach((k) => settle(k, (r) => { if (gen === generation) productCache.delete(k); r.reject(err); }));\n }\n}\n\nexport function clearProductCache() { productCache.clear(); generation++; stale.clear(); freshAt.clear(); }\n\n// ---------------------------------------------------------------------------\n// Hydration: products rendered on the server (tether/server hydrate()) are used at once and\n// refreshed once in the background, so prices and stock are live without a loading state.\n// ---------------------------------------------------------------------------\n\nconst stale = new Set(); // keys of products that came from the server and weren't refreshed yet\nconst freshAt = new Map(); // key -> when it was last loaded live (this page session)\nconst FRESH_MS = 60000;\n\nexport function hydrateProducts(products) {\n (products || []).forEach((p) => {\n if (!p?.id || !p.handle) return;\n // Loaded live in the last minute (an earlier page of a View Transition visit): that copy is newer.\n if (Date.now() - (freshAt.get(p.handle) || 0) < FRESH_MS && productCache.has(p.handle)) return;\n primeProduct(p);\n stale.add(p.handle);\n stale.add(p.id);\n });\n}\n\n/** True once per server-provided product: the caller refreshes it. */\nexport function takeStale(key) {\n const k = normalizeProductKey(key);\n if (!stale.has(k)) return false;\n const p = productCache.get(k);\n stale.delete(k);\n // Both keys point to the same product: refresh it once.\n p?.then?.((x) => { stale.delete(x.handle); stale.delete(x.id); });\n return true;\n}\n\n/** Fetch these products again (bypassing the cache). */\nexport function refreshProducts(keys) {\n keys.forEach((k) => productCache.delete(normalizeProductKey(k)));\n return keys.map((k) => getProduct(k));\n}\n\n/**\n * A page of products from a collection (by handle) or from a search query.\n * Returns { collection, products, pageInfo }.\n */\nexport async function getProducts({\n collection, query, first = cfg.collectionFirst, after = null, sortKey, reverse = false, filters,\n} = {}) {\n const fragment = productFragment();\n\n if (collection) {\n const data = await gql(`query TetherCollection($handle:String!,$first:Int!,$after:String,$sortKey:ProductCollectionSortKeys,$reverse:Boolean,$filters:[ProductFilter!]){collection(handle:$handle){${collectionFields()} products(first:$first,after:$after,sortKey:$sortKey,reverse:$reverse,filters:$filters){nodes{...TetherProduct}pageInfo{hasNextPage endCursor}}}}${fragment}`, {\n handle: collection, first, after, sortKey: sortKey || undefined, reverse, filters: filters || undefined,\n });\n if (!data.collection) throw new TetherError(`Collection not found: ${collection}`, { code: 'NOT_FOUND' });\n const { products, ...rest } = data.collection;\n products.nodes.forEach(primeProduct);\n return { collection: rest, products: products.nodes, pageInfo: products.pageInfo };\n }\n\n const data = await gql(`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}}}${fragment}`, { first, after, query: query || undefined, sortKey: sortKey || undefined, reverse });\n data.products.nodes.forEach(primeProduct);\n return { collection: null, products: data.products.nodes, pageInfo: data.products.pageInfo };\n}\n\nexport async function getRecommendations(product, intent = 'RELATED') {\n const key = normalizeProductKey(typeof product === 'object' ? product?.id : product);\n const byId = key?.startsWith('gid://');\n const data = await gql(`query TetherRecs(${byId ? '$id: ID!' : '$handle: String!'},$intent:ProductRecommendationIntent){productRecommendations(${byId ? 'productId: $id' : 'productHandle: $handle'},intent:$intent){...TetherProduct}}${productFragment()}`, byId ? { id: key, intent } : { handle: key, intent });\n const list = data.productRecommendations || [];\n list.forEach(primeProduct);\n return list;\n}\n", "/**\n * Pure helpers for Shopify selling plans (subscriptions). No DOM, easy to test.\n */\n\nexport const GID = {\n product: (v) => toGid(v, 'Product'),\n variant: (v) => toGid(v, 'ProductVariant'),\n sellingPlan: (v) => toGid(v, 'SellingPlan'),\n};\n\nexport function toGid(value, type) {\n const v = String(value ?? '').trim();\n if (!v) return null;\n if (v.startsWith('gid://')) return v;\n if (/^\\d+$/.test(v)) return `gid://shopify/${type}/${v}`;\n return v;\n}\n\n/** All plans of a product, flattened, each with its group attached. */\nexport function allPlans(product) {\n const groups = product?.sellingPlanGroups?.nodes || [];\n return groups.flatMap((g) => (g.sellingPlans?.nodes || []).map((p) => ({ ...p, group: g })));\n}\n\nexport function hasPlans(product) {\n return allPlans(product).length > 0;\n}\n\n/** The allocation of `planId` on `variant`, or null when the variant isn't in that plan. */\nexport function allocationFor(variant, planId) {\n if (!variant || !planId) return null;\n return (variant.sellingPlanAllocations?.nodes || []).find((a) => a.sellingPlan?.id === planId) || null;\n}\n\n/** Plans that can actually be bought with this variant. */\nexport function plansForVariant(product, variant) {\n return allPlans(product).filter((p) => allocationFor(variant, p.id));\n}\n\n/** Price per delivery for a variant on a plan (falls back to the one-time price). */\nexport function planPrice(variant, planId) {\n const a = allocationFor(variant, planId);\n const adj = a?.priceAdjustments?.[0];\n return adj?.perDeliveryPrice || adj?.price || variant?.price || null;\n}\n\n/** What the customer pays at checkout for this plan (prepaid plans charge more up front). */\nexport function planCheckoutCharge(variant, planId) {\n const a = allocationFor(variant, planId);\n return a?.checkoutChargeAmount || a?.priceAdjustments?.[0]?.price || variant?.price || null;\n}\n\n/** Savings of a plan vs the one-time price, as { amount, percentage }. */\nexport function planSavings(variant, planId) {\n const base = parseFloat(variant?.price?.amount);\n const sub = parseFloat(planPrice(variant, planId)?.amount);\n if (!Number.isFinite(base) || !Number.isFinite(sub) || base <= 0 || sub >= base) {\n return { amount: null, percentage: 0 };\n }\n return {\n amount: { amount: (base - sub).toFixed(2), currencyCode: variant.price.currencyCode },\n percentage: Math.round((1 - sub / base) * 100),\n };\n}\n\n/**\n * The plan's own discount description, independent of a variant:\n * '10%', or a fixed amount / fixed price.\n */\nexport function planAdjustment(plan) {\n const v = plan?.priceAdjustments?.[0]?.adjustmentValue;\n if (!v) return null;\n switch (v.__typename) {\n case 'SellingPlanPercentagePriceAdjustment': return { type: 'percentage', value: v.adjustmentPercentage };\n case 'SellingPlanFixedAmountPriceAdjustment': return { type: 'amount', value: v.adjustmentAmount };\n case 'SellingPlanFixedPriceAdjustment': return { type: 'price', value: v.price };\n default: return null;\n }\n}\n\n/**\n * Finds a plan by id, numeric id, name or option value (case-insensitive),\n * so Webflow editors can write tether-default-plan=\"Every month\".\n */\nexport function findPlan(product, ref) {\n if (!ref) return null;\n const plans = allPlans(product);\n const gid = GID.sellingPlan(ref);\n const needle = String(ref).trim().toLowerCase();\n return plans.find((p) => p.id === gid)\n || plans.find((p) => p.name.toLowerCase() === needle)\n || plans.find((p) => (p.options || []).some((o) => String(o.value).toLowerCase() === needle))\n || null;\n}\n", "/**\n * DOM helpers. Attribute names go through attr() so the prefix is configurable\n * (e.g. prefix: 'wfs' for markup that uses wfs-* attributes).\n */\nimport { cfg, warn } from './config.js';\n\nexport const attr = (name) => `${cfg.prefix}-${name}`;\nexport const sel = (name, value) =>\n value === undefined ? `[${attr(name)}]` : `[${attr(name)}=\"${value}\"]`;\nexport const get = (el, name) => el.getAttribute(attr(name));\nexport const has = (el, name) => el.hasAttribute(attr(name));\nexport const dataKey = () => `data-${cfg.prefix}-key`;\n\n/**\n * productPath '/product' -> /product/<handle>.\n * Templates: '/product?handle={handle}' (one static page for every product,\n * with tether-product=\"url:handle\"), '/p/{id}' (numeric product id).\n */\nexport function productUrl(handle, id) {\n const path = cfg.productPath || '/product';\n if (!/\\{(handle|id)\\}/.test(path)) return `${path.replace(/\\/$/, '')}/${handle}`;\n const numeric = id ? String(id).split('/').pop() : '';\n return path.replace(/\\{handle\\}/g, encodeURIComponent(handle || '')).replace(/\\{id\\}/g, encodeURIComponent(numeric));\n}\n\nexport const qsa = (root, s) => (root ? [...root.querySelectorAll(s)] : []);\n\n/** Elements in `root` whose nearest `scopeSelector` ancestor is `root` itself. */\nexport const scoped = (root, s, scopeSelector) =>\n qsa(root, s).filter((el) => el.closest(scopeSelector) === root);\n\nexport function emit(name, detail, target = document) {\n target.dispatchEvent(new CustomEvent(`${cfg.prefix}:${name}`, { detail, bubbles: true }));\n}\n\n/** 30 -> \"30%\" (en, nl) or \"30 %\" (de, fr), in the configured locale. */\nexport function formatPercent(n, locale = cfg.locale) {\n if (!n) return '';\n try { return new Intl.NumberFormat(locale || undefined, { style: 'percent', maximumFractionDigits: 0 }).format(n / 100); } catch { return `${n}%`; }\n}\n\nexport function formatMoney(money) {\n if (!money) return '';\n if (typeof cfg.formatMoney === 'function') return cfg.formatMoney(money, cfg.locale);\n const amount = parseFloat(money.amount);\n if (Number.isNaN(amount)) return '';\n try {\n return new Intl.NumberFormat(cfg.locale || undefined, {\n style: 'currency', currency: money.currencyCode,\n }).format(amount);\n } catch {\n return `${money.currencyCode} ${amount.toFixed(2)}`;\n }\n}\n\nexport function formatDate(iso) {\n if (!iso) return '';\n try { return new Date(iso).toLocaleDateString(cfg.locale || undefined); } catch { return ''; }\n}\n\n/** Shopify CDN resize via max-width / max-height / crop attributes on the element. */\n/**\n * Shopify CDN image at a size: imageUrl(url, { width: 800 }). Use the same width as the element's\n * max-width attribute, so the browser script keeps the image instead of loading it again.\n */\nexport function imageUrl(url, { width, height, crop } = {}) {\n if (!url) return url;\n try {\n const u = new URL(url);\n if (width) u.searchParams.set('width', String(width));\n if (height) u.searchParams.set('height', String(height));\n if (crop) u.searchParams.set('crop', crop);\n return u.toString();\n } catch { return url; }\n}\n\nexport function cdnUrl(url, el) {\n if (!url || !el) return url;\n // max-width (Webflow's custom attribute), or valid HTML: tether-max-width / data-max-width.\n const g = (k) => el.getAttribute(k) ?? el.getAttribute(`${cfg.prefix}-${k}`) ?? el.getAttribute(`data-${k}`);\n return imageUrl(url, { width: g('max-width'), height: g('max-height'), crop: g('max-width') || g('max-height') ? g('crop') : null });\n}\n\n/** Same image, whatever size parameters: the server-rendered one is kept (no second download). */\nexport const sameImage = (a, b) => Boolean(a && b) && a.split('?')[0] === b.split('?')[0];\n\nexport function setImage(el, url, alt) {\n if (!url) return;\n const src = cdnUrl(url, el);\n if (el.tagName === 'IMG' && sameImage(el.getAttribute('src'), src)) {\n if (alt != null && !el.getAttribute('alt')) el.setAttribute('alt', alt);\n return;\n }\n if (el.tagName === 'IMG') {\n el.removeAttribute('srcset');\n el.removeAttribute('sizes');\n el.setAttribute('src', src);\n if (alt != null) el.setAttribute('alt', alt);\n if (!el.getAttribute('loading')) el.setAttribute('loading', 'lazy');\n } else {\n el.style.backgroundImage = `url(\"${src}\")`;\n }\n}\n\nexport function setText(el, v) {\n const text = v == null ? '' : String(v);\n if (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA') el.value = text;\n else el.textContent = text;\n}\n\nexport const readText = (el) => (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA' ? el.value : el.textContent);\n\n/** setText that reports changes to cfg.onValueChange (for scramble/roll effects). */\nexport function setTextTracked(el, v) {\n const before = readText(el);\n setText(el, v);\n const after = readText(el);\n if (before !== after && el.dataset.tetherSeen && typeof cfg.onValueChange === 'function') {\n try { cfg.onValueChange(el, before); } catch { /* ignore */ }\n }\n el.dataset.tetherSeen = '1';\n}\n\nexport function show(el, visible) {\n const k = 'tetherPrevDisplay';\n if (visible) {\n if (el.dataset.tetherShown !== undefined) return; // already visible, nothing to check\n el.dataset.tetherShown = '';\n el.removeAttribute('hidden');\n if (el.dataset[k] !== undefined) {\n el.style.display = el.dataset[k];\n delete el.dataset[k];\n } else if (el.style.display === 'none') {\n el.style.display = '';\n }\n // Hidden before the script ran (a class, an inline display:none, a hidden attribute): show it\n // as block or the value of tether-display.\n if (typeof getComputedStyle === 'function' && getComputedStyle(el).display === 'none') {\n el.style.display = el.getAttribute(`${cfg.prefix}-display`) || 'block';\n }\n } else {\n delete el.dataset.tetherShown;\n // Remember a real display value to restore, never 'none'.\n if (el.dataset[k] === undefined && el.style.display !== 'none') el.dataset[k] = el.style.display || '';\n el.style.display = 'none';\n }\n}\n\nexport function setSelected(el, selected) {\n el.classList.toggle('is-selected', selected);\n el.setAttribute('aria-pressed', selected ? 'true' : 'false');\n if (el.tagName === 'INPUT' && (el.type === 'radio' || el.type === 'checkbox')) el.checked = selected;\n const input = el.querySelector?.('input[type=\"radio\"],input[type=\"checkbox\"]');\n if (input) input.checked = selected;\n}\n\n// ---------------------------------------------------------------------------\n// Repeaters: the first child in Webflow is the template, the rest is removed.\n// ---------------------------------------------------------------------------\n\nconst templates = new WeakMap();\n\n/** True once a repeater's template has been captured (it may be empty after that). */\nexport const hasTemplate = (container) => Boolean(templates.get(container));\n\nfunction template(container) {\n if (!templates.has(container)) {\n const tpl = container.firstElementChild?.cloneNode(true) ?? null;\n templates.set(container, tpl);\n container.innerHTML = '';\n }\n return templates.get(container);\n}\n\n/** Rebuilds the list on every render. Fine for images, tags, options. */\nexport function repeat(container, items, render) {\n const tpl = template(container);\n if (!tpl) { if (items.length) warn('repeater without a template child', container); return; }\n container.innerHTML = '';\n items.forEach((item, i) => {\n const node = tpl.cloneNode(true);\n render(node, item, i);\n container.appendChild(node);\n });\n}\n\n/**\n * Keyed repeater: keeps existing nodes, inserts new ones, removes old ones.\n * Used for cart lines, so values can animate and lines can slide in/out.\n */\nexport function repeatKeyed(container, items, keyOf, render, { onEnter, onLeave } = {}) {\n const tpl = template(container);\n if (!tpl) { warn('repeater without a template child', container); return; }\n\n const KEY = dataKey();\n const LEAVING = `data-${cfg.prefix}-leaving`;\n const live = () => [...container.children].filter((n) => n.hasAttribute(KEY) && !n.hasAttribute(LEAVING));\n\n const existing = new Map(live().map((n) => [n.getAttribute(KEY), n]));\n const wanted = [];\n const fresh = new Set();\n\n items.forEach((item, i) => {\n const k = String(keyOf(item, i));\n let node = existing.get(k);\n if (node) existing.delete(k);\n else {\n node = tpl.cloneNode(true);\n node.setAttribute(KEY, k);\n fresh.add(node);\n }\n render(node, item, i, fresh.has(node));\n wanted.push(node);\n });\n\n const staying = wanted.filter((n) => !fresh.has(n));\n const current = live().filter((n) => staying.includes(n));\n const orderOk = current.length === staying.length && current.every((n, i) => n === staying[i]);\n\n if (!orderOk) {\n existing.forEach((n) => n.remove());\n wanted.forEach((n) => container.appendChild(n));\n return;\n }\n\n wanted.forEach((node, i) => {\n if (!fresh.has(node)) return;\n const prev = wanted[i - 1];\n if (prev && prev.parentNode === container) prev.after(node);\n else container.prepend(node);\n if (onEnter) { try { onEnter(node); } catch { /* ignore */ } }\n });\n\n existing.forEach((node) => {\n node.setAttribute(LEAVING, '');\n node.removeAttribute(KEY);\n node.style.pointerEvents = 'none';\n node.inert = true;\n const done = () => node.remove();\n if (onLeave) { try { onLeave(node, done); } catch { done(); } } else done();\n });\n}\n\n// ---------------------------------------------------------------------------\n// Layout notifications: async renders change page height after your\n// page-transition hooks ran. Debounced, then cfg.onLayoutChange or a default.\n// ---------------------------------------------------------------------------\n\nlet layoutTimer = null;\n\nexport function notifyLayoutChanged(reason) {\n clearTimeout(layoutTimer);\n layoutTimer = setTimeout(() => {\n if (typeof cfg.onLayoutChange === 'function') cfg.onLayoutChange(reason);\n else if (window.ScrollTrigger?.refresh) window.ScrollTrigger.refresh();\n emit('layout-changed', { reason });\n }, 120);\n}\n\nexport function watchImages(root, reason) {\n const imgs = qsa(root, 'img').filter((i) => !i.complete);\n if (!imgs.length) return;\n let left = imgs.length;\n const done = () => { if (--left === 0) notifyLayoutChanged(`${reason}:images`); };\n imgs.forEach((img) => {\n img.addEventListener('load', done, { once: true });\n img.addEventListener('error', done, { once: true });\n });\n}\n\nexport function busy(el, fn) {\n if (el.getAttribute('aria-busy') === 'true') return Promise.resolve();\n el.setAttribute('aria-busy', 'true');\n return Promise.resolve().then(fn).finally(() => el.removeAttribute('aria-busy'));\n}\n\nexport function parseJSONAttr(el, name) {\n const raw = el && get(el, name);\n if (!raw) return null;\n try { return JSON.parse(raw); } catch { warn(`invalid JSON in ${attr(name)}`, el); return null; }\n}\n\n/** {a: 1} or [{key, value}] -> [{key, value}] as Shopify wants it. */\nexport function toAttributes(obj) {\n if (!obj) return [];\n if (Array.isArray(obj)) return obj.map((a) => ({ key: String(a.key), value: String(a.value ?? '') }));\n return Object.entries(obj).map(([key, value]) => ({ key, value: String(value ?? '') }));\n}\n", "/**\n * ProductScope: everything inside [tether-product=\"<handle>\"] binds to one\n * Shopify product: options, variants, quantity, subscriptions, add to cart.\n */\nimport { cfg, reportError } from './config.js';\nimport {\n attr, sel, get, has, qsa, scoped, emit, formatMoney, formatDate, setText, setImage, show,\n setSelected, repeat, productUrl, notifyLayoutChanged, watchImages, busy, parseJSONAttr, toAttributes, sameImage, hasTemplate, formatPercent,\n} from './dom.js';\nimport { Cart } from './cart.js';\nimport { STATUS_KEYS, ownedBy } from './status.js';\nimport {\n allPlans, allocationFor, planPrice, planCheckoutCharge, planSavings, planAdjustment, findPlan, GID,\n} from './selling-plans.js';\n\nexport const scopes = new WeakMap(); // element -> ProductScope\n\nconst productSel = () => sel('product');\n\nfunction metafieldValue(product, ref) {\n const i = ref.indexOf('.');\n const ns = ref.slice(0, i);\n const key = ref.slice(i + 1);\n const mf = (product.metafields || []).find((m) => m && m.namespace === ns && m.key === key);\n return mf || null;\n}\n\n// Option names as written in the markup (the build's language), by product handle. With another\n// language Shopify translates them (Size -> Gr\u00F6\u00DFe), so attributes are matched by position instead.\nconst knownOptionNames = new Map();\nexport function rememberOptionNames(products) {\n (products || []).forEach((p) => { if (p?.handle && !knownOptionNames.has(p.handle)) knownOptionNames.set(p.handle, (p.options || []).map((o) => o.name)); });\n}\n\nexport class ProductScope {\n constructor(root, product) {\n this.root = root;\n this.product = product;\n this.selected = {};\n this.variant = null;\n this.quantity = Math.max(0, parseInt(get(root, 'quantity') ?? '1', 10) || (has(root, 'quantity') ? 0 : 1));\n this.plans = allPlans(product);\n this.purchase = 'one-time';\n this.planId = null;\n\n scopes.set(root, this);\n root.setAttribute(attr('state'), 'ready');\n root.removeAttribute(attr('error'));\n\n this.initSelection();\n this.initPurchase();\n this.renderProduct();\n this.bind();\n this.renderVariant();\n\n watchImages(root, 'product');\n notifyLayoutChanged('product');\n emit('product-ready', { product, scope: this }, root);\n }\n\n /** New data for the same product (e.g. after a country switch). Keeps the selection. */\n update(product) {\n const variantId = this.variant?.id;\n this.product = product;\n this.plans = allPlans(product);\n if (this.planId && !this.plans.some((p) => p.id === this.planId)) this.planId = this.plans[0]?.id || null;\n if (!this.plans.length && this.purchase === 'subscription') this.purchase = 'one-time';\n const v = product.variants.nodes.find((x) => x.id === variantId);\n if (v) { this.selected = {}; v.selectedOptions.forEach((o) => { this.selected[o.name] = o.value; }); }\n this.root.setAttribute(attr('state'), 'ready');\n this.root.removeAttribute(attr('error'));\n this.renderProduct();\n this.renderVariant();\n notifyLayoutChanged('product');\n emit('product-updated', { product, scope: this }, this.root);\n }\n\n /** Matching elements in this scope, including the root itself (e.g. a card link with tether-bind=\"link\"). */\n $(s) {\n const inner = scoped(this.root, s, productSel());\n return this.root.matches(s) ? [this.root, ...inner] : inner;\n }\n\n // ------------------------------------------------------------ state\n\n /** The product's option name for a name used in the markup (same name, or same position). */\n optName(authored) {\n const opts = this.product?.options || [];\n if (!authored || opts.some((o) => o.name === authored)) return authored;\n const i = (knownOptionNames.get(this.product.handle) || []).indexOf(authored);\n return i >= 0 && opts[i] ? opts[i].name : authored;\n }\n\n initSelection() {\n const vs = this.product.variants.nodes;\n const first = vs.find((v) => v.availableForSale) || vs[0];\n if (first) first.selectedOptions.forEach((o) => { this.selected[o.name] = o.value; });\n\n const param = new URLSearchParams(window.location.search).get('variant') || get(this.root, 'variant');\n if (param) {\n const gid = GID.variant(param);\n const match = vs.find((v) => v.id === gid);\n if (match) {\n this.selected = {};\n match.selectedOptions.forEach((o) => { this.selected[o.name] = o.value; });\n }\n }\n }\n\n initPurchase() {\n if (!this.plans.length) return;\n const params = new URLSearchParams(window.location.search);\n const fromUrl = findPlan(this.product, params.get('selling_plan'));\n const fromAttr = findPlan(this.product, get(this.root, 'default-plan'));\n this.planId = (fromUrl || fromAttr || this.plans[0]).id;\n\n const wanted = fromUrl ? 'subscription' : (get(this.root, 'default-purchase') || cfg.defaultPurchase);\n this.purchase = this.product.requiresSellingPlan || wanted === 'subscription' ? 'subscription' : 'one-time';\n }\n\n findVariant() {\n return this.product.variants.nodes.find((v) =>\n v.selectedOptions.every((o) => this.selected[o.name] === o.value)) || null;\n }\n\n isValueAvailable(name, value) {\n return this.product.variants.nodes.some((v) =>\n v.availableForSale && v.selectedOptions.every((o) =>\n (o.name === name ? o.value === value : this.selected[o.name] === o.value)));\n }\n\n get plan() { return this.plans.find((p) => p.id === this.planId) || null; }\n\n /** True when the current variant can be bought on the selected plan. */\n get subscriptionAvailable() {\n return Boolean(this.variant && this.plans.some((p) => allocationFor(this.variant, p.id)));\n }\n\n get isSubscription() {\n return this.purchase === 'subscription' && Boolean(allocationFor(this.variant, this.planId));\n }\n\n /** What would be added to the cart right now. */\n getLine() {\n if (!this.variant) return null;\n const line = { merchandiseId: this.variant.id, quantity: this.quantity };\n if (this.isSubscription) line.sellingPlanId = this.planId;\n const attrs = this.collectAttributes();\n if (attrs.length) line.attributes = attrs;\n return line;\n }\n\n collectAttributes() {\n const fixed = toAttributes(parseJSONAttr(this.root, 'line-attributes'));\n const inputs = this.$(sel('line-attribute')).map((el) => {\n const key = get(el, 'line-attribute');\n let value;\n if (el.type === 'checkbox') value = el.checked ? (el.value && el.value !== 'on' ? el.value : 'Yes') : '';\n else if (el.type === 'radio') value = el.checked ? el.value : null;\n else value = el.value;\n return value == null || value === '' ? null : { key, value: String(value) };\n }).filter(Boolean);\n return [...fixed, ...inputs];\n }\n\n // ------------------------------------------------------------ actions\n\n select(name, value) {\n if (this.selected[name] === value) return;\n const vs = this.product.variants.nodes.filter((v) => v.selectedOptions.some((o) => o.name === name && o.value === value));\n if (!vs.length) return; // a value no variant has: nothing to select, keep the visitor's choice\n const next = { ...this.selected, [name]: value };\n if (!vs.some((v) => v.selectedOptions.every((o) => next[o.name] === o.value))) {\n // That combination doesn't exist: the closest variant with this value (most other choices kept, available first).\n const score = (v) => v.selectedOptions.filter((o) => o.name !== name && this.selected[o.name] === o.value).length * 2 + (v.availableForSale ? 1 : 0);\n const best = vs.reduce((a, b) => (score(b) > score(a) ? b : a));\n best.selectedOptions.forEach((o) => { next[o.name] = o.value; });\n }\n this.selected = next;\n this.renderVariant();\n }\n\n selectVariant(id) {\n const v = this.product.variants.nodes.find((x) => x.id === GID.variant(id));\n if (!v) return;\n this.selected = {};\n v.selectedOptions.forEach((o) => { this.selected[o.name] = o.value; });\n this.renderVariant();\n }\n\n setPurchase(mode) {\n const next = mode === 'subscription' ? 'subscription' : 'one-time';\n if (next === 'one-time' && this.product.requiresSellingPlan) return;\n if (this.purchase === next) return;\n this.purchase = next;\n this.renderVariant();\n }\n\n selectPlan(ref) {\n const p = findPlan(this.product, ref);\n if (!p) return;\n this.planId = p.id;\n this.purchase = 'subscription';\n this.renderVariant();\n }\n\n setQuantity(n) {\n const min = has(this.root, 'quantity') ? 0 : 1;\n this.quantity = Math.max(min, parseInt(n, 10) || 0);\n this.$(sel('qty')).forEach((i) => setText(i, this.quantity));\n this.renderVariant();\n }\n\n async addToCart() {\n if (!this.variant?.availableForSale) return null;\n const line = this.getLine();\n if (!line || line.quantity < 1) return null;\n const cart = await Cart.add(line);\n emit('product-added', { product: this.product, variant: this.variant, line }, this.root);\n return cart;\n }\n\n // ------------------------------------------------------------ events\n\n bind() {\n const own = (el) => el && el.closest(productSel()) === this.root;\n\n this.root.addEventListener('click', (e) => {\n const t = e.target;\n if (!t?.closest) return;\n\n const opt = t.closest(sel('option-value'));\n if (own(opt) && opt.closest(sel('option-list'))) {\n e.preventDefault();\n this.select(this.optName(get(opt.closest(sel('option-list')), 'option-list')), get(opt, 'option-value'));\n return;\n }\n\n const plan = t.closest(sel('plan-value'));\n if (own(plan)) { e.preventDefault(); this.selectPlan(get(plan, 'plan-value')); return; }\n\n const purchase = t.closest(`${sel('purchase')}:not(select)`);\n if (own(purchase)) {\n if (purchase.tagName !== 'INPUT') e.preventDefault();\n this.setPurchase(get(purchase, 'purchase'));\n return;\n }\n\n const plus = t.closest(sel('qty-plus'));\n if (own(plus)) { e.preventDefault(); this.setQuantity(this.quantity + 1); return; }\n const minus = t.closest(sel('qty-minus'));\n if (own(minus)) { e.preventDefault(); this.setQuantity(this.quantity - 1); return; }\n\n const add = t.closest(sel('add-to-cart'));\n if (own(add)) { e.preventDefault(); this.onAddClick(add); }\n });\n\n this.root.addEventListener('change', (e) => {\n const t = e.target;\n if (!own(t)) return;\n if (t.matches(`select${sel('option')}`)) this.select(this.optName(get(t, 'option')), t.value);\n else if (t.matches(`select${sel('variant-select')}`)) this.selectVariant(t.value);\n else if (t.matches(`select${sel('plan')}`)) {\n if (t.value) this.selectPlan(t.value); else this.setPurchase('one-time');\n } else if (t.matches(`select${sel('purchase')}`)) this.setPurchase(t.value);\n else if (t.matches(sel('qty'))) this.setQuantity(t.value);\n });\n }\n\n onAddClick(btn) {\n const label = btn.querySelector(sel('add-label')) || btn;\n const busyText = get(btn, 'adding-text');\n const write = (txt) => setText(label, txt);\n if (label.dataset.tetherLabel === undefined) label.dataset.tetherLabel = label.tagName === 'INPUT' ? label.value : label.textContent;\n\n busy(btn, async () => {\n if (busyText) write(busyText);\n try { await this.addToCart(); } catch (err) {\n reportError(err, 'add to cart failed');\n emit('error', { error: err, context: 'add-to-cart' }, this.root);\n } finally {\n if (busyText) write(label.dataset.tetherLabel);\n }\n }).then(() => {\n // Restore mode-dependent labels (subscribe-text / soldout-text) after aria-busy is cleared.\n this.renderVariant();\n });\n }\n\n // ------------------------------------------------------------ render\n\n renderProduct() {\n const p0 = this.product;\n if (!knownOptionNames.has(p0.handle)) {\n const authored = this.$(`${sel('option-list')},select${sel('option')}`).map((e) => get(e, 'option-list') || get(e, 'option'));\n if (authored.some((n) => p0.options.some((o) => o.name === n))) rememberOptionNames([p0]);\n }\n const p = this.product;\n\n this.$(sel('bind')).forEach((el) => {\n const key = get(el, 'bind') || '';\n const txt = {\n title: p.title,\n 'description-text': p.description,\n vendor: p.vendor,\n type: p.productType,\n handle: p.handle,\n }[key];\n if (txt !== undefined) return setText(el, txt);\n switch (key) {\n case 'description': el.innerHTML = p.descriptionHtml || ''; return undefined;\n case 'published-at': return setText(el, formatDate(p.publishedAt));\n case 'min-price': return setText(el, formatMoney(p.priceRange.minVariantPrice));\n case 'max-price': return setText(el, formatMoney(p.priceRange.maxVariantPrice));\n case 'featured-image': return setImage(el, p.featuredImage?.url, p.featuredImage?.altText || p.title);\n case 'url':\n case 'link':\n el.setAttribute('href', productUrl(p.handle, p.id));\n if (key === 'url' && !el.firstElementChild && !el.textContent.trim()) setText(el, p.title);\n return undefined;\n case 'images': {\n // Server-rendered gallery with the same images: keep it as it is.\n const imgs = [...el.children].map((n) => (n.tagName === 'IMG' ? n : n.querySelector('img')));\n if (!hasTemplate(el) && imgs.length === p.images.nodes.length && imgs.every((im, i) => sameImage(im?.getAttribute('src'), p.images.nodes[i].url))) return undefined;\n }\n return repeat(el, p.images.nodes, (node, img) => {\n const target = node.matches(`img,${sel('bind', 'image')}`) ? node : node.querySelector('img') || node;\n setImage(target, img.url, img.altText || p.title);\n });\n case 'tags': {\n const exclude = (el.getAttribute('exclude') || '').split(',').map((s) => s.trim()).filter(Boolean);\n return repeat(el, p.tags.filter((t) => !exclude.includes(t)), (node, tag) => setText(node, tag));\n }\n default:\n // image:2 = the second product image (falls back to the featured image)\n if (/^image:\\d+$/.test(key)) {\n const img = p.images.nodes[key.slice(6) - 1] || p.featuredImage;\n return setImage(el, img?.url, img?.altText || p.title);\n }\n if (key.startsWith('metafield:')) {\n const mf = metafieldValue(p, key.slice(10));\n if (!mf) return setText(el, '');\n if (mf.reference?.image) return setImage(el, mf.reference.image.url, mf.reference.image.altText);\n if (/^(rich_text|multi_line_text)_field$/.test(mf.type)) el.style.whiteSpace = 'pre-line';\n return setText(el, mf.value);\n }\n return undefined;\n }\n });\n\n this.$(sel('option-list')).forEach((container) => {\n const name = this.optName(get(container, 'option-list'));\n const opt = p.options.find((o) => o.name === name);\n if (!opt || (opt.optionValues.length <= 1 && has(container, 'hide-single'))) return show(container, false);\n return repeat(container, opt.optionValues, (node, v) => {\n node.setAttribute(attr('option-value'), v.name);\n const t = node.querySelector(sel('bind', 'option-value'));\n if (t) setText(t, v.name); else if (!node.firstElementChild) setText(node, v.name);\n const sw = node.querySelector(sel('bind', 'swatch'));\n if (sw && v.swatch?.color) sw.style.backgroundColor = v.swatch.color;\n if (sw && v.swatch?.image?.previewImage) setImage(sw, v.swatch.image.previewImage.url, v.name);\n });\n });\n\n this.$(`select${sel('option')}`).forEach((s) => {\n const opt = p.options.find((o) => o.name === this.optName(get(s, 'option')));\n if (!opt) return show(s, false);\n s.innerHTML = '';\n opt.optionValues.forEach((v) => s.appendChild(new Option(v.name, v.name)));\n return undefined;\n });\n\n this.$(`select${sel('variant-select')}`).forEach((s) => {\n s.innerHTML = '';\n p.variants.nodes.forEach((v) => s.appendChild(new Option(v.title, v.id)));\n });\n\n // Subscriptions\n this.$(sel('plan-list')).forEach((container) => {\n // Value = selling plan group name. Empty, \"true\", \"all\" or \"*\" = every plan\n // (Webflow's Designer doesn't always allow empty attribute values).\n const raw = (get(container, 'plan-list') || '').trim();\n const group = ['', 'true', 'all', '*'].includes(raw.toLowerCase()) ? null : raw;\n const plans = this.plans.filter((pl) => !group || pl.group.name === group);\n repeat(container, plans, (node, plan) => {\n node.setAttribute(attr('plan-value'), plan.id);\n if (!node.firstElementChild && !node.querySelector(sel('plan-bind'))) setText(node, plan.name);\n });\n });\n\n this.$(`select${sel('plan')}`).forEach((s) => {\n s.innerHTML = '';\n if (!p.requiresSellingPlan && get(s, 'plan') !== 'subscription-only') {\n s.appendChild(new Option(s.getAttribute(attr('one-time-label')) || 'One-time purchase', ''));\n }\n this.plans.forEach((pl) => s.appendChild(new Option(pl.name, pl.id)));\n });\n }\n\n renderVariant() {\n const p = this.product;\n let v = this.findVariant();\n if (!v) {\n [v] = p.variants.nodes;\n if (v) {\n this.selected = {};\n v.selectedOptions.forEach((o) => { this.selected[o.name] = o.value; });\n }\n }\n this.variant = v;\n if (!v) return;\n\n // A plan the variant isn't in -> pick the first one it is in.\n if (this.plans.length && !allocationFor(v, this.planId)) {\n const alt = this.plans.find((pl) => allocationFor(v, pl.id));\n if (alt) this.planId = alt.id;\n }\n\n const sub = this.isSubscription;\n const oneTimePrice = v.price;\n const subPrice = this.planId ? planPrice(v, this.planId) : null;\n const price = sub ? subPrice : oneTimePrice;\n const compareAt = sub ? (allocationFor(v, this.planId)?.priceAdjustments?.[0]?.compareAtPrice || v.compareAtPrice) : v.compareAtPrice;\n const onSale = compareAt && parseFloat(compareAt.amount) > parseFloat(price.amount);\n const discountPct = onSale ? Math.round((1 - parseFloat(price.amount) / parseFloat(compareAt.amount)) * 100) : 0;\n const savings = this.planId ? planSavings(v, this.planId) : { amount: null, percentage: 0 };\n const plan = this.plan;\n const total = { amount: (parseFloat(price.amount) * Math.max(1, this.quantity)).toFixed(2), currencyCode: price.currencyCode };\n\n const fm = formatMoney;\n const pct = (n) => formatPercent(n);\n // Text binds: name -> value (functions, so only the binds on the page are computed).\n const text = {\n price: () => fm(price),\n 'total-price': () => fm(total),\n 'one-time-price': () => fm(oneTimePrice),\n 'subscription-price': () => fm(subPrice),\n 'subscription-savings': () => pct(savings.percentage),\n 'subscription-savings-amount': () => fm(savings.amount),\n // What the visitor pays today for the chosen quantity (prepaid plans charge more up front).\n 'checkout-charge': () => { const c = sub ? planCheckoutCharge(v, this.planId) : price; return c && fm({ amount: (parseFloat(c.amount) * Math.max(1, this.quantity)).toFixed(2), currencyCode: c.currencyCode }); },\n 'plan-name': () => plan?.name,\n 'plan-description': () => plan?.description,\n 'plan-group': () => plan?.group?.name,\n 'compare-at-price': () => (onSale ? fm(compareAt) : ''),\n 'unit-price': () => fm(v.unitPrice),\n 'discount-percentage': () => `${discountPct}%`,\n 'discount-amount': () => (onSale ? fm({ amount: String(parseFloat(compareAt.amount) - parseFloat(price.amount)), currencyCode: price.currencyCode }) : ''),\n 'variant-title': () => v.title,\n 'variant-id': () => v.id,\n sku: () => v.sku,\n barcode: () => v.barcode,\n stock: () => v.quantityAvailable,\n quantity: () => this.quantity,\n };\n this.$(sel('bind')).forEach((el) => {\n const k = get(el, 'bind');\n if (k === 'variant-image') setImage(el, v.image?.url || p.featuredImage?.url, v.image?.altText || p.title);\n else if (text[k]) setText(el, text[k]());\n });\n\n this.$(sel('option-selected')).forEach((el) => setText(el, this.selected[this.optName(get(el, 'option-selected'))] || ''));\n\n this.$(sel('option-list')).forEach((container) => {\n const name = this.optName(get(container, 'option-list'));\n qsa(container, sel('option-value')).forEach((node) => {\n const value = get(node, 'option-value');\n setSelected(node, this.selected[name] === value);\n const unavailable = !this.isValueAvailable(name, value);\n node.classList.toggle('is-unavailable', unavailable);\n node.setAttribute('data-unavailable', unavailable ? 'true' : 'false');\n });\n });\n\n this.$(`select${sel('option')}`).forEach((s) => { s.value = this.selected[this.optName(get(s, 'option'))] || ''; });\n this.$(`select${sel('variant-select')}`).forEach((s) => { s.value = v.id; });\n\n // Subscription UI\n this.$(sel('purchase')).forEach((el) => {\n if (el.tagName === 'SELECT') { el.value = this.purchase; return; }\n const mode = get(el, 'purchase');\n setSelected(el, mode === this.purchase);\n const unavailable = mode === 'subscription' ? !this.subscriptionAvailable : p.requiresSellingPlan;\n el.classList.toggle('is-unavailable', unavailable);\n });\n\n this.$(sel('plan-value')).forEach((node) => {\n const id = get(node, 'plan-value');\n const planObj = this.plans.find((pl) => pl.id === id);\n const inVariant = Boolean(allocationFor(v, id));\n setSelected(node, sub && id === this.planId);\n node.classList.toggle('is-unavailable', !inVariant);\n qsa(node, sel('plan-bind')).forEach((el) => {\n const adj = planAdjustment(planObj);\n const s = planSavings(v, id);\n const k = get(el, 'plan-bind');\n const val = {\n name: () => planObj?.name,\n option: () => (planObj?.options || []).map((o) => o.value).join(', '), // e.g. \"1 month\", without the store's price text\n description: () => planObj?.description,\n price: () => fm(planPrice(v, id)),\n savings: () => pct(s.percentage),\n 'savings-amount': () => fm(s.amount),\n adjustment: () => (!adj ? '' : adj.type === 'percentage' ? `${adj.value}%` : fm(adj.value)),\n }[k];\n if (val) setText(el, val());\n });\n });\n\n this.$(`select${sel('plan')}`).forEach((s) => { s.value = sub ? this.planId : ''; });\n\n const low = v.quantityAvailable != null && v.quantityAvailable > 0 && v.quantityAvailable <= (cfg.lowStock ?? 5);\n const conds = {\n 'in-stock': v.availableForSale,\n 'out-of-stock': !v.availableForSale,\n 'backorder': v.availableForSale && v.currentlyNotInStock,\n 'on-sale': Boolean(onSale),\n 'not-on-sale': !onSale,\n 'has-variants': p.variants.nodes.length > 1,\n 'single-variant': p.variants.nodes.length === 1,\n 'low-stock': low,\n 'plenty-in-stock': v.availableForSale && !low,\n 'subscription-available': this.subscriptionAvailable,\n 'subscription-unavailable': !this.subscriptionAvailable,\n 'subscription-only': Boolean(p.requiresSellingPlan),\n 'one-time-available': !p.requiresSellingPlan,\n 'subscription-selected': sub,\n 'one-time-selected': !sub,\n 'has-savings': sub ? savings.percentage > 0 : Boolean(onSale),\n // scope state (see status.js)\n 'loading': false,\n 'ready': true,\n 'error': false,\n 'not-found': false,\n };\n this.$(sel('show')).forEach((el) => {\n const k = get(el, 'show');\n if (!(k in conds)) return;\n // State blocks of a list nested in this product belong to that list.\n if (STATUS_KEYS.includes(k) && !ownedBy(el, this.root)) return;\n show(el, conds[k]);\n });\n\n this.root.classList.toggle('is-subscription', sub);\n this.root.setAttribute(attr('purchase-mode'), sub ? 'subscription' : 'one-time');\n\n this.$(sel('add-to-cart')).forEach((btn) => {\n const disabled = !v.availableForSale;\n btn.classList.toggle('is-disabled', disabled);\n btn.setAttribute('aria-disabled', String(disabled));\n if ('disabled' in btn) btn.disabled = disabled;\n const soldOut = get(btn, 'soldout-text');\n const subText = get(btn, 'subscribe-text');\n if (soldOut || subText) {\n const label = btn.querySelector(sel('add-label')) || btn;\n if (label.dataset.tetherLabel === undefined) label.dataset.tetherLabel = label.tagName === 'INPUT' ? label.value : label.textContent;\n let text = label.dataset.tetherLabel;\n if (sub && subText) text = subText;\n if (disabled && soldOut) text = soldOut;\n if (btn.getAttribute('aria-busy') !== 'true') setText(label, text);\n }\n });\n\n emit('variant-changed', {\n product: p, variant: v, selected: { ...this.selected },\n purchase: this.purchase, sellingPlanId: sub ? this.planId : null,\n }, this.root);\n\n }\n}\n", "/**\n * Where a product scope gets its key from, and the loading / ready / error /\n * not-found state of a scope (so a failing API never leaves a broken page).\n */\nimport { attr, sel, get, scoped, show } from './dom.js';\n\n/**\n * tether-product values:\n * \"coffee-box\" handle, numeric id, gid or product URL (as before)\n * \"url:handle\" ?handle=... from the page URL (any param name: \"url:p\" -> ?p=)\n * \"url:path\" the last segment of the page path (/shop/coffee-box -> coffee-box)\n * Returns { key, fromUrl, raw }. key is null when the URL has no value.\n */\nexport function resolveProductKey(el, location = window.location, name = 'product') {\n const raw = (get(el, name) || '').trim();\n if (!raw.toLowerCase().startsWith('url:')) return { key: raw || null, fromUrl: false, raw };\n const what = raw.slice(4).trim();\n let key = null;\n if (what.toLowerCase() === 'path') {\n const parts = location.pathname.split('/').filter(Boolean);\n key = parts.length ? safeDecode(parts[parts.length - 1]) : null;\n } else {\n key = new URLSearchParams(location.search).get(what || 'handle');\n }\n key = key && key.trim() ? key.trim() : null;\n return { key, fromUrl: true, raw };\n}\n\nfunction safeDecode(s) { try { return decodeURIComponent(s); } catch { return s; } }\n\n/** Values of tether-show that follow the scope state. */\nexport const STATUS_KEYS = ['loading', 'ready', 'error', 'not-found'];\n\nexport const isNotFound = (err) => err?.code === 'NOT_FOUND';\n\n/** Product scopes and lists both own their state elements; the nearest one wins. */\nexport const boundary = () => ['product', 'collection', 'products', 'recommendations'].map((n) => sel(n)).join(',');\n\n/** True when `el` belongs to the scope `root` (not to a nested product or list). */\nexport const ownedBy = (el, root) => el === root || el.parentElement?.closest(boundary()) === root;\n\n/**\n * Sets tether-state (loading | ready | error) and tether-error (not-found or an\n * error code) on `root`, toggles tether-show=\"loading|ready|error|not-found\"\n * inside it, and disables add-to-cart buttons when there's no product.\n */\nexport function setScopeStatus(root, status, err) {\n const notFound = status === 'not-found';\n root.setAttribute(attr('state'), notFound ? 'error' : status);\n if (status === 'error' || notFound) root.setAttribute(attr('error'), notFound ? 'not-found' : (err?.code || 'error'));\n else root.removeAttribute(attr('error'));\n\n scoped(root, sel('show'), boundary()).forEach((el) => {\n const k = get(el, 'show');\n if (!STATUS_KEYS.includes(k)) return;\n show(el, k === status);\n });\n\n if (status === 'error' || notFound) {\n scoped(root, sel('add-to-cart'), boundary()).forEach((btn) => {\n btn.classList.add('is-disabled');\n btn.setAttribute('aria-disabled', 'true');\n if ('disabled' in btn) btn.disabled = true;\n });\n }\n}\n", "/**\n * Product lists: [tether-collection=\"handle\"] or [tether-products=\"search query\"].\n * The first child of [tether-list] is the card template; every card becomes a\n * product scope, so all product attributes work inside cards (including\n * quick-add with a subscription toggle).\n */\nimport { reportError } from './config.js';\nimport { TetherError } from './client.js';\nimport { attr, sel, get, has, scoped, emit, setText, setImage, repeat, notifyLayoutChanged, busy, show } from './dom.js';\nimport { getProducts, getRecommendations } from './loader.js';\nimport { setScopeStatus, isNotFound, resolveProductKey } from './status.js';\n\nexport const listSelector = () => `${sel('collection')},${sel('products')},${sel('recommendations')}`;\n\nexport class ListScope {\n constructor(root) {\n this.root = root;\n this.products = [];\n this.pageInfo = null;\n this.collection = null;\n setScopeStatus(root, 'loading');\n root.addEventListener('click', (e) => {\n const more = e.target.closest?.(sel('load-more'));\n if (more && more.closest(listSelector()) === root) {\n e.preventDefault();\n busy(more, () => this.load(true));\n }\n });\n }\n\n $(s) { return scoped(this.root, s, listSelector()); }\n\n options() {\n const r = this.root;\n const opts = {\n first: parseInt(get(r, 'limit') || '', 10) || undefined,\n sortKey: get(r, 'sort') || undefined,\n reverse: get(r, 'reverse') === 'true',\n };\n if (has(r, 'collection')) opts.collection = get(r, 'collection');\n else {\n // url:q = the search in the page's ?q= (a results page on a static site).\n const raw = get(r, 'products') || '';\n opts.query = raw.startsWith('url:') ? new URL(window.location.href).searchParams.get(raw.slice(4)) || '' : raw;\n }\n return opts;\n }\n\n async load(more = false) {\n const token = (this.loadToken = (this.loadToken || 0) + 1);\n const stale = () => token !== this.loadToken;\n try {\n if (has(this.root, 'recommendations')) {\n // A handle, url:handle (one dynamic product page), or empty inside a product: that product.\n let { key } = resolveProductKey(this.root, window.location, 'recommendations');\n const scope = this.root.closest(sel('product'));\n if (!key && scope) ({ key } = resolveProductKey(scope));\n if (!key) throw new TetherError('No product for recommendations', { code: 'NOT_FOUND' });\n const recs = await getRecommendations(key, get(this.root, 'intent') || 'RELATED');\n if (stale()) return;\n const limit = parseInt(get(this.root, 'limit') || '', 10);\n this.products = limit ? recs.slice(0, limit) : recs;\n } else {\n const res = await getProducts({ ...this.options(), after: more ? this.pageInfo?.endCursor : null });\n if (stale()) return;\n this.collection = res.collection;\n this.pageInfo = res.pageInfo;\n this.products = more ? [...this.products, ...res.products] : res.products;\n }\n this.render();\n setScopeStatus(this.root, 'ready');\n emit('list-ready', { products: this.products, collection: this.collection }, this.root);\n } catch (err) {\n if (stale()) return;\n // Keep what's already rendered on a failed \"load more\"; otherwise show the error state.\n if (!more) setScopeStatus(this.root, isNotFound(err) ? 'not-found' : 'error', err);\n // A missing product for recommendations is a page detail, not an error to report.\n if (!(isNotFound(err) && has(this.root, 'recommendations'))) reportError(err, 'list load failed');\n emit('error', { error: err, context: 'list' }, this.root);\n }\n }\n\n render() {\n const c = this.collection;\n this.$(sel('collection-bind')).forEach((el) => {\n switch (get(el, 'collection-bind')) {\n case 'title': return setText(el, c?.title || '');\n case 'description': el.innerHTML = c?.descriptionHtml || ''; return undefined;\n case 'image': return setImage(el, c?.image?.url, c?.image?.altText || c?.title);\n case 'count': return setText(el, this.products.length);\n default: return undefined;\n }\n });\n\n this.$(sel('list')).forEach((container) => {\n repeat(container, this.products, (node, p) => {\n node.setAttribute(attr('product'), p.handle);\n node.removeAttribute(attr('state'));\n });\n // Cards are new elements: mount them (product data is already cached).\n emit('list-rendered', { container }, this.root);\n });\n\n const empty = this.products.length === 0;\n this.$(sel('show')).forEach((el) => {\n const k = get(el, 'show');\n if (k === 'list-empty') show(el, empty);\n if (k === 'list-filled') show(el, !empty);\n });\n this.$(sel('load-more')).forEach((el) => show(el, Boolean(this.pageInfo?.hasNextPage)));\n notifyLayoutChanged('list');\n }\n}\n\n", "/** Product scopes and lists that are mounted, shared by index.js and the optional markets part. */\nimport { cfg, log, warn, reportError } from './config.js';\nimport { ProductScope, scopes, rememberOptionNames } from './product.js';\nimport { listSelector } from './collection.js';\nimport { getProduct, takeStale, refreshProducts, hydrateProducts } from './loader.js';\nimport { resolveProductKey, setScopeStatus, isNotFound } from './status.js';\nimport { attr, get, qsa, emit } from './dom.js';\n\nexport const mountedProducts = new WeakSet();\nexport const mountedLists = new WeakSet();\n// Live roots, for re-rendering after a country switch (pruned when disconnected).\nexport const liveProducts = new Set();\nexport const liveLists = new Set();\nconst requestToken = new WeakMap(); // product root -> latest request, so a slow old response can't win\n\nexport function pruneLive() {\n liveProducts.forEach((el) => { if (!el.isConnected) liveProducts.delete(el); });\n liveLists.forEach((l) => { if (!l.root.isConnected) liveLists.delete(l); });\n}\nexport function within(root, selector) {\n return [...(root.matches?.(selector) ? [root] : []), ...qsa(root, selector)];\n}\n\nexport /** Mounts one product root. Returns true when a product request was started. */\nfunction mountProduct(el) {\n if (mountedProducts.has(el)) return false;\n const { key, fromUrl, raw } = resolveProductKey(el);\n if (!key) {\n if (fromUrl) {\n // Dynamic product page opened without ?handle= (or an empty path).\n mountedProducts.add(el);\n setScopeStatus(el, 'not-found');\n emit('product-not-found', { key: null, source: raw }, el);\n } else if (!el.closest(listSelector())) {\n // List cards get their handle when the list renders.\n warn(`[${attr('product')}] without a value. Bind it to the Shopify handle field, or use \"url:handle\".`, el);\n }\n return false;\n }\n mountedProducts.add(el);\n liveProducts.add(el);\n const token = {};\n requestToken.set(el, token);\n const current = () => requestToken.get(el) === token;\n // A rendered scope keeps showing its content while it refreshes (e.g. country switch).\n if (!scopes.get(el)) setScopeStatus(el, 'loading');\n else el.setAttribute(attr('state'), 'updating');\n const loading = getProduct(key);\n marketPending?.add(loading);\n loading\n .then((p) => {\n if (!current()) return;\n const existing = scopes.get(el);\n if (existing) existing.update(p);\n // eslint-disable-next-line no-new\n else new ProductScope(el, p);\n applyPageTitle(el, p);\n if (cfg.revalidate !== false && takeStale(key)) queueRefresh(key);\n })\n .catch((err) => {\n if (!current()) return;\n const notFound = isNotFound(err);\n setScopeStatus(el, notFound ? 'not-found' : 'error', err);\n if (notFound) {\n emit('product-not-found', { key, source: raw }, el);\n // A typo in a URL isn't worth an alert; a CMS item pointing at a deleted product is.\n if (fromUrl) log(`product not found: ${key}`); else reportError(err, `product ${key}`);\n } else {\n reportError(err, `product ${key}`);\n emit('error', { error: err, context: 'product', key }, el);\n }\n });\n return true;\n}\n\n/** tether-page-title=\"{title} | My shop\" on a product root sets document.title (dynamic product pages). */\nfunction applyPageTitle(el, p) {\n const tpl = get(el, 'page-title');\n if (!tpl || typeof document === 'undefined') return;\n document.title = tpl.replace(/\\{title\\}/g, p.title).replace(/\\{vendor\\}/g, p.vendor || '').replace(/\\{type\\}/g, p.productType || '');\n}\n\n\n/** Product scopes that failed on a network/API error: loaded again when the browser is back online. */\nexport function retryFailed() {\n pruneLive();\n liveProducts.forEach((el) => {\n if (el.getAttribute(attr('state')) !== 'error' || el.getAttribute(attr('error')) === 'not-found') return;\n mountedProducts.delete(el);\n mountProduct(el);\n });\n}\n\n// Server-rendered products: one batched background request refreshes them all.\nlet refreshQueue = new Set();\nfunction queueRefresh(key) {\n if (!refreshQueue.size) setTimeout(flushRefresh, 0);\n refreshQueue.add(key);\n}\nfunction flushRefresh() {\n const keys = [...refreshQueue];\n refreshQueue = new Set();\n refreshProducts(keys).forEach((promise, i) => promise.then((fresh) => {\n liveProducts.forEach((el) => {\n const scope = scopes.get(el);\n if (!scope || !el.isConnected) return;\n const k = resolveProductKey(el).key;\n if (k !== keys[i] && k !== fresh.handle && k !== fresh.id) return;\n if (JSON.stringify(scope.product) !== JSON.stringify(fresh)) scope.update(fresh);\n });\n }).catch((err) => reportError(err, `refresh ${keys[i]}`)));\n}\n\n/**\n * <script type=\"application/json\" data-tether-hydrate> tags written by tether/server's hydrate():\n * their products are used without a request. Ignored when they were made for another market.\n */\nconst readScripts = new WeakSet();\nlet marketPending = null; // product loads to wait for before html.tether-market-pending goes\n\n/** Lists (and anything else that loads prices) wait too. */\nexport const trackMarket = (p) => { marketPending?.add(p); return p; };\n\n/** After a mount: drop html.tether-market-pending once this page's products are live. */\nexport function settleMarket() {\n if (!marketPending) return;\n const waits = [...marketPending];\n Promise.allSettled(waits).then(() => {\n if (!marketPending || waits.some((w) => !marketPending.has(w))) return;\n if (waits.length === marketPending.size) {\n marketPending = null;\n document.documentElement.classList.remove(`${cfg.prefix}-market-pending`);\n } else settleMarket(); // more products came in meanwhile\n });\n}\n\nexport function hydrateFromPage(root = document) {\n qsa(root.ownerDocument || root, 'script[type=\"application/json\"][data-tether-hydrate]').forEach((s) => {\n if (readScripts.has(s)) return;\n readScripts.add(s);\n try {\n const data = JSON.parse(s.textContent);\n rememberOptionNames(data.products); // the build's option names, also for other languages\n const same = (a, b) => String(a || '').toUpperCase() === String(b || '').toUpperCase();\n if (same(data.country, cfg.country) && same(data.language, cfg.language)) hydrateProducts(data.products);\n else {\n // The page was built for another market: its prices aren't this visitor's. Mark the page\n // (html.tether-market-pending) until the live ones are in, so CSS can hide prices meanwhile.\n log('hydration skipped: other market');\n if (!marketPending) { marketPending = new Set(); document.documentElement.classList.add(`${cfg.prefix}-market-pending`); }\n }\n } catch (err) { warn('bad data-tether-hydrate', err); }\n });\n}\n", "/**\n * <script> build: optional parts are separate files next to tether(.min).js, e.g.\n * tether.markets.min.js, loaded on first use. Override the folder with config.partsUrl.\n */\nimport * as config from './config.js';\nimport * as client from './client.js';\nimport * as dom from './dom.js';\nimport * as fragments from './fragments.js';\nimport * as loader from './loader.js';\nimport * as sellingPlans from './selling-plans.js';\nimport * as status from './status.js';\nimport * as cart from './cart.js';\nimport * as product from './product.js';\nimport * as collection from './collection.js';\nimport * as mounting from './mounting.js';\n\nconst { cfg } = config;\n\n/** The modules a part may use, shared instead of bundled twice (scripts/build.mjs maps imports to these). */\nexport const coreModules = {\n 'config.js': config, 'client.js': client, 'dom.js': dom, 'fragments.js': fragments, 'loader.js': loader,\n 'selling-plans.js': sellingPlans, 'status.js': status, 'cart.js': cart, 'product.js': product,\n 'collection.js': collection, 'mounting.js': mounting,\n};\n\nconst self = typeof document !== 'undefined' ? document.currentScript?.src || '' : '';\nconst parts = {};\n\nexport function loadPart(name) {\n if (parts[name]) return parts[name];\n const base = cfg.partsUrl || self.replace(/[^/]*$/, '');\n const min = /\\.min\\.js(\\?|$)/.test(self) || !self ? '.min' : '';\n const url = `${base.replace(/\\/?$/, '/')}tether.${name}${min}.js`;\n parts[name] = new Promise((resolve, reject) => {\n const s = document.createElement('script');\n s.src = url;\n s.async = true;\n s.onload = () => (window.Tether?.__parts?.[name] ? resolve(window.Tether.__parts[name]) : reject(new Error(`${url} did not register`)));\n s.onerror = () => { delete parts[name]; reject(new Error(`Could not load ${url}. Host it next to the Tether script, or set partsUrl.`)); };\n document.head.appendChild(s);\n });\n return parts[name];\n}\n\n// Parts that load other parts (account -> account-pages) use this same loader.\ncoreModules['lazy.js'] = { loadPart, coreModules };\n", "/**\n * Tether \u2014 Shopify <-> Webflow (or any HTML) sync via the Storefront API.\n *\n * <script>window.TETHER_CONFIG = { domain: 'x.myshopify.com', token: '...' }</script>\n * <script src=\"tether.min.js\" defer></script>\n *\n * With page transitions (Barba, Swup): set autoMount: false, call\n * Tether.init() once and Tether.mount(container) after every page enter.\n */\nimport { cfg, configure, isConfigured, log, warn, reportError } from './config.js';\nimport { gql, TetherError, withContext } from './client.js';\nimport { Cart, focusables } from './cart.js';\nimport { scopes } from './product.js';\nimport { ListScope, listSelector } from './collection.js';\nimport {\n getProduct, getProducts, getRecommendations, clearProductCache, primeProduct, normalizeProductKey,\n} from './loader.js';\nimport * as plans from './selling-plans.js';\nimport { resolveProductKey } from './status.js';\nimport { attr, sel, get, qsa, emit, formatMoney, busy, parseJSONAttr, toAttributes, imageUrl } from './dom.js';\nimport { loadPart, coreModules } from './lazy.js';\nimport { mountedLists, liveLists, pruneLive, within, mountProduct, retryFailed, hydrateFromPage, settleMarket, trackMarket } from './mounting.js';\n\nexport const VERSION = '0.6.6';\n\nlet initPromise = null;\nlet observer = null;\n\n/** Mount every product scope and product list inside `root`. Safe to call repeatedly. */\nexport function mount(root = document) {\n if (!isConfigured()) return 0;\n let count = 0;\n pruneLive(); // page transitions detach old roots: don't keep them alive\n hydrateFromPage(root); // products the server already rendered: no request needed\n\n within(root, listSelector()).forEach((el) => {\n if (mountedLists.has(el)) return;\n mountedLists.add(el);\n count++;\n const list = new ListScope(el);\n liveLists.add(list);\n el.addEventListener(`${cfg.prefix}:list-rendered`, (e) => mount(e.detail.container));\n trackMarket(list.load());\n });\n\n within(root, sel('product')).forEach((el) => { if (mountProduct(el)) count++; });\n\n // The country select lives in the optional markets part: load it only when the page uses it.\n if (within(root, `${sel('country-select')},${sel('country-bind')}`).length) {\n loadPart('markets').then((m) => m.renderCountrySelects(root)).catch((err) => reportError(err, 'markets'));\n }\n\n // Customer accounts: their own optional part, when configured and the page (or a login) needs it.\n if ((cfg.account?.clientId || cfg.account?.server) && (within(root, ['account-login', 'account-bind', 'account-link', 'orders', 'order', 'addresses', 'subscriptions', 'profile-form', 'address-form'].map((n) => `[${attr(n)}]`).join(',') + `,[${attr('show')}^=\"logged-\"]`).length\n || /[?&]code=/.test(window.location.search) || hasAccountSession())) {\n loadPart('account').then((m) => m.mountAccount(root)).catch((err) => reportError(err, 'account'));\n }\n\n // Search as you type: its own optional part, only for pages that have it.\n if (within(root, sel('search')).length) {\n loadPart('search').then((m) => m.mountSearch(root)).catch((err) => reportError(err, 'search'));\n }\n\n\n settleMarket();\n Cart.render();\n log(`mounted ${count} scope(s)`, root);\n return count;\n}\n\n// ---------------------------------------------------------------------------\n// Markets: country select + switching\n// ---------------------------------------------------------------------------\n\n/** Call before a page transition removes `root` (closes the drawer etc.). */\nexport function unmount() {\n Cart.close();\n}\n\nexport function getScope(el) {\n const root = el?.closest?.(sel('product'));\n return root ? scopes.get(root) || null : null;\n}\n\n// ---------------------------------------------------------------------------\n// Document-wide controls (delegated, so they survive page swaps)\n// ---------------------------------------------------------------------------\n\nlet controlsBound = false;\n\nfunction bindControls() {\n if (controlsBound) return;\n controlsBound = true;\n\n document.addEventListener('click', (e) => {\n const t = e.target;\n if (!t?.closest) return;\n\n if (t.closest(sel('cart-open'))) { e.preventDefault(); Cart.toggle(); return; }\n if (t.closest(sel('cart-close'))) { e.preventDefault(); Cart.close(); return; }\n\n const clear = t.closest(sel('cart-clear'));\n if (clear) { e.preventDefault(); busy(clear, () => Cart.clear().catch((err) => reportError(err, 'cart clear'))); return; }\n\n const checkout = t.closest(sel('checkout'));\n if (checkout) { e.preventDefault(); busy(checkout, () => Cart.checkout()); return; }\n\n const line = t.closest(dataKeySel());\n if (line && line.closest(sel('cart-lines'))) {\n const id = line.getAttribute(`data-${cfg.prefix}-key`);\n const current = Cart.lines.find((l) => l.id === id);\n const run = (fn) => { e.preventDefault(); fn().catch((err) => reportError(err, 'cart line')); };\n if (t.closest(sel('line-remove'))) { line.classList.add('is-busy'); return run(() => Cart.removeLine(id)); }\n if (current && t.closest(sel('line-plus'))) return run(() => Cart.changeQuantity(id, 1));\n if (current && t.closest(sel('line-minus'))) return run(() => Cart.changeQuantity(id, -1));\n }\n\n const removeCode = t.closest(sel('discount-remove'));\n if (removeCode) {\n e.preventDefault();\n const code = removeCode.closest(sel('discount-code'))?.getAttribute(attr('discount-code'));\n if (code) Cart.removeDiscount(code).catch((err) => reportError(err, 'discount'));\n return;\n }\n\n const groupBtn = t.closest(sel('group-add'));\n if (groupBtn) { e.preventDefault(); busy(groupBtn, () => addGroup(groupBtn)); }\n });\n\n document.addEventListener('change', (e) => {\n const t = e.target;\n if (!t?.closest) return;\n const lineEl = t.closest(dataKeySel());\n const id = lineEl?.getAttribute(`data-${cfg.prefix}-key`);\n // The line shows is-busy / aria-busy until Shopify has answered (removed by the next render).\n const busyLine = (p, what) => { lineEl.classList.add('is-busy'); lineEl.setAttribute('aria-busy', 'true'); p.catch((err) => reportError(err, what)); };\n if (id && t.matches(`input${sel('line', 'quantity')}`)) {\n busyLine(Cart.updateLine(id, parseInt(t.value, 10) || 0), 'cart line');\n } else if (id && t.matches(`select${sel('line-plan')}`)) {\n busyLine(Cart.updateLine(id, { sellingPlanId: t.value || null }), 'cart line plan');\n } else if (t.matches(`select${sel('country-select')}`)) {\n if (t.value) setCountry(t.value).catch((err) => reportError(err, 'country'));\n } else if (t.matches(sel('cart-note'))) {\n Cart.setNote(t.value).catch((err) => reportError(err, 'cart note'));\n }\n });\n\n document.addEventListener('submit', (e) => {\n const form = e.target.closest?.(sel('discount-form'));\n if (!form) return;\n e.preventDefault();\n const input = form.querySelector(sel('discount-input')) || form.querySelector('input');\n const code = input?.value.trim();\n if (!code) return;\n busy(form, async () => {\n const mark = (bad) => {\n form.classList.toggle('is-invalid', bad);\n if (input) { if (bad) input.setAttribute('aria-invalid', 'true'); else input.removeAttribute('aria-invalid'); }\n };\n try {\n await Cart.applyDiscount(code);\n mark(false);\n emit('discount-applied', { code }, form);\n if (input) input.value = '';\n } catch (err) {\n mark(true);\n if (err?.code === 'INVALID_DISCOUNT') emit('discount-invalid', { code }, form); else reportError(err, 'discount');\n }\n });\n }, true); // capture: before a router (Astro's ClientRouter) turns the submit into a navigation\n document.addEventListener('input', (e) => {\n const f = e.target.closest?.(sel('discount-form'));\n if (f) { f.classList.remove('is-invalid'); e.target.removeAttribute?.('aria-invalid'); }\n });\n\n // Other tabs: the cart or the market changed there (handled by the extras part, loaded then).\n window.addEventListener('storage', (e) => {\n if (cfg.domain && e.key?.startsWith(`${cfg.prefix}:`)) loadPart('extras').then((m) => m.onStorage(e)).catch(() => {});\n });\n // Shareable variant links: only when turned on.\n document.addEventListener(`${cfg.prefix}:variant-changed`, (e) => {\n const root = e.target;\n if (cfg.variantUrl || root.hasAttribute?.(attr('variant-url'))) loadPart('extras').then((m) => m.writeVariantUrl(root, e.detail)).catch(() => {});\n });\n\n // Astro View Transitions (<ClientRouter />): mount every new page, close the cart while leaving.\n if (cfg.astro !== false) {\n // Astro fires this on the first load too: wait for init (the visitor's saved market) first.\n document.addEventListener('astro:page-load', () => (initPromise || Promise.resolve()).then(() => {\n // Navigated to a page of another market (e.g. /de/): switch first, then mount in that market.\n // Back on a normal page after one: the visitor's own choice, else the default market.\n let target = pageMarket();\n if (!target && onPageMarket) {\n try { target = JSON.parse(localStorage.getItem(`${cfg.prefix}:market:${cfg.domain}`) || 'null'); } catch { target = null; }\n target = target?.country ? target : baseMarket;\n }\n onPageMarket = Boolean(pageMarket());\n const differs = target?.country && (String(target.country).toUpperCase() !== String(cfg.country || '').toUpperCase()\n || String(target.language || '').toUpperCase() !== String(cfg.language || '').toUpperCase());\n if (differs) setCountry(target.country, { language: target.language ?? null, locale: target.locale, remember: false }).then(() => mount(document), () => mount(document));\n else mount(document);\n }));\n document.addEventListener('astro:before-swap', () => unmount());\n }\n\n // Back online after a failed load: try the failed products and lists again.\n window.addEventListener('online', () => {\n retryFailed();\n liveLists.forEach((l) => { if (l.root.getAttribute(attr('state')) === 'error') l.load(); });\n });\n\n document.addEventListener('keydown', (e) => {\n if (!Cart.isOpen()) return;\n if (e.key === 'Escape') { Cart.close(); return; }\n if (e.key !== 'Tab' || cfg.cartFocus === false) return;\n // Keep Tab inside the open cart.\n const d = Cart.drawers().find((x) => x.classList.contains(cfg.cartDrawerOpenClass));\n const f = d ? focusables(d) : [];\n if (!f.length) return;\n const first = f[0];\n const last = f[f.length - 1];\n if (!d.contains(document.activeElement) || (e.shiftKey && document.activeElement === first) || (!e.shiftKey && document.activeElement === last)) {\n e.preventDefault();\n (e.shiftKey ? last : first).focus();\n }\n });\n}\n\nfunction dataKeySel() { return `[data-${cfg.prefix}-key]`; }\n\n/**\n * [tether-group] + [tether-group-add]: adds every product scope inside the\n * group in one request. Bundles, build-a-box, \"complete the set\".\n * Lines get attribute _group (and the group's tether-line-attributes).\n */\nexport const addGroup = (btn) => loadPart('extras').then((m) => m.addGroup(btn));\n\n// ---------------------------------------------------------------------------\n// Init\n// ---------------------------------------------------------------------------\n\nlet analyticsQueue = null;\n\nexport function init(overrides = {}) {\n if (initPromise && !Object.keys(overrides).length) return initPromise;\n configure({ ...(window.TETHER_CONFIG || {}), ...overrides });\n\n if (!isConfigured()) {\n warn('TETHER_CONFIG is missing domain or token. Tether is idle.');\n initPromise = Promise.resolve(null);\n return initPromise;\n }\n\n bindControls();\n if (cfg.observe) startObserver();\n // Analytics (optional part): buffer Tether's events until it has loaded, so none are missed.\n if (cfg.analytics && !analyticsQueue) {\n analyticsQueue = [];\n ['product-ready', 'list-ready', 'cart-updated', 'cart-toggled', 'checkout', 'search'].forEach((n) => document.addEventListener(`${cfg.prefix}:${n}`, (e) => analyticsQueue.push(e)));\n document.addEventListener('astro:page-load', () => analyticsQueue.push(new CustomEvent(`${cfg.prefix}:page`)));\n loadPart('analytics').then((m) => m.startAnalytics(analyticsQueue)).catch((err) => reportError(err, 'analytics'));\n }\n\n initPromise = applyMarket(overrides).then(() => Cart.init()).then(async (cart) => {\n // A saved cart from another market: move it to this one, so prices match the page.\n const want = cfg.country ? String(cfg.country).toUpperCase() : null;\n if (cart && want && cart.buyerIdentity?.countryCode && cart.buyerIdentity.countryCode !== want) {\n try { cart = await Cart.setBuyerIdentity({ countryCode: want }, { create: false }); } catch (err) { reportError(err, 'cart country'); }\n }\n emit('ready', { cart });\n return api;\n });\n return initPromise;\n}\n\n/**\n * Detected market (saved choice, server hint, Webflow locale) wins over the static config.\n * Without markets.detect only the visitor's saved choice applies, read here without loading\n * the markets part.\n */\n/**\n * A page built for one market (e.g. /de/ pages): <meta name=\"tether-page-country\" content=\"DE\">,\n * tether-page-language, tether-page-locale. Wins over the visitor's saved choice, isn't remembered.\n */\nfunction pageMarket(doc = document) {\n const get = (n) => doc.querySelector(`meta[name=\"${cfg.prefix}-page-${n}\"]`)?.getAttribute('content') || undefined;\n const country = get('country');\n return country ? { country: country.toUpperCase(), language: get('language'), locale: get('locale') } : null;\n}\n\nlet baseMarket = null; // the configured market, before a visitor's or page's market applied\nlet onPageMarket = false;\n\nasync function applyMarket(overrides) {\n const m = cfg.markets || {};\n baseMarket = { country: cfg.country, language: cfg.language, locale: cfg.locale };\n const page = pageMarket();\n onPageMarket = Boolean(page);\n if (page) {\n cfg.country = page.country;\n cfg.language = page.language ? page.language.toUpperCase() : undefined;\n if (page.locale) cfg.locale = page.locale;\n return;\n }\n if (m.detect === false) return;\n let market = null;\n if (m.detect) {\n try { market = (await loadPart('markets')).detectMarket(m); } catch (err) { reportError(err, 'markets'); return; }\n } else if (m.remember !== false) {\n try { market = JSON.parse(localStorage.getItem(`${cfg.prefix}:market:${cfg.domain}`) || 'null'); } catch { /* none */ }\n if (market && !/^[A-Z]{2}$/.test(market.country || '')) market = null;\n }\n if (!market) return;\n if (market.country) cfg.country = market.country;\n if (market.language) cfg.language = market.language;\n if (market.locale && !overrides.locale) cfg.locale = market.locale; // the visitor's market wins over the default\n log('market', market);\n}\n\nfunction hasAccountSession() {\n try { return Boolean(sessionStorage[`${cfg.prefix}:account:${cfg.domain}`] || localStorage[`${cfg.prefix}:account:${cfg.domain}`] || localStorage[`${cfg.prefix}:account-hint:${cfg.domain}`]); } catch { return false; }\n}\n\n/** Customer accounts (optional part, loaded on first use). See src/account.js. */\nconst accountApi = new Proxy({}, { get: (_, n) => (...a) => loadPart('account').then((m) => m[n](...a)) });\n\n/** Tether.setCountry('DE'): loads the markets part on first use. */\nexport function setCountry(code, opts) {\n return loadPart('markets').then((m) => m.setCountry(code, opts));\n}\n\nfunction startObserver() {\n if (observer || typeof MutationObserver === 'undefined') return;\n let t = null;\n const queued = new Set();\n observer = new MutationObserver((muts) => {\n muts.forEach((m) => m.addedNodes.forEach((n) => { if (n.nodeType === 1) queued.add(n); }));\n clearTimeout(t);\n t = setTimeout(() => { queued.forEach((n) => { if (n.isConnected) mount(n); }); queued.clear(); }, 50);\n });\n observer.observe(document.body, { childList: true, subtree: true });\n}\n\nexport const api = {\n VERSION,\n init,\n mount,\n unmount,\n get config() { return cfg; },\n get ready() { return initPromise || Promise.resolve(null); },\n query: gql,\n withContext,\n cart: Cart,\n getProduct,\n getProducts,\n getRecommendations,\n getScope,\n addGroup,\n account: accountApi,\n primeProduct,\n normalizeProductKey,\n clearProductCache,\n formatMoney,\n imageUrl,\n plans,\n TetherError,\n resolveProductKey,\n setCountry,\n detectMarket: (markets) => loadPart('markets').then((m) => m.detectMarket(markets || cfg.markets)),\n getLocalization: () => loadPart('markets').then((m) => m.getLocalization()),\n diagnose: (opts) => loadPart('diagnose').then((m) => m.diagnose({ ...opts, version: VERSION })),\n __core: coreModules,\n __parts: {},\n on(name, fn) {\n const h = (e) => fn(e.detail, e);\n document.addEventListener(`${cfg.prefix}:${name}`, h);\n return () => document.removeEventListener(`${cfg.prefix}:${name}`, h);\n },\n};\n\nexport default api;\n\n// Auto-start for the plain <script> setup.\nif (typeof window !== 'undefined' && typeof document !== 'undefined') {\n window.Tether = api;\n // Not with a framework integration (Astro), which starts Tether itself.\n const auto = window.TETHER_CONFIG && window.TETHER_CONFIG.autoMount !== false && !window.TETHER_INTEGRATION;\n if (auto) {\n const start = () => init().then(() => mount(document));\n if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', start, { once: true });\n else start();\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["config_exports", "__export", "DEFAULTS", "cfg", "configure", "isConfigured", "log", "reportError", "warn", "overrides", "k", "a", "err", "context", "client_exports", "__export", "TetherError", "endpoint", "gql", "request", "unwrap", "withContext", "TetherError", "message", "status", "errors", "userErrors", "code", "endpoint", "conf", "cfg", "withContext", "query", "ctx", "args", "tag", "sleep", "ms", "r", "statusText", "request", "variables", "context", "text", "age", "body", "attempt", "res", "err", "log", "json", "e", "gql", "opts", "unwrap", "payload", "name", "errs", "cart_exports", "__export", "Cart", "focusables", "toLineInput", "fragments_exports", "__export", "ALLOCATION_FIELDS", "SELLING_PLAN_FIELDS", "cartFragment", "collectionFields", "metafieldIdentifiers", "productFragment", "MONEY", "IMAGE", "metafieldIdentifiers", "o", "cfg", "m", "i", "metafieldsField", "ids", "SELLING_PLAN_FIELDS", "ALLOCATION_FIELDS", "productFragment", "cartFragment", "collectionFields", "loader_exports", "__export", "clearProductCache", "getProduct", "getProducts", "getRecommendations", "hydrateProducts", "normalizeProductKey", "primeProduct", "refreshProducts", "takeStale", "productCache", "pending", "resolvers", "scheduled", "generation", "isGid", "v", "normalizeProductKey", "raw", "m", "primeProduct", "product", "p", "getProduct", "rawKey", "key", "TetherError", "resolve", "reject", "flush", "gen", "keys", "ids", "handles", "k", "defs", "parts", "vars", "h", "i", "query", "productFragment", "log", "settle", "fn", "r", "data", "gql", "got", "freshAt", "miss", "err", "clearProductCache", "stale", "FRESH_MS", "hydrateProducts", "products", "takeStale", "x", "refreshProducts", "getProducts", "collection", "first", "cfg", "after", "sortKey", "reverse", "filters", "fragment", "collectionFields", "rest", "getRecommendations", "intent", "byId", "list", "selling_plans_exports", "__export", "GID", "allPlans", "allocationFor", "findPlan", "hasPlans", "planAdjustment", "planCheckoutCharge", "planPrice", "planSavings", "plansForVariant", "toGid", "v", "value", "type", "product", "g", "p", "variant", "planId", "a", "adj", "base", "sub", "plan", "ref", "plans", "gid", "needle", "o", "dom_exports", "__export", "attr", "busy", "cdnUrl", "dataKey", "emit", "formatDate", "formatMoney", "formatPercent", "get", "has", "hasTemplate", "imageUrl", "notifyLayoutChanged", "parseJSONAttr", "productUrl", "qsa", "readText", "repeat", "repeatKeyed", "sameImage", "scoped", "sel", "setImage", "setSelected", "setText", "setTextTracked", "show", "toAttributes", "watchImages", "attr", "name", "cfg", "sel", "value", "get", "el", "has", "dataKey", "productUrl", "handle", "id", "path", "numeric", "qsa", "root", "s", "scoped", "scopeSelector", "emit", "detail", "target", "formatPercent", "n", "locale", "formatMoney", "money", "amount", "formatDate", "iso", "imageUrl", "url", "width", "height", "crop", "u", "cdnUrl", "g", "k", "sameImage", "a", "b", "setImage", "alt", "src", "setText", "v", "text", "readText", "setTextTracked", "before", "after", "show", "visible", "setSelected", "selected", "input", "templates", "hasTemplate", "container", "template", "tpl", "repeat", "items", "render", "warn", "item", "i", "node", "repeatKeyed", "keyOf", "onEnter", "onLeave", "KEY", "LEAVING", "live", "existing", "wanted", "fresh", "staying", "current", "prev", "done", "layoutTimer", "notifyLayoutChanged", "reason", "watchImages", "imgs", "left", "img", "busy", "fn", "parseJSONAttr", "raw", "toAttributes", "obj", "key", "toLineInput", "input", "quantity", "opts", "src", "merchandiseId", "GID", "TetherError", "line", "plan", "attrs", "toAttributes", "mutation", "name", "args", "inner", "cartFragment", "FOCUSABLE", "returnFocus", "focusables", "d", "qsa", "el", "ariaState", "open", "sel", "b", "get", "cfg", "isMissingCart", "err", "Cart", "id", "payload", "p", "unwrap", "w", "all", "x", "emit", "fn", "run", "value", "cart", "reason", "n", "data", "gql", "reportError", "buyerIdentity", "variables", "createInput", "cartId", "log", "lines", "l", "lineId", "patch", "delta", "current", "target", "job", "latest", "now", "lineIds", "ids", "note", "obj", "merged", "a", "attributes", "v", "key", "codes", "discountCodes", "c", "code", "k", "create", "tab", "url", "ds", "hadFocus", "call", "h", "e", "count", "money", "formatMoney", "setTextTracked", "hasSub", "conds", "show", "container", "repeat", "node", "attr", "t", "setText", "repeatKeyed", "renderLine", "notifyLayoutChanged", "lineValue", "m", "o", "isSub", "setImage", "u", "productUrl", "q", "qs", "warning", "pending", "lineConds", "select", "handle", "getProduct", "product", "plans", "allPlans", "want", "sig", "product_exports", "__export", "ProductScope", "rememberOptionNames", "scopes", "status_exports", "__export", "STATUS_KEYS", "boundary", "isNotFound", "ownedBy", "resolveProductKey", "setScopeStatus", "resolveProductKey", "el", "location", "name", "raw", "get", "what", "key", "parts", "safeDecode", "s", "STATUS_KEYS", "isNotFound", "err", "boundary", "n", "sel", "ownedBy", "root", "setScopeStatus", "status", "notFound", "attr", "scoped", "k", "show", "btn", "scopes", "productSel", "sel", "metafieldValue", "product", "ref", "i", "ns", "key", "m", "knownOptionNames", "rememberOptionNames", "products", "p", "o", "ProductScope", "root", "get", "has", "allPlans", "attr", "watchImages", "notifyLayoutChanged", "emit", "variantId", "v", "x", "s", "inner", "scoped", "authored", "opts", "vs", "first", "param", "gid", "GID", "match", "params", "fromUrl", "findPlan", "fromAttr", "wanted", "cfg", "name", "value", "allocationFor", "line", "attrs", "fixed", "toAttributes", "parseJSONAttr", "inputs", "el", "next", "score", "a", "b", "id", "mode", "n", "min", "setText", "cart", "Cart", "own", "e", "t", "opt", "plan", "purchase", "plus", "minus", "add", "btn", "label", "busyText", "write", "txt", "busy", "err", "reportError", "p0", "formatDate", "formatMoney", "setImage", "productUrl", "imgs", "hasTemplate", "im", "sameImage", "repeat", "node", "img", "target", "exclude", "tag", "mf", "container", "show", "sw", "raw", "group", "plans", "pl", "alt", "sub", "oneTimePrice", "subPrice", "planPrice", "price", "compareAt", "onSale", "discountPct", "savings", "planSavings", "total", "fm", "pct", "formatPercent", "text", "c", "planCheckoutCharge", "k", "qsa", "setSelected", "unavailable", "planObj", "inVariant", "adj", "planAdjustment", "val", "low", "conds", "STATUS_KEYS", "ownedBy", "disabled", "soldOut", "subText", "collection_exports", "__export", "ListScope", "listSelector", "listSelector", "sel", "ListScope", "root", "setScopeStatus", "e", "more", "busy", "s", "scoped", "r", "opts", "get", "has", "raw", "token", "stale", "key", "resolveProductKey", "scope", "TetherError", "recs", "getRecommendations", "limit", "res", "getProducts", "emit", "err", "isNotFound", "reportError", "c", "el", "setText", "setImage", "container", "repeat", "node", "p", "attr", "empty", "k", "show", "notifyLayoutChanged", "mounting_exports", "__export", "hydrateFromPage", "liveLists", "liveProducts", "mountProduct", "mountedLists", "mountedProducts", "pruneLive", "retryFailed", "settleMarket", "trackMarket", "within", "mountedProducts", "mountedLists", "liveProducts", "liveLists", "requestToken", "pruneLive", "el", "l", "within", "root", "selector", "qsa", "mountProduct", "key", "fromUrl", "raw", "resolveProductKey", "setScopeStatus", "emit", "listSelector", "warn", "attr", "token", "current", "scopes", "loading", "getProduct", "marketPending", "p", "existing", "ProductScope", "applyPageTitle", "cfg", "takeStale", "queueRefresh", "err", "notFound", "isNotFound", "log", "reportError", "tpl", "get", "retryFailed", "refreshQueue", "flushRefresh", "keys", "refreshProducts", "promise", "i", "fresh", "scope", "k", "readScripts", "trackMarket", "settleMarket", "waits", "w", "hydrateFromPage", "s", "data", "rememberOptionNames", "same", "a", "b", "hydrateProducts", "cfg", "config_exports", "coreModules", "client_exports", "dom_exports", "fragments_exports", "loader_exports", "selling_plans_exports", "status_exports", "cart_exports", "product_exports", "collection_exports", "mounting_exports", "self", "parts", "loadPart", "name", "base", "min", "url", "resolve", "reject", "s", "VERSION", "initPromise", "observer", "mount", "root", "isConfigured", "count", "pruneLive", "hydrateFromPage", "within", "listSelector", "el", "mountedLists", "list", "ListScope", "liveLists", "cfg", "e", "trackMarket", "sel", "mountProduct", "loadPart", "m", "err", "reportError", "attr", "hasAccountSession", "settleMarket", "Cart", "log", "unmount", "getScope", "scopes", "controlsBound", "bindControls", "t", "clear", "busy", "checkout", "line", "dataKeySel", "id", "current", "l", "run", "fn", "removeCode", "code", "groupBtn", "addGroup", "lineEl", "busyLine", "p", "what", "setCountry", "form", "input", "mark", "bad", "emit", "f", "target", "pageMarket", "onPageMarket", "baseMarket", "retryFailed", "d", "x", "focusables", "first", "last", "btn", "analyticsQueue", "init", "overrides", "configure", "startObserver", "n", "applyMarket", "cart", "want", "api", "warn", "doc", "get", "country", "page", "market", "accountApi", "_", "a", "opts", "queued", "muts", "gql", "withContext", "getProduct", "getProducts", "getRecommendations", "primeProduct", "normalizeProductKey", "clearProductCache", "formatMoney", "imageUrl", "selling_plans_exports", "TetherError", "resolveProductKey", "markets", "coreModules", "name", "h", "index_default", "start"]
|
|
4
|
+
"sourcesContent": ["/**\n * Runtime config. One shared object, mutated by configure(), read everywhere.\n */\n\nexport const DEFAULTS = {\n // Shopify Storefront API\n domain: '', // 'your-store.myshopify.com'\n token: '', // public Storefront API access token\n apiVersion: '2026-07',\n country: undefined, // ISO code, e.g. 'NL' -> @inContext(country: NL)\n language: undefined, // e.g. 'NL' -> @inContext(language: NL)\n locale: undefined, // Intl locale for money/dates, e.g. 'nl-NL'\n markets: null, // { detect: true, locales: { de: { country: 'DE', language: 'DE' } }, cookie, remember } (markets.js)\n\n // Markup\n prefix: 'tether', // attribute prefix: tether-product, tether-bind, ...\n productPath: '/product', // Webflow CMS template path for products\n collectionPath: '/collection',\n\n // Fetching\n metafields: [], // ['custom.material', { namespace, key }]\n imagesFirst: 25,\n variantsFirst: 100,\n sellingPlanGroupsFirst: 10,\n sellingPlansFirst: 25,\n collectionFirst: 24,\n retries: 2,\n revalidate: true, // products from the server (tether/server hydrate()): refresh once in the background\n\n // Cart\n storageKey: null, // defaults to `tether:cart:<domain>`\n cartDrawerOpenClass: 'is-open',\n openCartOnAdd: true,\n cartFocus: true, // move focus into the open cart, keep Tab inside it, restore it on close\n checkoutTarget: '_self', // '_self' or '_blank'\n\n // Subscriptions\n defaultPurchase: 'one-time', // 'one-time' | 'subscription'\n variantUrl: false, // true: ?variant= follows the visitor's choice on the main product (shareable links)\n maxAge: 60, // seconds a Shopify answer may be cached (0 = Shopify's own caching, can be hours)\n lowStock: 5, // tether-show=\"low-stock\" at this many or fewer (needs inventory access)\n\n // Mounting\n autoMount: true, // mount document on DOMContentLoaded\n observe: false, // auto-mount nodes added later (CMS load-more, filters)\n astro: true, // mount on Astro View Transitions (astro:page-load); false if you do it yourself\n partsUrl: null, // folder of tether.markets/diagnose(.min).js for the <script> build (default: next to it)\n\n // Formatting\n formatMoney: null, // (money, locale) => string\n\n // Hooks (all optional)\n onLayoutChange: null, // (reason) => void. Default refreshes ScrollTrigger if present\n onCartOpen: null, // (drawers) => void, e.g. lock scroll\n onCartClose: null, // (drawers) => void\n onLineEnter: null, // (node) => void, animate a new cart line in\n onLineLeave: null, // (node, done) => void, animate out, then call done()\n onValueChange: null, // (el, previousText) => void, e.g. text scramble\n onError: null, // (error, context) => void\n\n debug: false,\n};\n\nexport const cfg = { ...DEFAULTS };\n\nexport function configure(overrides = {}) {\n Object.keys(cfg).forEach((k) => delete cfg[k]);\n Object.assign(cfg, DEFAULTS, overrides);\n if (cfg.domain) cfg.domain = String(cfg.domain).replace(/^https?:\\/\\//, '').replace(/\\/.*$/, '');\n if (!cfg.storageKey) cfg.storageKey = `${cfg.prefix}:cart:${cfg.domain}`;\n if (cfg.apiVersion === 'unstable') warn('apiVersion \"unstable\" changes without notice. Pin a dated version (e.g. 2026-07).');\n return cfg;\n}\n\nexport const isConfigured = () => Boolean(cfg.domain && cfg.token);\n\nexport function log(...a) { if (cfg.debug) console.log(`[${cfg.prefix}]`, ...a); }\nexport function warn(...a) { console.warn(`[${cfg.prefix}]`, ...a); }\n\nexport function reportError(err, context) {\n warn(context, err && (err.message || err.code) ? err.message || err.code : err);\n if (typeof cfg.onError === 'function') {\n try { cfg.onError(err, context); } catch { /* never let a hook break us */ }\n }\n}\n", "/**\n * Storefront API client: one fetch wrapper with @inContext, retries and\n * readable errors. Exposed as Tether.query() for anything Tether doesn't cover.\n */\nimport { cfg, log } from './config.js';\n\nexport class TetherError extends Error {\n constructor(message, { status, errors, userErrors, code } = {}) {\n super(message);\n this.name = 'TetherError';\n this.code = code || (status ? `HTTP_${status}` : 'ERROR');\n this.status = status;\n this.errors = errors;\n this.userErrors = userErrors;\n }\n}\n\nexport function endpoint(conf = cfg) {\n return `https://${conf.domain}/api/${conf.apiVersion}/graphql.json`;\n}\n\n/**\n * Adds @inContext(country, language) to the first operation in the document,\n * so prices, currency and translations follow the configured market.\n * Operations are always written first, fragments after, so the first match is\n * the operation.\n */\nexport function withContext(query, ctx = cfg) {\n const args = [];\n if (ctx.country) args.push(`country: ${String(ctx.country).toUpperCase()}`);\n if (ctx.language) args.push(`language: ${String(ctx.language).toUpperCase().replace('-', '_')}`);\n if (!args.length || /@inContext/.test(query)) return query;\n\n const tag = `@inContext(${args.join(', ')})`;\n // Named (query Name($x: T)), anonymous (query { \u2026 }) and shorthand ({ \u2026 }) queries.\n if (/^\\s*\\{/.test(query)) return `query ${tag} ${query.trimStart()}`;\n return query.replace(/^(\\s*(?:query|mutation)(?:\\s+\\w+)?\\s*(?:\\([^)]*\\))?)/, `$1 ${tag}`);\n}\n\nconst sleep = (ms) => new Promise((r) => setTimeout(r, ms));\n\n/** What a status means, for errors Shopify sends without a message (401/403 have none). */\nfunction statusText(status, conf) {\n if (status === 401 || status === 403) {\n return `Shopify rejected the Storefront token for ${conf.domain} (${status}): use the public Storefront API token (Headless channel)${/^shpat_/.test(conf.token) ? ', not an Admin API token (shpat_\u2026)' : ''}`;\n }\n return status === 404 ? `Store or API version not found (404): check domain ${conf.domain} and apiVersion ${conf.apiVersion}` : `HTTP ${status} from ${conf.domain}`;\n}\n\n/**\n * One Storefront API request with retries, for any config object (the browser's shared config,\n * or the server module's own). gql() below is the browser version.\n */\nexport async function request(conf, query, variables = {}, { context = true } = {}) {\n if (!conf.domain || !conf.token) {\n throw new TetherError('Tether is not configured: domain and token are required', { code: 'NOT_CONFIGURED' });\n }\n\n // Shopify caches the response of an identical query text (prices included, for hours after a\n // change). A time bucket in a comment keeps answers at most maxAge seconds old (default 60).\n let text = context ? withContext(query, conf) : query;\n const age = conf.maxAge ?? 60;\n if (age > 0 && !/^\\s*mutation\\b/.test(text)) text += ` #${Math.floor(Date.now() / (age * 1000))}`;\n const body = JSON.stringify({ query: text, variables });\n let attempt = 0;\n\n for (;;) {\n let res;\n try {\n res = await (conf.fetch || fetch)(endpoint(conf), {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Shopify-Storefront-Access-Token': conf.token,\n },\n body,\n });\n } catch (err) {\n if (attempt++ < conf.retries) { await sleep(300 * 2 ** attempt); continue; }\n throw new TetherError(`Network error: ${err.message}`, { code: 'NETWORK' });\n }\n\n if (res.status === 430) throw new TetherError('Shopify security rejection (430)', { status: 430 });\n\n const retryable = res.status === 429 || res.status >= 500;\n if (retryable && attempt++ < conf.retries) {\n log('retry', res.status, attempt);\n await sleep(300 * 2 ** attempt);\n continue;\n }\n\n let json;\n try { json = await res.json(); } catch {\n throw new TetherError(res.ok ? `Invalid response (${res.status})` : statusText(res.status, conf), { status: res.status });\n }\n\n if (json.errors?.length) {\n // Token without unauthenticated_read_product_inventory: drop the field and retry.\n const inventoryDenied = json.errors.some((e) => /quantityAvailable/.test(e.message || ''));\n if (inventoryDenied && /\\bquantityAvailable\\b/.test(body)) {\n log('no inventory permission, retrying without quantityAvailable');\n return request(conf, query.replace(/\\bquantityAvailable\\b/g, ''), variables, { context });\n }\n // An older apiVersion without cart warnings (before 2024-07): retry without them.\n if (json.errors.some((e) => /'warnings'/.test(e.message || '')) && /warnings \\{ code message target \\}/.test(query)) {\n return request(conf, query.replace(/ warnings \\{ code message target \\}/g, ''), variables, { context });\n }\n const throttled = json.errors.some((e) => e.extensions?.code === 'THROTTLED');\n if (throttled && attempt++ < conf.retries) { await sleep(500 * 2 ** attempt); continue; }\n const message = json.errors.map((e) => e.message).filter(Boolean).join(' | ');\n throw new TetherError(res.ok ? message || 'Storefront API error' : (res.status === 401 || res.status === 403 || !message ? statusText(res.status, conf) : message), {\n status: res.status, errors: json.errors,\n });\n }\n if (!res.ok) throw new TetherError(statusText(res.status, conf), { status: res.status });\n\n return json.data;\n }\n}\n\nexport const gql = (query, variables, opts) => request(cfg, query, variables, opts);\n\n/** Throws on mutation userErrors, returns the payload otherwise. */\nexport function unwrap(payload, name) {\n if (!payload) throw new TetherError(`${name}: empty response`);\n const errs = payload.userErrors || [];\n if (errs.length) {\n throw new TetherError(errs.map((e) => e.message).join(' | '), { userErrors: errs });\n }\n return payload;\n}\n", "/**\n * Cart: Shopify Cart API, state in localStorage, document-wide rendering.\n *\n * Every mutation is queued, so fast clicking never races. All public methods\n * return the updated cart.\n */\nimport { cfg, log, reportError } from './config.js';\nimport { gql, unwrap, TetherError } from './client.js';\nimport { cartFragment } from './fragments.js';\nimport { getProduct } from './loader.js';\nimport { allPlans, GID } from './selling-plans.js';\nimport {\n attr, sel, get, qsa, emit, formatMoney, setText, setTextTracked, setImage, show,\n repeat, repeatKeyed, toAttributes, productUrl, notifyLayoutChanged,\n} from './dom.js';\n\n/** Accepts many shapes and returns a Shopify CartLineInput. */\nexport function toLineInput(input, quantity = 1, opts = {}) {\n const src = typeof input === 'object' && input !== null ? input : { variantId: input, quantity, ...opts };\n const merchandiseId = GID.variant(src.merchandiseId || src.variantId || src.id);\n if (!merchandiseId) throw new TetherError('add(): variantId is required');\n const line = { merchandiseId, quantity: Math.max(1, parseInt(src.quantity ?? 1, 10) || 1) };\n const plan = src.sellingPlanId || src.sellingPlan;\n if (plan) line.sellingPlanId = GID.sellingPlan(plan);\n const attrs = toAttributes(src.attributes);\n if (attrs.length) line.attributes = attrs;\n return line;\n}\n\nfunction mutation(name, args, inner) {\n return `mutation Tether_${name}(${args}){${name}(${inner}){cart{...TetherCart}userErrors{field message}warnings{code message target}}}${cartFragment()}`;\n}\n\nconst FOCUSABLE = 'a[href],button:not([disabled]),input:not([disabled]),select:not([disabled]),textarea:not([disabled]),[tabindex]:not([tabindex=\"-1\"])';\nlet returnFocus = null;\n\n/** Focusable elements inside an open drawer, in order (visible ones only). */\nexport const focusables = (d) => qsa(d, FOCUSABLE).filter((el) => el.offsetParent !== null || el === document.activeElement);\n\n/** aria-expanded on the open buttons; dialog semantics on drawers (unless the markup has its own). */\nfunction ariaState(open) {\n qsa(document, sel('cart-open')).forEach((b) => b.setAttribute('aria-expanded', String(open)));\n qsa(document, sel('cart-drawer')).forEach((d) => {\n if (!d.hasAttribute('role')) d.setAttribute('role', 'dialog');\n if (!d.hasAttribute('aria-label') && !d.hasAttribute('aria-labelledby')) d.setAttribute('aria-label', get(d, 'cart-label') || 'Cart');\n d.setAttribute('aria-modal', String(open));\n // Closed: hidden from screen readers and out of the Tab order (inert), like a closed dialog.\n if (!d.classList.contains(cfg.cartDrawerOpenClass)) { d.setAttribute('aria-hidden', 'true'); if (cfg.cartFocus !== false) d.inert = true; }\n });\n}\n\nconst isMissingCart = (err) => /does not exist|not found|invalid id/i.test(err?.message || '');\n\nexport const Cart = {\n state: null,\n _chain: Promise.resolve(),\n\n id() { try { return localStorage.getItem(cfg.storageKey); } catch { return null; } },\n _setId(id) {\n try {\n if (id) localStorage.setItem(cfg.storageKey, id);\n else localStorage.removeItem(cfg.storageKey);\n } catch { /* private mode */ }\n },\n\n get lines() { return this.state?.lines?.nodes || []; },\n get count() { return this.state?.totalQuantity || 0; },\n\n lastError: null,\n /** Set by the account part while a customer is logged in (Customer Account API token). */\n customerAccessToken: null,\n /** line id -> { qty, done }: what quick +/- clicks asked for, shown until Shopify has answered. */\n pendingQty: new Map(),\n /** Shopify's notes on the last change, e.g. less stock than asked: [{ code, message }]. */\n warnings: [],\n /** true once the saved cart (or the absence of one) is known. */\n loaded: false,\n\n _take(payload, name) {\n const p = unwrap(payload, name);\n // Shopify can repeat a warning per line or code: each message once.\n this.warnings = (p.warnings || []).filter((w, i, all) => all.findIndex((x) => x.message === w.message) === i)\n .map((w) => ({ ...w, message: (typeof cfg.warningText === 'function' && cfg.warningText(w)) || w.message }));\n if (this.warnings.length) emit('cart-warning', { warnings: this.warnings });\n return p.cart;\n },\n\n _queue(fn) {\n const run = this._chain.then(fn, fn).then((value) => {\n if (this.lastError) { this.lastError = null; this.render(); }\n return value;\n }, (err) => {\n // tether-show=\"cart-error\" becomes visible until the next successful cart call.\n this.lastError = err;\n this.render();\n emit('cart-error', { error: err });\n throw err;\n });\n this._chain = run.catch(() => {});\n return run;\n },\n\n _commit(cart, reason) {\n this.state = cart;\n if (cart?.id) this._setId(cart.id);\n // Other tabs reload the cart (storage event); the count also shows at once on the next page.\n try { localStorage.setItem(`${cfg.storageKey}:seen`, `${Date.now()}|${cart?.totalQuantity || 0}`); } catch { /* private mode */ }\n this.render();\n emit('cart-updated', { cart, reason });\n return cart;\n },\n\n async init() {\n const id = this.id();\n if (!id) { this.state = null; this.loaded = true; this.render(); emit('cart-updated', { cart: null, reason: 'load' }); return null; }\n // Until the saved cart has loaded, show its last known count instead of the page's 0.\n if (!this.loaded) {\n try {\n const n = (localStorage.getItem(`${cfg.storageKey}:seen`) || '').split('|')[1];\n if (n) qsa(document, sel('cart-count')).forEach((el) => { if (/^\\s*0?\\s*$/.test(el.textContent)) el.textContent = n; });\n } catch { /* private mode */ }\n }\n try {\n const data = await gql(`query TetherCart($id:ID!){cart(id:$id){...TetherCart}}${cartFragment()}`, { id });\n if (!data.cart) { this._setId(null); this.state = null; } else this.state = data.cart;\n } catch (err) {\n reportError(err, 'cart load failed');\n this.lastError = err;\n // Keep the cart id on network/API errors: the cart is probably fine, Shopify isn't reachable.\n if (isMissingCart(err)) this._setId(null);\n this.state = null;\n }\n this.loaded = true;\n this.render();\n emit('cart-updated', { cart: this.state, reason: 'load' }); // islands (cart.subscribe) hear the loaded cart\n return this.state;\n },\n\n async _create(input = {}) {\n const buyerIdentity = cfg.country || this.customerAccessToken ? {\n ...(cfg.country ? { countryCode: String(cfg.country).toUpperCase() } : {}),\n ...(this.customerAccessToken ? { customerAccessToken: this.customerAccessToken } : {}),\n } : undefined;\n const data = await gql(\n mutation('cartCreate', '$input: CartInput!', 'input: $input'),\n { input: { buyerIdentity, ...input } },\n );\n return this._take(data.cartCreate, 'cartCreate');\n },\n\n /** Runs a cart mutation; creates a fresh cart if ours expired. */\n async _mutate(name, args, inner, variables, createInput) {\n const cartId = this.id();\n if (!cartId) return createInput ? this._create(createInput) : null;\n try {\n const data = await gql(mutation(name, `$cartId: ID!, ${args}`, `cartId: $cartId, ${inner}`), { ...variables, cartId });\n return this._take(data[name], name);\n } catch (err) {\n if (createInput && isMissingCart(err)) {\n log('cart expired, creating a new one');\n this._setId(null);\n return this._create(createInput);\n }\n throw err;\n }\n },\n\n /**\n * add('gid://shopify/ProductVariant/1', 2)\n * add({ variantId, quantity, sellingPlanId, attributes })\n * add([line, line]) // bundles / build-a-box in one request\n */\n add(input, quantity = 1, opts = {}) {\n const lines = (Array.isArray(input) ? input : [input]).map((l) => toLineInput(l, quantity, opts));\n return this._queue(async () => {\n const cart = await this._mutate('cartLinesAdd', '$lines: [CartLineInput!]!', 'lines: $lines', { lines }, { lines });\n this._commit(cart, 'add');\n emit('added', { cart, lines });\n if (cfg.openCartOnAdd) this.open();\n return cart;\n });\n },\n\n /**\n * updateLine(lineId, 3)\n * updateLine(lineId, { quantity, sellingPlanId, attributes })\n * sellingPlanId: null switches a line back to one-time purchase.\n */\n updateLine(lineId, patch) {\n const p = typeof patch === 'number' ? { quantity: patch } : { ...patch };\n if (p.quantity !== undefined && p.quantity <= 0) return this.removeLine(lineId);\n\n const line = { id: lineId };\n if (p.quantity !== undefined) line.quantity = p.quantity;\n if ('sellingPlanId' in p) line.sellingPlanId = p.sellingPlanId ? GID.sellingPlan(p.sellingPlanId) : null;\n if (p.attributes) line.attributes = toAttributes(p.attributes);\n if (p.merchandiseId || p.variantId) line.merchandiseId = GID.variant(p.merchandiseId || p.variantId);\n\n return this._queue(async () => this._commit(\n await this._mutate('cartLinesUpdate', '$lines: [CartLineUpdateInput!]!', 'lines: $lines', { lines: [line] }),\n 'update',\n ));\n },\n\n /**\n * +1 / -1 for a line. Quick clicks add up: each builds on the quantity the last click asked for,\n * which shows at once (tether-line=\"quantity\", Cart.lines) until Shopify has answered.\n */\n changeQuantity(lineId, delta) {\n const current = this.lines.find((l) => l.id === lineId);\n if (!current) return Promise.resolve(this.state);\n const target = Math.max(0, (this.pendingQty.get(lineId)?.qty ?? current.quantity) + delta);\n const job = { qty: target, done: false };\n this.pendingQty.set(lineId, job);\n this.render();\n emit('cart-updated', { cart: this.state, reason: 'pending' });\n const latest = () => this.pendingQty.get(lineId) === job;\n return this._queue(async () => {\n // Quick clicks: only the latest target goes to Shopify; the ones it replaced are skipped.\n if (!latest()) return this.state;\n const now = this.lines.find((l) => l.id === lineId);\n if (now && now.quantity === target) return this.state; // e.g. + then -: nothing to change\n const cart = target > 0\n ? await this._mutate('cartLinesUpdate', '$lines: [CartLineUpdateInput!]!', 'lines: $lines', { lines: [{ id: lineId, quantity: target }] })\n : await this._mutate('cartLinesRemove', '$lineIds: [ID!]!', 'lineIds: $lineIds', { lineIds: [lineId] });\n // A newer click is on its way: keep this answer, but show totals and count only once that\n // one is in (no stepping through every reply).\n if (!latest()) { this.state = cart; if (cart?.id) this._setId(cart.id); return cart; }\n return this._commit(cart, target > 0 ? 'update' : 'remove');\n }).finally(() => {\n if (latest()) { this.pendingQty.delete(lineId); this.render(); emit('cart-updated', { cart: this.state, reason: 'settled' }); }\n });\n },\n\n /** Quantity to show for a line: the one asked for while an update is on its way. */\n quantityOf(line) { return this.pendingQty.get(line.id)?.qty ?? line.quantity; },\n\n removeLine(lineIds) {\n const ids = Array.isArray(lineIds) ? lineIds : [lineIds];\n return this._queue(async () => this._commit(\n await this._mutate('cartLinesRemove', '$lineIds: [ID!]!', 'lineIds: $lineIds', { lineIds: ids }),\n 'remove',\n ));\n },\n\n clear() {\n const ids = this.lines.map((l) => l.id);\n if (!ids.length) return Promise.resolve(this.state);\n return this.removeLine(ids);\n },\n\n setNote(note) {\n return this._queue(async () => this._commit(\n await this._mutate('cartNoteUpdate', '$note: String!', 'note: $note', { note: note ?? '' }, { note: note ?? '' }),\n 'note',\n ));\n },\n\n /** Cart-level attributes, merged with existing ones. Value '' removes a key. */\n setAttributes(obj) {\n const add = toAttributes(obj);\n // Merged in the queue, with the cart as it is by then: quick calls in a row don't drop each other.\n return this._queue(async () => {\n const merged = new Map((this.state?.attributes || []).map((a) => [a.key, a.value]));\n add.forEach((a) => merged.set(a.key, a.value));\n const attributes = [...merged].filter(([, v]) => v !== '').map(([key, value]) => ({ key, value }));\n return this._commit(\n await this._mutate('cartAttributesUpdate', '$attributes: [AttributeInput!]!', 'attributes: $attributes', { attributes }, { attributes }),\n 'attributes',\n );\n });\n },\n\n /** Replaces the discount codes. Pass [] to remove all. */\n setDiscountCodes(codes) {\n return this._queue(async () => {\n // A function gets the codes as they are by then (applyDiscount/removeDiscount in quick succession).\n const list = typeof codes === 'function' ? codes((this.state?.discountCodes || []).map((d) => d.code)) : codes;\n const discountCodes = (Array.isArray(list) ? list : [list]).map((c) => String(c).trim()).filter(Boolean);\n return this._commit(\n await this._mutate('cartDiscountCodesUpdate', '$discountCodes: [String!]!', 'discountCodes: $discountCodes', { discountCodes }, { discountCodes }),\n 'discount',\n );\n });\n },\n\n /**\n * Adds a code. A code Shopify doesn't accept isn't kept in the cart (it would warn on every change):\n * it's removed again and the promise rejects with code INVALID_DISCOUNT.\n */\n async applyDiscount(code) {\n const cart = await this.setDiscountCodes((current) => [...new Set([...current, code])]);\n const hit = (cart?.discountCodes || []).find((d) => d.code.toLowerCase() === String(code).toLowerCase());\n if (hit?.applicable) return cart;\n await this.removeDiscount(code).catch(() => {});\n throw new TetherError(`Discount code not valid: ${code}`, { code: 'INVALID_DISCOUNT' });\n },\n\n removeDiscount(code) {\n const k = String(code).toLowerCase();\n return this.setDiscountCodes((current) => current.filter((c) => c.toLowerCase() !== k));\n },\n\n /** { countryCode, email, phone } \u2014 changes currency/prices for that market. */\n setBuyerIdentity(buyerIdentity, { create = true } = {}) {\n return this._queue(async () => {\n const cart = await this._mutate('cartBuyerIdentityUpdate', '$buyerIdentity: CartBuyerIdentityInput!', 'buyerIdentity: $buyerIdentity', { buyerIdentity }, create ? { buyerIdentity } : null)\n .catch((err) => {\n if (create || !isMissingCart(err)) throw err;\n this._setId(null); // expired cart: forget it instead of creating an empty one\n return null;\n });\n return this._commit(cart, 'buyer-identity');\n });\n },\n\n /**\n * Goes to Shopify checkout. With checkoutTarget '_blank' the tab is opened\n * inside the click (Safari blocks window.open after an await) and gets its\n * URL once we have it.\n */\n async checkout(target = cfg.checkoutTarget) {\n const id = this.id();\n if (!id || (this.state && !this.count)) return null; // nothing to check out\n const tab = target === '_blank' ? window.open('', '_blank') : null;\n if (tab) { try { tab.opener = null; } catch { /* ignore */ } }\n\n try {\n // Side by side: the cart's current checkout URL, and the account's own (beforeCheckout) if any.\n const fresh = gql('query TetherCheckout($id: ID!) { cart(id: $id) { checkoutUrl } }', { id }).then((d) => d.cart?.checkoutUrl);\n fresh.catch(() => {}); // not needed when beforeCheckout answers\n let url = (this.beforeCheckout && await this.beforeCheckout().catch(() => null)) || await fresh;\n if (url && this.customerAccessToken) url += `${url.includes('?') ? '&' : '?'}logged_in=true`;\n if (!url) throw new TetherError('No checkoutUrl (cart empty or expired)');\n emit('checkout', { url, cart: this.state });\n if (tab && !tab.closed) tab.location.href = url;\n else window.location.href = url;\n return url;\n } catch (err) {\n if (tab) tab.close();\n reportError(err, 'checkout failed');\n return null;\n }\n },\n\n // -------------------------------------------------------------- drawer\n\n drawers() { return qsa(document, sel('cart-drawer')); },\n\n /** Without a tether-cart-drawer (a React/Svelte/Vue cart), open/close still work: as state for subscribe. */\n _open: false,\n isOpen() {\n const ds = this.drawers();\n return ds.length ? ds.some((d) => d.classList.contains(cfg.cartDrawerOpenClass)) : this._open;\n },\n\n open() {\n if (this.isOpen()) return;\n this._open = true;\n const ds = this.drawers().filter((d) => get(d, 'cart-drawer') !== 'manual');\n ds.forEach((d) => { d.inert = false; d.classList.add(cfg.cartDrawerOpenClass); d.setAttribute('aria-hidden', 'false'); });\n ariaState(true);\n if (cfg.cartFocus !== false && ds[0]) {\n // Move focus into the cart (after the open transition has made it visible).\n returnFocus = document.activeElement;\n setTimeout(() => {\n const target = focusables(ds[0])[0] || ds[0];\n if (target === ds[0] && !ds[0].hasAttribute('tabindex')) ds[0].tabIndex = -1;\n target.focus?.({ preventScroll: true });\n }, 60);\n }\n if (typeof cfg.onCartOpen === 'function') cfg.onCartOpen(ds);\n emit('cart-toggled', { open: true });\n },\n\n close() {\n if (!this.isOpen()) return;\n this._open = false;\n const ds = this.drawers();\n const hadFocus = ds.some((d) => d.contains(document.activeElement));\n ds.forEach((d) => { d.classList.remove(cfg.cartDrawerOpenClass); d.setAttribute('aria-hidden', 'true'); if (cfg.cartFocus !== false) d.inert = true; });\n ariaState(false);\n if (hadFocus && returnFocus?.isConnected) returnFocus.focus({ preventScroll: true });\n returnFocus = null;\n if (typeof cfg.onCartClose === 'function') cfg.onCartClose(ds);\n emit('cart-toggled', { open: false });\n },\n\n toggle() { if (this.isOpen()) this.close(); else this.open(); },\n\n /**\n * For framework islands (React, Svelte, Vue): fn(cart, { open }) now and on every change.\n * Returns a function that stops listening.\n */\n subscribe(fn) {\n const call = () => fn(this.state, { open: this.isOpen(), count: this.count, loaded: this.loaded, warnings: this.warnings });\n const h = () => call();\n ['cart-updated', 'cart-toggled'].forEach((e) => document.addEventListener(`${cfg.prefix}:${e}`, h));\n call();\n return () => ['cart-updated', 'cart-toggled'].forEach((e) => document.removeEventListener(`${cfg.prefix}:${e}`, h));\n },\n\n // -------------------------------------------------------------- render\n\n render() {\n const cart = this.state;\n const count = cart ? cart.totalQuantity : 0;\n const money = (k) => (cart ? formatMoney(cart.cost?.[k]) : '');\n\n ariaState(this.isOpen());\n qsa(document, sel('cart-count')).forEach((el) => setTextTracked(el, count));\n qsa(document, sel('cart-subtotal')).forEach((el) => setTextTracked(el, money('subtotalAmount')));\n qsa(document, sel('cart-total')).forEach((el) => setTextTracked(el, money('totalAmount')));\n qsa(document, sel('cart-checkout-charge')).forEach((el) => setTextTracked(el, money('checkoutChargeAmount')));\n\n const hasSub = this.lines.some((l) => l.sellingPlanAllocation);\n const conds = {\n 'cart-empty': count === 0,\n 'cart-filled': count > 0,\n 'cart-has-subscription': hasSub,\n 'cart-no-subscription': !hasSub,\n 'cart-has-discount': (cart?.discountCodes || []).some((d) => d.applicable),\n 'cart-error': Boolean(this.lastError),\n 'cart-warning': this.warnings.length > 0,\n };\n qsa(document, sel('cart-warning')).forEach((el) => setTextTracked(el, [...new Set(this.warnings.map((w) => w.message))].join(' ')));\n qsa(document, sel('show')).forEach((el) => {\n const k = get(el, 'show');\n if (k in conds && !el.closest(sel('product'))) show(el, conds[k]);\n });\n qsa(document, sel('checkout')).forEach((el) => {\n el.classList.toggle('is-disabled', !count);\n el.setAttribute('aria-disabled', String(!count));\n });\n\n qsa(document, `textarea${sel('cart-note')},input${sel('cart-note')}`).forEach((el) => {\n if (document.activeElement !== el) el.value = cart?.note || '';\n });\n\n qsa(document, sel('cart-discounts')).forEach((container) => {\n repeat(container, cart?.discountCodes || [], (node, d) => {\n node.setAttribute(attr('discount-code'), d.code);\n const t = node.querySelector(sel('discount', 'code')) || (node.firstElementChild ? null : node);\n if (t) setText(t, d.code);\n node.classList.toggle('is-inapplicable', !d.applicable);\n });\n });\n\n qsa(document, sel('cart-lines')).forEach((container) => {\n repeatKeyed(container, this.lines, (l) => l.id, (node, line) => renderLine(node, line), {\n onEnter: cfg.onLineEnter, onLeave: cfg.onLineLeave,\n });\n });\n\n if (cart) notifyLayoutChanged('cart');\n },\n};\n\nfunction lineValue(line, key) {\n const m = line.merchandise || {};\n const plan = line.sellingPlanAllocation?.sellingPlan;\n switch (key) {\n case 'title': return m.product?.title;\n case 'product-title': return m.product?.title;\n case 'variant-title': return m.title === 'Default Title' ? '' : m.title;\n case 'options': return (m.selectedOptions || [])\n .filter((o) => o.value !== 'Default Title').map((o) => `${o.name}: ${o.value}`).join(', ');\n case 'vendor': return m.product?.vendor;\n case 'sku': return m.sku;\n case 'price': return formatMoney(line.cost?.amountPerQuantity || m.price);\n case 'compare-at-price': return formatMoney(line.cost?.compareAtAmountPerQuantity || m.compareAtPrice);\n case 'line-total': return formatMoney(line.cost?.totalAmount);\n case 'line-subtotal': return formatMoney(line.cost?.subtotalAmount);\n case 'quantity': return Cart.quantityOf(line);\n case 'plan': return plan?.name || '';\n case 'plan-description': return plan?.description || '';\n case 'components': return (line.lineComponents || [])\n .map((c) => `${c.quantity} \u00D7 ${c.merchandise?.product?.title || ''}`).join(', ');\n default:\n if (key.startsWith('attribute:')) {\n const k = key.slice('attribute:'.length);\n return (line.attributes || []).find((a) => a.key === k)?.value || '';\n }\n return undefined;\n }\n}\n\nfunction renderLine(node, line) {\n const m = line.merchandise || {};\n const isSub = Boolean(line.sellingPlanAllocation);\n node.setAttribute(attr('line-id'), line.id);\n node.classList.toggle('is-subscription', isSub);\n\n qsa(node, sel('line')).forEach((el) => {\n const key = get(el, 'line');\n if (key === 'image') return setImage(el, m.image?.url || m.product?.featuredImage?.url, m.product?.title);\n if (key === 'url') {\n const u = productUrl(m.product?.handle, m.product?.id);\n const q = new URLSearchParams();\n if (m.id) q.set('variant', String(m.id).split('/').pop());\n const plan = line.sellingPlanAllocation?.sellingPlan?.id;\n if (plan) q.set('selling_plan', plan.split('/').pop());\n const qs = q.toString();\n return el.setAttribute('href', qs ? `${u}${u.includes('?') ? '&' : '?'}${qs}` : u);\n }\n const v = lineValue(line, key);\n if (v !== undefined) setTextTracked(el, v);\n return undefined;\n });\n\n // Shopify's note about this line (e.g. less stock than asked): class is-warning, tether-line=\"warning\".\n const warning = Cart.warnings.find((w) => w.target === line.id);\n node.classList.toggle('is-warning', Boolean(warning));\n const pending = Cart.pendingQty.has(line.id);\n node.classList.toggle('is-busy', pending);\n if (pending) node.setAttribute('aria-busy', 'true'); else node.removeAttribute('aria-busy');\n qsa(node, sel('line', 'warning')).forEach((el) => setTextTracked(el, warning?.message || ''));\n const lineConds = {\n subscription: isSub,\n 'one-time': !isSub,\n 'on-sale': parseFloat(line.cost?.compareAtAmountPerQuantity?.amount) > parseFloat(line.cost?.amountPerQuantity?.amount),\n 'has-components': (line.lineComponents || []).length > 0,\n warning: Boolean(warning),\n };\n qsa(node, sel('line-show')).forEach((el) => {\n const k = get(el, 'line-show');\n if (k in lineConds) show(el, lineConds[k]);\n });\n\n // Change frequency in the cart: <select tether-line-plan> lists the product's plans.\n qsa(node, `select${sel('line-plan')}`).forEach((select) => {\n const handle = m.product?.handle;\n if (!handle) return;\n getProduct(handle).then((product) => {\n const plans = allPlans(product);\n const allowOneTime = !product.requiresSellingPlan && get(select, 'line-plan') !== 'subscription-only';\n const want = [\n ...(allowOneTime ? [{ value: '', label: select.getAttribute(attr('one-time-label')) || 'One-time purchase' }] : []),\n ...plans.map((p) => ({ value: p.id, label: p.name })),\n ];\n const sig = want.map((w) => w.value).join('|');\n if (select.dataset.tetherSig !== sig) {\n select.innerHTML = '';\n want.forEach((w) => {\n const o = document.createElement('option');\n o.value = w.value; o.textContent = w.label;\n select.appendChild(o);\n });\n select.dataset.tetherSig = sig;\n }\n select.value = line.sellingPlanAllocation?.sellingPlan?.id || '';\n show(select, plans.length > 0);\n }).catch((err) => reportError(err, 'line plan options'));\n });\n}\n\n", "/**\n * GraphQL fragments. Built at call time because counts and metafields come\n * from config. Operations put these AFTER the operation (see withContext).\n */\nimport { cfg } from './config.js';\n\nconst MONEY = 'amount currencyCode';\nconst IMAGE = 'url altText width height';\n\nexport function metafieldIdentifiers(o = cfg) {\n return (o.metafields || []).map((m) => {\n if (typeof m === 'string') {\n const i = m.indexOf('.');\n return { namespace: m.slice(0, i), key: m.slice(i + 1) };\n }\n return m;\n }).filter((m) => m.namespace && m.key);\n}\n\nfunction metafieldsField(o = cfg) {\n const ids = metafieldIdentifiers(o);\n if (!ids.length) return '';\n const list = ids\n .map((m) => `{namespace: ${JSON.stringify(m.namespace)}, key: ${JSON.stringify(m.key)}}`)\n .join(', ');\n return `metafields(identifiers:[${list}]){namespace key type value reference{... on MediaImage{image{${IMAGE}}}}}`;\n}\n\nexport const SELLING_PLAN_FIELDS = ` id name description recurringDeliveries options{name value}priceAdjustments{orderCount adjustmentValue{__typename ... on SellingPlanPercentagePriceAdjustment{adjustmentPercentage}... on SellingPlanFixedAmountPriceAdjustment{adjustmentAmount{${MONEY}}}... on SellingPlanFixedPriceAdjustment{price{${MONEY}}}}}`;\n\nexport const ALLOCATION_FIELDS = ` sellingPlan{id}checkoutChargeAmount{${MONEY}}remainingBalanceChargeAmount{${MONEY}}priceAdjustments{price{${MONEY}}compareAtPrice{${MONEY}}perDeliveryPrice{${MONEY}}unitPrice{${MONEY}}}`;\n\n/** The product fields Tether renders. `o` = config (counts, metafields); the server module passes its own. */\nexport function productFragment(o = cfg) {\n return ` fragment TetherProduct on Product{id handle title description descriptionHtml productType vendor tags availableForSale publishedAt onlineStoreUrl requiresSellingPlan seo{title description}featuredImage{${IMAGE}}images(first:${o.imagesFirst}){nodes{${IMAGE}}}options{name optionValues{name swatch{color image{previewImage{${IMAGE}}}}}}priceRange{minVariantPrice{${MONEY}}maxVariantPrice{${MONEY}}}compareAtPriceRange{minVariantPrice{${MONEY}}maxVariantPrice{${MONEY}}}${metafieldsField(o)} sellingPlanGroups(first:${o.sellingPlanGroupsFirst}){nodes{name appName options{name values}sellingPlans(first:${o.sellingPlansFirst}){nodes{${SELLING_PLAN_FIELDS}}}}}variants(first:${o.variantsFirst}){nodes{id title availableForSale currentlyNotInStock quantityAvailable sku barcode selectedOptions{name value}image{${IMAGE}}price{${MONEY}}compareAtPrice{${MONEY}}unitPrice{${MONEY}}sellingPlanAllocations(first:${o.sellingPlansFirst}){nodes{${ALLOCATION_FIELDS}}}}}}`;\n}\n\nexport function cartFragment() {\n return ` fragment TetherCart on Cart{id checkoutUrl totalQuantity note createdAt updatedAt attributes{key value}buyerIdentity{countryCode email}discountCodes{code applicable}cost{subtotalAmount{${MONEY}}totalAmount{${MONEY}}checkoutChargeAmount{${MONEY}}}lines(first:100){nodes{id quantity attributes{key value}cost{totalAmount{${MONEY}}subtotalAmount{${MONEY}}amountPerQuantity{${MONEY}}compareAtAmountPerQuantity{${MONEY}}}discountAllocations{discountedAmount{${MONEY}}}sellingPlanAllocation{sellingPlan{id name description recurringDeliveries options{name value}}checkoutChargeAmount{${MONEY}}priceAdjustments{price{${MONEY}}compareAtPrice{${MONEY}}perDeliveryPrice{${MONEY}}}}merchandise{... on ProductVariant{id title sku availableForSale requiresShipping quantityAvailable image{${IMAGE}}price{${MONEY}}compareAtPrice{${MONEY}}selectedOptions{name value}product{id title handle vendor featuredImage{${IMAGE}}}}}... on ComponentizableCartLine{lineComponents{id quantity merchandise{... on ProductVariant{id title product{title handle}}}}}}}}`;\n}\n\nexport function collectionFields() {\n return `\n id handle title description descriptionHtml\n image { ${IMAGE} }\n seo { title description }`;\n}\n", "/**\n * Data loading. Products are batched per tick into one request and cached for\n * the lifetime of the page (survives Barba/Swup page swaps).\n */\nimport { cfg, log } from './config.js';\nimport { gql, TetherError } from './client.js';\nimport { productFragment, collectionFields } from './fragments.js';\n\nconst productCache = new Map(); // key -> Promise<product>\nlet pending = [];\nconst resolvers = new Map();\nlet scheduled = false;\n// Bumped by clearProductCache(): responses to requests sent before that (e.g. in the old\n// market after a country switch) still reach their callers but never refill the cache.\nlet generation = 0;\n\nconst isGid = (v) => typeof v === 'string' && v.startsWith('gid://');\n\n/** Accepts a handle, numeric id, gid or a full product URL. */\nexport function normalizeProductKey(raw) {\n const v = String(raw ?? '').trim();\n if (!v) return null;\n if (isGid(v)) return v;\n if (/^\\d+$/.test(v)) return `gid://shopify/Product/${v}`;\n const m = v.match(/\\/products\\/([^/?#]+)/);\n return m ? m[1] : v;\n}\n\n/** Put a product we already have (from a collection query) in the cache. */\nexport function primeProduct(product) {\n if (!product) return;\n const p = Promise.resolve(product);\n productCache.set(product.handle, p);\n productCache.set(product.id, p);\n}\n\nexport function getProduct(rawKey) {\n const key = normalizeProductKey(rawKey);\n if (!key) return Promise.reject(new TetherError('empty product key', { code: 'NOT_FOUND' }));\n if (productCache.has(key)) return productCache.get(key);\n\n const p = new Promise((resolve, reject) => {\n resolvers.set(key, { resolve, reject });\n pending.push(key);\n if (!scheduled) {\n scheduled = true;\n setTimeout(flush, 0);\n }\n });\n productCache.set(key, p);\n return p;\n}\n\nasync function flush() {\n scheduled = false;\n const gen = generation;\n const keys = pending.splice(0);\n if (!keys.length) return;\n\n const ids = keys.filter(isGid);\n const handles = keys.filter((k) => !isGid(k));\n const defs = [];\n const parts = [];\n const vars = {};\n\n if (ids.length) {\n defs.push('$ids: [ID!]!');\n vars.ids = ids;\n parts.push('byId: nodes(ids: $ids) { ... on Product { ...TetherProduct } }');\n }\n handles.forEach((h, i) => {\n defs.push(`$h${i}: String!`);\n vars[`h${i}`] = h;\n parts.push(`h${i}: product(handle: $h${i}) { ...TetherProduct }`);\n });\n\n const query = `query TetherProducts(${defs.join(',')}){${parts.join(' ')}}${productFragment()}`;\n log('fetch products', keys);\n\n const settle = (k, fn) => {\n const r = resolvers.get(k);\n resolvers.delete(k);\n if (r) fn(r);\n };\n\n try {\n const data = await gql(query, vars);\n const got = new Map();\n (data.byId || []).forEach((p) => { if (p) got.set(p.id, p); });\n handles.forEach((h, i) => { if (data[`h${i}`]) got.set(h, data[`h${i}`]); });\n\n keys.forEach((k) => settle(k, (r) => {\n if (got.has(k)) {\n const p = got.get(k);\n if (gen === generation) { primeProduct(p); freshAt.set(p.handle, Date.now()); freshAt.set(p.id, Date.now()); }\n r.resolve(p);\n } else {\n // A miss is remembered for a few seconds (one page load asking twice makes one request),\n // not longer: a product published in Shopify shows up on the next visit.\n const miss = productCache.get(k);\n if (gen === generation) setTimeout(() => { if (productCache.get(k) === miss) productCache.delete(k); }, 10000);\n r.reject(new TetherError(`Product not found: ${k}`, { code: 'NOT_FOUND' }));\n }\n }));\n } catch (err) {\n keys.forEach((k) => settle(k, (r) => { if (gen === generation) productCache.delete(k); r.reject(err); }));\n }\n}\n\nexport function clearProductCache() { productCache.clear(); generation++; stale.clear(); freshAt.clear(); }\n\n// ---------------------------------------------------------------------------\n// Hydration: products rendered on the server (tether/server hydrate()) are used at once and\n// refreshed once in the background, so prices and stock are live without a loading state.\n// ---------------------------------------------------------------------------\n\nconst stale = new Set(); // keys of products that came from the server and weren't refreshed yet\nconst freshAt = new Map(); // key -> when it was last loaded live (this page session)\nconst FRESH_MS = 60000;\n\nexport function hydrateProducts(products) {\n (products || []).forEach((p) => {\n if (!p?.id || !p.handle) return;\n // Loaded live in the last minute (an earlier page of a View Transition visit): that copy is newer.\n if (Date.now() - (freshAt.get(p.handle) || 0) < FRESH_MS && productCache.has(p.handle)) return;\n primeProduct(p);\n stale.add(p.handle);\n stale.add(p.id);\n });\n}\n\n/** True once per server-provided product: the caller refreshes it. */\nexport function takeStale(key) {\n const k = normalizeProductKey(key);\n if (!stale.has(k)) return false;\n const p = productCache.get(k);\n stale.delete(k);\n // Both keys point to the same product: refresh it once.\n p?.then?.((x) => { stale.delete(x.handle); stale.delete(x.id); });\n return true;\n}\n\n/** Fetch these products again (bypassing the cache). */\nexport function refreshProducts(keys) {\n keys.forEach((k) => productCache.delete(normalizeProductKey(k)));\n return keys.map((k) => getProduct(k));\n}\n\n/**\n * A page of products from a collection (by handle) or from a search query.\n * Returns { collection, products, pageInfo }.\n */\nexport async function getProducts({\n collection, query, first = cfg.collectionFirst, after = null, sortKey, reverse = false, filters,\n} = {}) {\n const fragment = productFragment();\n\n if (collection) {\n const data = await gql(`query TetherCollection($handle:String!,$first:Int!,$after:String,$sortKey:ProductCollectionSortKeys,$reverse:Boolean,$filters:[ProductFilter!]){collection(handle:$handle){${collectionFields()} products(first:$first,after:$after,sortKey:$sortKey,reverse:$reverse,filters:$filters){nodes{...TetherProduct}pageInfo{hasNextPage endCursor}}}}${fragment}`, {\n handle: collection, first, after, sortKey: sortKey || undefined, reverse, filters: filters || undefined,\n });\n if (!data.collection) throw new TetherError(`Collection not found: ${collection}`, { code: 'NOT_FOUND' });\n const { products, ...rest } = data.collection;\n products.nodes.forEach(primeProduct);\n return { collection: rest, products: products.nodes, pageInfo: products.pageInfo };\n }\n\n const data = await gql(`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}}}${fragment}`, { first, after, query: query || undefined, sortKey: sortKey || undefined, reverse });\n data.products.nodes.forEach(primeProduct);\n return { collection: null, products: data.products.nodes, pageInfo: data.products.pageInfo };\n}\n\nexport async function getRecommendations(product, intent = 'RELATED') {\n const key = normalizeProductKey(typeof product === 'object' ? product?.id : product);\n const byId = key?.startsWith('gid://');\n const data = await gql(`query TetherRecs(${byId ? '$id: ID!' : '$handle: String!'},$intent:ProductRecommendationIntent){productRecommendations(${byId ? 'productId: $id' : 'productHandle: $handle'},intent:$intent){...TetherProduct}}${productFragment()}`, byId ? { id: key, intent } : { handle: key, intent });\n const list = data.productRecommendations || [];\n list.forEach(primeProduct);\n return list;\n}\n", "/**\n * Pure helpers for Shopify selling plans (subscriptions). No DOM, easy to test.\n */\n\nexport const GID = {\n product: (v) => toGid(v, 'Product'),\n variant: (v) => toGid(v, 'ProductVariant'),\n sellingPlan: (v) => toGid(v, 'SellingPlan'),\n};\n\nexport function toGid(value, type) {\n const v = String(value ?? '').trim();\n if (!v) return null;\n if (v.startsWith('gid://')) return v;\n if (/^\\d+$/.test(v)) return `gid://shopify/${type}/${v}`;\n return v;\n}\n\n/** All plans of a product, flattened, each with its group attached. */\nexport function allPlans(product) {\n const groups = product?.sellingPlanGroups?.nodes || [];\n return groups.flatMap((g) => (g.sellingPlans?.nodes || []).map((p) => ({ ...p, group: g })));\n}\n\nexport function hasPlans(product) {\n return allPlans(product).length > 0;\n}\n\n/** The allocation of `planId` on `variant`, or null when the variant isn't in that plan. */\nexport function allocationFor(variant, planId) {\n if (!variant || !planId) return null;\n return (variant.sellingPlanAllocations?.nodes || []).find((a) => a.sellingPlan?.id === planId) || null;\n}\n\n/** Plans that can actually be bought with this variant. */\nexport function plansForVariant(product, variant) {\n return allPlans(product).filter((p) => allocationFor(variant, p.id));\n}\n\n/** Price per delivery for a variant on a plan (falls back to the one-time price). */\nexport function planPrice(variant, planId) {\n const a = allocationFor(variant, planId);\n const adj = a?.priceAdjustments?.[0];\n return adj?.perDeliveryPrice || adj?.price || variant?.price || null;\n}\n\n/** What the customer pays at checkout for this plan (prepaid plans charge more up front). */\nexport function planCheckoutCharge(variant, planId) {\n const a = allocationFor(variant, planId);\n return a?.checkoutChargeAmount || a?.priceAdjustments?.[0]?.price || variant?.price || null;\n}\n\n/** Savings of a plan vs the one-time price, as { amount, percentage }. */\nexport function planSavings(variant, planId) {\n const base = parseFloat(variant?.price?.amount);\n const sub = parseFloat(planPrice(variant, planId)?.amount);\n if (!Number.isFinite(base) || !Number.isFinite(sub) || base <= 0 || sub >= base) {\n return { amount: null, percentage: 0 };\n }\n return {\n amount: { amount: (base - sub).toFixed(2), currencyCode: variant.price.currencyCode },\n percentage: Math.round((1 - sub / base) * 100),\n };\n}\n\n/**\n * The plan's own discount description, independent of a variant:\n * '10%', or a fixed amount / fixed price.\n */\nexport function planAdjustment(plan) {\n const v = plan?.priceAdjustments?.[0]?.adjustmentValue;\n if (!v) return null;\n switch (v.__typename) {\n case 'SellingPlanPercentagePriceAdjustment': return { type: 'percentage', value: v.adjustmentPercentage };\n case 'SellingPlanFixedAmountPriceAdjustment': return { type: 'amount', value: v.adjustmentAmount };\n case 'SellingPlanFixedPriceAdjustment': return { type: 'price', value: v.price };\n default: return null;\n }\n}\n\n/**\n * Finds a plan by id, numeric id, name or option value (case-insensitive),\n * so Webflow editors can write tether-default-plan=\"Every month\".\n */\nexport function findPlan(product, ref) {\n if (!ref) return null;\n const plans = allPlans(product);\n const gid = GID.sellingPlan(ref);\n const needle = String(ref).trim().toLowerCase();\n return plans.find((p) => p.id === gid)\n || plans.find((p) => p.name.toLowerCase() === needle)\n || plans.find((p) => (p.options || []).some((o) => String(o.value).toLowerCase() === needle))\n || null;\n}\n", "/**\n * DOM helpers. Attribute names go through attr() so the prefix is configurable\n * (e.g. prefix: 'wfs' for markup that uses wfs-* attributes).\n */\nimport { cfg, warn } from './config.js';\n\nexport const attr = (name) => `${cfg.prefix}-${name}`;\nexport const sel = (name, value) =>\n value === undefined ? `[${attr(name)}]` : `[${attr(name)}=\"${value}\"]`;\nexport const get = (el, name) => el.getAttribute(attr(name));\nexport const has = (el, name) => el.hasAttribute(attr(name));\nexport const dataKey = () => `data-${cfg.prefix}-key`;\n\n/**\n * productPath '/product' -> /product/<handle>.\n * Templates: '/product?handle={handle}' (one static page for every product,\n * with tether-product=\"url:handle\"), '/p/{id}' (numeric product id).\n */\nexport function productUrl(handle, id) {\n const path = cfg.productPath || '/product';\n if (!/\\{(handle|id)\\}/.test(path)) return `${path.replace(/\\/$/, '')}/${handle}`;\n const numeric = id ? String(id).split('/').pop() : '';\n return path.replace(/\\{handle\\}/g, encodeURIComponent(handle || '')).replace(/\\{id\\}/g, encodeURIComponent(numeric));\n}\n\nexport const qsa = (root, s) => (root ? [...root.querySelectorAll(s)] : []);\n\n/** Elements in `root` whose nearest `scopeSelector` ancestor is `root` itself. */\nexport const scoped = (root, s, scopeSelector) =>\n qsa(root, s).filter((el) => el.closest(scopeSelector) === root);\n\nexport function emit(name, detail, target = document) {\n target.dispatchEvent(new CustomEvent(`${cfg.prefix}:${name}`, { detail, bubbles: true }));\n}\n\n/** 30 -> \"30%\" (en, nl) or \"30 %\" (de, fr), in the configured locale. */\nexport function formatPercent(n, locale = cfg.locale) {\n if (!n) return '';\n try { return new Intl.NumberFormat(locale || undefined, { style: 'percent', maximumFractionDigits: 0 }).format(n / 100); } catch { return `${n}%`; }\n}\n\nexport function formatMoney(money) {\n if (!money) return '';\n if (typeof cfg.formatMoney === 'function') return cfg.formatMoney(money, cfg.locale);\n const amount = parseFloat(money.amount);\n if (Number.isNaN(amount)) return '';\n try {\n return new Intl.NumberFormat(cfg.locale || undefined, {\n style: 'currency', currency: money.currencyCode,\n }).format(amount);\n } catch {\n return `${money.currencyCode} ${amount.toFixed(2)}`;\n }\n}\n\nexport function formatDate(iso) {\n if (!iso) return '';\n try { return new Date(iso).toLocaleDateString(cfg.locale || undefined); } catch { return ''; }\n}\n\n/** Shopify CDN resize via max-width / max-height / crop attributes on the element. */\n/**\n * Shopify CDN image at a size: imageUrl(url, { width: 800 }). Use the same width as the element's\n * max-width attribute, so the browser script keeps the image instead of loading it again.\n */\nexport function imageUrl(url, { width, height, crop } = {}) {\n if (!url) return url;\n try {\n const u = new URL(url);\n if (width) u.searchParams.set('width', String(width));\n if (height) u.searchParams.set('height', String(height));\n if (crop) u.searchParams.set('crop', crop);\n return u.toString();\n } catch { return url; }\n}\n\nexport function cdnUrl(url, el) {\n if (!url || !el) return url;\n // max-width (Webflow's custom attribute), or valid HTML: tether-max-width / data-max-width.\n const g = (k) => el.getAttribute(k) ?? el.getAttribute(`${cfg.prefix}-${k}`) ?? el.getAttribute(`data-${k}`);\n return imageUrl(url, { width: g('max-width'), height: g('max-height'), crop: g('max-width') || g('max-height') ? g('crop') : null });\n}\n\n/** Same image, whatever size parameters: the server-rendered one is kept (no second download). */\nexport const sameImage = (a, b) => Boolean(a && b) && a.split('?')[0] === b.split('?')[0];\n\nexport function setImage(el, url, alt) {\n if (!url) return;\n const src = cdnUrl(url, el);\n if (el.tagName === 'IMG' && sameImage(el.getAttribute('src'), src)) {\n if (alt != null && !el.getAttribute('alt')) el.setAttribute('alt', alt);\n return;\n }\n if (el.tagName === 'IMG') {\n el.removeAttribute('srcset');\n el.removeAttribute('sizes');\n el.setAttribute('src', src);\n if (alt != null) el.setAttribute('alt', alt);\n if (!el.getAttribute('loading')) el.setAttribute('loading', 'lazy');\n } else {\n el.style.backgroundImage = `url(\"${src}\")`;\n }\n}\n\nexport function setText(el, v) {\n const text = v == null ? '' : String(v);\n if (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA') el.value = text;\n else el.textContent = text;\n}\n\nexport const readText = (el) => (el.tagName === 'INPUT' || el.tagName === 'TEXTAREA' ? el.value : el.textContent);\n\n/** setText that reports changes to cfg.onValueChange (for scramble/roll effects). */\nexport function setTextTracked(el, v) {\n const before = readText(el);\n setText(el, v);\n const after = readText(el);\n if (before !== after && el.dataset.tetherSeen && typeof cfg.onValueChange === 'function') {\n try { cfg.onValueChange(el, before); } catch { /* ignore */ }\n }\n el.dataset.tetherSeen = '1';\n}\n\nexport function show(el, visible) {\n const k = 'tetherPrevDisplay';\n if (visible) {\n if (el.dataset.tetherShown !== undefined) return; // already visible, nothing to check\n el.dataset.tetherShown = '';\n el.removeAttribute('hidden');\n if (el.dataset[k] !== undefined) {\n el.style.display = el.dataset[k];\n delete el.dataset[k];\n } else if (el.style.display === 'none') {\n el.style.display = '';\n }\n // Hidden before the script ran (a class, an inline display:none, a hidden attribute): show it\n // as block or the value of tether-display.\n if (typeof getComputedStyle === 'function' && getComputedStyle(el).display === 'none') {\n el.style.display = el.getAttribute(`${cfg.prefix}-display`) || 'block';\n }\n } else {\n delete el.dataset.tetherShown;\n // Remember a real display value to restore, never 'none'.\n if (el.dataset[k] === undefined && el.style.display !== 'none') el.dataset[k] = el.style.display || '';\n el.style.display = 'none';\n }\n}\n\nexport function setSelected(el, selected) {\n el.classList.toggle('is-selected', selected);\n el.setAttribute('aria-pressed', selected ? 'true' : 'false');\n if (el.tagName === 'INPUT' && (el.type === 'radio' || el.type === 'checkbox')) el.checked = selected;\n const input = el.querySelector?.('input[type=\"radio\"],input[type=\"checkbox\"]');\n if (input) input.checked = selected;\n}\n\n// ---------------------------------------------------------------------------\n// Repeaters: the first child in Webflow is the template, the rest is removed.\n// ---------------------------------------------------------------------------\n\nconst templates = new WeakMap();\n\n/** True once a repeater's template has been captured (it may be empty after that). */\nexport const hasTemplate = (container) => Boolean(templates.get(container));\n\nfunction template(container) {\n if (!templates.has(container)) {\n const tpl = container.firstElementChild?.cloneNode(true) ?? null;\n templates.set(container, tpl);\n container.innerHTML = '';\n }\n return templates.get(container);\n}\n\n/** Rebuilds the list on every render. Fine for images, tags, options. */\nexport function repeat(container, items, render) {\n const tpl = template(container);\n if (!tpl) { if (items.length) warn('repeater without a template child', container); return; }\n container.innerHTML = '';\n items.forEach((item, i) => {\n const node = tpl.cloneNode(true);\n render(node, item, i);\n container.appendChild(node);\n });\n}\n\n/**\n * Keyed repeater: keeps existing nodes, inserts new ones, removes old ones.\n * Used for cart lines, so values can animate and lines can slide in/out.\n */\nexport function repeatKeyed(container, items, keyOf, render, { onEnter, onLeave } = {}) {\n const tpl = template(container);\n if (!tpl) { warn('repeater without a template child', container); return; }\n\n const KEY = dataKey();\n const LEAVING = `data-${cfg.prefix}-leaving`;\n const live = () => [...container.children].filter((n) => n.hasAttribute(KEY) && !n.hasAttribute(LEAVING));\n\n const existing = new Map(live().map((n) => [n.getAttribute(KEY), n]));\n const wanted = [];\n const fresh = new Set();\n\n items.forEach((item, i) => {\n const k = String(keyOf(item, i));\n let node = existing.get(k);\n if (node) existing.delete(k);\n else {\n node = tpl.cloneNode(true);\n node.setAttribute(KEY, k);\n fresh.add(node);\n }\n render(node, item, i, fresh.has(node));\n wanted.push(node);\n });\n\n const staying = wanted.filter((n) => !fresh.has(n));\n const current = live().filter((n) => staying.includes(n));\n const orderOk = current.length === staying.length && current.every((n, i) => n === staying[i]);\n\n if (!orderOk) {\n existing.forEach((n) => n.remove());\n wanted.forEach((n) => container.appendChild(n));\n return;\n }\n\n wanted.forEach((node, i) => {\n if (!fresh.has(node)) return;\n const prev = wanted[i - 1];\n if (prev && prev.parentNode === container) prev.after(node);\n else container.prepend(node);\n if (onEnter) { try { onEnter(node); } catch { /* ignore */ } }\n });\n\n existing.forEach((node) => {\n node.setAttribute(LEAVING, '');\n node.removeAttribute(KEY);\n node.style.pointerEvents = 'none';\n node.inert = true;\n const done = () => node.remove();\n if (onLeave) { try { onLeave(node, done); } catch { done(); } } else done();\n });\n}\n\n// ---------------------------------------------------------------------------\n// Layout notifications: async renders change page height after your\n// page-transition hooks ran. Debounced, then cfg.onLayoutChange or a default.\n// ---------------------------------------------------------------------------\n\nlet layoutTimer = null;\n\nexport function notifyLayoutChanged(reason) {\n clearTimeout(layoutTimer);\n layoutTimer = setTimeout(() => {\n if (typeof cfg.onLayoutChange === 'function') cfg.onLayoutChange(reason);\n else if (window.ScrollTrigger?.refresh) window.ScrollTrigger.refresh();\n emit('layout-changed', { reason });\n }, 120);\n}\n\nexport function watchImages(root, reason) {\n const imgs = qsa(root, 'img').filter((i) => !i.complete);\n if (!imgs.length) return;\n let left = imgs.length;\n const done = () => { if (--left === 0) notifyLayoutChanged(`${reason}:images`); };\n imgs.forEach((img) => {\n img.addEventListener('load', done, { once: true });\n img.addEventListener('error', done, { once: true });\n });\n}\n\nexport function busy(el, fn) {\n if (el.getAttribute('aria-busy') === 'true') return Promise.resolve();\n el.setAttribute('aria-busy', 'true');\n return Promise.resolve().then(fn).finally(() => el.removeAttribute('aria-busy'));\n}\n\nexport function parseJSONAttr(el, name) {\n const raw = el && get(el, name);\n if (!raw) return null;\n try { return JSON.parse(raw); } catch { warn(`invalid JSON in ${attr(name)}`, el); return null; }\n}\n\n/** {a: 1} or [{key, value}] -> [{key, value}] as Shopify wants it. */\nexport function toAttributes(obj) {\n if (!obj) return [];\n if (Array.isArray(obj)) return obj.map((a) => ({ key: String(a.key), value: String(a.value ?? '') }));\n return Object.entries(obj).map(([key, value]) => ({ key, value: String(value ?? '') }));\n}\n", "/**\n * ProductScope: everything inside [tether-product=\"<handle>\"] binds to one\n * Shopify product: options, variants, quantity, subscriptions, add to cart.\n */\nimport { cfg, reportError } from './config.js';\nimport {\n attr, sel, get, has, qsa, scoped, emit, formatMoney, formatDate, setText, setImage, show,\n setSelected, repeat, productUrl, notifyLayoutChanged, watchImages, busy, parseJSONAttr, toAttributes, sameImage, hasTemplate, formatPercent,\n} from './dom.js';\nimport { Cart } from './cart.js';\nimport { STATUS_KEYS, ownedBy } from './status.js';\nimport {\n allPlans, allocationFor, planPrice, planCheckoutCharge, planSavings, planAdjustment, findPlan, GID,\n} from './selling-plans.js';\n\nexport const scopes = new WeakMap(); // element -> ProductScope\n\nconst productSel = () => sel('product');\n\nfunction metafieldValue(product, ref) {\n const i = ref.indexOf('.');\n const ns = ref.slice(0, i);\n const key = ref.slice(i + 1);\n const mf = (product.metafields || []).find((m) => m && m.namespace === ns && m.key === key);\n return mf || null;\n}\n\n// Option names as written in the markup (the build's language), by product handle. With another\n// language Shopify translates them (Size -> Gr\u00F6\u00DFe), so attributes are matched by position instead.\nconst knownOptionNames = new Map();\nexport function rememberOptionNames(products) {\n (products || []).forEach((p) => { if (p?.handle && !knownOptionNames.has(p.handle)) knownOptionNames.set(p.handle, (p.options || []).map((o) => o.name)); });\n}\n\nexport class ProductScope {\n constructor(root, product) {\n this.root = root;\n this.product = product;\n this.selected = {};\n this.variant = null;\n this.quantity = Math.max(0, parseInt(get(root, 'quantity') ?? '1', 10) || (has(root, 'quantity') ? 0 : 1));\n this.plans = allPlans(product);\n this.purchase = 'one-time';\n this.planId = null;\n\n scopes.set(root, this);\n root.setAttribute(attr('state'), 'ready');\n root.removeAttribute(attr('error'));\n\n this.initSelection();\n this.initPurchase();\n this.renderProduct();\n this.bind();\n this.renderVariant();\n\n watchImages(root, 'product');\n notifyLayoutChanged('product');\n emit('product-ready', { product, scope: this }, root);\n }\n\n /** New data for the same product (e.g. after a country switch). Keeps the selection. */\n update(product) {\n const variantId = this.variant?.id;\n this.product = product;\n this.plans = allPlans(product);\n if (this.planId && !this.plans.some((p) => p.id === this.planId)) this.planId = this.plans[0]?.id || null;\n if (!this.plans.length && this.purchase === 'subscription') this.purchase = 'one-time';\n const v = product.variants.nodes.find((x) => x.id === variantId);\n if (v) { this.selected = {}; v.selectedOptions.forEach((o) => { this.selected[o.name] = o.value; }); }\n this.root.setAttribute(attr('state'), 'ready');\n this.root.removeAttribute(attr('error'));\n this.renderProduct();\n this.renderVariant();\n notifyLayoutChanged('product');\n emit('product-updated', { product, scope: this }, this.root);\n }\n\n /** Matching elements in this scope, including the root itself (e.g. a card link with tether-bind=\"link\"). */\n $(s) {\n const inner = scoped(this.root, s, productSel());\n return this.root.matches(s) ? [this.root, ...inner] : inner;\n }\n\n // ------------------------------------------------------------ state\n\n /** The product's option name for a name used in the markup (same name, or same position). */\n optName(authored) {\n const opts = this.product?.options || [];\n if (!authored || opts.some((o) => o.name === authored)) return authored;\n const i = (knownOptionNames.get(this.product.handle) || []).indexOf(authored);\n return i >= 0 && opts[i] ? opts[i].name : authored;\n }\n\n initSelection() {\n const vs = this.product.variants.nodes;\n const first = vs.find((v) => v.availableForSale) || vs[0];\n if (first) first.selectedOptions.forEach((o) => { this.selected[o.name] = o.value; });\n\n const param = new URLSearchParams(window.location.search).get('variant') || get(this.root, 'variant');\n if (param) {\n const gid = GID.variant(param);\n const match = vs.find((v) => v.id === gid);\n if (match) {\n this.selected = {};\n match.selectedOptions.forEach((o) => { this.selected[o.name] = o.value; });\n }\n }\n }\n\n initPurchase() {\n if (!this.plans.length) return;\n const params = new URLSearchParams(window.location.search);\n const fromUrl = findPlan(this.product, params.get('selling_plan'));\n const fromAttr = findPlan(this.product, get(this.root, 'default-plan'));\n this.planId = (fromUrl || fromAttr || this.plans[0]).id;\n\n const wanted = fromUrl ? 'subscription' : (get(this.root, 'default-purchase') || cfg.defaultPurchase);\n this.purchase = this.product.requiresSellingPlan || wanted === 'subscription' ? 'subscription' : 'one-time';\n }\n\n findVariant() {\n return this.product.variants.nodes.find((v) =>\n v.selectedOptions.every((o) => this.selected[o.name] === o.value)) || null;\n }\n\n isValueAvailable(name, value) {\n return this.product.variants.nodes.some((v) =>\n v.availableForSale && v.selectedOptions.every((o) =>\n (o.name === name ? o.value === value : this.selected[o.name] === o.value)));\n }\n\n get plan() { return this.plans.find((p) => p.id === this.planId) || null; }\n\n /** True when the current variant can be bought on the selected plan. */\n get subscriptionAvailable() {\n return Boolean(this.variant && this.plans.some((p) => allocationFor(this.variant, p.id)));\n }\n\n get isSubscription() {\n return this.purchase === 'subscription' && Boolean(allocationFor(this.variant, this.planId));\n }\n\n /** What would be added to the cart right now. */\n getLine() {\n if (!this.variant) return null;\n const line = { merchandiseId: this.variant.id, quantity: this.quantity };\n if (this.isSubscription) line.sellingPlanId = this.planId;\n const attrs = this.collectAttributes();\n if (attrs.length) line.attributes = attrs;\n return line;\n }\n\n collectAttributes() {\n const fixed = toAttributes(parseJSONAttr(this.root, 'line-attributes'));\n const inputs = this.$(sel('line-attribute')).map((el) => {\n const key = get(el, 'line-attribute');\n let value;\n if (el.type === 'checkbox') value = el.checked ? (el.value && el.value !== 'on' ? el.value : 'Yes') : '';\n else if (el.type === 'radio') value = el.checked ? el.value : null;\n else value = el.value;\n return value == null || value === '' ? null : { key, value: String(value) };\n }).filter(Boolean);\n return [...fixed, ...inputs];\n }\n\n // ------------------------------------------------------------ actions\n\n select(name, value) {\n if (this.selected[name] === value) return;\n const vs = this.product.variants.nodes.filter((v) => v.selectedOptions.some((o) => o.name === name && o.value === value));\n if (!vs.length) return; // a value no variant has: nothing to select, keep the visitor's choice\n const next = { ...this.selected, [name]: value };\n if (!vs.some((v) => v.selectedOptions.every((o) => next[o.name] === o.value))) {\n // That combination doesn't exist: the closest variant with this value (most other choices kept, available first).\n const score = (v) => v.selectedOptions.filter((o) => o.name !== name && this.selected[o.name] === o.value).length * 2 + (v.availableForSale ? 1 : 0);\n const best = vs.reduce((a, b) => (score(b) > score(a) ? b : a));\n best.selectedOptions.forEach((o) => { next[o.name] = o.value; });\n }\n this.selected = next;\n this.renderVariant();\n }\n\n selectVariant(id) {\n const v = this.product.variants.nodes.find((x) => x.id === GID.variant(id));\n if (!v) return;\n this.selected = {};\n v.selectedOptions.forEach((o) => { this.selected[o.name] = o.value; });\n this.renderVariant();\n }\n\n setPurchase(mode) {\n const next = mode === 'subscription' ? 'subscription' : 'one-time';\n if (next === 'one-time' && this.product.requiresSellingPlan) return;\n if (this.purchase === next) return;\n this.purchase = next;\n this.renderVariant();\n }\n\n selectPlan(ref) {\n const p = findPlan(this.product, ref);\n if (!p) return;\n this.planId = p.id;\n this.purchase = 'subscription';\n this.renderVariant();\n }\n\n setQuantity(n) {\n const min = has(this.root, 'quantity') ? 0 : 1;\n this.quantity = Math.max(min, parseInt(n, 10) || 0);\n this.$(sel('qty')).forEach((i) => setText(i, this.quantity));\n this.renderVariant();\n }\n\n async addToCart() {\n if (!this.variant?.availableForSale) return null;\n const line = this.getLine();\n if (!line || line.quantity < 1) return null;\n const cart = await Cart.add(line);\n emit('product-added', { product: this.product, variant: this.variant, line }, this.root);\n return cart;\n }\n\n // ------------------------------------------------------------ events\n\n bind() {\n const own = (el) => el && el.closest(productSel()) === this.root;\n\n this.root.addEventListener('click', (e) => {\n const t = e.target;\n if (!t?.closest) return;\n\n const opt = t.closest(sel('option-value'));\n if (own(opt) && opt.closest(sel('option-list'))) {\n e.preventDefault();\n this.select(this.optName(get(opt.closest(sel('option-list')), 'option-list')), get(opt, 'option-value'));\n return;\n }\n\n const plan = t.closest(sel('plan-value'));\n if (own(plan)) { e.preventDefault(); this.selectPlan(get(plan, 'plan-value')); return; }\n\n const purchase = t.closest(`${sel('purchase')}:not(select)`);\n if (own(purchase)) {\n if (purchase.tagName !== 'INPUT') e.preventDefault();\n this.setPurchase(get(purchase, 'purchase'));\n return;\n }\n\n const plus = t.closest(sel('qty-plus'));\n if (own(plus)) { e.preventDefault(); this.setQuantity(this.quantity + 1); return; }\n const minus = t.closest(sel('qty-minus'));\n if (own(minus)) { e.preventDefault(); this.setQuantity(this.quantity - 1); return; }\n\n const add = t.closest(sel('add-to-cart'));\n if (own(add)) { e.preventDefault(); this.onAddClick(add); }\n });\n\n this.root.addEventListener('change', (e) => {\n const t = e.target;\n if (!own(t)) return;\n if (t.matches(`select${sel('option')}`)) this.select(this.optName(get(t, 'option')), t.value);\n else if (t.matches(`select${sel('variant-select')}`)) this.selectVariant(t.value);\n else if (t.matches(`select${sel('plan')}`)) {\n if (t.value) this.selectPlan(t.value); else this.setPurchase('one-time');\n } else if (t.matches(`select${sel('purchase')}`)) this.setPurchase(t.value);\n else if (t.matches(sel('qty'))) this.setQuantity(t.value);\n });\n }\n\n onAddClick(btn) {\n const label = btn.querySelector(sel('add-label')) || btn;\n const busyText = get(btn, 'adding-text');\n const write = (txt) => setText(label, txt);\n if (label.dataset.tetherLabel === undefined) label.dataset.tetherLabel = label.tagName === 'INPUT' ? label.value : label.textContent;\n\n busy(btn, async () => {\n if (busyText) write(busyText);\n try { await this.addToCart(); } catch (err) {\n reportError(err, 'add to cart failed');\n emit('error', { error: err, context: 'add-to-cart' }, this.root);\n } finally {\n if (busyText) write(label.dataset.tetherLabel);\n }\n }).then(() => {\n // Restore mode-dependent labels (subscribe-text / soldout-text) after aria-busy is cleared.\n this.renderVariant();\n });\n }\n\n // ------------------------------------------------------------ render\n\n renderProduct() {\n const p0 = this.product;\n if (!knownOptionNames.has(p0.handle)) {\n const authored = this.$(`${sel('option-list')},select${sel('option')}`).map((e) => get(e, 'option-list') || get(e, 'option'));\n if (authored.some((n) => p0.options.some((o) => o.name === n))) rememberOptionNames([p0]);\n }\n const p = this.product;\n\n this.$(sel('bind')).forEach((el) => {\n const key = get(el, 'bind') || '';\n const txt = {\n title: p.title,\n 'description-text': p.description,\n vendor: p.vendor,\n type: p.productType,\n handle: p.handle,\n }[key];\n if (txt !== undefined) return setText(el, txt);\n switch (key) {\n case 'description': el.innerHTML = p.descriptionHtml || ''; return undefined;\n case 'published-at': return setText(el, formatDate(p.publishedAt));\n case 'min-price': return setText(el, formatMoney(p.priceRange.minVariantPrice));\n case 'max-price': return setText(el, formatMoney(p.priceRange.maxVariantPrice));\n case 'featured-image': return setImage(el, p.featuredImage?.url, p.featuredImage?.altText || p.title);\n case 'url':\n case 'link':\n el.setAttribute('href', productUrl(p.handle, p.id));\n if (key === 'url' && !el.firstElementChild && !el.textContent.trim()) setText(el, p.title);\n return undefined;\n case 'images': {\n // Server-rendered gallery with the same images: keep it as it is.\n const imgs = [...el.children].map((n) => (n.tagName === 'IMG' ? n : n.querySelector('img')));\n if (!hasTemplate(el) && imgs.length === p.images.nodes.length && imgs.every((im, i) => sameImage(im?.getAttribute('src'), p.images.nodes[i].url))) return undefined;\n }\n return repeat(el, p.images.nodes, (node, img) => {\n const target = node.matches(`img,${sel('bind', 'image')}`) ? node : node.querySelector('img') || node;\n setImage(target, img.url, img.altText || p.title);\n });\n case 'tags': {\n const exclude = (el.getAttribute('exclude') || '').split(',').map((s) => s.trim()).filter(Boolean);\n return repeat(el, p.tags.filter((t) => !exclude.includes(t)), (node, tag) => setText(node, tag));\n }\n default:\n // image:2 = the second product image (falls back to the featured image)\n if (/^image:\\d+$/.test(key)) {\n const img = p.images.nodes[key.slice(6) - 1] || p.featuredImage;\n return setImage(el, img?.url, img?.altText || p.title);\n }\n if (key.startsWith('metafield:')) {\n const mf = metafieldValue(p, key.slice(10));\n if (!mf) return setText(el, '');\n if (mf.reference?.image) return setImage(el, mf.reference.image.url, mf.reference.image.altText);\n if (/^(rich_text|multi_line_text)_field$/.test(mf.type)) el.style.whiteSpace = 'pre-line';\n return setText(el, mf.value);\n }\n return undefined;\n }\n });\n\n this.$(sel('option-list')).forEach((container) => {\n const name = this.optName(get(container, 'option-list'));\n const opt = p.options.find((o) => o.name === name);\n if (!opt || (opt.optionValues.length <= 1 && has(container, 'hide-single'))) return show(container, false);\n return repeat(container, opt.optionValues, (node, v) => {\n node.setAttribute(attr('option-value'), v.name);\n const t = node.querySelector(sel('bind', 'option-value'));\n if (t) setText(t, v.name); else if (!node.firstElementChild) setText(node, v.name);\n const sw = node.querySelector(sel('bind', 'swatch'));\n if (sw && v.swatch?.color) sw.style.backgroundColor = v.swatch.color;\n if (sw && v.swatch?.image?.previewImage) setImage(sw, v.swatch.image.previewImage.url, v.name);\n });\n });\n\n this.$(`select${sel('option')}`).forEach((s) => {\n const opt = p.options.find((o) => o.name === this.optName(get(s, 'option')));\n if (!opt) return show(s, false);\n s.innerHTML = '';\n opt.optionValues.forEach((v) => s.appendChild(new Option(v.name, v.name)));\n return undefined;\n });\n\n this.$(`select${sel('variant-select')}`).forEach((s) => {\n s.innerHTML = '';\n p.variants.nodes.forEach((v) => s.appendChild(new Option(v.title, v.id)));\n });\n\n // Subscriptions\n this.$(sel('plan-list')).forEach((container) => {\n // Value = selling plan group name. Empty, \"true\", \"all\" or \"*\" = every plan\n // (Webflow's Designer doesn't always allow empty attribute values).\n const raw = (get(container, 'plan-list') || '').trim();\n const group = ['', 'true', 'all', '*'].includes(raw.toLowerCase()) ? null : raw;\n const plans = this.plans.filter((pl) => !group || pl.group.name === group);\n repeat(container, plans, (node, plan) => {\n node.setAttribute(attr('plan-value'), plan.id);\n if (!node.firstElementChild && !node.querySelector(sel('plan-bind'))) setText(node, plan.name);\n });\n });\n\n this.$(`select${sel('plan')}`).forEach((s) => {\n s.innerHTML = '';\n if (!p.requiresSellingPlan && get(s, 'plan') !== 'subscription-only') {\n s.appendChild(new Option(s.getAttribute(attr('one-time-label')) || 'One-time purchase', ''));\n }\n this.plans.forEach((pl) => s.appendChild(new Option(pl.name, pl.id)));\n });\n }\n\n renderVariant() {\n const p = this.product;\n let v = this.findVariant();\n if (!v) {\n [v] = p.variants.nodes;\n if (v) {\n this.selected = {};\n v.selectedOptions.forEach((o) => { this.selected[o.name] = o.value; });\n }\n }\n this.variant = v;\n if (!v) return;\n\n // A plan the variant isn't in -> pick the first one it is in.\n if (this.plans.length && !allocationFor(v, this.planId)) {\n const alt = this.plans.find((pl) => allocationFor(v, pl.id));\n if (alt) this.planId = alt.id;\n }\n\n const sub = this.isSubscription;\n const oneTimePrice = v.price;\n const subPrice = this.planId ? planPrice(v, this.planId) : null;\n const price = sub ? subPrice : oneTimePrice;\n const compareAt = sub ? (allocationFor(v, this.planId)?.priceAdjustments?.[0]?.compareAtPrice || v.compareAtPrice) : v.compareAtPrice;\n const onSale = compareAt && parseFloat(compareAt.amount) > parseFloat(price.amount);\n const discountPct = onSale ? Math.round((1 - parseFloat(price.amount) / parseFloat(compareAt.amount)) * 100) : 0;\n const savings = this.planId ? planSavings(v, this.planId) : { amount: null, percentage: 0 };\n const plan = this.plan;\n const total = { amount: (parseFloat(price.amount) * Math.max(1, this.quantity)).toFixed(2), currencyCode: price.currencyCode };\n\n const fm = formatMoney;\n const pct = (n) => formatPercent(n);\n // Text binds: name -> value (functions, so only the binds on the page are computed).\n const text = {\n price: () => fm(price),\n 'total-price': () => fm(total),\n 'one-time-price': () => fm(oneTimePrice),\n 'subscription-price': () => fm(subPrice),\n 'subscription-savings': () => pct(savings.percentage),\n 'subscription-savings-amount': () => fm(savings.amount),\n // What the visitor pays today for the chosen quantity (prepaid plans charge more up front).\n 'checkout-charge': () => { const c = sub ? planCheckoutCharge(v, this.planId) : price; return c && fm({ amount: (parseFloat(c.amount) * Math.max(1, this.quantity)).toFixed(2), currencyCode: c.currencyCode }); },\n 'plan-name': () => plan?.name,\n 'plan-description': () => plan?.description,\n 'plan-group': () => plan?.group?.name,\n 'compare-at-price': () => (onSale ? fm(compareAt) : ''),\n 'unit-price': () => fm(v.unitPrice),\n 'discount-percentage': () => `${discountPct}%`,\n 'discount-amount': () => (onSale ? fm({ amount: String(parseFloat(compareAt.amount) - parseFloat(price.amount)), currencyCode: price.currencyCode }) : ''),\n 'variant-title': () => v.title,\n 'variant-id': () => v.id,\n sku: () => v.sku,\n barcode: () => v.barcode,\n stock: () => v.quantityAvailable,\n quantity: () => this.quantity,\n };\n this.$(sel('bind')).forEach((el) => {\n const k = get(el, 'bind');\n if (k === 'variant-image') setImage(el, v.image?.url || p.featuredImage?.url, v.image?.altText || p.title);\n else if (text[k]) setText(el, text[k]());\n });\n\n this.$(sel('option-selected')).forEach((el) => setText(el, this.selected[this.optName(get(el, 'option-selected'))] || ''));\n\n this.$(sel('option-list')).forEach((container) => {\n const name = this.optName(get(container, 'option-list'));\n qsa(container, sel('option-value')).forEach((node) => {\n const value = get(node, 'option-value');\n setSelected(node, this.selected[name] === value);\n const unavailable = !this.isValueAvailable(name, value);\n node.classList.toggle('is-unavailable', unavailable);\n node.setAttribute('data-unavailable', unavailable ? 'true' : 'false');\n });\n });\n\n this.$(`select${sel('option')}`).forEach((s) => { s.value = this.selected[this.optName(get(s, 'option'))] || ''; });\n this.$(`select${sel('variant-select')}`).forEach((s) => { s.value = v.id; });\n\n // Subscription UI\n this.$(sel('purchase')).forEach((el) => {\n if (el.tagName === 'SELECT') { el.value = this.purchase; return; }\n const mode = get(el, 'purchase');\n setSelected(el, mode === this.purchase);\n const unavailable = mode === 'subscription' ? !this.subscriptionAvailable : p.requiresSellingPlan;\n el.classList.toggle('is-unavailable', unavailable);\n });\n\n this.$(sel('plan-value')).forEach((node) => {\n const id = get(node, 'plan-value');\n const planObj = this.plans.find((pl) => pl.id === id);\n const inVariant = Boolean(allocationFor(v, id));\n setSelected(node, sub && id === this.planId);\n node.classList.toggle('is-unavailable', !inVariant);\n qsa(node, sel('plan-bind')).forEach((el) => {\n const adj = planAdjustment(planObj);\n const s = planSavings(v, id);\n const k = get(el, 'plan-bind');\n const val = {\n name: () => planObj?.name,\n option: () => (planObj?.options || []).map((o) => o.value).join(', '), // e.g. \"1 month\", without the store's price text\n description: () => planObj?.description,\n price: () => fm(planPrice(v, id)),\n savings: () => pct(s.percentage),\n 'savings-amount': () => fm(s.amount),\n adjustment: () => (!adj ? '' : adj.type === 'percentage' ? `${adj.value}%` : fm(adj.value)),\n }[k];\n if (val) setText(el, val());\n });\n });\n\n this.$(`select${sel('plan')}`).forEach((s) => { s.value = sub ? this.planId : ''; });\n\n const low = v.quantityAvailable != null && v.quantityAvailable > 0 && v.quantityAvailable <= (cfg.lowStock ?? 5);\n const conds = {\n 'in-stock': v.availableForSale,\n 'out-of-stock': !v.availableForSale,\n 'backorder': v.availableForSale && v.currentlyNotInStock,\n 'on-sale': Boolean(onSale),\n 'not-on-sale': !onSale,\n 'has-variants': p.variants.nodes.length > 1,\n 'single-variant': p.variants.nodes.length === 1,\n 'low-stock': low,\n 'plenty-in-stock': v.availableForSale && !low,\n 'subscription-available': this.subscriptionAvailable,\n 'subscription-unavailable': !this.subscriptionAvailable,\n 'subscription-only': Boolean(p.requiresSellingPlan),\n 'one-time-available': !p.requiresSellingPlan,\n 'subscription-selected': sub,\n 'one-time-selected': !sub,\n 'has-savings': sub ? savings.percentage > 0 : Boolean(onSale),\n // scope state (see status.js)\n 'loading': false,\n 'ready': true,\n 'error': false,\n 'not-found': false,\n };\n this.$(sel('show')).forEach((el) => {\n const k = get(el, 'show');\n if (!(k in conds)) return;\n // State blocks of a list nested in this product belong to that list.\n if (STATUS_KEYS.includes(k) && !ownedBy(el, this.root)) return;\n show(el, conds[k]);\n });\n\n this.root.classList.toggle('is-subscription', sub);\n this.root.setAttribute(attr('purchase-mode'), sub ? 'subscription' : 'one-time');\n\n this.$(sel('add-to-cart')).forEach((btn) => {\n const disabled = !v.availableForSale;\n btn.classList.toggle('is-disabled', disabled);\n btn.setAttribute('aria-disabled', String(disabled));\n if ('disabled' in btn) btn.disabled = disabled;\n const soldOut = get(btn, 'soldout-text');\n const subText = get(btn, 'subscribe-text');\n if (soldOut || subText) {\n const label = btn.querySelector(sel('add-label')) || btn;\n if (label.dataset.tetherLabel === undefined) label.dataset.tetherLabel = label.tagName === 'INPUT' ? label.value : label.textContent;\n let text = label.dataset.tetherLabel;\n if (sub && subText) text = subText;\n if (disabled && soldOut) text = soldOut;\n if (btn.getAttribute('aria-busy') !== 'true') setText(label, text);\n }\n });\n\n emit('variant-changed', {\n product: p, variant: v, selected: { ...this.selected },\n purchase: this.purchase, sellingPlanId: sub ? this.planId : null,\n }, this.root);\n\n }\n}\n", "/**\n * Where a product scope gets its key from, and the loading / ready / error /\n * not-found state of a scope (so a failing API never leaves a broken page).\n */\nimport { attr, sel, get, scoped, show } from './dom.js';\n\n/**\n * tether-product values:\n * \"coffee-box\" handle, numeric id, gid or product URL (as before)\n * \"url:handle\" ?handle=... from the page URL (any param name: \"url:p\" -> ?p=)\n * \"url:path\" the last segment of the page path (/shop/coffee-box -> coffee-box)\n * Returns { key, fromUrl, raw }. key is null when the URL has no value.\n */\nexport function resolveProductKey(el, location = window.location, name = 'product') {\n const raw = (get(el, name) || '').trim();\n if (!raw.toLowerCase().startsWith('url:')) return { key: raw || null, fromUrl: false, raw };\n const what = raw.slice(4).trim();\n let key = null;\n if (what.toLowerCase() === 'path') {\n const parts = location.pathname.split('/').filter(Boolean);\n key = parts.length ? safeDecode(parts[parts.length - 1]) : null;\n } else {\n key = new URLSearchParams(location.search).get(what || 'handle');\n }\n key = key && key.trim() ? key.trim() : null;\n return { key, fromUrl: true, raw };\n}\n\nfunction safeDecode(s) { try { return decodeURIComponent(s); } catch { return s; } }\n\n/** Values of tether-show that follow the scope state. */\nexport const STATUS_KEYS = ['loading', 'ready', 'error', 'not-found'];\n\nexport const isNotFound = (err) => err?.code === 'NOT_FOUND';\n\n/** Product scopes and lists both own their state elements; the nearest one wins. */\nexport const boundary = () => ['product', 'collection', 'products', 'recommendations'].map((n) => sel(n)).join(',');\n\n/** True when `el` belongs to the scope `root` (not to a nested product or list). */\nexport const ownedBy = (el, root) => el === root || el.parentElement?.closest(boundary()) === root;\n\n/**\n * Sets tether-state (loading | ready | error) and tether-error (not-found or an\n * error code) on `root`, toggles tether-show=\"loading|ready|error|not-found\"\n * inside it, and disables add-to-cart buttons when there's no product.\n */\nexport function setScopeStatus(root, status, err) {\n const notFound = status === 'not-found';\n root.setAttribute(attr('state'), notFound ? 'error' : status);\n if (status === 'error' || notFound) root.setAttribute(attr('error'), notFound ? 'not-found' : (err?.code || 'error'));\n else root.removeAttribute(attr('error'));\n\n scoped(root, sel('show'), boundary()).forEach((el) => {\n const k = get(el, 'show');\n if (!STATUS_KEYS.includes(k)) return;\n show(el, k === status);\n });\n\n if (status === 'error' || notFound) {\n scoped(root, sel('add-to-cart'), boundary()).forEach((btn) => {\n btn.classList.add('is-disabled');\n btn.setAttribute('aria-disabled', 'true');\n if ('disabled' in btn) btn.disabled = true;\n });\n }\n}\n", "/**\n * Product lists: [tether-collection=\"handle\"] or [tether-products=\"search query\"].\n * The first child of [tether-list] is the card template; every card becomes a\n * product scope, so all product attributes work inside cards (including\n * quick-add with a subscription toggle).\n */\nimport { reportError } from './config.js';\nimport { TetherError } from './client.js';\nimport { attr, sel, get, has, scoped, emit, setText, setImage, repeat, notifyLayoutChanged, busy, show } from './dom.js';\nimport { getProducts, getRecommendations } from './loader.js';\nimport { setScopeStatus, isNotFound, resolveProductKey } from './status.js';\n\nexport const listSelector = () => `${sel('collection')},${sel('products')},${sel('recommendations')}`;\n\nexport class ListScope {\n constructor(root) {\n this.root = root;\n this.products = [];\n this.pageInfo = null;\n this.collection = null;\n setScopeStatus(root, 'loading');\n root.addEventListener('click', (e) => {\n const more = e.target.closest?.(sel('load-more'));\n if (more && more.closest(listSelector()) === root) {\n e.preventDefault();\n busy(more, () => this.load(true));\n }\n });\n }\n\n $(s) { return scoped(this.root, s, listSelector()); }\n\n options() {\n const r = this.root;\n const opts = {\n first: parseInt(get(r, 'limit') || '', 10) || undefined,\n sortKey: get(r, 'sort') || undefined,\n reverse: get(r, 'reverse') === 'true',\n };\n if (has(r, 'collection')) opts.collection = get(r, 'collection');\n else {\n // url:q = the search in the page's ?q= (a results page on a static site).\n const raw = get(r, 'products') || '';\n opts.query = raw.startsWith('url:') ? new URL(window.location.href).searchParams.get(raw.slice(4)) || '' : raw;\n }\n return opts;\n }\n\n async load(more = false) {\n const token = (this.loadToken = (this.loadToken || 0) + 1);\n const stale = () => token !== this.loadToken;\n try {\n if (has(this.root, 'recommendations')) {\n // A handle, url:handle (one dynamic product page), or empty inside a product: that product.\n let { key } = resolveProductKey(this.root, window.location, 'recommendations');\n const scope = this.root.closest(sel('product'));\n if (!key && scope) ({ key } = resolveProductKey(scope));\n if (!key) throw new TetherError('No product for recommendations', { code: 'NOT_FOUND' });\n const recs = await getRecommendations(key, get(this.root, 'intent') || 'RELATED');\n if (stale()) return;\n const limit = parseInt(get(this.root, 'limit') || '', 10);\n this.products = limit ? recs.slice(0, limit) : recs;\n } else {\n const res = await getProducts({ ...this.options(), after: more ? this.pageInfo?.endCursor : null });\n if (stale()) return;\n this.collection = res.collection;\n this.pageInfo = res.pageInfo;\n this.products = more ? [...this.products, ...res.products] : res.products;\n }\n this.render();\n setScopeStatus(this.root, 'ready');\n emit('list-ready', { products: this.products, collection: this.collection }, this.root);\n } catch (err) {\n if (stale()) return;\n // Keep what's already rendered on a failed \"load more\"; otherwise show the error state.\n if (!more) setScopeStatus(this.root, isNotFound(err) ? 'not-found' : 'error', err);\n // A missing product for recommendations is a page detail, not an error to report.\n if (!(isNotFound(err) && has(this.root, 'recommendations'))) reportError(err, 'list load failed');\n emit('error', { error: err, context: 'list' }, this.root);\n }\n }\n\n render() {\n const c = this.collection;\n this.$(sel('collection-bind')).forEach((el) => {\n switch (get(el, 'collection-bind')) {\n case 'title': return setText(el, c?.title || '');\n case 'description': el.innerHTML = c?.descriptionHtml || ''; return undefined;\n case 'image': return setImage(el, c?.image?.url, c?.image?.altText || c?.title);\n case 'count': return setText(el, this.products.length);\n default: return undefined;\n }\n });\n\n this.$(sel('list')).forEach((container) => {\n repeat(container, this.products, (node, p) => {\n node.setAttribute(attr('product'), p.handle);\n node.removeAttribute(attr('state'));\n });\n // Cards are new elements: mount them (product data is already cached).\n emit('list-rendered', { container }, this.root);\n });\n\n const empty = this.products.length === 0;\n this.$(sel('show')).forEach((el) => {\n const k = get(el, 'show');\n if (k === 'list-empty') show(el, empty);\n if (k === 'list-filled') show(el, !empty);\n });\n this.$(sel('load-more')).forEach((el) => show(el, Boolean(this.pageInfo?.hasNextPage)));\n notifyLayoutChanged('list');\n }\n}\n\n", "/** Product scopes and lists that are mounted, shared by index.js and the optional markets part. */\nimport { cfg, log, warn, reportError } from './config.js';\nimport { ProductScope, scopes, rememberOptionNames } from './product.js';\nimport { listSelector } from './collection.js';\nimport { getProduct, takeStale, refreshProducts, hydrateProducts } from './loader.js';\nimport { resolveProductKey, setScopeStatus, isNotFound } from './status.js';\nimport { attr, get, qsa, emit } from './dom.js';\n\nexport const mountedProducts = new WeakSet();\nexport const mountedLists = new WeakSet();\n// Live roots, for re-rendering after a country switch (pruned when disconnected).\nexport const liveProducts = new Set();\nexport const liveLists = new Set();\nconst requestToken = new WeakMap(); // product root -> latest request, so a slow old response can't win\n\nexport function pruneLive() {\n liveProducts.forEach((el) => { if (!el.isConnected) liveProducts.delete(el); });\n liveLists.forEach((l) => { if (!l.root.isConnected) liveLists.delete(l); });\n}\nexport function within(root, selector) {\n return [...(root.matches?.(selector) ? [root] : []), ...qsa(root, selector)];\n}\n\nexport /** Mounts one product root. Returns true when a product request was started. */\nfunction mountProduct(el) {\n if (mountedProducts.has(el)) return false;\n const { key, fromUrl, raw } = resolveProductKey(el);\n if (!key) {\n if (fromUrl) {\n // Dynamic product page opened without ?handle= (or an empty path).\n mountedProducts.add(el);\n setScopeStatus(el, 'not-found');\n emit('product-not-found', { key: null, source: raw }, el);\n } else if (!el.closest(listSelector())) {\n // List cards get their handle when the list renders.\n warn(`[${attr('product')}] without a value. Bind it to the Shopify handle field, or use \"url:handle\".`, el);\n }\n return false;\n }\n mountedProducts.add(el);\n liveProducts.add(el);\n const token = {};\n requestToken.set(el, token);\n const current = () => requestToken.get(el) === token;\n // A rendered scope keeps showing its content while it refreshes (e.g. country switch).\n if (!scopes.get(el)) setScopeStatus(el, 'loading');\n else el.setAttribute(attr('state'), 'updating');\n const loading = getProduct(key);\n marketPending?.add(loading);\n loading\n .then((p) => {\n if (!current()) return;\n const existing = scopes.get(el);\n if (existing) existing.update(p);\n // eslint-disable-next-line no-new\n else new ProductScope(el, p);\n applyPageTitle(el, p);\n if (cfg.revalidate !== false && takeStale(key)) queueRefresh(key);\n })\n .catch((err) => {\n if (!current()) return;\n const notFound = isNotFound(err);\n setScopeStatus(el, notFound ? 'not-found' : 'error', err);\n if (notFound) {\n emit('product-not-found', { key, source: raw }, el);\n // A typo in a URL isn't worth an alert; a CMS item pointing at a deleted product is.\n if (fromUrl) log(`product not found: ${key}`); else reportError(err, `product ${key}`);\n } else {\n reportError(err, `product ${key}`);\n emit('error', { error: err, context: 'product', key }, el);\n }\n });\n return true;\n}\n\n/** tether-page-title=\"{title} | My shop\" on a product root sets document.title (dynamic product pages). */\nfunction applyPageTitle(el, p) {\n const tpl = get(el, 'page-title');\n if (!tpl || typeof document === 'undefined') return;\n document.title = tpl.replace(/\\{title\\}/g, p.title).replace(/\\{vendor\\}/g, p.vendor || '').replace(/\\{type\\}/g, p.productType || '');\n}\n\n\n/** Product scopes that failed on a network/API error: loaded again when the browser is back online. */\nexport function retryFailed() {\n pruneLive();\n liveProducts.forEach((el) => {\n if (el.getAttribute(attr('state')) !== 'error' || el.getAttribute(attr('error')) === 'not-found') return;\n mountedProducts.delete(el);\n mountProduct(el);\n });\n}\n\n// Server-rendered products: one batched background request refreshes them all.\nlet refreshQueue = new Set();\nfunction queueRefresh(key) {\n if (!refreshQueue.size) setTimeout(flushRefresh, 0);\n refreshQueue.add(key);\n}\nfunction flushRefresh() {\n const keys = [...refreshQueue];\n refreshQueue = new Set();\n refreshProducts(keys).forEach((promise, i) => promise.then((fresh) => {\n liveProducts.forEach((el) => {\n const scope = scopes.get(el);\n if (!scope || !el.isConnected) return;\n const k = resolveProductKey(el).key;\n if (k !== keys[i] && k !== fresh.handle && k !== fresh.id) return;\n if (JSON.stringify(scope.product) !== JSON.stringify(fresh)) scope.update(fresh);\n });\n }).catch((err) => reportError(err, `refresh ${keys[i]}`)));\n}\n\n/**\n * <script type=\"application/json\" data-tether-hydrate> tags written by tether/server's hydrate():\n * their products are used without a request. Ignored when they were made for another market.\n */\nconst readScripts = new WeakSet();\nlet marketPending = null; // product loads to wait for before html.tether-market-pending goes\n\n/** Lists (and anything else that loads prices) wait too. */\nexport const trackMarket = (p) => { marketPending?.add(p); return p; };\n\n/** After a mount: drop html.tether-market-pending once this page's products are live. */\nexport function settleMarket() {\n if (!marketPending) return;\n const waits = [...marketPending];\n Promise.allSettled(waits).then(() => {\n if (!marketPending || waits.some((w) => !marketPending.has(w))) return;\n if (waits.length === marketPending.size) {\n marketPending = null;\n document.documentElement.classList.remove(`${cfg.prefix}-market-pending`);\n } else settleMarket(); // more products came in meanwhile\n });\n}\n\nexport function hydrateFromPage(root = document) {\n qsa(root.ownerDocument || root, 'script[type=\"application/json\"][data-tether-hydrate]').forEach((s) => {\n if (readScripts.has(s)) return;\n readScripts.add(s);\n try {\n const data = JSON.parse(s.textContent);\n rememberOptionNames(data.products); // the build's option names, also for other languages\n const same = (a, b) => String(a || '').toUpperCase() === String(b || '').toUpperCase();\n if (same(data.country, cfg.country) && same(data.language, cfg.language)) hydrateProducts(data.products);\n else {\n // The page was built for another market: its prices aren't this visitor's. Mark the page\n // (html.tether-market-pending) until the live ones are in, so CSS can hide prices meanwhile.\n log('hydration skipped: other market');\n if (!marketPending) { marketPending = new Set(); document.documentElement.classList.add(`${cfg.prefix}-market-pending`); }\n }\n } catch (err) { warn('bad data-tether-hydrate', err); }\n });\n}\n", "/**\n * <script> build: optional parts are separate files next to tether(.min).js, e.g.\n * tether.markets.min.js, loaded on first use. Override the folder with config.partsUrl.\n */\nimport * as config from './config.js';\nimport * as client from './client.js';\nimport * as dom from './dom.js';\nimport * as fragments from './fragments.js';\nimport * as loader from './loader.js';\nimport * as sellingPlans from './selling-plans.js';\nimport * as status from './status.js';\nimport * as cart from './cart.js';\nimport * as product from './product.js';\nimport * as collection from './collection.js';\nimport * as mounting from './mounting.js';\n\nconst { cfg } = config;\n\n/** The modules a part may use, shared instead of bundled twice (scripts/build.mjs maps imports to these). */\nexport const coreModules = {\n 'config.js': config, 'client.js': client, 'dom.js': dom, 'fragments.js': fragments, 'loader.js': loader,\n 'selling-plans.js': sellingPlans, 'status.js': status, 'cart.js': cart, 'product.js': product,\n 'collection.js': collection, 'mounting.js': mounting,\n};\n\nconst self = typeof document !== 'undefined' ? document.currentScript?.src || '' : '';\nconst parts = {};\n\nexport function loadPart(name) {\n if (parts[name]) return parts[name];\n const base = cfg.partsUrl || self.replace(/[^/]*$/, '');\n const min = /\\.min\\.js(\\?|$)/.test(self) || !self ? '.min' : '';\n const url = `${base.replace(/\\/?$/, '/')}tether.${name}${min}.js`;\n parts[name] = new Promise((resolve, reject) => {\n const s = document.createElement('script');\n s.src = url;\n s.async = true;\n s.onload = () => (window.Tether?.__parts?.[name] ? resolve(window.Tether.__parts[name]) : reject(new Error(`${url} did not register`)));\n s.onerror = () => { delete parts[name]; reject(new Error(`Could not load ${url}. Host it next to the Tether script, or set partsUrl.`)); };\n document.head.appendChild(s);\n });\n return parts[name];\n}\n\n// Parts that load other parts (account -> account-pages) use this same loader.\ncoreModules['lazy.js'] = { loadPart, coreModules };\n", "/**\n * Tether \u2014 Shopify <-> Webflow (or any HTML) sync via the Storefront API.\n *\n * <script>window.TETHER_CONFIG = { domain: 'x.myshopify.com', token: '...' }</script>\n * <script src=\"tether.min.js\" defer></script>\n *\n * With page transitions (Barba, Swup): set autoMount: false, call\n * Tether.init() once and Tether.mount(container) after every page enter.\n */\nimport { cfg, configure, isConfigured, log, warn, reportError } from './config.js';\nimport { gql, TetherError, withContext } from './client.js';\nimport { Cart, focusables } from './cart.js';\nimport { scopes } from './product.js';\nimport { ListScope, listSelector } from './collection.js';\nimport {\n getProduct, getProducts, getRecommendations, clearProductCache, primeProduct, normalizeProductKey,\n} from './loader.js';\nimport * as plans from './selling-plans.js';\nimport { resolveProductKey } from './status.js';\nimport { attr, sel, get, qsa, emit, formatMoney, busy, parseJSONAttr, toAttributes, imageUrl } from './dom.js';\nimport { loadPart, coreModules } from './lazy.js';\nimport { mountedLists, liveLists, pruneLive, within, mountProduct, retryFailed, hydrateFromPage, settleMarket, trackMarket } from './mounting.js';\n\nexport const VERSION = '0.6.7';\n\nlet initPromise = null;\nlet observer = null;\nlet mountedBody = null; // the page body mount(document) last ran on (Astro's first page-load repeats it)\n\n/** Mount every product scope and product list inside `root`. Safe to call repeatedly. */\nexport function mount(root = document) {\n if (!isConfigured()) return 0;\n if (root === document) mountedBody = document.body;\n let count = 0;\n pruneLive(); // page transitions detach old roots: don't keep them alive\n hydrateFromPage(root); // products the server already rendered: no request needed\n\n within(root, listSelector()).forEach((el) => {\n if (mountedLists.has(el)) return;\n mountedLists.add(el);\n count++;\n const list = new ListScope(el);\n liveLists.add(list);\n el.addEventListener(`${cfg.prefix}:list-rendered`, (e) => mount(e.detail.container));\n trackMarket(list.load());\n });\n\n within(root, sel('product')).forEach((el) => { if (mountProduct(el)) count++; });\n\n // The country select lives in the optional markets part: load it only when the page uses it.\n if (within(root, `${sel('country-select')},${sel('country-bind')}`).length) {\n loadPart('markets').then((m) => m.renderCountrySelects(root)).catch((err) => reportError(err, 'markets'));\n }\n\n // Customer accounts: their own optional part, when configured and the page (or a login) needs it.\n if ((cfg.account?.clientId || cfg.account?.server) && (within(root, ['account-login', 'account-bind', 'account-link', 'orders', 'order', 'addresses', 'subscriptions', 'profile-form', 'address-form'].map((n) => `[${attr(n)}]`).join(',') + `,[${attr('show')}^=\"logged-\"]`).length\n || /[?&]code=/.test(window.location.search) || hasAccountSession())) {\n loadPart('account').then((m) => m.mountAccount(root)).catch((err) => reportError(err, 'account'));\n }\n\n // Search as you type: its own optional part, only for pages that have it.\n if (within(root, sel('search')).length) {\n loadPart('search').then((m) => m.mountSearch(root)).catch((err) => reportError(err, 'search'));\n }\n\n\n settleMarket();\n Cart.render();\n log(`mounted ${count} scope(s)`, root);\n return count;\n}\n\n// ---------------------------------------------------------------------------\n// Markets: country select + switching\n// ---------------------------------------------------------------------------\n\n/** Call before a page transition removes `root` (closes the drawer etc.). */\nexport function unmount() {\n Cart.close();\n}\n\nexport function getScope(el) {\n const root = el?.closest?.(sel('product'));\n return root ? scopes.get(root) || null : null;\n}\n\n// ---------------------------------------------------------------------------\n// Document-wide controls (delegated, so they survive page swaps)\n// ---------------------------------------------------------------------------\n\nlet controlsBound = false;\n\nfunction bindControls() {\n if (controlsBound) return;\n controlsBound = true;\n\n document.addEventListener('click', (e) => {\n const t = e.target;\n if (!t?.closest) return;\n\n if (t.closest(sel('cart-open'))) { e.preventDefault(); Cart.toggle(); return; }\n if (t.closest(sel('cart-close'))) { e.preventDefault(); Cart.close(); return; }\n\n const clear = t.closest(sel('cart-clear'));\n if (clear) { e.preventDefault(); busy(clear, () => Cart.clear().catch((err) => reportError(err, 'cart clear'))); return; }\n\n const checkout = t.closest(sel('checkout'));\n if (checkout) { e.preventDefault(); busy(checkout, () => Cart.checkout()); return; }\n\n const line = t.closest(dataKeySel());\n if (line && line.closest(sel('cart-lines'))) {\n const id = line.getAttribute(`data-${cfg.prefix}-key`);\n const current = Cart.lines.find((l) => l.id === id);\n const run = (fn) => { e.preventDefault(); fn().catch((err) => reportError(err, 'cart line')); };\n if (t.closest(sel('line-remove'))) { line.classList.add('is-busy'); return run(() => Cart.removeLine(id)); }\n if (current && t.closest(sel('line-plus'))) return run(() => Cart.changeQuantity(id, 1));\n if (current && t.closest(sel('line-minus'))) return run(() => Cart.changeQuantity(id, -1));\n }\n\n const removeCode = t.closest(sel('discount-remove'));\n if (removeCode) {\n e.preventDefault();\n const code = removeCode.closest(sel('discount-code'))?.getAttribute(attr('discount-code'));\n if (code) Cart.removeDiscount(code).catch((err) => reportError(err, 'discount'));\n return;\n }\n\n const groupBtn = t.closest(sel('group-add'));\n if (groupBtn) { e.preventDefault(); busy(groupBtn, () => addGroup(groupBtn)); }\n });\n\n document.addEventListener('change', (e) => {\n const t = e.target;\n if (!t?.closest) return;\n const lineEl = t.closest(dataKeySel());\n const id = lineEl?.getAttribute(`data-${cfg.prefix}-key`);\n // The line shows is-busy / aria-busy until Shopify has answered (removed by the next render).\n const busyLine = (p, what) => { lineEl.classList.add('is-busy'); lineEl.setAttribute('aria-busy', 'true'); p.catch((err) => reportError(err, what)); };\n if (id && t.matches(`input${sel('line', 'quantity')}`)) {\n busyLine(Cart.updateLine(id, parseInt(t.value, 10) || 0), 'cart line');\n } else if (id && t.matches(`select${sel('line-plan')}`)) {\n busyLine(Cart.updateLine(id, { sellingPlanId: t.value || null }), 'cart line plan');\n } else if (t.matches(`select${sel('country-select')}`)) {\n if (t.value) setCountry(t.value).catch((err) => reportError(err, 'country'));\n } else if (t.matches(sel('cart-note'))) {\n Cart.setNote(t.value).catch((err) => reportError(err, 'cart note'));\n }\n });\n\n document.addEventListener('submit', (e) => {\n const form = e.target.closest?.(sel('discount-form'));\n if (!form) return;\n e.preventDefault();\n const input = form.querySelector(sel('discount-input')) || form.querySelector('input');\n const code = input?.value.trim();\n if (!code) return;\n busy(form, async () => {\n const mark = (bad) => {\n form.classList.toggle('is-invalid', bad);\n if (input) { if (bad) input.setAttribute('aria-invalid', 'true'); else input.removeAttribute('aria-invalid'); }\n };\n try {\n await Cart.applyDiscount(code);\n mark(false);\n emit('discount-applied', { code }, form);\n if (input) input.value = '';\n } catch (err) {\n mark(true);\n if (err?.code === 'INVALID_DISCOUNT') emit('discount-invalid', { code }, form); else reportError(err, 'discount');\n }\n });\n }, true); // capture: before a router (Astro's ClientRouter) turns the submit into a navigation\n document.addEventListener('input', (e) => {\n const f = e.target.closest?.(sel('discount-form'));\n if (f) { f.classList.remove('is-invalid'); e.target.removeAttribute?.('aria-invalid'); }\n });\n\n // Other tabs: the cart or the market changed there (handled by the extras part, loaded then).\n window.addEventListener('storage', (e) => {\n if (cfg.domain && e.key?.startsWith(`${cfg.prefix}:`)) loadPart('extras').then((m) => m.onStorage(e)).catch(() => {});\n });\n // Shareable variant links: only when turned on.\n document.addEventListener(`${cfg.prefix}:variant-changed`, (e) => {\n const root = e.target;\n if (cfg.variantUrl || root.hasAttribute?.(attr('variant-url'))) loadPart('extras').then((m) => m.writeVariantUrl(root, e.detail)).catch(() => {});\n });\n\n // Astro View Transitions (<ClientRouter />): mount every new page, close the cart while leaving.\n if (cfg.astro !== false) {\n // Astro fires this on the first load too: wait for init (the visitor's saved market) first.\n document.addEventListener('astro:page-load', () => (initPromise || Promise.resolve()).then(() => {\n // Navigated to a page of another market (e.g. /de/): switch first, then mount in that market.\n // Back on a normal page after one: the visitor's own choice, else the default market.\n let target = pageMarket();\n if (!target && onPageMarket) {\n try { target = JSON.parse(localStorage.getItem(`${cfg.prefix}:market:${cfg.domain}`) || 'null'); } catch { target = null; }\n target = target?.country ? target : baseMarket;\n }\n onPageMarket = Boolean(pageMarket());\n const differs = target?.country && (String(target.country).toUpperCase() !== String(cfg.country || '').toUpperCase()\n || String(target.language || '').toUpperCase() !== String(cfg.language || '').toUpperCase());\n if (differs) setCountry(target.country, { language: target.language ?? null, locale: target.locale, remember: false }).then(() => mount(document), () => mount(document));\n else if (mountedBody !== document.body) mount(document); // the first load is already mounted: no second round of requests\n }));\n document.addEventListener('astro:before-swap', () => { mountedBody = null; unmount(); });\n }\n\n // Back online after a failed load: try the failed products and lists again.\n window.addEventListener('online', () => {\n retryFailed();\n liveLists.forEach((l) => { if (l.root.getAttribute(attr('state')) === 'error') l.load(); });\n });\n\n document.addEventListener('keydown', (e) => {\n if (!Cart.isOpen()) return;\n if (e.key === 'Escape') { Cart.close(); return; }\n if (e.key !== 'Tab' || cfg.cartFocus === false) return;\n // Keep Tab inside the open cart.\n const d = Cart.drawers().find((x) => x.classList.contains(cfg.cartDrawerOpenClass));\n const f = d ? focusables(d) : [];\n if (!f.length) return;\n const first = f[0];\n const last = f[f.length - 1];\n if (!d.contains(document.activeElement) || (e.shiftKey && document.activeElement === first) || (!e.shiftKey && document.activeElement === last)) {\n e.preventDefault();\n (e.shiftKey ? last : first).focus();\n }\n });\n}\n\nfunction dataKeySel() { return `[data-${cfg.prefix}-key]`; }\n\n/**\n * [tether-group] + [tether-group-add]: adds every product scope inside the\n * group in one request. Bundles, build-a-box, \"complete the set\".\n * Lines get attribute _group (and the group's tether-line-attributes).\n */\nexport const addGroup = (btn) => loadPart('extras').then((m) => m.addGroup(btn));\n\n// ---------------------------------------------------------------------------\n// Init\n// ---------------------------------------------------------------------------\n\nlet analyticsQueue = null;\n\nexport function init(overrides = {}) {\n if (initPromise && !Object.keys(overrides).length) return initPromise;\n configure({ ...(window.TETHER_CONFIG || {}), ...overrides });\n\n if (!isConfigured()) {\n warn('TETHER_CONFIG is missing domain or token. Tether is idle.');\n initPromise = Promise.resolve(null);\n return initPromise;\n }\n\n bindControls();\n if (cfg.observe) startObserver();\n // Analytics (optional part): buffer Tether's events until it has loaded, so none are missed.\n if (cfg.analytics && !analyticsQueue) {\n analyticsQueue = [];\n ['product-ready', 'list-ready', 'cart-updated', 'cart-toggled', 'checkout', 'search'].forEach((n) => document.addEventListener(`${cfg.prefix}:${n}`, (e) => analyticsQueue.push(e)));\n document.addEventListener('astro:page-load', () => analyticsQueue.push(new CustomEvent(`${cfg.prefix}:page`)));\n loadPart('analytics').then((m) => m.startAnalytics(analyticsQueue)).catch((err) => reportError(err, 'analytics'));\n }\n\n initPromise = applyMarket(overrides).then(() => Cart.init()).then(async (cart) => {\n // A saved cart from another market: move it to this one, so prices match the page.\n const want = cfg.country ? String(cfg.country).toUpperCase() : null;\n if (cart && want && cart.buyerIdentity?.countryCode && cart.buyerIdentity.countryCode !== want) {\n try { cart = await Cart.setBuyerIdentity({ countryCode: want }, { create: false }); } catch (err) { reportError(err, 'cart country'); }\n }\n emit('ready', { cart });\n return api;\n });\n return initPromise;\n}\n\n/**\n * Detected market (saved choice, server hint, Webflow locale) wins over the static config.\n * Without markets.detect only the visitor's saved choice applies, read here without loading\n * the markets part.\n */\n/**\n * A page built for one market (e.g. /de/ pages): <meta name=\"tether-page-country\" content=\"DE\">,\n * tether-page-language, tether-page-locale. Wins over the visitor's saved choice, isn't remembered.\n */\nfunction pageMarket(doc = document) {\n const get = (n) => doc.querySelector(`meta[name=\"${cfg.prefix}-page-${n}\"]`)?.getAttribute('content') || undefined;\n const country = get('country');\n return country ? { country: country.toUpperCase(), language: get('language'), locale: get('locale') } : null;\n}\n\nlet baseMarket = null; // the configured market, before a visitor's or page's market applied\nlet onPageMarket = false;\n\nasync function applyMarket(overrides) {\n const m = cfg.markets || {};\n baseMarket = { country: cfg.country, language: cfg.language, locale: cfg.locale };\n const page = pageMarket();\n onPageMarket = Boolean(page);\n if (page) {\n cfg.country = page.country;\n cfg.language = page.language ? page.language.toUpperCase() : undefined;\n if (page.locale) cfg.locale = page.locale;\n return;\n }\n if (m.detect === false) return;\n let market = null;\n if (m.detect) {\n try { market = (await loadPart('markets')).detectMarket(m); } catch (err) { reportError(err, 'markets'); return; }\n } else if (m.remember !== false) {\n try { market = JSON.parse(localStorage.getItem(`${cfg.prefix}:market:${cfg.domain}`) || 'null'); } catch { /* none */ }\n if (market && !/^[A-Z]{2}$/.test(market.country || '')) market = null;\n }\n if (!market) return;\n if (market.country) cfg.country = market.country;\n if (market.language) cfg.language = market.language;\n if (market.locale && !overrides.locale) cfg.locale = market.locale; // the visitor's market wins over the default\n log('market', market);\n}\n\nfunction hasAccountSession() {\n try { return Boolean(sessionStorage[`${cfg.prefix}:account:${cfg.domain}`] || localStorage[`${cfg.prefix}:account:${cfg.domain}`] || localStorage[`${cfg.prefix}:account-hint:${cfg.domain}`]); } catch { return false; }\n}\n\n/** Customer accounts (optional part, loaded on first use). See src/account.js. */\nconst accountApi = new Proxy({}, { get: (_, n) => (...a) => loadPart('account').then((m) => m[n](...a)) });\n\n/** Tether.setCountry('DE'): loads the markets part on first use. */\nexport function setCountry(code, opts) {\n return loadPart('markets').then((m) => m.setCountry(code, opts));\n}\n\nfunction startObserver() {\n if (observer || typeof MutationObserver === 'undefined') return;\n let t = null;\n const queued = new Set();\n observer = new MutationObserver((muts) => {\n muts.forEach((m) => m.addedNodes.forEach((n) => { if (n.nodeType === 1) queued.add(n); }));\n clearTimeout(t);\n t = setTimeout(() => { queued.forEach((n) => { if (n.isConnected) mount(n); }); queued.clear(); }, 50);\n });\n observer.observe(document.body, { childList: true, subtree: true });\n}\n\nexport const api = {\n VERSION,\n init,\n mount,\n unmount,\n get config() { return cfg; },\n get ready() { return initPromise || Promise.resolve(null); },\n query: gql,\n withContext,\n cart: Cart,\n getProduct,\n getProducts,\n getRecommendations,\n getScope,\n addGroup,\n account: accountApi,\n primeProduct,\n normalizeProductKey,\n clearProductCache,\n formatMoney,\n imageUrl,\n plans,\n TetherError,\n resolveProductKey,\n setCountry,\n detectMarket: (markets) => loadPart('markets').then((m) => m.detectMarket(markets || cfg.markets)),\n getLocalization: () => loadPart('markets').then((m) => m.getLocalization()),\n diagnose: (opts) => loadPart('diagnose').then((m) => m.diagnose({ ...opts, version: VERSION })),\n __core: coreModules,\n __parts: {},\n on(name, fn) {\n const h = (e) => fn(e.detail, e);\n document.addEventListener(`${cfg.prefix}:${name}`, h);\n return () => document.removeEventListener(`${cfg.prefix}:${name}`, h);\n },\n};\n\nexport default api;\n\n// Auto-start for the plain <script> setup.\nif (typeof window !== 'undefined' && typeof document !== 'undefined') {\n window.Tether = api;\n // Not with a framework integration (Astro), which starts Tether itself.\n const auto = window.TETHER_CONFIG && window.TETHER_CONFIG.autoMount !== false && !window.TETHER_INTEGRATION;\n if (auto) {\n const start = () => init().then(() => mount(document));\n if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', start, { once: true });\n else start();\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["config_exports", "__export", "DEFAULTS", "cfg", "configure", "isConfigured", "log", "reportError", "warn", "overrides", "k", "a", "err", "context", "client_exports", "__export", "TetherError", "endpoint", "gql", "request", "unwrap", "withContext", "TetherError", "message", "status", "errors", "userErrors", "code", "endpoint", "conf", "cfg", "withContext", "query", "ctx", "args", "tag", "sleep", "ms", "r", "statusText", "request", "variables", "context", "text", "age", "body", "attempt", "res", "err", "log", "json", "e", "gql", "opts", "unwrap", "payload", "name", "errs", "cart_exports", "__export", "Cart", "focusables", "toLineInput", "fragments_exports", "__export", "ALLOCATION_FIELDS", "SELLING_PLAN_FIELDS", "cartFragment", "collectionFields", "metafieldIdentifiers", "productFragment", "MONEY", "IMAGE", "metafieldIdentifiers", "o", "cfg", "m", "i", "metafieldsField", "ids", "SELLING_PLAN_FIELDS", "ALLOCATION_FIELDS", "productFragment", "cartFragment", "collectionFields", "loader_exports", "__export", "clearProductCache", "getProduct", "getProducts", "getRecommendations", "hydrateProducts", "normalizeProductKey", "primeProduct", "refreshProducts", "takeStale", "productCache", "pending", "resolvers", "scheduled", "generation", "isGid", "v", "normalizeProductKey", "raw", "m", "primeProduct", "product", "p", "getProduct", "rawKey", "key", "TetherError", "resolve", "reject", "flush", "gen", "keys", "ids", "handles", "k", "defs", "parts", "vars", "h", "i", "query", "productFragment", "log", "settle", "fn", "r", "data", "gql", "got", "freshAt", "miss", "err", "clearProductCache", "stale", "FRESH_MS", "hydrateProducts", "products", "takeStale", "x", "refreshProducts", "getProducts", "collection", "first", "cfg", "after", "sortKey", "reverse", "filters", "fragment", "collectionFields", "rest", "getRecommendations", "intent", "byId", "list", "selling_plans_exports", "__export", "GID", "allPlans", "allocationFor", "findPlan", "hasPlans", "planAdjustment", "planCheckoutCharge", "planPrice", "planSavings", "plansForVariant", "toGid", "v", "value", "type", "product", "g", "p", "variant", "planId", "a", "adj", "base", "sub", "plan", "ref", "plans", "gid", "needle", "o", "dom_exports", "__export", "attr", "busy", "cdnUrl", "dataKey", "emit", "formatDate", "formatMoney", "formatPercent", "get", "has", "hasTemplate", "imageUrl", "notifyLayoutChanged", "parseJSONAttr", "productUrl", "qsa", "readText", "repeat", "repeatKeyed", "sameImage", "scoped", "sel", "setImage", "setSelected", "setText", "setTextTracked", "show", "toAttributes", "watchImages", "attr", "name", "cfg", "sel", "value", "get", "el", "has", "dataKey", "productUrl", "handle", "id", "path", "numeric", "qsa", "root", "s", "scoped", "scopeSelector", "emit", "detail", "target", "formatPercent", "n", "locale", "formatMoney", "money", "amount", "formatDate", "iso", "imageUrl", "url", "width", "height", "crop", "u", "cdnUrl", "g", "k", "sameImage", "a", "b", "setImage", "alt", "src", "setText", "v", "text", "readText", "setTextTracked", "before", "after", "show", "visible", "setSelected", "selected", "input", "templates", "hasTemplate", "container", "template", "tpl", "repeat", "items", "render", "warn", "item", "i", "node", "repeatKeyed", "keyOf", "onEnter", "onLeave", "KEY", "LEAVING", "live", "existing", "wanted", "fresh", "staying", "current", "prev", "done", "layoutTimer", "notifyLayoutChanged", "reason", "watchImages", "imgs", "left", "img", "busy", "fn", "parseJSONAttr", "raw", "toAttributes", "obj", "key", "toLineInput", "input", "quantity", "opts", "src", "merchandiseId", "GID", "TetherError", "line", "plan", "attrs", "toAttributes", "mutation", "name", "args", "inner", "cartFragment", "FOCUSABLE", "returnFocus", "focusables", "d", "qsa", "el", "ariaState", "open", "sel", "b", "get", "cfg", "isMissingCart", "err", "Cart", "id", "payload", "p", "unwrap", "w", "all", "x", "emit", "fn", "run", "value", "cart", "reason", "n", "data", "gql", "reportError", "buyerIdentity", "variables", "createInput", "cartId", "log", "lines", "l", "lineId", "patch", "delta", "current", "target", "job", "latest", "now", "lineIds", "ids", "note", "obj", "add", "merged", "a", "attributes", "v", "key", "codes", "list", "discountCodes", "c", "code", "k", "create", "tab", "fresh", "url", "ds", "hadFocus", "call", "h", "e", "count", "money", "formatMoney", "setTextTracked", "hasSub", "conds", "show", "container", "repeat", "node", "attr", "t", "setText", "repeatKeyed", "renderLine", "notifyLayoutChanged", "lineValue", "m", "o", "isSub", "setImage", "u", "productUrl", "q", "qs", "warning", "pending", "lineConds", "select", "handle", "getProduct", "product", "plans", "allPlans", "want", "sig", "product_exports", "__export", "ProductScope", "rememberOptionNames", "scopes", "status_exports", "__export", "STATUS_KEYS", "boundary", "isNotFound", "ownedBy", "resolveProductKey", "setScopeStatus", "resolveProductKey", "el", "location", "name", "raw", "get", "what", "key", "parts", "safeDecode", "s", "STATUS_KEYS", "isNotFound", "err", "boundary", "n", "sel", "ownedBy", "root", "setScopeStatus", "status", "notFound", "attr", "scoped", "k", "show", "btn", "scopes", "productSel", "sel", "metafieldValue", "product", "ref", "i", "ns", "key", "m", "knownOptionNames", "rememberOptionNames", "products", "p", "o", "ProductScope", "root", "get", "has", "allPlans", "attr", "watchImages", "notifyLayoutChanged", "emit", "variantId", "v", "x", "s", "inner", "scoped", "authored", "opts", "vs", "first", "param", "gid", "GID", "match", "params", "fromUrl", "findPlan", "fromAttr", "wanted", "cfg", "name", "value", "allocationFor", "line", "attrs", "fixed", "toAttributes", "parseJSONAttr", "inputs", "el", "next", "score", "a", "b", "id", "mode", "n", "min", "setText", "cart", "Cart", "own", "e", "t", "opt", "plan", "purchase", "plus", "minus", "add", "btn", "label", "busyText", "write", "txt", "busy", "err", "reportError", "p0", "formatDate", "formatMoney", "setImage", "productUrl", "imgs", "hasTemplate", "im", "sameImage", "repeat", "node", "img", "target", "exclude", "tag", "mf", "container", "show", "sw", "raw", "group", "plans", "pl", "alt", "sub", "oneTimePrice", "subPrice", "planPrice", "price", "compareAt", "onSale", "discountPct", "savings", "planSavings", "total", "fm", "pct", "formatPercent", "text", "c", "planCheckoutCharge", "k", "qsa", "setSelected", "unavailable", "planObj", "inVariant", "adj", "planAdjustment", "val", "low", "conds", "STATUS_KEYS", "ownedBy", "disabled", "soldOut", "subText", "collection_exports", "__export", "ListScope", "listSelector", "listSelector", "sel", "ListScope", "root", "setScopeStatus", "e", "more", "busy", "s", "scoped", "r", "opts", "get", "has", "raw", "token", "stale", "key", "resolveProductKey", "scope", "TetherError", "recs", "getRecommendations", "limit", "res", "getProducts", "emit", "err", "isNotFound", "reportError", "c", "el", "setText", "setImage", "container", "repeat", "node", "p", "attr", "empty", "k", "show", "notifyLayoutChanged", "mounting_exports", "__export", "hydrateFromPage", "liveLists", "liveProducts", "mountProduct", "mountedLists", "mountedProducts", "pruneLive", "retryFailed", "settleMarket", "trackMarket", "within", "mountedProducts", "mountedLists", "liveProducts", "liveLists", "requestToken", "pruneLive", "el", "l", "within", "root", "selector", "qsa", "mountProduct", "key", "fromUrl", "raw", "resolveProductKey", "setScopeStatus", "emit", "listSelector", "warn", "attr", "token", "current", "scopes", "loading", "getProduct", "marketPending", "p", "existing", "ProductScope", "applyPageTitle", "cfg", "takeStale", "queueRefresh", "err", "notFound", "isNotFound", "log", "reportError", "tpl", "get", "retryFailed", "refreshQueue", "flushRefresh", "keys", "refreshProducts", "promise", "i", "fresh", "scope", "k", "readScripts", "trackMarket", "settleMarket", "waits", "w", "hydrateFromPage", "s", "data", "rememberOptionNames", "same", "a", "b", "hydrateProducts", "cfg", "config_exports", "coreModules", "client_exports", "dom_exports", "fragments_exports", "loader_exports", "selling_plans_exports", "status_exports", "cart_exports", "product_exports", "collection_exports", "mounting_exports", "self", "parts", "loadPart", "name", "base", "min", "url", "resolve", "reject", "s", "VERSION", "initPromise", "observer", "mountedBody", "mount", "root", "isConfigured", "count", "pruneLive", "hydrateFromPage", "within", "listSelector", "el", "mountedLists", "list", "ListScope", "liveLists", "cfg", "e", "trackMarket", "sel", "mountProduct", "loadPart", "m", "err", "reportError", "attr", "hasAccountSession", "settleMarket", "Cart", "log", "unmount", "getScope", "scopes", "controlsBound", "bindControls", "t", "clear", "busy", "checkout", "line", "dataKeySel", "id", "current", "l", "run", "fn", "removeCode", "code", "groupBtn", "addGroup", "lineEl", "busyLine", "p", "what", "setCountry", "form", "input", "mark", "bad", "emit", "f", "target", "pageMarket", "onPageMarket", "baseMarket", "retryFailed", "d", "x", "focusables", "first", "last", "btn", "analyticsQueue", "init", "overrides", "configure", "startObserver", "n", "applyMarket", "cart", "want", "api", "warn", "doc", "get", "country", "page", "market", "accountApi", "_", "a", "opts", "queued", "muts", "gql", "withContext", "getProduct", "getProducts", "getRecommendations", "primeProduct", "normalizeProductKey", "clearProductCache", "formatMoney", "imageUrl", "selling_plans_exports", "TetherError", "resolveProductKey", "markets", "coreModules", "name", "h", "index_default", "start"]
|
|
7
7
|
}
|