@atomm-developer/generator-material-purchase 0.1.0
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 +80 -0
- package/dist/README.md +424 -0
- package/dist/index.d.ts +81 -0
- package/dist/index.es.js +1925 -0
- package/dist/index.es.js.map +1 -0
- package/dist/index.umd.js +2 -0
- package/dist/index.umd.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../src/config.ts","../src/services/auth.ts","../src/services/api.ts","../node_modules/.pnpm/@xtool+shopify-sdk@2.0.7/node_modules/@xtool/shopify-sdk/dist/index.esm.js","../src/services/shopify.ts","../src/services/money.ts","../src/services/product.ts","../src/i18n/en.ts","../src/i18n/zh.ts","../src/i18n/index.ts","../src/ui/icons.ts","../src/ui/styles.ts","../src/ui/renderer.ts","../src/modal.ts","../src/index.ts"],"sourcesContent":["import type { StoreOption } from './types'\n\nexport const DEFAULT_API_BASE_URL = 'https://xcs-api.xtool.com'\n\nconst ICON_BASE = 'https://storage.atomm.com/xtool/aimake-static/static/xtool-shopify'\n\nexport const ShopifyStoreName = {\n MAKEBLOCK_XTOOL: 'makeblock-xtool',\n CA_XTOOL: 'ca-xtool',\n XTOOL_AUSTRALIA_STORE: 'xtool-australia-store',\n JP_XTOOL: 'jp-xtool',\n EU_XTOOL: 'eu-xtool',\n DE_XTOOL: 'de-xtool',\n FR_XTOOL: 'fr-xtool',\n UK_XTOOL: 'uk-xtool',\n} as const\n\nexport type ShopifyStoreNameType =\n (typeof ShopifyStoreName)[keyof typeof ShopifyStoreName]\n\nexport const PROD_STORE_OPTIONS: StoreOption[] = [\n {\n label: 'US',\n value: ShopifyStoreName.MAKEBLOCK_XTOOL,\n icon: `${ICON_BASE}/at_country_us.svg`,\n shopDomain: 'makeblock-xtool.myshopify.com',\n storeFrontAccessToken: '7bb184c4d18313c58d0ccd6bfa0f73a3',\n },\n {\n label: 'CA',\n value: ShopifyStoreName.CA_XTOOL,\n icon: `${ICON_BASE}/at_country_ca.svg`,\n shopDomain: 'ca-xtool.myshopify.com',\n storeFrontAccessToken: '7912e607574a3a6eaffaf501c75408e6',\n },\n {\n label: 'EU',\n value: ShopifyStoreName.EU_XTOOL,\n icon: `${ICON_BASE}/at_country_eu.svg`,\n shopDomain: 'eu-xtool.myshopify.com',\n storeFrontAccessToken: '0886b237162c21d11ba1ca30f6220c6f',\n },\n {\n label: 'UK',\n value: ShopifyStoreName.UK_XTOOL,\n icon: `${ICON_BASE}/at_country_uk.svg`,\n shopDomain: 'uk-xtool.myshopify.com',\n storeFrontAccessToken: 'adf825795f70225d0351ad387d538757',\n },\n {\n label: 'FR',\n value: ShopifyStoreName.FR_XTOOL,\n icon: `${ICON_BASE}/at_country_fr.svg`,\n shopDomain: 'fr-xtool.myshopify.com',\n storeFrontAccessToken: 'e397fc547281c76d1086776fa347d804',\n },\n {\n label: 'DE',\n value: ShopifyStoreName.DE_XTOOL,\n icon: `${ICON_BASE}/at_country_de.svg`,\n shopDomain: 'de-xtool.myshopify.com',\n storeFrontAccessToken: '87e1adaeba390a0b21e5ef6937792d2f',\n },\n {\n label: 'JP',\n value: ShopifyStoreName.JP_XTOOL,\n icon: `${ICON_BASE}/at_country_jp.svg`,\n shopDomain: 'jp-xtool.myshopify.com',\n storeFrontAccessToken: 'c9738498306280b6ae87bb999811d952',\n },\n {\n label: 'AU',\n value: ShopifyStoreName.XTOOL_AUSTRALIA_STORE,\n icon: `${ICON_BASE}/at_country_au.svg`,\n shopDomain: 'xtool-australia-store.myshopify.com',\n storeFrontAccessToken: 'fabb70f52384af557b4ac0392f86c2ed',\n },\n]\n\nconst COUNTRY_TO_SITE_LABEL_MAP: Record<string, string> = {\n store_us: ShopifyStoreName.MAKEBLOCK_XTOOL,\n store_ca: ShopifyStoreName.CA_XTOOL,\n store_eu: ShopifyStoreName.EU_XTOOL,\n store_uk: ShopifyStoreName.UK_XTOOL,\n store_fr: ShopifyStoreName.FR_XTOOL,\n store_de: ShopifyStoreName.DE_XTOOL,\n store_jp: ShopifyStoreName.JP_XTOOL,\n store_au: ShopifyStoreName.XTOOL_AUSTRALIA_STORE,\n}\n\nexport const STORE_LABEL_KEY_MAP: Record<string, string> = {\n [ShopifyStoreName.MAKEBLOCK_XTOOL]: 'store_us',\n [ShopifyStoreName.CA_XTOOL]: 'store_ca',\n [ShopifyStoreName.XTOOL_AUSTRALIA_STORE]: 'store_au',\n [ShopifyStoreName.EU_XTOOL]: 'store_eu',\n [ShopifyStoreName.DE_XTOOL]: 'store_de',\n [ShopifyStoreName.FR_XTOOL]: 'store_fr',\n [ShopifyStoreName.UK_XTOOL]: 'store_uk',\n [ShopifyStoreName.JP_XTOOL]: 'store_jp',\n}\n\nexport const COUNTRY_NAME_KEY_MAP: Record<string, string> = {\n [ShopifyStoreName.MAKEBLOCK_XTOOL]: 'country_usa',\n [ShopifyStoreName.CA_XTOOL]: 'country_canada',\n [ShopifyStoreName.XTOOL_AUSTRALIA_STORE]: 'country_australia',\n [ShopifyStoreName.EU_XTOOL]: 'country_eu',\n [ShopifyStoreName.DE_XTOOL]: 'country_germany',\n [ShopifyStoreName.FR_XTOOL]: 'country_france',\n [ShopifyStoreName.UK_XTOOL]: 'country_uk',\n [ShopifyStoreName.JP_XTOOL]: 'country_japan',\n}\n\nvoid COUNTRY_TO_SITE_LABEL_MAP\n\n/** 根据 IP 定位映射到 Shopify 站点 */\nexport function countryToSite(\n countryInfo?: { continent?: string; country?: string },\n): string {\n if (!countryInfo) return ShopifyStoreName.MAKEBLOCK_XTOOL\n switch (countryInfo.continent) {\n case 'EU':\n switch (countryInfo.country) {\n case 'GB':\n case 'GG':\n case 'IM':\n case 'JE':\n return ShopifyStoreName.UK_XTOOL\n case 'DE':\n case 'AT':\n return ShopifyStoreName.DE_XTOOL\n case 'FR':\n case 'LU':\n case 'MC':\n return ShopifyStoreName.FR_XTOOL\n default:\n return ShopifyStoreName.EU_XTOOL\n }\n case 'AS':\n return countryInfo.country === 'JP'\n ? ShopifyStoreName.JP_XTOOL\n : ShopifyStoreName.MAKEBLOCK_XTOOL\n case 'NA':\n return countryInfo.country === 'CA'\n ? ShopifyStoreName.CA_XTOOL\n : ShopifyStoreName.MAKEBLOCK_XTOOL\n case 'OC':\n return countryInfo.country === 'AU'\n ? ShopifyStoreName.XTOOL_AUSTRALIA_STORE\n : ShopifyStoreName.MAKEBLOCK_XTOOL\n default:\n return ShopifyStoreName.MAKEBLOCK_XTOOL\n }\n}\n\nexport const STORAGE_KEYS = {\n CURRENT_SHOP: 'xtool_current_shop_name',\n SHOP_INFO: 'xtool_shop_info',\n U_TOKEN: 'utoken',\n LANG: 'LANG_KEY',\n}\n","import { STORAGE_KEYS } from '../config'\n\n/** 读 cookie value */\nfunction getCookie(name: string): string {\n if (typeof document === 'undefined') return ''\n const reg = new RegExp(`(?:^|;\\\\s*)${name}=([^;]*)`)\n const match = document.cookie.match(reg)\n return match ? decodeURIComponent(match[1]!) : ''\n}\n\nexport function getUToken(): string {\n return getCookie(STORAGE_KEYS.U_TOKEN) || localStorage.getItem(STORAGE_KEYS.U_TOKEN) || ''\n}\n\nexport function getLang(): string {\n return localStorage.getItem(STORAGE_KEYS.LANG) || 'en'\n}\n","import type { ProductDataType } from '../types'\nimport { getLang, getUToken } from './auth'\n\ninterface RequestArgs {\n baseURL: string\n url: string\n method: 'GET' | 'POST'\n params?: Record<string, unknown>\n data?: unknown\n}\n\ninterface AtommResponse<T> {\n code: number\n msg?: string\n message?: string\n data: T\n}\n\nasync function atommRequest<T>({ baseURL, url, method, params, data }: RequestArgs): Promise<T> {\n let finalUrl = baseURL.replace(/\\/$/, '') + url\n if (params && method === 'GET') {\n const search = new URLSearchParams()\n Object.entries(params).forEach(([k, v]) => {\n if (v === undefined || v === null) return\n search.append(k, String(v))\n })\n const qs = search.toString()\n if (qs) finalUrl += (finalUrl.includes('?') ? '&' : '?') + qs\n }\n\n const res = await fetch(finalUrl, {\n method,\n headers: {\n 'content-type': 'application/json;charset=UTF-8',\n uToken: getUToken(),\n lang: getLang(),\n },\n body: method === 'POST' ? JSON.stringify(data ?? {}) : undefined,\n })\n\n if (!res.ok) {\n throw new Error(`HTTP ${res.status} ${res.statusText}`)\n }\n const body = (await res.json()) as AtommResponse<T>\n if (body.code === 0) return body.data\n throw new Error(body.msg || body.message || `Request failed with code ${body.code}`)\n}\n\nexport interface AccessoryPackParams {\n store: string\n generatorId: string\n accessoryType: string\n}\n\nexport function fetchAccessoryPack(\n baseURL: string,\n params: AccessoryPackParams,\n): Promise<ProductDataType[]> {\n return atommRequest<ProductDataType[]>({\n baseURL,\n url: '/community/v1/web/generator-accessory-pack',\n method: 'GET',\n params: params as unknown as Record<string, unknown>,\n })\n}\n\nexport function fetchIpLocation(\n baseURL: string,\n): Promise<{ continent: string; country: string }> {\n return atommRequest<{ continent: string; country: string }>({\n baseURL,\n url: '/community/v2/web/ip/location',\n method: 'GET',\n })\n}\n\nexport interface TrackProductContent {\n variantId: string | number\n productQuantity: number\n store?: string\n relatedObjectId?: number | string\n relatedObjectType?: string\n pageSource?: string\n}\n\nexport function fetchDistributionTrackId(\n baseURL: string,\n productContent: TrackProductContent[],\n): Promise<{ trackId: string }> {\n return atommRequest<{ trackId: string }>({\n baseURL,\n url: '/community/v1/web/distribution/order',\n method: 'POST',\n data: { productContent },\n })\n}\n","class f {\n constructor(t) {\n if (t.shopDomain && !t.shopDomain.match(/^[a-zA-Z0-9_-]+\\.myshopify\\.com$/))\n throw new Error(\"shopDomain 必须为 xxxx.myshopify.com 格式\");\n if (!t.storeFrontAccessToken)\n throw new Error(\"storeFrontAccessToken 必填\");\n this.config = {\n shopDomain: t.shopDomain,\n storeFrontAccessToken: t.storeFrontAccessToken,\n apiVersion: t.apiVersion || \"2025-07\",\n timeout: t.timeout || 3e4,\n cartStorageMode: t.cartStorageMode || \"memory\",\n cartStorageKey: t.cartStorageKey || \"xtool_shop_sdk_shopify_cart_id\"\n }, this.baseUrl = `https://${this.config.shopDomain}/api/${this.config.apiVersion}`;\n }\n /**\n * 发送 HTTP 请求\n */\n async request(t, e = {}) {\n const {\n method: o = \"GET\",\n headers: a = {},\n body: i,\n params: s\n } = e;\n let n = `${this.baseUrl}${t}`;\n if (s) {\n const r = new URLSearchParams(s).toString();\n n += `?${r}`;\n }\n const h = {\n \"Content-Type\": \"application/json\",\n \"X-Shopify-StoreFront-Access-Token\": this.config.storeFrontAccessToken,\n ...a\n }, c = {\n method: o,\n headers: h\n };\n i && (c.body = JSON.stringify(i));\n const d = new AbortController(), u = setTimeout(() => d.abort(), this.config.timeout);\n try {\n const r = await fetch(n, {\n ...c,\n signal: d.signal\n });\n clearTimeout(u);\n const p = {\n data: await r.json(),\n status: r.status,\n statusText: r.statusText,\n headers: this.parseHeaders(r.headers)\n };\n if (!r.ok)\n throw new Error(`API 请求失败: ${r.status} ${r.statusText}`);\n return p;\n } catch (r) {\n throw r instanceof Error ? r.name === \"AbortError\" ? new Error(\"请求超时\") : r : new Error(\"未知错误\");\n }\n }\n /**\n * 解析响应头\n */\n parseHeaders(t) {\n const e = {};\n return t.forEach((o, a) => {\n e[a] = o;\n }), e;\n }\n graphQlRequest(t, e = {}) {\n return this.request(\"/graphql.json\", {\n method: \"POST\",\n body: { query: t, variables: e }\n });\n }\n /**\n * 创建购物车\n * @param params 购物车参数\n * @returns 购物车信息,包含购物车 ID\n */\n async createCart(t) {\n const e = t.lines.map((s) => s.merchandiseId.startsWith(\"gid://shopify/ProductVariant/\") ? s : {\n ...s,\n merchandiseId: `gid://shopify/ProductVariant/${s.merchandiseId}`\n });\n return t.lines = e, (await this.graphQlRequest(`\n mutation cartCreate($input: CartInput) {\n cartCreate(input: $input) {\n cart {\n id\n checkoutUrl\n }\n userErrors {\n field\n message\n }\n warnings {\n code\n message\n target\n }\n }\n }\n `, { input: t })).data.data.cartCreate;\n }\n /**\n * 获取商品信息与Metafields\n * @param params 商品信息与Metafields参数\n * @returns 商品信息与Metafields\n */\n async getProductInfoWithMetafields(t) {\n const { productId: e, metafieldsIdentifiers: o } = t, a = `\n query Products($id: ID, $metafields_identifiers: [HasMetafieldsIdentifier!]!) {\n product(id: $id ) {\n title\n id\n handle\n tags\n productType\n totalInventory\n onlineStoreUrl\n handle\n isGiftCard\n description\n descriptionHtml\n selectedOrFirstAvailableVariant {\n id\n }\n featuredImage {\n url\n }\n metafields(identifiers: $metafields_identifiers){\n id\n namespace\n key\n value\n }\n variants(first: 20){\n nodes {\n id\n title\n }\n }\n }\n }\n `, i = {\n id: String(e).startsWith(\"gid://shopify/Product/\") ? e : `gid://shopify/Product/${e}`,\n metafields_identifiers: o\n };\n return (await this.graphQlRequest(a, i)).data.data.product;\n }\n /**\n * 获取店铺信息\n * @returns 店铺信息\n */\n async getShopInfo() {\n return (await this.graphQlRequest(`\n query Shop {\n shop {\n id\n name\n moneyFormat\n }\n }\n `)).data.data.shop;\n }\n /**\n * 自定义请求方法\n * 提供灵活的 HTTP 请求能力,可用于调用其他 Shopify API\n */\n async customRequest(t, e) {\n return this.request(t, e);\n }\n}\nexport {\n f as XtoolShopify\n};\n//# sourceMappingURL=index.esm.js.map\n","import { XtoolShopify } from '@xtool/shopify-sdk'\nimport { PROD_STORE_OPTIONS, STORAGE_KEYS } from '../config'\nimport type { StoreOption } from '../types'\n\nexport class ShopifyClient {\n currentShopName = ''\n private client: XtoolShopify | null = null\n initialized = false\n initializing = false\n\n get currentStore(): StoreOption | undefined {\n return PROD_STORE_OPTIONS.find((s) => s.value === this.currentShopName)\n }\n\n private initClientFor(shopName: string) {\n const store = PROD_STORE_OPTIONS.find((s) => s.value === shopName)\n if (!store) {\n console.warn(`[ShopifyClient] missing config for store: ${shopName}`)\n return\n }\n this.client = new XtoolShopify({\n shopDomain: store.shopDomain,\n storeFrontAccessToken: store.storeFrontAccessToken,\n })\n }\n\n async init(initialShopName: string) {\n if (this.initialized || this.initializing) return\n this.initializing = true\n try {\n this.currentShopName = initialShopName\n localStorage.setItem(STORAGE_KEYS.CURRENT_SHOP, this.currentShopName)\n this.initClientFor(this.currentShopName)\n await this.fetchAndSaveShopInfo()\n this.initialized = true\n } catch (e) {\n console.error('[ShopifyClient] init failed:', e)\n this.initialized = true\n } finally {\n this.initializing = false\n }\n }\n\n async fetchAndSaveShopInfo() {\n if (!this.client) return\n try {\n const info = await this.client.getShopInfo()\n localStorage.setItem(\n STORAGE_KEYS.SHOP_INFO,\n JSON.stringify({\n money_with_currency_format: info.moneyFormat,\n moneyFormat: info.moneyFormat,\n }),\n )\n } catch (e) {\n console.warn('[ShopifyClient] getShopInfo failed:', e)\n }\n }\n\n async changeShop(shopName: string) {\n this.currentShopName = shopName\n localStorage.setItem(STORAGE_KEYS.CURRENT_SHOP, shopName)\n this.initClientFor(shopName)\n await this.fetchAndSaveShopInfo()\n }\n\n async createCheckout(\n lines: { merchandiseId: string; quantity: number }[],\n options?: { trackId?: string },\n ) {\n if (!this.client) throw new Error('Shopify client not initialized')\n const attributes: Array<{ key: string; value: string }> = [\n { key: 'xtool_return_url', value: window.location.href },\n ]\n if (options?.trackId) {\n attributes.push({ key: 'atomm_track_id', value: options.trackId })\n }\n const result = await this.client.createCart({ lines, attributes })\n if (result.cart) return result.cart\n const errMsg = result.userErrors?.[0]?.message || 'Failed to create cart'\n throw new Error(errMsg)\n }\n}\n","import { STORAGE_KEYS } from '../config'\n\nexport function formatMoney(money: number | string): string {\n const moneyNumber = typeof money === 'string' ? parseFloat(money) : money\n if (isNaN(moneyNumber) || typeof moneyNumber !== 'number') return '$0.00'\n\n let shopInfo: { money_with_currency_format?: string; moneyFormat?: string } = {}\n try {\n const stored = localStorage.getItem(STORAGE_KEYS.SHOP_INFO)\n if (stored) shopInfo = JSON.parse(stored)\n } catch {\n /* noop */\n }\n\n const formatString =\n shopInfo.money_with_currency_format || shopInfo.moneyFormat || '${{amount}}'\n const placeholderRegex = /\\{\\{\\s*(\\w+)\\s*\\}\\}/\n\n function formatWithDelimiters(n: number, precision: number, thousands = ',', decimal = '.') {\n const parts = n.toFixed(precision).split('.')\n const dollars = parts[0]?.replace(/(\\d)(?=(\\d{3})+(?!\\d))/g, '$1' + thousands) || ''\n const cents = parts[1] ? decimal + parts[1] : ''\n return dollars + cents\n }\n\n const match = formatString.match(placeholderRegex)\n let value = ''\n if (match?.[1]) {\n switch (match[1]) {\n case 'amount':\n value = formatWithDelimiters(moneyNumber, 2)\n break\n case 'amount_no_decimals':\n value = formatWithDelimiters(moneyNumber, 0)\n break\n case 'amount_with_comma_separator':\n value = formatWithDelimiters(moneyNumber, 2, '.', ',')\n break\n case 'amount_no_decimals_with_comma_separator':\n value = formatWithDelimiters(moneyNumber, 0, '.', ',')\n break\n case 'amount_with_space_separator':\n value = formatWithDelimiters(moneyNumber, 2, ' ', ',')\n break\n case 'amount_with_apostrophe_separator':\n value = formatWithDelimiters(moneyNumber, 2, \"'\")\n break\n default:\n value = formatWithDelimiters(moneyNumber, 2)\n break\n }\n } else {\n value = formatWithDelimiters(moneyNumber, 2)\n }\n\n return formatString.replace(placeholderRegex, value)\n}\n","import type { ProductDataType, ProductVariantType } from '../types'\nimport { formatMoney } from './money'\n\nexport function assignUid(item: ProductDataType, index: number): string {\n const dvId = item.defaultVariant\n if (dvId != null) return `${item.id}_${String(dvId)}_${index}`\n const vid = item.variants?.[0]?.id\n if (vid != null) return `${item.id}_${vid}_${index}`\n return `${item.id}_${index}`\n}\n\nexport function isVariantPurchasable(v: ProductVariantType | null | undefined): boolean {\n if (!v) return false\n return v.availableForSale === true && v.outOfStock !== true\n}\n\nexport function refreshProductPrices(list: ProductDataType[]) {\n list.forEach((item) => {\n item.variants?.forEach((v) => {\n v.displayPrice = formatMoney(v.price || '0.00')\n v.displayCompareAtPrice = v.compareAtPrice ? formatMoney(v.compareAtPrice) : ''\n })\n })\n}\n\nexport function findVariantByOptions(\n product: ProductDataType,\n options: Record<string, string> | undefined,\n): ProductVariantType | null {\n if (!product.variants?.length) return null\n if (!options || Object.keys(options).length === 0) {\n if (product.defaultVariant) {\n const dv = product.variants.find((v) => v.id === product.defaultVariant)\n if (dv) return dv\n }\n return product.variants.find((v) => v.isBind) || product.variants[0] || null\n }\n const matched = product.variants.find((v) => {\n if (!v.option) return false\n for (const [k, val] of Object.entries(options)) {\n if (k === 'uid') continue\n if (val && val !== '' && v.option[k] !== val) return false\n }\n return true\n })\n if (matched) return matched\n if (product.defaultVariant) {\n const dv = product.variants.find((v) => v.id === product.defaultVariant)\n if (dv) return dv\n }\n return product.variants.find((v) => v.isBind) || product.variants[0] || null\n}\n\nexport function getOptionKeys(product: ProductDataType): string[] {\n const variants = product.variants\n if (!variants?.length) return []\n const isNonEmpty = (v: string | undefined) => !!v && v.trim() !== ''\n let keys: string[] = []\n if (product.options?.length) {\n keys = product.options.map((o) => o.key).filter(Boolean) as string[]\n } else if (variants[0]?.option) {\n keys = Object.keys(variants[0].option)\n }\n return keys.filter((k) => variants.some((v) => isNonEmpty(v.option?.[k])))\n}\n\nexport function getOptionValues(\n product: ProductDataType,\n keys: string[],\n index: number,\n selected: Record<string, string>,\n): string[] {\n const isNonEmpty = (v: string | undefined) => !!v && v.trim() !== ''\n const variants = product.variants || []\n const values = new Set<string>()\n variants.forEach((v) => {\n if (!v.option) return\n if (index > 0) {\n for (let i = 0; i < index; i++) {\n const prevKey = keys[i]!\n const prevVal = selected[prevKey]\n if (isNonEmpty(prevVal) && v.option[prevKey] !== prevVal) return\n }\n }\n const val = v.option[keys[index]!]\n if (isNonEmpty(val)) values.add(val!)\n })\n return Array.from(values).sort()\n}\n\nexport function getDefaultVariant(product: ProductDataType): ProductVariantType | null {\n const variants = product.variants\n if (!variants?.length) return null\n if (product.defaultVariant) {\n const found = variants.find((v) => v.id === product.defaultVariant)\n if (found) return found\n }\n return variants.find((v) => v.isBind) || variants[0] || null\n}\n\nexport function initSelectedOptionsForProduct(product: ProductDataType): Record<string, string> {\n const keys = getOptionKeys(product)\n const selected: Record<string, string> = {}\n if (!keys.length) return selected\n keys.forEach((k) => (selected[k] = ''))\n const target = getDefaultVariant(product)\n if (target?.option) {\n keys.forEach((k) => {\n const v = target.option![k]\n if (v && v.trim() !== '') selected[k] = v\n })\n } else {\n keys.forEach((k, i) => {\n const values = getOptionValues(product, keys, i, selected)\n if (values[0]) selected[k] = values[0]\n })\n }\n return selected\n}\n","export default {\n shopify_supplies_kit: 'Supplies Kit',\n close: 'Close',\n current_country_notice: 'Items will be shipped to {country}.',\n loading: 'Loading',\n no_items_in_cart: 'No items available.',\n sold_out: 'Sold out',\n total: 'Total',\n discount_notice: 'Discount codes can only be used in checkout.',\n buy_now: 'Buy now',\n failed_load_product_list: 'Failed to load product list.',\n checkout_failed: 'Failed to create checkout.',\n selected_items_out_of_stock: 'Selected items are sold out.',\n no_valid_products_selected: 'No valid products selected.',\n store_us: 'US',\n store_ca: 'CA',\n store_au: 'AU',\n store_eu: 'EU',\n store_de: 'DE',\n store_fr: 'FR',\n store_uk: 'UK',\n store_jp: 'JP',\n store_test: 'XT',\n country_usa: 'USA',\n country_canada: 'Canada',\n country_australia: 'Australia',\n country_eu: 'EU',\n country_germany: 'Germany',\n country_france: 'France',\n country_uk: 'UK',\n country_japan: 'Japan',\n} as Record<string, string>\n","export default {\n shopify_supplies_kit: '耗材包',\n close: '关闭',\n current_country_notice: '商品将发往{country}。',\n loading: '加载中',\n no_items_in_cart: '暂无可购买的商品。',\n sold_out: '售罄',\n total: '合计',\n discount_notice: '优惠码仅可在结算页使用。',\n buy_now: '立即购买',\n failed_load_product_list: '加载商品列表失败。',\n checkout_failed: '创建结算订单失败。',\n selected_items_out_of_stock: '所选商品已售罄。',\n no_valid_products_selected: '未选择有效商品。',\n store_us: '美国',\n store_ca: '加拿大',\n store_au: '澳大利亚',\n store_eu: '欧盟',\n store_de: '德国',\n store_fr: '法国',\n store_uk: '英国',\n store_jp: '日本',\n store_test: '测试',\n country_usa: '美国',\n country_canada: '加拿大',\n country_australia: '澳大利亚',\n country_eu: '欧洲',\n country_germany: '德国',\n country_france: '法国',\n country_uk: '英国',\n country_japan: '日本',\n} as Record<string, string>\n","import en from './en'\nimport zh from './zh'\nimport type { Locale } from '../types'\n\nexport class I18n {\n private locale: Locale = 'en'\n private dict: Record<string, Record<string, string>> = { en, zh }\n\n setLocale(locale: Locale) {\n this.locale = this.dict[locale] ? locale : 'en'\n }\n\n extend(messages: Partial<Record<Locale, Record<string, string>>> | undefined) {\n if (!messages) return\n Object.entries(messages).forEach(([loc, entries]) => {\n if (!entries) return\n this.dict[loc] = { ...(this.dict[loc] || {}), ...entries }\n })\n }\n\n t(key: string, params?: Record<string, string | number>): string {\n const table = this.dict[this.locale] || this.dict['en'] || {}\n let text = table[key] ?? this.dict['en']?.[key] ?? key\n if (params) {\n Object.entries(params).forEach(([k, v]) => {\n text = text.replace(new RegExp(`\\\\{\\\\s*${k}\\\\s*\\\\}`, 'g'), String(v))\n })\n }\n return text\n }\n}\n","/** 简单的 lucide 图标 SVG 字符串(24x24 viewBox,stroke=currentColor) */\n\nconst wrap = (path: string, size = 16) =>\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${size}\" height=\"${size}\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${path}</svg>`\n\nexport const iconX = (size = 16) => wrap('<path d=\"M18 6 6 18\"/><path d=\"m6 6 12 12\"/>', size)\nexport const iconChevronDown = (size = 16) => wrap('<path d=\"m6 9 6 6 6-6\"/>', size)\nexport const iconChevronUp = (size = 16) => wrap('<path d=\"m18 15-6-6-6 6\"/>', size)\nexport const iconCheck = (size = 12) => wrap('<path d=\"M20 6 9 17l-5-5\"/>', size)\nexport const iconMinus = (size = 14) => wrap('<path d=\"M5 12h14\"/>', size)\nexport const iconPlus = (size = 14) =>\n wrap('<path d=\"M5 12h14\"/><path d=\"M12 5v14\"/>', size)\n","/** 弹窗全部样式,BEM 命名前缀 xpm- (Xtool Purchase Modal) */\nexport const styles = `\n:host, .xpm-host {\n font-family: Inter, system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif;\n color: #2d3541;\n}\n*, *::before, *::after { box-sizing: border-box; }\n\n.xpm-overlay {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n z-index: 0;\n opacity: 0;\n transition: opacity 0.2s ease;\n}\n.xpm-overlay--visible { opacity: 1; }\n\n.xpm-panel {\n position: fixed;\n top: 0;\n right: 0;\n width: 320px;\n height: 100vh;\n background: #fff;\n display: flex;\n flex-direction: column;\n box-shadow:\n 0 1.187px 2.373px rgba(0, 0, 0, 0.1),\n 0 23.733px 23.733px rgba(0, 0, 0, 0.1);\n transform: translateX(100%);\n transition: transform 0.25s ease;\n}\n.xpm-panel--visible { transform: translateX(0); }\n\n.xpm-header {\n height: 56px;\n padding: 12px;\n border-bottom: 1px solid #e7e9ed;\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n background: #fff;\n}\n.xpm-header__title {\n color: #2d3541;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n}\n.xpm-icon-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n padding: 0;\n border: 0;\n border-radius: 4px;\n background: transparent;\n color: #2d3541;\n cursor: pointer;\n}\n.xpm-icon-btn:hover { background: #f0f0f5; }\n\n.xpm-banner {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: 40px;\n padding: 8px 12px 0;\n flex-shrink: 0;\n background: #fff;\n}\n.xpm-banner__text {\n min-width: 0;\n color: #ff7c23;\n font-size: 10px;\n font-weight: 500;\n line-height: 14px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n padding-right: 80px;\n}\n\n.xpm-dropdown {\n position: absolute;\n top: 8px;\n right: 12px;\n z-index: 30;\n display: flex;\n flex-direction: column;\n gap: 4px;\n width: 73px;\n flex-shrink: 0;\n}\n.xpm-dropdown__trigger {\n display: flex;\n align-items: center;\n gap: 4px;\n width: 73px;\n height: 32px;\n padding: 6px 4px 6px 8px;\n border: 1px solid transparent;\n background: #f0f0f5;\n border-radius: 4px;\n color: #070b10;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n.xpm-dropdown--open .xpm-dropdown__trigger {\n border: 1px solid #070b10;\n background: #fff;\n}\n.xpm-dropdown__selected {\n flex: 1;\n min-width: 0;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n color: #070b10;\n font-size: 12px;\n font-weight: 400;\n line-height: 16px;\n overflow: hidden;\n}\n.xpm-dropdown__selected span {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.xpm-dropdown__menu {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n width: 73px;\n padding: 4px;\n overflow: hidden;\n border: 1px solid #f0f0f5;\n border-radius: 6px;\n background: #fff;\n box-shadow:\n 0 2px 8px rgba(0, 0, 0, 0.1),\n 0 16px 32px rgba(0, 0, 0, 0.1);\n}\n.xpm-dropdown__item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n height: 32px;\n padding: 8px;\n border: 0;\n border-radius: 4px;\n background: transparent;\n color: #070b10;\n font-size: 12px;\n font-weight: 400;\n line-height: 16px;\n cursor: pointer;\n}\n.xpm-dropdown__item:hover { background: #f0f0f5; }\n.xpm-dropdown__item-icon {\n width: 16px;\n height: 16px;\n object-fit: contain;\n flex-shrink: 0;\n}\n.xpm-flag {\n width: 15px;\n height: 11px;\n object-fit: cover;\n flex-shrink: 0;\n}\n\n.xpm-list {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n background: #fff;\n}\n.xpm-list::-webkit-scrollbar { width: 4px; }\n.xpm-list::-webkit-scrollbar-thumb { background: #c5cad2; border-radius: 2px; }\n.xpm-list::-webkit-scrollbar-track { background: transparent; }\n\n.xpm-placeholder {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n height: 100%;\n color: #848b96;\n font-size: 12px;\n}\n.xpm-spinner {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n border: 2px solid #e7e9ed;\n border-top-color: #6e757f;\n animation: xpm-spin 0.8s linear infinite;\n}\n@keyframes xpm-spin { to { transform: rotate(1turn); } }\n\n.xpm-row {\n display: flex;\n gap: 12px;\n align-items: center;\n min-height: 110px;\n padding: 8px 12px;\n border-bottom: 1px solid rgba(83, 91, 136, 0.1);\n background: #fff;\n}\n.xpm-row--has-options {\n align-items: flex-start;\n min-height: 167px;\n padding: 12px;\n}\n.xpm-row--has-options .xpm-row__info {\n min-height: 142px;\n justify-content: flex-start;\n}\n.xpm-row--has-options .xpm-row__meta { margin-top: 0; }\n\n.xpm-row__media {\n position: relative;\n width: 88px;\n height: 88px;\n flex-shrink: 0;\n}\n.xpm-row__thumb {\n width: 88px;\n height: 88px;\n overflow: hidden;\n border: 1px solid rgba(0, 0, 0, 0.08);\n border-radius: 8px;\n background: #f6f6fa;\n}\n.xpm-row__thumb img {\n width: 100%;\n height: 100%;\n display: block;\n object-fit: cover;\n}\n.xpm-row__sold-out {\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 0 0 8px 8px;\n background: rgba(0, 0, 0, 0.8);\n color: #fff;\n font-size: 10px;\n font-weight: 400;\n line-height: 14px;\n}\n\n.xpm-checkbox {\n position: absolute;\n left: 4px;\n top: 4px;\n z-index: 2;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n cursor: pointer;\n}\n.xpm-checkbox input {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n opacity: 0;\n cursor: pointer;\n}\n.xpm-checkbox__box {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 14px;\n border: 1px solid #d8dadf;\n border-radius: 2px;\n background: #fff;\n color: #fff;\n}\n.xpm-checkbox--checked .xpm-checkbox__box {\n border-color: #070b10;\n background: #070b10;\n}\n.xpm-checkbox--disabled,\n.xpm-checkbox--disabled input { cursor: not-allowed; }\n.xpm-checkbox--disabled .xpm-checkbox__box {\n border-color: #d8dadf;\n background: #d8dadf;\n}\n\n.xpm-row__info {\n flex: 1;\n min-width: 0;\n min-height: 80px;\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n gap: 8px;\n}\n.xpm-row__name {\n min-width: 100%;\n color: #070b10;\n font-size: 12px;\n font-weight: 600;\n line-height: 16px;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n word-break: break-word;\n}\n\n.xpm-variants {\n display: flex;\n flex-direction: column;\n gap: 4px;\n width: 100%;\n}\n\n.xpm-select {\n position: relative;\n width: 100%;\n}\n.xpm-select__trigger {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n height: 28px;\n padding: 0 6px;\n border: 1px solid rgba(0, 0, 0, 0.1);\n border-radius: 4px;\n background: #fff;\n color: #2d3541;\n font-size: 12px;\n font-weight: 400;\n line-height: 16px;\n cursor: pointer;\n}\n.xpm-select__trigger--placeholder { color: #848b96; }\n.xpm-select--open .xpm-select__trigger { border-color: #070b10; }\n.xpm-select__menu {\n position: absolute;\n left: 0;\n right: 0;\n top: calc(100% + 4px);\n z-index: 40;\n max-height: 200px;\n overflow-y: auto;\n padding: 4px;\n border: 1px solid #f0f0f5;\n border-radius: 6px;\n background: #fff;\n box-shadow:\n 0 2px 8px rgba(0, 0, 0, 0.1),\n 0 16px 32px rgba(0, 0, 0, 0.1);\n}\n.xpm-select__option {\n display: flex;\n align-items: center;\n width: 100%;\n height: 28px;\n padding: 4px 8px;\n border: 0;\n border-radius: 4px;\n background: transparent;\n color: #2d3541;\n font-size: 12px;\n font-weight: 400;\n line-height: 16px;\n cursor: pointer;\n text-align: left;\n}\n.xpm-select__option:hover { background: #f0f0f5; }\n.xpm-select__option--selected { background: #f0f0f5; color: #070b10; font-weight: 500; }\n\n.xpm-row__meta {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.xpm-row__meta--with-options {\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n}\n\n.xpm-price-group {\n min-width: 0;\n display: flex;\n align-items: center;\n gap: 4px;\n white-space: nowrap;\n}\n.xpm-price-group__discount {\n flex-shrink: 0;\n color: #fa2730;\n font-size: 12px;\n font-weight: 600;\n line-height: 16px;\n}\n.xpm-price-group__current {\n min-width: 0;\n overflow: hidden;\n color: #070b10;\n font-size: 12px;\n font-weight: 600;\n line-height: 16px;\n text-overflow: ellipsis;\n}\n.xpm-price-group__compare {\n min-width: 0;\n overflow: hidden;\n color: #b3b9c2;\n font-size: 10px;\n font-weight: 400;\n line-height: 14px;\n text-decoration: line-through;\n text-overflow: ellipsis;\n}\n\n.xpm-row__actions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n min-height: 24px;\n}\n.xpm-qty {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n flex-shrink: 0;\n}\n.xpm-qty__btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n padding: 0;\n border: 1px solid #d8dadf;\n border-radius: 2px;\n background: #fff;\n color: #070b10;\n cursor: pointer;\n}\n.xpm-qty__btn:hover:not(:disabled) { background: #f6f6fa; }\n.xpm-qty__btn:disabled { opacity: 0.4; cursor: not-allowed; }\n.xpm-qty__value {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: #070b10;\n font-size: 12px;\n font-weight: 400;\n line-height: 16px;\n}\n\n.xpm-footer {\n flex-shrink: 0;\n height: 105px;\n padding: 8px 16px;\n border-top: 1px solid rgba(81, 97, 117, 0.1);\n background: #fff;\n}\n.xpm-footer__inner {\n display: flex;\n flex-direction: column;\n justify-content: center;\n gap: 8px;\n width: 100%;\n height: 100%;\n}\n.xpm-footer__total-block {\n display: flex;\n flex-direction: column;\n gap: 4px;\n align-items: flex-start;\n}\n.xpm-footer__total-row {\n display: flex;\n align-items: center;\n gap: 4px;\n color: #070b10;\n}\n.xpm-footer__total-label {\n font-size: 12px;\n font-weight: 600;\n line-height: 16px;\n}\n.xpm-footer__total-price {\n font-size: 16px;\n font-weight: 500;\n line-height: 22px;\n}\n.xpm-footer__warning {\n margin: 0;\n color: #ff7c23;\n font-size: 12px;\n font-weight: 500;\n line-height: 16px;\n}\n.xpm-buy-now {\n width: 100%;\n height: 32px;\n padding: 6px 12px;\n border: 0;\n border-radius: 6px;\n background: #ff0035;\n color: #fff;\n font-size: 12px;\n font-weight: 600;\n line-height: 16px;\n cursor: pointer;\n}\n.xpm-buy-now:hover:not(:disabled) { background: #e60030; }\n.xpm-buy-now:disabled { opacity: 0.6; cursor: not-allowed; }\n\n.xpm-toast {\n position: fixed;\n top: 24px;\n left: 50%;\n transform: translateX(-50%);\n z-index: 1000;\n padding: 8px 16px;\n border-radius: 6px;\n background: rgba(20, 20, 24, 0.92);\n color: #fff;\n font-size: 13px;\n line-height: 20px;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.18);\n opacity: 0;\n transition: opacity 0.18s ease;\n pointer-events: none;\n}\n.xpm-toast--visible { opacity: 1; }\n`\n","import {\n PROD_STORE_OPTIONS,\n STORE_LABEL_KEY_MAP,\n COUNTRY_NAME_KEY_MAP,\n} from '../config'\nimport { iconCheck, iconChevronDown, iconChevronUp, iconMinus, iconPlus, iconX } from './icons'\nimport { styles } from './styles'\nimport type { ProductDataType, ProductVariantType, StoreOption } from '../types'\nimport {\n findVariantByOptions,\n getOptionKeys,\n getOptionValues,\n initSelectedOptionsForProduct,\n isVariantPurchasable,\n} from '../services/product'\nimport { formatMoney } from '../services/money'\nimport { I18n } from '../i18n'\n\nexport interface RendererCallbacks {\n onClose: () => void\n onShopChange: (value: string) => void\n onCheckout: () => void\n}\n\nexport interface RendererState {\n productList: ProductDataType[]\n currentShopName: string\n loading: boolean\n checkoutLoading: boolean\n checkedUids: string[]\n productSelectedOptions: Record<string, Record<string, string>>\n shopMenuOpen: boolean\n openSelect: { uid: string; key: string } | null\n}\n\nexport class Renderer {\n private host: HTMLDivElement | null = null\n private shadow: ShadowRoot | null = null\n private overlay: HTMLDivElement | null = null\n private panel: HTMLDivElement | null = null\n private toastEl: HTMLDivElement | null = null\n private toastTimer: number | null = null\n private docClickHandler = (e: Event) => this.handleDocClick(e)\n\n constructor(\n private state: RendererState,\n private i18n: I18n,\n private callbacks: RendererCallbacks,\n private zIndex: number,\n ) {}\n\n mount() {\n if (this.host) return\n this.host = document.createElement('div')\n this.host.className = 'xpm-host'\n this.host.style.position = 'relative'\n this.host.style.zIndex = String(this.zIndex)\n this.shadow = this.host.attachShadow({ mode: 'open' })\n\n const styleEl = document.createElement('style')\n styleEl.textContent = styles\n this.shadow.appendChild(styleEl)\n\n this.overlay = document.createElement('div')\n this.overlay.className = 'xpm-overlay'\n this.overlay.addEventListener('click', () => this.callbacks.onClose())\n this.shadow.appendChild(this.overlay)\n\n this.panel = document.createElement('div')\n this.panel.className = 'xpm-panel'\n this.shadow.appendChild(this.panel)\n\n document.body.appendChild(this.host)\n this.shadow.addEventListener('click', this.docClickHandler)\n\n this.renderAll()\n // 下一帧切换 visible 用于动画\n requestAnimationFrame(() => {\n this.overlay?.classList.add('xpm-overlay--visible')\n this.panel?.classList.add('xpm-panel--visible')\n })\n }\n\n unmount() {\n if (!this.host) return\n this.shadow?.removeEventListener('click', this.docClickHandler)\n this.host.remove()\n this.host = null\n this.shadow = null\n this.overlay = null\n this.panel = null\n this.toastEl = null\n if (this.toastTimer) {\n clearTimeout(this.toastTimer)\n this.toastTimer = null\n }\n }\n\n /** 主动触发关闭动画,调用方负责在动画完成后 unmount */\n playClose(): Promise<void> {\n return new Promise((resolve) => {\n this.overlay?.classList.remove('xpm-overlay--visible')\n this.panel?.classList.remove('xpm-panel--visible')\n setTimeout(() => resolve(), 250)\n })\n }\n\n setState(patch: Partial<RendererState>) {\n Object.assign(this.state, patch)\n this.renderAll()\n }\n\n /** 不重渲,仅查 / 触发某些行为 */\n getState(): RendererState {\n return this.state\n }\n\n showToast(message: string) {\n if (!this.shadow) return\n if (!this.toastEl) {\n this.toastEl = document.createElement('div')\n this.toastEl.className = 'xpm-toast'\n this.shadow.appendChild(this.toastEl)\n }\n this.toastEl.textContent = message\n this.toastEl.classList.add('xpm-toast--visible')\n if (this.toastTimer) clearTimeout(this.toastTimer)\n this.toastTimer = window.setTimeout(() => {\n this.toastEl?.classList.remove('xpm-toast--visible')\n }, 2200)\n }\n\n private renderAll() {\n if (!this.panel) return\n this.panel.innerHTML = ''\n this.panel.appendChild(this.renderHeader())\n this.panel.appendChild(this.renderBanner())\n this.panel.appendChild(this.renderList())\n this.panel.appendChild(this.renderFooter())\n }\n\n private renderHeader(): HTMLElement {\n const header = document.createElement('header')\n header.className = 'xpm-header'\n\n const title = document.createElement('span')\n title.className = 'xpm-header__title'\n title.textContent = this.i18n.t('shopify_supplies_kit')\n\n const closeBtn = document.createElement('button')\n closeBtn.className = 'xpm-icon-btn'\n closeBtn.setAttribute('aria-label', this.i18n.t('close'))\n closeBtn.innerHTML = iconX(16)\n closeBtn.addEventListener('click', () => this.callbacks.onClose())\n\n header.appendChild(title)\n header.appendChild(closeBtn)\n return header\n }\n\n private renderBanner(): HTMLElement {\n const banner = document.createElement('div')\n banner.className = 'xpm-banner'\n\n const currentStore: StoreOption | undefined =\n PROD_STORE_OPTIONS.find((s) => s.value === this.state.currentShopName) ||\n PROD_STORE_OPTIONS[0]\n const countryKey = currentStore\n ? COUNTRY_NAME_KEY_MAP[currentStore.value] || 'country_usa'\n : 'country_usa'\n const countryName = this.i18n.t(countryKey)\n\n const bannerText = document.createElement('span')\n bannerText.className = 'xpm-banner__text'\n bannerText.textContent = this.i18n.t('current_country_notice', { country: countryName })\n\n const dropdown = document.createElement('div')\n dropdown.className = 'xpm-dropdown' + (this.state.shopMenuOpen ? ' xpm-dropdown--open' : '')\n dropdown.dataset.xpmStop = '1'\n\n const trigger = document.createElement('button')\n trigger.type = 'button'\n trigger.className = 'xpm-dropdown__trigger'\n trigger.addEventListener('click', (e) => {\n e.stopPropagation()\n this.setState({ shopMenuOpen: !this.state.shopMenuOpen, openSelect: null })\n })\n\n const triggerSelected = document.createElement('span')\n triggerSelected.className = 'xpm-dropdown__selected'\n if (currentStore?.icon) {\n const flag = document.createElement('img')\n flag.src = currentStore.icon\n flag.alt = ''\n flag.className = 'xpm-flag'\n triggerSelected.appendChild(flag)\n }\n const triggerLabel = document.createElement('span')\n const labelKey = currentStore ? STORE_LABEL_KEY_MAP[currentStore.value] : undefined\n triggerLabel.textContent = labelKey ? this.i18n.t(labelKey) : currentStore?.label || ''\n triggerSelected.appendChild(triggerLabel)\n trigger.appendChild(triggerSelected)\n\n const chevWrap = document.createElement('span')\n chevWrap.innerHTML = this.state.shopMenuOpen ? iconChevronUp(16) : iconChevronDown(16)\n trigger.appendChild(chevWrap)\n\n dropdown.appendChild(trigger)\n\n if (this.state.shopMenuOpen) {\n const menu = document.createElement('div')\n menu.className = 'xpm-dropdown__menu'\n PROD_STORE_OPTIONS.forEach((opt) => {\n const item = document.createElement('button')\n item.type = 'button'\n item.className = 'xpm-dropdown__item'\n if (opt.icon) {\n const ic = document.createElement('img')\n ic.src = opt.icon\n ic.alt = ''\n ic.className = 'xpm-dropdown__item-icon'\n item.appendChild(ic)\n }\n const labelText = document.createElement('span')\n const k = STORE_LABEL_KEY_MAP[opt.value]\n labelText.textContent = k ? this.i18n.t(k) : opt.label\n item.appendChild(labelText)\n item.addEventListener('click', (e) => {\n e.stopPropagation()\n this.setState({ shopMenuOpen: false })\n this.callbacks.onShopChange(opt.value)\n })\n menu.appendChild(item)\n })\n dropdown.appendChild(menu)\n }\n\n banner.appendChild(bannerText)\n banner.appendChild(dropdown)\n return banner\n }\n\n private renderList(): HTMLElement {\n const list = document.createElement('div')\n list.className = 'xpm-list'\n\n if (this.state.loading) {\n const ph = document.createElement('div')\n ph.className = 'xpm-placeholder'\n const sp = document.createElement('div')\n sp.className = 'xpm-spinner'\n const txt = document.createElement('span')\n txt.textContent = this.i18n.t('loading')\n ph.appendChild(sp)\n ph.appendChild(txt)\n list.appendChild(ph)\n return list\n }\n\n if (this.state.productList.length === 0) {\n const ph = document.createElement('div')\n ph.className = 'xpm-placeholder'\n ph.textContent = this.i18n.t('no_items_in_cart')\n list.appendChild(ph)\n return list\n }\n\n this.state.productList.forEach((p) => list.appendChild(this.renderCard(p)))\n return list\n }\n\n private renderCard(product: ProductDataType): HTMLElement {\n const keys = getOptionKeys(product)\n const hasOptions = keys.length > 0\n\n const selectedOpts =\n this.state.productSelectedOptions[product.uid] ||\n initSelectedOptionsForProduct(product)\n if (!this.state.productSelectedOptions[product.uid]) {\n this.state.productSelectedOptions[product.uid] = selectedOpts\n }\n\n const variant: ProductVariantType | null = findVariantByOptions(product, selectedOpts)\n const isSoldOut = variant?.outOfStock === true\n const isPurchasable = isVariantPurchasable(variant)\n const isChecked = isSoldOut || this.state.checkedUids.includes(product.uid)\n\n const row = document.createElement('div')\n row.className = 'xpm-row' + (hasOptions ? ' xpm-row--has-options' : '')\n\n // media\n const media = document.createElement('div')\n media.className = 'xpm-row__media'\n const thumb = document.createElement('div')\n thumb.className = 'xpm-row__thumb'\n const img = document.createElement('img')\n const imgSrc = (variant?.image && variant.image.trim() !== '' ? variant.image : product.image) || ''\n if (imgSrc) img.src = imgSrc\n img.alt = product.displayName || product.title || ''\n thumb.appendChild(img)\n if (isSoldOut) {\n const sold = document.createElement('div')\n sold.className = 'xpm-row__sold-out'\n sold.textContent = this.i18n.t('sold_out')\n thumb.appendChild(sold)\n }\n media.appendChild(thumb)\n\n const checkbox = document.createElement('label')\n checkbox.className =\n 'xpm-checkbox' +\n (isChecked ? ' xpm-checkbox--checked' : '') +\n (isSoldOut ? ' xpm-checkbox--disabled' : '')\n const input = document.createElement('input')\n input.type = 'checkbox'\n input.checked = isChecked\n input.disabled = isSoldOut\n input.addEventListener('change', (e) => {\n if (!isPurchasable) return\n const next = (e.target as HTMLInputElement).checked\n const set = new Set(this.state.checkedUids)\n if (next) set.add(product.uid)\n else set.delete(product.uid)\n this.setState({ checkedUids: Array.from(set) })\n })\n const box = document.createElement('span')\n box.className = 'xpm-checkbox__box'\n if (isChecked) box.innerHTML = iconCheck(12)\n checkbox.appendChild(input)\n checkbox.appendChild(box)\n media.appendChild(checkbox)\n\n row.appendChild(media)\n\n // info\n const info = document.createElement('div')\n info.className = 'xpm-row__info'\n\n const name = document.createElement('div')\n name.className = 'xpm-row__name'\n name.textContent = product.displayName || product.title || ''\n name.title = name.textContent\n info.appendChild(name)\n\n if (hasOptions) {\n const variants = document.createElement('div')\n variants.className = 'xpm-variants'\n keys.forEach((key, idx) => {\n variants.appendChild(this.renderSelect(product, key, idx, keys, selectedOpts))\n })\n info.appendChild(variants)\n }\n\n const meta = document.createElement('div')\n meta.className = 'xpm-row__meta' + (hasOptions ? ' xpm-row__meta--with-options' : '')\n\n const priceGroup = document.createElement('div')\n priceGroup.className = 'xpm-price-group'\n const price = parseFloat(String(variant?.price ?? '0')) || 0\n const compareAt = parseFloat(String(variant?.compareAtPrice ?? '0')) || 0\n if (compareAt > price && compareAt > 0) {\n const pct = Math.round(((compareAt - price) / compareAt) * 100)\n const discount = document.createElement('span')\n discount.className = 'xpm-price-group__discount'\n discount.textContent = `-${pct}%`\n priceGroup.appendChild(discount)\n }\n const current = document.createElement('span')\n current.className = 'xpm-price-group__current'\n current.textContent = variant?.displayPrice || formatMoney(variant?.price || '0.00')\n priceGroup.appendChild(current)\n if (variant?.compareAtPrice) {\n const cmp = document.createElement('span')\n cmp.className = 'xpm-price-group__compare'\n cmp.textContent = variant.displayCompareAtPrice || formatMoney(variant.compareAtPrice)\n priceGroup.appendChild(cmp)\n }\n meta.appendChild(priceGroup)\n\n const actions = document.createElement('div')\n actions.className = 'xpm-row__actions'\n const qty = document.createElement('div')\n qty.className = 'xpm-qty'\n const minusBtn = document.createElement('button')\n minusBtn.className = 'xpm-qty__btn'\n minusBtn.innerHTML = iconMinus(14)\n minusBtn.disabled = (product.quantity || 1) <= 1 || !isPurchasable\n minusBtn.addEventListener('click', () => this.changeQty(product, -1))\n const qtyVal = document.createElement('span')\n qtyVal.className = 'xpm-qty__value'\n qtyVal.textContent = String(product.quantity || 1)\n const plusBtn = document.createElement('button')\n plusBtn.className = 'xpm-qty__btn'\n plusBtn.innerHTML = iconPlus(14)\n plusBtn.disabled = !isPurchasable\n plusBtn.addEventListener('click', () => this.changeQty(product, 1))\n qty.appendChild(minusBtn)\n qty.appendChild(qtyVal)\n qty.appendChild(plusBtn)\n actions.appendChild(qty)\n meta.appendChild(actions)\n\n info.appendChild(meta)\n row.appendChild(info)\n return row\n }\n\n private renderSelect(\n product: ProductDataType,\n key: string,\n index: number,\n keys: string[],\n selected: Record<string, string>,\n ): HTMLElement {\n const open =\n this.state.openSelect?.uid === product.uid && this.state.openSelect?.key === key\n const wrap = document.createElement('div')\n wrap.className = 'xpm-select' + (open ? ' xpm-select--open' : '')\n wrap.dataset.xpmStop = '1'\n\n const trigger = document.createElement('button')\n trigger.type = 'button'\n trigger.className = 'xpm-select__trigger'\n const currentVal = selected[key] || ''\n if (!currentVal) trigger.classList.add('xpm-select__trigger--placeholder')\n const label = document.createElement('span')\n label.textContent = currentVal || ''\n trigger.appendChild(label)\n const chev = document.createElement('span')\n chev.innerHTML = open ? iconChevronUp(14) : iconChevronDown(14)\n trigger.appendChild(chev)\n trigger.addEventListener('click', (e) => {\n e.stopPropagation()\n this.setState({\n openSelect: open ? null : { uid: product.uid, key },\n shopMenuOpen: false,\n })\n })\n wrap.appendChild(trigger)\n\n if (open) {\n const values = getOptionValues(product, keys, index, selected)\n const menu = document.createElement('div')\n menu.className = 'xpm-select__menu'\n values.forEach((val) => {\n const opt = document.createElement('button')\n opt.type = 'button'\n opt.className =\n 'xpm-select__option' + (val === currentVal ? ' xpm-select__option--selected' : '')\n opt.textContent = val\n opt.addEventListener('click', (e) => {\n e.stopPropagation()\n this.handleVariantChange(product, keys, key, index, val)\n })\n menu.appendChild(opt)\n })\n wrap.appendChild(menu)\n }\n return wrap\n }\n\n private handleVariantChange(\n product: ProductDataType,\n keys: string[],\n key: string,\n index: number,\n value: string,\n ) {\n const next =\n { ...(this.state.productSelectedOptions[product.uid] || {}) } as Record<string, string>\n next[key] = value\n // 重置后续选项到第一个候选\n for (let i = index + 1; i < keys.length; i++) {\n const nk = keys[i]!\n next[nk] = ''\n const tempSelected = { ...next }\n const values = getOptionValues(product, keys, i, tempSelected)\n if (values[0]) next[nk] = values[0]\n }\n const nextOptions = {\n ...this.state.productSelectedOptions,\n [product.uid]: next,\n }\n\n // 选择变体后,若新变体可购买则保持/添加勾选,否则取消勾选\n const variant = findVariantByOptions(product, next)\n const nextChecked = new Set(this.state.checkedUids)\n if (isVariantPurchasable(variant)) {\n nextChecked.add(product.uid)\n } else {\n nextChecked.delete(product.uid)\n }\n\n this.setState({\n productSelectedOptions: nextOptions,\n checkedUids: Array.from(nextChecked),\n openSelect: null,\n })\n }\n\n private changeQty(product: ProductDataType, delta: number) {\n const next = (product.quantity || 1) + delta\n if (next < 1) return\n product.quantity = next\n this.setState({})\n }\n\n private renderFooter(): HTMLElement {\n const footer = document.createElement('footer')\n footer.className = 'xpm-footer'\n\n const inner = document.createElement('div')\n inner.className = 'xpm-footer__inner'\n\n let total = 0\n let hasPurchasable = false\n this.state.checkedUids.forEach((uid) => {\n const product = this.state.productList.find((p) => p.uid === uid)\n if (!product) return\n const options = this.state.productSelectedOptions[uid] || {}\n const variant = findVariantByOptions(product, options)\n if (!variant) return\n if (isVariantPurchasable(variant)) hasPurchasable = true\n if (variant.price) {\n total += (parseFloat(String(variant.price)) || 0) * (product.quantity || 1)\n }\n })\n\n const totalBlock = document.createElement('div')\n totalBlock.className = 'xpm-footer__total-block'\n const totalRow = document.createElement('div')\n totalRow.className = 'xpm-footer__total-row'\n const tl = document.createElement('span')\n tl.className = 'xpm-footer__total-label'\n tl.textContent = this.i18n.t('total')\n const tp = document.createElement('span')\n tp.className = 'xpm-footer__total-price'\n tp.textContent = formatMoney(total.toFixed(2))\n totalRow.appendChild(tl)\n totalRow.appendChild(tp)\n const warn = document.createElement('p')\n warn.className = 'xpm-footer__warning'\n warn.textContent = this.i18n.t('discount_notice')\n totalBlock.appendChild(totalRow)\n totalBlock.appendChild(warn)\n\n const buyBtn = document.createElement('button')\n buyBtn.className = 'xpm-buy-now'\n buyBtn.textContent = this.state.checkoutLoading\n ? this.i18n.t('loading')\n : this.i18n.t('buy_now')\n buyBtn.disabled = !hasPurchasable || this.state.checkoutLoading\n buyBtn.addEventListener('click', () => this.callbacks.onCheckout())\n\n inner.appendChild(totalBlock)\n inner.appendChild(buyBtn)\n footer.appendChild(inner)\n return footer\n }\n\n private handleDocClick(e: Event) {\n // 点击 select / dropdown 之外的区域时关掉它们\n const path = e.composedPath()\n const insideDropdown = path.some(\n (n) => (n as HTMLElement)?.dataset?.xpmStop === '1',\n )\n if (insideDropdown) return\n if (this.state.openSelect || this.state.shopMenuOpen) {\n this.setState({ openSelect: null, shopMenuOpen: false })\n }\n }\n}\n","import {\n DEFAULT_API_BASE_URL,\n PROD_STORE_OPTIONS,\n ShopifyStoreName,\n STORAGE_KEYS,\n countryToSite,\n} from './config'\nimport { fetchAccessoryPack, fetchDistributionTrackId, fetchIpLocation } from './services/api'\nimport { ShopifyClient } from './services/shopify'\nimport {\n assignUid,\n findVariantByOptions,\n isVariantPurchasable,\n refreshProductPrices,\n} from './services/product'\nimport { I18n } from './i18n'\nimport { Renderer, RendererState } from './ui/renderer'\nimport type {\n GeneratorMaterialPurchaseApi,\n ProductDataType,\n PurchaseModalInitOptions,\n} from './types'\n\nconst DEFAULT_Z_INDEX = 9999\n\nclass PurchaseModal implements GeneratorMaterialPurchaseApi {\n private options: PurchaseModalInitOptions | null = null\n private apiBaseUrl: string = DEFAULT_API_BASE_URL\n private i18n = new I18n()\n private shopify = new ShopifyClient()\n private renderer: Renderer | null = null\n private state: RendererState = this.createInitialState()\n private accessoryCache: ProductDataType[] | null = null\n\n private createInitialState(): RendererState {\n return {\n productList: [],\n currentShopName: '',\n loading: false,\n checkoutLoading: false,\n checkedUids: [],\n productSelectedOptions: {},\n shopMenuOpen: false,\n openSelect: null,\n }\n }\n\n init(options: PurchaseModalInitOptions): void {\n if (!options || !options.generatorId || !options.accessoryType) {\n throw new Error('[GeneratorMaterialPurchase] init requires generatorId and accessoryType')\n }\n this.options = options\n this.apiBaseUrl = options.apiBaseUrl || DEFAULT_API_BASE_URL\n this.i18n.setLocale(options.locale || 'en')\n this.i18n.extend(options.messages)\n }\n\n async open(): Promise<void> {\n if (!this.options) {\n throw new Error('[GeneratorMaterialPurchase] call init() before open()')\n }\n\n // 重新创建一份 state 以避免上次状态污染\n this.state = this.createInitialState()\n\n this.renderer = new Renderer(\n this.state,\n this.i18n,\n {\n onClose: () => this.close(),\n onShopChange: (v) => this.handleShopChange(v),\n onCheckout: () => this.handleCheckout(),\n },\n this.options.zIndex || DEFAULT_Z_INDEX,\n )\n this.renderer.mount()\n\n // 先用 loading 状态打开\n this.renderer.setState({ loading: true })\n\n try {\n // 选定初始 shop:localStorage 优先;否则 IP 探测\n const cached = localStorage.getItem(STORAGE_KEYS.CURRENT_SHOP) || ''\n let initialShop = cached\n if (!initialShop || !PROD_STORE_OPTIONS.find((s) => s.value === initialShop)) {\n try {\n const loc = await fetchIpLocation(this.apiBaseUrl)\n initialShop = countryToSite(loc)\n } catch {\n initialShop = ShopifyStoreName.MAKEBLOCK_XTOOL\n }\n }\n await this.shopify.init(initialShop)\n this.renderer.setState({ currentShopName: this.shopify.currentShopName })\n await this.loadProducts(false)\n } catch (e) {\n console.error('[GeneratorMaterialPurchase] open failed:', e)\n this.options.onError?.(e)\n this.renderer.setState({ loading: false })\n this.renderer.showToast(this.i18n.t('failed_load_product_list'))\n }\n }\n\n close(): void {\n if (!this.renderer) return\n const r = this.renderer\n this.renderer = null\n r.playClose().then(() => r.unmount())\n this.options?.onClose?.()\n }\n\n destroy(): void {\n if (this.renderer) {\n this.renderer.unmount()\n this.renderer = null\n }\n this.options = null\n this.shopify = new ShopifyClient()\n this.accessoryCache = null\n }\n\n private async handleShopChange(shopName: string) {\n if (!this.renderer || !this.options) return\n this.renderer.setState({\n loading: true,\n productList: [],\n checkedUids: [],\n productSelectedOptions: {},\n })\n try {\n await this.shopify.changeShop(shopName)\n this.renderer.setState({ currentShopName: this.shopify.currentShopName })\n await this.loadProducts(true)\n } catch (e) {\n console.error('[GeneratorMaterialPurchase] handleShopChange failed:', e)\n this.options.onError?.(e)\n this.renderer.setState({ loading: false })\n this.renderer.showToast(this.i18n.t('failed_load_product_list'))\n }\n }\n\n private async loadProducts(force: boolean) {\n if (!this.renderer || !this.options) return\n try {\n let raw: ProductDataType[]\n if (!force && this.accessoryCache?.length) {\n raw = this.accessoryCache\n } else {\n raw = await fetchAccessoryPack(this.apiBaseUrl, {\n store: this.shopify.currentShopName,\n generatorId: this.options.generatorId,\n accessoryType: this.options.accessoryType,\n })\n this.accessoryCache = raw\n }\n const list: ProductDataType[] = (raw || []).map((item, idx) => ({\n ...item,\n uid: item.uid ?? assignUid(item, idx),\n quantity: item.quantity || 1,\n }))\n refreshProductPrices(list)\n\n // 默认勾上所有可购买的\n const initialChecked: string[] = []\n list.forEach((p) => {\n const variant = findVariantByOptions(p, {})\n if (isVariantPurchasable(variant)) initialChecked.push(p.uid)\n })\n\n this.renderer.setState({\n productList: list,\n checkedUids: initialChecked,\n productSelectedOptions: {},\n loading: false,\n })\n } catch (e) {\n console.error('[GeneratorMaterialPurchase] loadProducts failed:', e)\n this.options.onError?.(e)\n this.renderer.setState({ loading: false })\n this.renderer.showToast(this.i18n.t('failed_load_product_list'))\n }\n }\n\n private async handleCheckout() {\n if (!this.renderer || !this.options) return\n if (this.state.checkedUids.length === 0) return\n const options = this.options\n this.renderer.setState({ checkoutLoading: true })\n\n try {\n let skippedOutOfStock = 0\n const lines = this.state.checkedUids\n .map((uid) => {\n const product = this.state.productList.find((p) => p.uid === uid)\n if (!product) return null\n const options = this.state.productSelectedOptions[uid] || {}\n const variant = findVariantByOptions(product, options)\n if (!variant?.id) return null\n if (!isVariantPurchasable(variant)) {\n skippedOutOfStock += 1\n return null\n }\n return {\n merchandiseId: String(variant.id),\n quantity: product.quantity || 1,\n }\n })\n .filter(Boolean) as { merchandiseId: string; quantity: number }[]\n\n if (lines.length === 0) {\n const key =\n skippedOutOfStock > 0 ? 'selected_items_out_of_stock' : 'no_valid_products_selected'\n this.renderer.showToast(this.i18n.t(key))\n return\n }\n\n let trackId: string | undefined\n try {\n const productContent = lines.map((l) => ({\n variantId: l.merchandiseId,\n productQuantity: l.quantity,\n store: this.shopify.currentShopName,\n relatedObjectId: 1,\n relatedObjectType: options.generatorId,\n pageSource: 'generator',\n }))\n const res = await fetchDistributionTrackId(this.apiBaseUrl, productContent)\n trackId = res?.trackId\n } catch (e) {\n console.warn('[GeneratorMaterialPurchase] fetchDistributionTrackId failed:', e)\n }\n\n const cart = await this.shopify.createCheckout(lines, { trackId })\n if (cart?.checkoutUrl) {\n if (options.onCheckoutSuccess) {\n options.onCheckoutSuccess(cart.checkoutUrl)\n } else {\n window.open(cart.checkoutUrl, '_blank')\n }\n }\n } catch (e) {\n console.error('[GeneratorMaterialPurchase] checkout failed:', e)\n options.onError?.(e)\n this.renderer?.showToast(this.i18n.t('checkout_failed'))\n } finally {\n this.renderer?.setState({ checkoutLoading: false })\n }\n }\n}\n\nexport const generatorMaterialPurchaseInstance = new PurchaseModal()\n","import { generatorMaterialPurchaseInstance } from './modal'\nimport type { GeneratorMaterialPurchaseApi, PurchaseModalInitOptions } from './types'\n\nconst api: GeneratorMaterialPurchaseApi = {\n init: (options) => generatorMaterialPurchaseInstance.init(options),\n open: () => generatorMaterialPurchaseInstance.open(),\n close: () => generatorMaterialPurchaseInstance.close(),\n destroy: () => generatorMaterialPurchaseInstance.destroy(),\n}\n\nif (typeof window !== 'undefined') {\n ;(window as unknown as { GeneratorMaterialPurchase: GeneratorMaterialPurchaseApi }).GeneratorMaterialPurchase =\n api\n}\n\nexport default api\nexport { api as GeneratorMaterialPurchase }\nexport type { GeneratorMaterialPurchaseApi, PurchaseModalInitOptions }\nexport * from './types'\n"],"names":["XtoolShopify","_a","wrap","options"],"mappings":"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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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","x_google_ignoreList":[3]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).GeneratorMaterialPurchase={})}(this,function(t){"use strict";var e=Object.defineProperty,n=(t,n,o)=>((t,n,o)=>n in t?e(t,n,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[n]=o)(t,"symbol"!=typeof n?n+"":n,o);const o="https://xcs-api.xtool.com",i="https://storage.atomm.com/xtool/aimake-static/static/xtool-shopify",a="makeblock-xtool",s="ca-xtool",r="xtool-australia-store",c="jp-xtool",l="eu-xtool",d="de-xtool",p="fr-xtool",h="uk-xtool",u=[{label:"US",value:a,icon:`${i}/at_country_us.svg`,shopDomain:"makeblock-xtool.myshopify.com",storeFrontAccessToken:"7bb184c4d18313c58d0ccd6bfa0f73a3"},{label:"CA",value:s,icon:`${i}/at_country_ca.svg`,shopDomain:"ca-xtool.myshopify.com",storeFrontAccessToken:"7912e607574a3a6eaffaf501c75408e6"},{label:"EU",value:l,icon:`${i}/at_country_eu.svg`,shopDomain:"eu-xtool.myshopify.com",storeFrontAccessToken:"0886b237162c21d11ba1ca30f6220c6f"},{label:"UK",value:h,icon:`${i}/at_country_uk.svg`,shopDomain:"uk-xtool.myshopify.com",storeFrontAccessToken:"adf825795f70225d0351ad387d538757"},{label:"FR",value:p,icon:`${i}/at_country_fr.svg`,shopDomain:"fr-xtool.myshopify.com",storeFrontAccessToken:"e397fc547281c76d1086776fa347d804"},{label:"DE",value:d,icon:`${i}/at_country_de.svg`,shopDomain:"de-xtool.myshopify.com",storeFrontAccessToken:"87e1adaeba390a0b21e5ef6937792d2f"},{label:"JP",value:c,icon:`${i}/at_country_jp.svg`,shopDomain:"jp-xtool.myshopify.com",storeFrontAccessToken:"c9738498306280b6ae87bb999811d952"},{label:"AU",value:r,icon:`${i}/at_country_au.svg`,shopDomain:"xtool-australia-store.myshopify.com",storeFrontAccessToken:"fabb70f52384af557b4ac0392f86c2ed"}],m={[a]:"store_us",[s]:"store_ca",[r]:"store_au",[l]:"store_eu",[d]:"store_de",[p]:"store_fr",[h]:"store_uk",[c]:"store_jp"},f={[a]:"country_usa",[s]:"country_canada",[r]:"country_australia",[l]:"country_eu",[d]:"country_germany",[p]:"country_france",[h]:"country_uk",[c]:"country_japan"};const x="xtool_current_shop_name",g="xtool_shop_info",_="utoken",y="LANG_KEY";function b(){return function(t){if("undefined"==typeof document)return"";const e=new RegExp(`(?:^|;\\s*)${t}=([^;]*)`),n=document.cookie.match(e);return n?decodeURIComponent(n[1]):""}(_)||localStorage.getItem(_)||""}async function w({baseURL:t,url:e,method:n,params:o,data:i}){let a=t.replace(/\/$/,"")+e;if(o&&"GET"===n){const t=new URLSearchParams;Object.entries(o).forEach(([e,n])=>{null!=n&&t.append(e,String(n))});const e=t.toString();e&&(a+=(a.includes("?")?"&":"?")+e)}const s=await fetch(a,{method:n,headers:{"content-type":"application/json;charset=UTF-8",uToken:b(),lang:localStorage.getItem(y)||"en"},body:"POST"===n?JSON.stringify(i??{}):void 0});if(!s.ok)throw new Error(`HTTP ${s.status} ${s.statusText}`);const r=await s.json();if(0===r.code)return r.data;throw new Error(r.msg||r.message||`Request failed with code ${r.code}`)}class v{constructor(t){if(t.shopDomain&&!t.shopDomain.match(/^[a-zA-Z0-9_-]+\.myshopify\.com$/))throw new Error("shopDomain 必须为 xxxx.myshopify.com 格式");if(!t.storeFrontAccessToken)throw new Error("storeFrontAccessToken 必填");this.config={shopDomain:t.shopDomain,storeFrontAccessToken:t.storeFrontAccessToken,apiVersion:t.apiVersion||"2025-07",timeout:t.timeout||3e4,cartStorageMode:t.cartStorageMode||"memory",cartStorageKey:t.cartStorageKey||"xtool_shop_sdk_shopify_cart_id"},this.baseUrl=`https://${this.config.shopDomain}/api/${this.config.apiVersion}`}async request(t,e={}){const{method:n="GET",headers:o={},body:i,params:a}=e;let s=`${this.baseUrl}${t}`;if(a){s+=`?${new URLSearchParams(a).toString()}`}const r={method:n,headers:{"Content-Type":"application/json","X-Shopify-StoreFront-Access-Token":this.config.storeFrontAccessToken,...o}};i&&(r.body=JSON.stringify(i));const c=new AbortController,l=setTimeout(()=>c.abort(),this.config.timeout);try{const t=await fetch(s,{...r,signal:c.signal});clearTimeout(l);const e={data:await t.json(),status:t.status,statusText:t.statusText,headers:this.parseHeaders(t.headers)};if(!t.ok)throw new Error(`API 请求失败: ${t.status} ${t.statusText}`);return e}catch(d){throw d instanceof Error?"AbortError"===d.name?new Error("请求超时"):d:new Error("未知错误")}}parseHeaders(t){const e={};return t.forEach((t,n)=>{e[n]=t}),e}graphQlRequest(t,e={}){return this.request("/graphql.json",{method:"POST",body:{query:t,variables:e}})}async createCart(t){const e=t.lines.map(t=>t.merchandiseId.startsWith("gid://shopify/ProductVariant/")?t:{...t,merchandiseId:`gid://shopify/ProductVariant/${t.merchandiseId}`});return t.lines=e,(await this.graphQlRequest("\n mutation cartCreate($input: CartInput) {\n cartCreate(input: $input) {\n cart {\n id\n checkoutUrl\n }\n userErrors {\n field\n message\n }\n warnings {\n code\n message\n target\n }\n }\n }\n ",{input:t})).data.data.cartCreate}async getProductInfoWithMetafields(t){const{productId:e,metafieldsIdentifiers:n}=t,o={id:String(e).startsWith("gid://shopify/Product/")?e:`gid://shopify/Product/${e}`,metafields_identifiers:n};return(await this.graphQlRequest("\n query Products($id: ID, $metafields_identifiers: [HasMetafieldsIdentifier!]!) {\n product(id: $id ) {\n title\n id\n handle\n tags\n productType\n totalInventory\n onlineStoreUrl\n handle\n isGiftCard\n description\n descriptionHtml\n selectedOrFirstAvailableVariant {\n id\n }\n featuredImage {\n url\n }\n metafields(identifiers: $metafields_identifiers){\n id\n namespace\n key\n value\n }\n variants(first: 20){\n nodes {\n id\n title\n }\n }\n }\n }\n ",o)).data.data.product}async getShopInfo(){return(await this.graphQlRequest("\n query Shop {\n shop {\n id\n name\n moneyFormat\n }\n }\n ")).data.data.shop}async customRequest(t,e){return this.request(t,e)}}class k{constructor(){n(this,"currentShopName",""),n(this,"client",null),n(this,"initialized",!1),n(this,"initializing",!1)}get currentStore(){return u.find(t=>t.value===this.currentShopName)}initClientFor(t){const e=u.find(e=>e.value===t);e&&(this.client=new v({shopDomain:e.shopDomain,storeFrontAccessToken:e.storeFrontAccessToken}))}async init(t){if(!this.initialized&&!this.initializing){this.initializing=!0;try{this.currentShopName=t,localStorage.setItem(x,this.currentShopName),this.initClientFor(this.currentShopName),await this.fetchAndSaveShopInfo(),this.initialized=!0}catch(e){this.initialized=!0}finally{this.initializing=!1}}}async fetchAndSaveShopInfo(){if(this.client)try{const t=await this.client.getShopInfo();localStorage.setItem(g,JSON.stringify({money_with_currency_format:t.moneyFormat,moneyFormat:t.moneyFormat}))}catch(t){}}async changeShop(t){this.currentShopName=t,localStorage.setItem(x,t),this.initClientFor(t),await this.fetchAndSaveShopInfo()}async createCheckout(t,e){var n,o;if(!this.client)throw new Error("Shopify client not initialized");const i=[{key:"xtool_return_url",value:window.location.href}];(null==e?void 0:e.trackId)&&i.push({key:"atomm_track_id",value:e.trackId});const a=await this.client.createCart({lines:t,attributes:i});if(a.cart)return a.cart;const s=(null==(o=null==(n=a.userErrors)?void 0:n[0])?void 0:o.message)||"Failed to create cart";throw new Error(s)}}function C(t){const e="string"==typeof t?parseFloat(t):t;if(isNaN(e)||"number"!=typeof e)return"$0.00";let n={};try{const t=localStorage.getItem(g);t&&(n=JSON.parse(t))}catch{}const o=n.money_with_currency_format||n.moneyFormat||"${{amount}}",i=/\{\{\s*(\w+)\s*\}\}/;function a(t,e,n=",",o="."){var i;const a=t.toFixed(e).split(".");return((null==(i=a[0])?void 0:i.replace(/(\d)(?=(\d{3})+(?!\d))/g,"$1"+n))||"")+(a[1]?o+a[1]:"")}const s=o.match(i);let r="";if(null==s?void 0:s[1])switch(s[1]){case"amount":default:r=a(e,2);break;case"amount_no_decimals":r=a(e,0);break;case"amount_with_comma_separator":r=a(e,2,".",",");break;case"amount_no_decimals_with_comma_separator":r=a(e,0,".",",");break;case"amount_with_space_separator":r=a(e,2," ",",");break;case"amount_with_apostrophe_separator":r=a(e,2,"'")}else r=a(e,2);return o.replace(i,r)}function S(t,e){var n,o;const i=t.defaultVariant;if(null!=i)return`${t.id}_${String(i)}_${e}`;const a=null==(o=null==(n=t.variants)?void 0:n[0])?void 0:o.id;return null!=a?`${t.id}_${a}_${e}`:`${t.id}_${e}`}function E(t){return!!t&&(!0===t.availableForSale&&!0!==t.outOfStock)}function N(t,e){var n;if(!(null==(n=t.variants)?void 0:n.length))return null;if(!e||0===Object.keys(e).length){if(t.defaultVariant){const e=t.variants.find(e=>e.id===t.defaultVariant);if(e)return e}return t.variants.find(t=>t.isBind)||t.variants[0]||null}const o=t.variants.find(t=>{if(!t.option)return!1;for(const[n,o]of Object.entries(e))if("uid"!==n&&o&&""!==o&&t.option[n]!==o)return!1;return!0});if(o)return o;if(t.defaultVariant){const e=t.variants.find(e=>e.id===t.defaultVariant);if(e)return e}return t.variants.find(t=>t.isBind)||t.variants[0]||null}function T(t){var e,n;const o=t.variants;if(!(null==o?void 0:o.length))return[];let i=[];return(null==(e=t.options)?void 0:e.length)?i=t.options.map(t=>t.key).filter(Boolean):(null==(n=o[0])?void 0:n.option)&&(i=Object.keys(o[0].option)),i.filter(t=>o.some(e=>{var n;return(t=>!!t&&""!==t.trim())(null==(n=e.option)?void 0:n[t])}))}function A(t,e,n,o){const i=t=>!!t&&""!==t.trim(),a=t.variants||[],s=new Set;return a.forEach(t=>{if(!t.option)return;if(n>0)for(let s=0;s<n;s++){const n=e[s],a=o[n];if(i(a)&&t.option[n]!==a)return}const a=t.option[e[n]];i(a)&&s.add(a)}),Array.from(s).sort()}const L={shopify_supplies_kit:"Supplies Kit",close:"Close",current_country_notice:"Items will be shipped to {country}.",loading:"Loading",no_items_in_cart:"No items available.",sold_out:"Sold out",total:"Total",discount_notice:"Discount codes can only be used in checkout.",buy_now:"Buy now",failed_load_product_list:"Failed to load product list.",checkout_failed:"Failed to create checkout.",selected_items_out_of_stock:"Selected items are sold out.",no_valid_products_selected:"No valid products selected.",store_us:"US",store_ca:"CA",store_au:"AU",store_eu:"EU",store_de:"DE",store_fr:"FR",store_uk:"UK",store_jp:"JP",store_test:"XT",country_usa:"USA",country_canada:"Canada",country_australia:"Australia",country_eu:"EU",country_germany:"Germany",country_france:"France",country_uk:"UK",country_japan:"Japan"},I={shopify_supplies_kit:"耗材包",close:"关闭",current_country_notice:"商品将发往{country}。",loading:"加载中",no_items_in_cart:"暂无可购买的商品。",sold_out:"售罄",total:"合计",discount_notice:"优惠码仅可在结算页使用。",buy_now:"立即购买",failed_load_product_list:"加载商品列表失败。",checkout_failed:"创建结算订单失败。",selected_items_out_of_stock:"所选商品已售罄。",no_valid_products_selected:"未选择有效商品。",store_us:"美国",store_ca:"加拿大",store_au:"澳大利亚",store_eu:"欧盟",store_de:"德国",store_fr:"法国",store_uk:"英国",store_jp:"日本",store_test:"测试",country_usa:"美国",country_canada:"加拿大",country_australia:"澳大利亚",country_eu:"欧洲",country_germany:"德国",country_france:"法国",country_uk:"英国",country_japan:"日本"};class U{constructor(){n(this,"locale","en"),n(this,"dict",{en:L,zh:I})}setLocale(t){this.locale=this.dict[t]?t:"en"}extend(t){t&&Object.entries(t).forEach(([t,e])=>{e&&(this.dict[t]={...this.dict[t]||{},...e})})}t(t,e){var n;let o=(this.dict[this.locale]||this.dict.en||{})[t]??(null==(n=this.dict.en)?void 0:n[t])??t;return e&&Object.entries(e).forEach(([t,e])=>{o=o.replace(new RegExp(`\\{\\s*${t}\\s*\\}`,"g"),String(e))}),o}}const j=(t,e=16)=>`<svg xmlns="http://www.w3.org/2000/svg" width="${e}" height="${e}" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">${t}</svg>`,$=(t=16)=>j('<path d="m6 9 6 6 6-6"/>',t),F=(t=16)=>j('<path d="m18 15-6-6-6 6"/>',t);class O{constructor(t,e,o,i){n(this,"host",null),n(this,"shadow",null),n(this,"overlay",null),n(this,"panel",null),n(this,"toastEl",null),n(this,"toastTimer",null),n(this,"docClickHandler",t=>this.handleDocClick(t)),this.state=t,this.i18n=e,this.callbacks=o,this.zIndex=i}mount(){if(this.host)return;this.host=document.createElement("div"),this.host.className="xpm-host",this.host.style.position="relative",this.host.style.zIndex=String(this.zIndex),this.shadow=this.host.attachShadow({mode:"open"});const t=document.createElement("style");t.textContent='\n:host, .xpm-host {\n font-family: Inter, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;\n color: #2d3541;\n}\n*, *::before, *::after { box-sizing: border-box; }\n\n.xpm-overlay {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.4);\n z-index: 0;\n opacity: 0;\n transition: opacity 0.2s ease;\n}\n.xpm-overlay--visible { opacity: 1; }\n\n.xpm-panel {\n position: fixed;\n top: 0;\n right: 0;\n width: 320px;\n height: 100vh;\n background: #fff;\n display: flex;\n flex-direction: column;\n box-shadow:\n 0 1.187px 2.373px rgba(0, 0, 0, 0.1),\n 0 23.733px 23.733px rgba(0, 0, 0, 0.1);\n transform: translateX(100%);\n transition: transform 0.25s ease;\n}\n.xpm-panel--visible { transform: translateX(0); }\n\n.xpm-header {\n height: 56px;\n padding: 12px;\n border-bottom: 1px solid #e7e9ed;\n display: flex;\n align-items: center;\n justify-content: space-between;\n flex-shrink: 0;\n background: #fff;\n}\n.xpm-header__title {\n color: #2d3541;\n font-size: 14px;\n font-weight: 600;\n line-height: 20px;\n}\n.xpm-icon-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n padding: 0;\n border: 0;\n border-radius: 4px;\n background: transparent;\n color: #2d3541;\n cursor: pointer;\n}\n.xpm-icon-btn:hover { background: #f0f0f5; }\n\n.xpm-banner {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: space-between;\n height: 40px;\n padding: 8px 12px 0;\n flex-shrink: 0;\n background: #fff;\n}\n.xpm-banner__text {\n min-width: 0;\n color: #ff7c23;\n font-size: 10px;\n font-weight: 500;\n line-height: 14px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n padding-right: 80px;\n}\n\n.xpm-dropdown {\n position: absolute;\n top: 8px;\n right: 12px;\n z-index: 30;\n display: flex;\n flex-direction: column;\n gap: 4px;\n width: 73px;\n flex-shrink: 0;\n}\n.xpm-dropdown__trigger {\n display: flex;\n align-items: center;\n gap: 4px;\n width: 73px;\n height: 32px;\n padding: 6px 4px 6px 8px;\n border: 1px solid transparent;\n background: #f0f0f5;\n border-radius: 4px;\n color: #070b10;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n.xpm-dropdown--open .xpm-dropdown__trigger {\n border: 1px solid #070b10;\n background: #fff;\n}\n.xpm-dropdown__selected {\n flex: 1;\n min-width: 0;\n display: inline-flex;\n align-items: center;\n gap: 4px;\n color: #070b10;\n font-size: 12px;\n font-weight: 400;\n line-height: 16px;\n overflow: hidden;\n}\n.xpm-dropdown__selected span {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.xpm-dropdown__menu {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n width: 73px;\n padding: 4px;\n overflow: hidden;\n border: 1px solid #f0f0f5;\n border-radius: 6px;\n background: #fff;\n box-shadow:\n 0 2px 8px rgba(0, 0, 0, 0.1),\n 0 16px 32px rgba(0, 0, 0, 0.1);\n}\n.xpm-dropdown__item {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n height: 32px;\n padding: 8px;\n border: 0;\n border-radius: 4px;\n background: transparent;\n color: #070b10;\n font-size: 12px;\n font-weight: 400;\n line-height: 16px;\n cursor: pointer;\n}\n.xpm-dropdown__item:hover { background: #f0f0f5; }\n.xpm-dropdown__item-icon {\n width: 16px;\n height: 16px;\n object-fit: contain;\n flex-shrink: 0;\n}\n.xpm-flag {\n width: 15px;\n height: 11px;\n object-fit: cover;\n flex-shrink: 0;\n}\n\n.xpm-list {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n background: #fff;\n}\n.xpm-list::-webkit-scrollbar { width: 4px; }\n.xpm-list::-webkit-scrollbar-thumb { background: #c5cad2; border-radius: 2px; }\n.xpm-list::-webkit-scrollbar-track { background: transparent; }\n\n.xpm-placeholder {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n height: 100%;\n color: #848b96;\n font-size: 12px;\n}\n.xpm-spinner {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n border: 2px solid #e7e9ed;\n border-top-color: #6e757f;\n animation: xpm-spin 0.8s linear infinite;\n}\n@keyframes xpm-spin { to { transform: rotate(1turn); } }\n\n.xpm-row {\n display: flex;\n gap: 12px;\n align-items: center;\n min-height: 110px;\n padding: 8px 12px;\n border-bottom: 1px solid rgba(83, 91, 136, 0.1);\n background: #fff;\n}\n.xpm-row--has-options {\n align-items: flex-start;\n min-height: 167px;\n padding: 12px;\n}\n.xpm-row--has-options .xpm-row__info {\n min-height: 142px;\n justify-content: flex-start;\n}\n.xpm-row--has-options .xpm-row__meta { margin-top: 0; }\n\n.xpm-row__media {\n position: relative;\n width: 88px;\n height: 88px;\n flex-shrink: 0;\n}\n.xpm-row__thumb {\n width: 88px;\n height: 88px;\n overflow: hidden;\n border: 1px solid rgba(0, 0, 0, 0.08);\n border-radius: 8px;\n background: #f6f6fa;\n}\n.xpm-row__thumb img {\n width: 100%;\n height: 100%;\n display: block;\n object-fit: cover;\n}\n.xpm-row__sold-out {\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 0 0 8px 8px;\n background: rgba(0, 0, 0, 0.8);\n color: #fff;\n font-size: 10px;\n font-weight: 400;\n line-height: 14px;\n}\n\n.xpm-checkbox {\n position: absolute;\n left: 4px;\n top: 4px;\n z-index: 2;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n cursor: pointer;\n}\n.xpm-checkbox input {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n opacity: 0;\n cursor: pointer;\n}\n.xpm-checkbox__box {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 14px;\n border: 1px solid #d8dadf;\n border-radius: 2px;\n background: #fff;\n color: #fff;\n}\n.xpm-checkbox--checked .xpm-checkbox__box {\n border-color: #070b10;\n background: #070b10;\n}\n.xpm-checkbox--disabled,\n.xpm-checkbox--disabled input { cursor: not-allowed; }\n.xpm-checkbox--disabled .xpm-checkbox__box {\n border-color: #d8dadf;\n background: #d8dadf;\n}\n\n.xpm-row__info {\n flex: 1;\n min-width: 0;\n min-height: 80px;\n display: flex;\n flex-direction: column;\n justify-content: flex-start;\n gap: 8px;\n}\n.xpm-row__name {\n min-width: 100%;\n color: #070b10;\n font-size: 12px;\n font-weight: 600;\n line-height: 16px;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n word-break: break-word;\n}\n\n.xpm-variants {\n display: flex;\n flex-direction: column;\n gap: 4px;\n width: 100%;\n}\n\n.xpm-select {\n position: relative;\n width: 100%;\n}\n.xpm-select__trigger {\n display: flex;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n height: 28px;\n padding: 0 6px;\n border: 1px solid rgba(0, 0, 0, 0.1);\n border-radius: 4px;\n background: #fff;\n color: #2d3541;\n font-size: 12px;\n font-weight: 400;\n line-height: 16px;\n cursor: pointer;\n}\n.xpm-select__trigger--placeholder { color: #848b96; }\n.xpm-select--open .xpm-select__trigger { border-color: #070b10; }\n.xpm-select__menu {\n position: absolute;\n left: 0;\n right: 0;\n top: calc(100% + 4px);\n z-index: 40;\n max-height: 200px;\n overflow-y: auto;\n padding: 4px;\n border: 1px solid #f0f0f5;\n border-radius: 6px;\n background: #fff;\n box-shadow:\n 0 2px 8px rgba(0, 0, 0, 0.1),\n 0 16px 32px rgba(0, 0, 0, 0.1);\n}\n.xpm-select__option {\n display: flex;\n align-items: center;\n width: 100%;\n height: 28px;\n padding: 4px 8px;\n border: 0;\n border-radius: 4px;\n background: transparent;\n color: #2d3541;\n font-size: 12px;\n font-weight: 400;\n line-height: 16px;\n cursor: pointer;\n text-align: left;\n}\n.xpm-select__option:hover { background: #f0f0f5; }\n.xpm-select__option--selected { background: #f0f0f5; color: #070b10; font-weight: 500; }\n\n.xpm-row__meta {\n display: flex;\n flex-direction: column;\n gap: 8px;\n}\n.xpm-row__meta--with-options {\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n width: 100%;\n}\n\n.xpm-price-group {\n min-width: 0;\n display: flex;\n align-items: center;\n gap: 4px;\n white-space: nowrap;\n}\n.xpm-price-group__discount {\n flex-shrink: 0;\n color: #fa2730;\n font-size: 12px;\n font-weight: 600;\n line-height: 16px;\n}\n.xpm-price-group__current {\n min-width: 0;\n overflow: hidden;\n color: #070b10;\n font-size: 12px;\n font-weight: 600;\n line-height: 16px;\n text-overflow: ellipsis;\n}\n.xpm-price-group__compare {\n min-width: 0;\n overflow: hidden;\n color: #b3b9c2;\n font-size: 10px;\n font-weight: 400;\n line-height: 14px;\n text-decoration: line-through;\n text-overflow: ellipsis;\n}\n\n.xpm-row__actions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n min-height: 24px;\n}\n.xpm-qty {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n flex-shrink: 0;\n}\n.xpm-qty__btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n padding: 0;\n border: 1px solid #d8dadf;\n border-radius: 2px;\n background: #fff;\n color: #070b10;\n cursor: pointer;\n}\n.xpm-qty__btn:hover:not(:disabled) { background: #f6f6fa; }\n.xpm-qty__btn:disabled { opacity: 0.4; cursor: not-allowed; }\n.xpm-qty__value {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n color: #070b10;\n font-size: 12px;\n font-weight: 400;\n line-height: 16px;\n}\n\n.xpm-footer {\n flex-shrink: 0;\n height: 105px;\n padding: 8px 16px;\n border-top: 1px solid rgba(81, 97, 117, 0.1);\n background: #fff;\n}\n.xpm-footer__inner {\n display: flex;\n flex-direction: column;\n justify-content: center;\n gap: 8px;\n width: 100%;\n height: 100%;\n}\n.xpm-footer__total-block {\n display: flex;\n flex-direction: column;\n gap: 4px;\n align-items: flex-start;\n}\n.xpm-footer__total-row {\n display: flex;\n align-items: center;\n gap: 4px;\n color: #070b10;\n}\n.xpm-footer__total-label {\n font-size: 12px;\n font-weight: 600;\n line-height: 16px;\n}\n.xpm-footer__total-price {\n font-size: 16px;\n font-weight: 500;\n line-height: 22px;\n}\n.xpm-footer__warning {\n margin: 0;\n color: #ff7c23;\n font-size: 12px;\n font-weight: 500;\n line-height: 16px;\n}\n.xpm-buy-now {\n width: 100%;\n height: 32px;\n padding: 6px 12px;\n border: 0;\n border-radius: 6px;\n background: #ff0035;\n color: #fff;\n font-size: 12px;\n font-weight: 600;\n line-height: 16px;\n cursor: pointer;\n}\n.xpm-buy-now:hover:not(:disabled) { background: #e60030; }\n.xpm-buy-now:disabled { opacity: 0.6; cursor: not-allowed; }\n\n.xpm-toast {\n position: fixed;\n top: 24px;\n left: 50%;\n transform: translateX(-50%);\n z-index: 1000;\n padding: 8px 16px;\n border-radius: 6px;\n background: rgba(20, 20, 24, 0.92);\n color: #fff;\n font-size: 13px;\n line-height: 20px;\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.18);\n opacity: 0;\n transition: opacity 0.18s ease;\n pointer-events: none;\n}\n.xpm-toast--visible { opacity: 1; }\n',this.shadow.appendChild(t),this.overlay=document.createElement("div"),this.overlay.className="xpm-overlay",this.overlay.addEventListener("click",()=>this.callbacks.onClose()),this.shadow.appendChild(this.overlay),this.panel=document.createElement("div"),this.panel.className="xpm-panel",this.shadow.appendChild(this.panel),document.body.appendChild(this.host),this.shadow.addEventListener("click",this.docClickHandler),this.renderAll(),requestAnimationFrame(()=>{var t,e;null==(t=this.overlay)||t.classList.add("xpm-overlay--visible"),null==(e=this.panel)||e.classList.add("xpm-panel--visible")})}unmount(){var t;this.host&&(null==(t=this.shadow)||t.removeEventListener("click",this.docClickHandler),this.host.remove(),this.host=null,this.shadow=null,this.overlay=null,this.panel=null,this.toastEl=null,this.toastTimer&&(clearTimeout(this.toastTimer),this.toastTimer=null))}playClose(){return new Promise(t=>{var e,n;null==(e=this.overlay)||e.classList.remove("xpm-overlay--visible"),null==(n=this.panel)||n.classList.remove("xpm-panel--visible"),setTimeout(()=>t(),250)})}setState(t){Object.assign(this.state,t),this.renderAll()}getState(){return this.state}showToast(t){this.shadow&&(this.toastEl||(this.toastEl=document.createElement("div"),this.toastEl.className="xpm-toast",this.shadow.appendChild(this.toastEl)),this.toastEl.textContent=t,this.toastEl.classList.add("xpm-toast--visible"),this.toastTimer&&clearTimeout(this.toastTimer),this.toastTimer=window.setTimeout(()=>{var t;null==(t=this.toastEl)||t.classList.remove("xpm-toast--visible")},2200))}renderAll(){this.panel&&(this.panel.innerHTML="",this.panel.appendChild(this.renderHeader()),this.panel.appendChild(this.renderBanner()),this.panel.appendChild(this.renderList()),this.panel.appendChild(this.renderFooter()))}renderHeader(){const t=document.createElement("header");t.className="xpm-header";const e=document.createElement("span");e.className="xpm-header__title",e.textContent=this.i18n.t("shopify_supplies_kit");const n=document.createElement("button");return n.className="xpm-icon-btn",n.setAttribute("aria-label",this.i18n.t("close")),n.innerHTML=((t=16)=>j('<path d="M18 6 6 18"/><path d="m6 6 12 12"/>',t))(16),n.addEventListener("click",()=>this.callbacks.onClose()),t.appendChild(e),t.appendChild(n),t}renderBanner(){const t=document.createElement("div");t.className="xpm-banner";const e=u.find(t=>t.value===this.state.currentShopName)||u[0],n=e&&f[e.value]||"country_usa",o=this.i18n.t(n),i=document.createElement("span");i.className="xpm-banner__text",i.textContent=this.i18n.t("current_country_notice",{country:o});const a=document.createElement("div");a.className="xpm-dropdown"+(this.state.shopMenuOpen?" xpm-dropdown--open":""),a.dataset.xpmStop="1";const s=document.createElement("button");s.type="button",s.className="xpm-dropdown__trigger",s.addEventListener("click",t=>{t.stopPropagation(),this.setState({shopMenuOpen:!this.state.shopMenuOpen,openSelect:null})});const r=document.createElement("span");if(r.className="xpm-dropdown__selected",null==e?void 0:e.icon){const t=document.createElement("img");t.src=e.icon,t.alt="",t.className="xpm-flag",r.appendChild(t)}const c=document.createElement("span"),l=e?m[e.value]:void 0;c.textContent=l?this.i18n.t(l):(null==e?void 0:e.label)||"",r.appendChild(c),s.appendChild(r);const d=document.createElement("span");if(d.innerHTML=this.state.shopMenuOpen?F(16):$(16),s.appendChild(d),a.appendChild(s),this.state.shopMenuOpen){const t=document.createElement("div");t.className="xpm-dropdown__menu",u.forEach(e=>{const n=document.createElement("button");if(n.type="button",n.className="xpm-dropdown__item",e.icon){const t=document.createElement("img");t.src=e.icon,t.alt="",t.className="xpm-dropdown__item-icon",n.appendChild(t)}const o=document.createElement("span"),i=m[e.value];o.textContent=i?this.i18n.t(i):e.label,n.appendChild(o),n.addEventListener("click",t=>{t.stopPropagation(),this.setState({shopMenuOpen:!1}),this.callbacks.onShopChange(e.value)}),t.appendChild(n)}),a.appendChild(t)}return t.appendChild(i),t.appendChild(a),t}renderList(){const t=document.createElement("div");if(t.className="xpm-list",this.state.loading){const e=document.createElement("div");e.className="xpm-placeholder";const n=document.createElement("div");n.className="xpm-spinner";const o=document.createElement("span");return o.textContent=this.i18n.t("loading"),e.appendChild(n),e.appendChild(o),t.appendChild(e),t}if(0===this.state.productList.length){const e=document.createElement("div");return e.className="xpm-placeholder",e.textContent=this.i18n.t("no_items_in_cart"),t.appendChild(e),t}return this.state.productList.forEach(e=>t.appendChild(this.renderCard(e))),t}renderCard(t){const e=T(t),n=e.length>0,o=this.state.productSelectedOptions[t.uid]||function(t){const e=T(t),n={};if(!e.length)return n;e.forEach(t=>n[t]="");const o=function(t){const e=t.variants;if(!(null==e?void 0:e.length))return null;if(t.defaultVariant){const n=e.find(e=>e.id===t.defaultVariant);if(n)return n}return e.find(t=>t.isBind)||e[0]||null}(t);return(null==o?void 0:o.option)?e.forEach(t=>{const e=o.option[t];e&&""!==e.trim()&&(n[t]=e)}):e.forEach((o,i)=>{const a=A(t,e,i,n);a[0]&&(n[o]=a[0])}),n}(t);this.state.productSelectedOptions[t.uid]||(this.state.productSelectedOptions[t.uid]=o);const i=N(t,o),a=!0===(null==i?void 0:i.outOfStock),s=E(i),r=a||this.state.checkedUids.includes(t.uid),c=document.createElement("div");c.className="xpm-row"+(n?" xpm-row--has-options":"");const l=document.createElement("div");l.className="xpm-row__media";const d=document.createElement("div");d.className="xpm-row__thumb";const p=document.createElement("img"),h=((null==i?void 0:i.image)&&""!==i.image.trim()?i.image:t.image)||"";if(h&&(p.src=h),p.alt=t.displayName||t.title||"",d.appendChild(p),a){const t=document.createElement("div");t.className="xpm-row__sold-out",t.textContent=this.i18n.t("sold_out"),d.appendChild(t)}l.appendChild(d);const u=document.createElement("label");u.className="xpm-checkbox"+(r?" xpm-checkbox--checked":"")+(a?" xpm-checkbox--disabled":"");const m=document.createElement("input");m.type="checkbox",m.checked=r,m.disabled=a,m.addEventListener("change",e=>{if(!s)return;const n=e.target.checked,o=new Set(this.state.checkedUids);n?o.add(t.uid):o.delete(t.uid),this.setState({checkedUids:Array.from(o)})});const f=document.createElement("span");f.className="xpm-checkbox__box",r&&(f.innerHTML=((t=12)=>j('<path d="M20 6 9 17l-5-5"/>',t))(12)),u.appendChild(m),u.appendChild(f),l.appendChild(u),c.appendChild(l);const x=document.createElement("div");x.className="xpm-row__info";const g=document.createElement("div");if(g.className="xpm-row__name",g.textContent=t.displayName||t.title||"",g.title=g.textContent,x.appendChild(g),n){const n=document.createElement("div");n.className="xpm-variants",e.forEach((i,a)=>{n.appendChild(this.renderSelect(t,i,a,e,o))}),x.appendChild(n)}const _=document.createElement("div");_.className="xpm-row__meta"+(n?" xpm-row__meta--with-options":"");const y=document.createElement("div");y.className="xpm-price-group";const b=parseFloat(String((null==i?void 0:i.price)??"0"))||0,w=parseFloat(String((null==i?void 0:i.compareAtPrice)??"0"))||0;if(w>b&&w>0){const t=Math.round((w-b)/w*100),e=document.createElement("span");e.className="xpm-price-group__discount",e.textContent=`-${t}%`,y.appendChild(e)}const v=document.createElement("span");if(v.className="xpm-price-group__current",v.textContent=(null==i?void 0:i.displayPrice)||C((null==i?void 0:i.price)||"0.00"),y.appendChild(v),null==i?void 0:i.compareAtPrice){const t=document.createElement("span");t.className="xpm-price-group__compare",t.textContent=i.displayCompareAtPrice||C(i.compareAtPrice),y.appendChild(t)}_.appendChild(y);const k=document.createElement("div");k.className="xpm-row__actions";const S=document.createElement("div");S.className="xpm-qty";const L=document.createElement("button");L.className="xpm-qty__btn",L.innerHTML=((t=14)=>j('<path d="M5 12h14"/>',t))(14),L.disabled=(t.quantity||1)<=1||!s,L.addEventListener("click",()=>this.changeQty(t,-1));const I=document.createElement("span");I.className="xpm-qty__value",I.textContent=String(t.quantity||1);const U=document.createElement("button");return U.className="xpm-qty__btn",U.innerHTML=((t=14)=>j('<path d="M5 12h14"/><path d="M12 5v14"/>',t))(14),U.disabled=!s,U.addEventListener("click",()=>this.changeQty(t,1)),S.appendChild(L),S.appendChild(I),S.appendChild(U),k.appendChild(S),_.appendChild(k),x.appendChild(_),c.appendChild(x),c}renderSelect(t,e,n,o,i){var a,s;const r=(null==(a=this.state.openSelect)?void 0:a.uid)===t.uid&&(null==(s=this.state.openSelect)?void 0:s.key)===e,c=document.createElement("div");c.className="xpm-select"+(r?" xpm-select--open":""),c.dataset.xpmStop="1";const l=document.createElement("button");l.type="button",l.className="xpm-select__trigger";const d=i[e]||"";d||l.classList.add("xpm-select__trigger--placeholder");const p=document.createElement("span");p.textContent=d||"",l.appendChild(p);const h=document.createElement("span");if(h.innerHTML=r?F(14):$(14),l.appendChild(h),l.addEventListener("click",n=>{n.stopPropagation(),this.setState({openSelect:r?null:{uid:t.uid,key:e},shopMenuOpen:!1})}),c.appendChild(l),r){const a=A(t,o,n,i),s=document.createElement("div");s.className="xpm-select__menu",a.forEach(i=>{const a=document.createElement("button");a.type="button",a.className="xpm-select__option"+(i===d?" xpm-select__option--selected":""),a.textContent=i,a.addEventListener("click",a=>{a.stopPropagation(),this.handleVariantChange(t,o,e,n,i)}),s.appendChild(a)}),c.appendChild(s)}return c}handleVariantChange(t,e,n,o,i){const a={...this.state.productSelectedOptions[t.uid]||{}};a[n]=i;for(let l=o+1;l<e.length;l++){const n=e[l];a[n]="";const o=A(t,e,l,{...a});o[0]&&(a[n]=o[0])}const s={...this.state.productSelectedOptions,[t.uid]:a},r=N(t,a),c=new Set(this.state.checkedUids);E(r)?c.add(t.uid):c.delete(t.uid),this.setState({productSelectedOptions:s,checkedUids:Array.from(c),openSelect:null})}changeQty(t,e){const n=(t.quantity||1)+e;n<1||(t.quantity=n,this.setState({}))}renderFooter(){const t=document.createElement("footer");t.className="xpm-footer";const e=document.createElement("div");e.className="xpm-footer__inner";let n=0,o=!1;this.state.checkedUids.forEach(t=>{const e=this.state.productList.find(e=>e.uid===t);if(!e)return;const i=N(e,this.state.productSelectedOptions[t]||{});i&&(E(i)&&(o=!0),i.price&&(n+=(parseFloat(String(i.price))||0)*(e.quantity||1)))});const i=document.createElement("div");i.className="xpm-footer__total-block";const a=document.createElement("div");a.className="xpm-footer__total-row";const s=document.createElement("span");s.className="xpm-footer__total-label",s.textContent=this.i18n.t("total");const r=document.createElement("span");r.className="xpm-footer__total-price",r.textContent=C(n.toFixed(2)),a.appendChild(s),a.appendChild(r);const c=document.createElement("p");c.className="xpm-footer__warning",c.textContent=this.i18n.t("discount_notice"),i.appendChild(a),i.appendChild(c);const l=document.createElement("button");return l.className="xpm-buy-now",l.textContent=this.state.checkoutLoading?this.i18n.t("loading"):this.i18n.t("buy_now"),l.disabled=!o||this.state.checkoutLoading,l.addEventListener("click",()=>this.callbacks.onCheckout()),e.appendChild(i),e.appendChild(l),t.appendChild(e),t}handleDocClick(t){t.composedPath().some(t=>{var e;return"1"===(null==(e=null==t?void 0:t.dataset)?void 0:e.xpmStop)})||(this.state.openSelect||this.state.shopMenuOpen)&&this.setState({openSelect:null,shopMenuOpen:!1})}}const P=new class{constructor(){n(this,"options",null),n(this,"apiBaseUrl",o),n(this,"i18n",new U),n(this,"shopify",new k),n(this,"renderer",null),n(this,"state",this.createInitialState()),n(this,"accessoryCache",null)}createInitialState(){return{productList:[],currentShopName:"",loading:!1,checkoutLoading:!1,checkedUids:[],productSelectedOptions:{},shopMenuOpen:!1,openSelect:null}}init(t){if(!t||!t.generatorId||!t.accessoryType)throw new Error("[GeneratorMaterialPurchase] init requires generatorId and accessoryType");this.options=t,this.apiBaseUrl=t.apiBaseUrl||o,this.i18n.setLocale(t.locale||"en"),this.i18n.extend(t.messages)}async open(){var t,e,n;if(!this.options)throw new Error("[GeneratorMaterialPurchase] call init() before open()");this.state=this.createInitialState(),this.renderer=new O(this.state,this.i18n,{onClose:()=>this.close(),onShopChange:t=>this.handleShopChange(t),onCheckout:()=>this.handleCheckout()},this.options.zIndex||9999),this.renderer.mount(),this.renderer.setState({loading:!0});try{let t=localStorage.getItem(x)||"";if(!t||!u.find(e=>e.value===t))try{const e=await(n=this.apiBaseUrl,w({baseURL:n,url:"/community/v2/web/ip/location",method:"GET"}));t=function(t){if(!t)return a;switch(t.continent){case"EU":switch(t.country){case"GB":case"GG":case"IM":case"JE":return h;case"DE":case"AT":return d;case"FR":case"LU":case"MC":return p;default:return l}case"AS":return"JP"===t.country?c:a;case"NA":return"CA"===t.country?s:a;case"OC":return"AU"===t.country?r:a;default:return a}}(e)}catch{t=a}await this.shopify.init(t),this.renderer.setState({currentShopName:this.shopify.currentShopName}),await this.loadProducts(!1)}catch(o){null==(e=(t=this.options).onError)||e.call(t,o),this.renderer.setState({loading:!1}),this.renderer.showToast(this.i18n.t("failed_load_product_list"))}}close(){var t,e;if(!this.renderer)return;const n=this.renderer;this.renderer=null,n.playClose().then(()=>n.unmount()),null==(e=null==(t=this.options)?void 0:t.onClose)||e.call(t)}destroy(){this.renderer&&(this.renderer.unmount(),this.renderer=null),this.options=null,this.shopify=new k,this.accessoryCache=null}async handleShopChange(t){var e,n;if(this.renderer&&this.options){this.renderer.setState({loading:!0,productList:[],checkedUids:[],productSelectedOptions:{}});try{await this.shopify.changeShop(t),this.renderer.setState({currentShopName:this.shopify.currentShopName}),await this.loadProducts(!0)}catch(o){null==(n=(e=this.options).onError)||n.call(e,o),this.renderer.setState({loading:!1}),this.renderer.showToast(this.i18n.t("failed_load_product_list"))}}}async loadProducts(t){var e,n,o,i,a;if(this.renderer&&this.options)try{let n;!t&&(null==(e=this.accessoryCache)?void 0:e.length)?n=this.accessoryCache:(n=await(i=this.apiBaseUrl,a={store:this.shopify.currentShopName,generatorId:this.options.generatorId,accessoryType:this.options.accessoryType},w({baseURL:i,url:"/community/v1/web/generator-accessory-pack",method:"GET",params:a})),this.accessoryCache=n);const o=(n||[]).map((t,e)=>({...t,uid:t.uid??S(t,e),quantity:t.quantity||1}));!function(t){t.forEach(t=>{var e;null==(e=t.variants)||e.forEach(t=>{t.displayPrice=C(t.price||"0.00"),t.displayCompareAtPrice=t.compareAtPrice?C(t.compareAtPrice):""})})}(o);const s=[];o.forEach(t=>{E(N(t,{}))&&s.push(t.uid)}),this.renderer.setState({productList:o,checkedUids:s,productSelectedOptions:{},loading:!1})}catch(s){null==(o=(n=this.options).onError)||o.call(n,s),this.renderer.setState({loading:!1}),this.renderer.showToast(this.i18n.t("failed_load_product_list"))}}async handleCheckout(){var t,e,n;if(!this.renderer||!this.options)return;if(0===this.state.checkedUids.length)return;const o=this.options;this.renderer.setState({checkoutLoading:!0});try{let t=0;const e=this.state.checkedUids.map(e=>{const n=this.state.productList.find(t=>t.uid===e);if(!n)return null;const o=N(n,this.state.productSelectedOptions[e]||{});return(null==o?void 0:o.id)?E(o)?{merchandiseId:String(o.id),quantity:n.quantity||1}:(t+=1,null):null}).filter(Boolean);if(0===e.length){const e=t>0?"selected_items_out_of_stock":"no_valid_products_selected";return void this.renderer.showToast(this.i18n.t(e))}let n;try{const t=e.map(t=>({variantId:t.merchandiseId,productQuantity:t.quantity,store:this.shopify.currentShopName,relatedObjectId:1,relatedObjectType:o.generatorId,pageSource:"generator"})),i=await function(t,e){return w({baseURL:t,url:"/community/v1/web/distribution/order",method:"POST",data:{productContent:e}})}(this.apiBaseUrl,t);n=null==i?void 0:i.trackId}catch(i){}const a=await this.shopify.createCheckout(e,{trackId:n});(null==a?void 0:a.checkoutUrl)&&(o.onCheckoutSuccess?o.onCheckoutSuccess(a.checkoutUrl):window.open(a.checkoutUrl,"_blank"))}catch(i){null==(t=o.onError)||t.call(o,i),null==(e=this.renderer)||e.showToast(this.i18n.t("checkout_failed"))}finally{null==(n=this.renderer)||n.setState({checkoutLoading:!1})}}},z={init:t=>P.init(t),open:()=>P.open(),close:()=>P.close(),destroy:()=>P.destroy()};"undefined"!=typeof window&&(window.GeneratorMaterialPurchase=z),t.GeneratorMaterialPurchase=z,t.default=z,Object.defineProperties(t,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
|
|
2
|
+
//# sourceMappingURL=index.umd.js.map
|