the-foxy-library 1.0.20 → 1.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/cjs/{factory-DOvX72Vv.js → factory-NSOuLE3E.js} +4 -3
  2. package/dist/cjs/factory-NSOuLE3E.js.map +1 -0
  3. package/dist/cjs/ion-icon_12.cjs.entry.js +1 -1
  4. package/dist/cjs/iv-card_3.cjs.entry.js +1 -1
  5. package/dist/cjs/iv-dynamic-products-carousel.cjs.entry.js +1 -1
  6. package/dist/cjs/iv-dynamic-products.cjs.entry.js +1 -1
  7. package/dist/cjs/iv-recently-viewed.cjs.entry.js +1 -1
  8. package/dist/collection/utils/storefront_api/factory.js +2 -1
  9. package/dist/collection/utils/storefront_api/factory.js.map +1 -1
  10. package/dist/components/iv-card.js +1 -1
  11. package/dist/components/iv-dynamic-products-carousel.js +2 -2
  12. package/dist/components/iv-dynamic-products.js +2 -2
  13. package/dist/components/iv-modal.js +1 -1
  14. package/dist/components/iv-recently-viewed.js +2 -2
  15. package/dist/components/iv-sidebar.js +1 -1
  16. package/dist/components/iv-suggest.js +1 -1
  17. package/dist/components/iv-wishlist-view.js +1 -1
  18. package/dist/components/{p-CTpPxZeS.js → p-BVL7DqEj.js} +4 -3
  19. package/dist/components/p-BVL7DqEj.js.map +1 -0
  20. package/dist/components/{p-CZzebQGC.js → p-DE0H3IbO.js} +3 -3
  21. package/dist/components/{p-CZzebQGC.js.map → p-DE0H3IbO.js.map} +1 -1
  22. package/dist/components/{p-DbjqrXQL.js → p-IJUHvLzw.js} +3 -3
  23. package/dist/components/{p-DbjqrXQL.js.map → p-IJUHvLzw.js.map} +1 -1
  24. package/dist/esm/{factory-CEG06b1_.js → factory-Bf2IW1Vz.js} +4 -3
  25. package/dist/esm/factory-Bf2IW1Vz.js.map +1 -0
  26. package/dist/esm/ion-icon_12.entry.js +1 -1
  27. package/dist/esm/iv-card_3.entry.js +1 -1
  28. package/dist/esm/iv-dynamic-products-carousel.entry.js +1 -1
  29. package/dist/esm/iv-dynamic-products.entry.js +1 -1
  30. package/dist/esm/iv-recently-viewed.entry.js +1 -1
  31. package/dist/intravenous/intravenous.esm.js +1 -1
  32. package/dist/intravenous/{p-b4e1f1e2.entry.js → p-28d83a02.entry.js} +2 -2
  33. package/dist/intravenous/{p-9d4362b5.entry.js → p-7e46d5b9.entry.js} +2 -2
  34. package/dist/intravenous/{p-c8ce6b0d.entry.js → p-8d726fec.entry.js} +2 -2
  35. package/dist/intravenous/p-DujflZ2b.js +2 -0
  36. package/dist/intravenous/p-DujflZ2b.js.map +1 -0
  37. package/dist/intravenous/{p-a222b1b9.entry.js → p-a28bd4eb.entry.js} +2 -2
  38. package/dist/intravenous/{p-deb1d7cf.entry.js → p-ff2b5ad8.entry.js} +2 -2
  39. package/package.json +1 -1
  40. package/dist/cjs/factory-DOvX72Vv.js.map +0 -1
  41. package/dist/components/p-CTpPxZeS.js.map +0 -1
  42. package/dist/esm/factory-CEG06b1_.js.map +0 -1
  43. package/dist/intravenous/p-DiJKGz2q.js +0 -2
  44. package/dist/intravenous/p-DiJKGz2q.js.map +0 -1
  45. /package/dist/intravenous/{p-b4e1f1e2.entry.js.map → p-28d83a02.entry.js.map} +0 -0
  46. /package/dist/intravenous/{p-9d4362b5.entry.js.map → p-7e46d5b9.entry.js.map} +0 -0
  47. /package/dist/intravenous/{p-c8ce6b0d.entry.js.map → p-8d726fec.entry.js.map} +0 -0
  48. /package/dist/intravenous/{p-a222b1b9.entry.js.map → p-a28bd4eb.entry.js.map} +0 -0
  49. /package/dist/intravenous/{p-deb1d7cf.entry.js.map → p-ff2b5ad8.entry.js.map} +0 -0
@@ -6,7 +6,8 @@ async function shopifyFetch(query, variables = {}) {
6
6
  try {
7
7
  if (!index.state.shopDomainApi || !index.state.storefrontToken)
8
8
  throw new Error('Missing Shopify configuration (shopDomain/storefrontToken)');
9
- const endpoint = `https://${index.state.shopDomainApi}/api/2025-07/graphql.json`;
9
+ // const endpoint = `https://${state.shopDomainApi}/api/2025-07/graphql.json`;
10
+ const endpoint = 'https://craftnberry-co-uk.myshopify.com/api/2025-07/graphql.json';
10
11
  console.log('[IV] Shopify Fetch to', endpoint);
11
12
  const token = index.state.storefrontToken;
12
13
  console.log('[IV] Using storefront token', token);
@@ -216,6 +217,6 @@ exports.addToCart = addToCart;
216
217
  exports.fetchProductByID = fetchProductByID;
217
218
  exports.fetchProducts = fetchProducts;
218
219
  exports.getIdFromHandle = getIdFromHandle;
219
- //# sourceMappingURL=factory-DOvX72Vv.js.map
220
+ //# sourceMappingURL=factory-NSOuLE3E.js.map
220
221
 
221
- //# sourceMappingURL=factory-DOvX72Vv.js.map
222
+ //# sourceMappingURL=factory-NSOuLE3E.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory-NSOuLE3E.js","sources":["src/utils/storefront_api/factory.ts"],"sourcesContent":["import { state, showToast } from \"../store/store\";\r\nasync function shopifyFetch(query: string, variables: Record<string, any> = {}): Promise<any> {\r\n try {\r\n if(!state.shopDomainApi || !state.storefrontToken) throw new Error('Missing Shopify configuration (shopDomain/storefrontToken)');\r\n // const endpoint = `https://${state.shopDomainApi}/api/2025-07/graphql.json`;\r\n const endpoint = 'https://craftnberry-co-uk.myshopify.com/api/2025-07/graphql.json';\r\n console.log('[IV] Shopify Fetch to', endpoint);\r\n const token = state.storefrontToken;\r\n console.log('[IV] Using storefront token', token);\r\n const res = await fetch(endpoint, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-Shopify-Storefront-Access-Token': token\r\n },\r\n body: JSON.stringify({ query, variables })\r\n });\r\n const json = await res.json();\r\n if(json.errors) throw new Error(json.errors.map((e: any) => e.message).join(', '));\r\n return json.data;\r\n } catch(error) {\r\n console.error('Shopify Fetch Error:', error);\r\n throw error; \r\n };\r\n};\r\n\r\nexport async function getIdFromHandle(handle: string): Promise<string | null> {\r\n const query = `\r\n query ($handle: String!) {\r\n product(handle: $handle) {\r\n id\r\n }\r\n }`;\r\n try {\r\n const data = await shopifyFetch(query, { handle });\r\n return data?.product?.id || null;\r\n } catch (error) {\r\n console.error('getIdFromHandle error:', error);\r\n return null;\r\n };\r\n};\r\n\r\n// Field + normalization helpers\r\nconst BASE_PRODUCT_FIELDS = ['id','handle','title'];\r\nconst DEFAULT_VARIANT_FIELDS = ['id','title','price { amount currencyCode }'];\r\n\r\nfunction mergeFields(requested: string[] | string, defaults: string[]): string[] {\r\n const req = (Array.isArray(requested) ? requested : requested.split(','))\r\n .map(f => f.trim())\r\n .filter(Boolean);\r\n const seen = new Set<string>();\r\n const ordered: string[] = [];\r\n for(const f of req) { \r\n if(!seen.has(f)) { \r\n seen.add(f); ordered.push(f); \r\n }; \r\n };\r\n for(const d of defaults) { \r\n if(!seen.has(d)) { \r\n seen.add(d); \r\n ordered.push(d); \r\n }; \r\n };\r\n return ordered;\r\n};\r\n\r\nfunction expandProductFields(fields: string[]): string {\r\n return fields\r\n .filter(f => f !== 'price')\r\n .map(f => {\r\n if(f === 'images') return 'images(first: 10) { nodes { url altText } }';\r\n return f;\r\n })\r\n .join('\\n');\r\n};\r\n\r\nfunction variantSelection(fields: string[] = DEFAULT_VARIANT_FIELDS): string {\r\n return fields.join('\\n');\r\n};\r\n\r\ninterface NormalizedProduct {\r\n id: string;\r\n handle?: string;\r\n title?: string;\r\n variantId?: string;\r\n price?: string | null;\r\n imageUrl?: string | null;\r\n imageAlt?: string | null;\r\n // index signature for dynamic requested fields\r\n [key: string]: any;\r\n};\r\n\r\nfunction normalizeProduct(product: any, selectedVariant?: any): NormalizedProduct {\r\n const variant = selectedVariant || product.variants?.edges?.[0]?.node || {};\r\n let imageUrl = null;\r\n let imageAlt = null;\r\n if(product.images?.nodes && product.images.nodes.length > 0) {\r\n imageUrl = product.images.nodes[0].url || null;\r\n imageAlt = product.images.nodes[0].altText || null;\r\n };\r\n const { id: variantId, price } = variant;\r\n return {\r\n id: product.id,\r\n ...Object.fromEntries(Object.entries(product).filter(([key]) => key !== 'variants')),\r\n variantId,\r\n price: price?.amount || null,\r\n imageUrl,\r\n imageAlt,\r\n };\r\n};\r\n\r\n// Query builders\r\nfunction buildProductsQuery(fieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($limit: Int!, $sortKey: ProductSortKeys!, $reverse: Boolean) {\r\n products(first: $limit, sortKey: $sortKey, reverse: $reverse) {\r\n edges {\r\n node {\r\n ${fieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }\r\n }\r\n }`;\r\n};\r\n\r\nfunction buildCollectionProductsQuery(fieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($handle: String!, $limit: Int!, $sortKey: ProductCollectionSortKeys!, $reverse: Boolean) {\r\n collection(handle: $handle) {\r\n products(first: $limit, sortKey: $sortKey, reverse: $reverse) {\r\n edges {\r\n node {\r\n ${fieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }\r\n }\r\n }\r\n }`;\r\n};\r\n\r\nfunction buildSingleProductQuery(fieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($id: ID!) {\r\n product(id: $id) {\r\n ${fieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }`;\r\n};\r\n\r\nfunction buildVariantProductQuery(productFieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($id: ID!) {\r\n productVariant(id: $id) {\r\n ${variantFieldsString}\r\n product {\r\n ${productFieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }\r\n }`;\r\n};\r\n\r\n// Public API\r\nexport async function fetchProducts(limit: number, collectionHandle: string, sortKey: string, fields: string[] | string, reversed: boolean = false) {\r\n try {\r\n const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);\r\n const fieldsString = expandProductFields(merged);\r\n const variantFieldsString = variantSelection();\r\n const isAll = !collectionHandle || collectionHandle === 'all';\r\n const query = isAll ? buildProductsQuery(fieldsString, variantFieldsString) : buildCollectionProductsQuery(fieldsString, variantFieldsString);\r\n const reverse = !!reversed;\r\n const variables: Record<string, any> = isAll ? { limit, sortKey, reverse } : { handle: collectionHandle, limit, sortKey, reverse };\r\n const data = await shopifyFetch(query, variables);\r\n const productEdges = data.products?.edges || data.collection?.products?.edges || [];\r\n return productEdges.map((edge: any) => normalizeProduct(edge.node));\r\n } catch(error) { \r\n console.error('Fetch Products Error:', error); throw error;\r\n };\r\n};\r\n\r\nexport async function fetchProductByID(id: string, fields: string[] | string, options?: { variantId?: string }): Promise<NormalizedProduct | null> {\r\n try {\r\n if(options?.variantId) return await getVariantProduct(options.variantId, fields);\r\n const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);\r\n const fieldsString = expandProductFields(merged);\r\n const variantFieldsString = variantSelection();\r\n const query = buildSingleProductQuery(fieldsString, variantFieldsString);\r\n const data = await shopifyFetch(query, { id });\r\n const product = data?.product;\r\n if(!product) return null;\r\n return normalizeProduct(product);\r\n } catch(error) { console.error('Fetch Product By ID Error:', error); throw error; };\r\n};\r\n\r\nexport async function getVariantProduct(variantId: string, fields: string[] | string): Promise<NormalizedProduct | null> {\r\n try {\r\n const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);\r\n const productFieldsString = expandProductFields(merged);\r\n const variantFieldsString = variantSelection();\r\n const query = buildVariantProductQuery(productFieldsString, variantFieldsString);\r\n const data = await shopifyFetch(query, { id: variantId });\r\n const variantNode = data?.productVariant;\r\n if(!variantNode) return null;\r\n const product = variantNode.product;\r\n if(!product) return null;\r\n return normalizeProduct(product, variantNode); \r\n } catch(error) { console.error('Get Variant Product Error:', error); throw error; };\r\n};\r\n\r\nexport async function addToCart(options: {\r\n id: number;\r\n quantity?: number;\r\n properties?: Record<string, any>;\r\n}) {\r\n try {\r\n console.log('IV add to cart called');\r\n if(!options.id) throw new Error('No variant id provided for addToCart');\r\n const quantity = options.quantity || 1;\r\n const properties = options.properties || {};\r\n const payload = {\r\n items: [\r\n {\r\n id: options.id,\r\n quantity,\r\n properties\r\n }\r\n ]\r\n };\r\n const url = '/cart/add.js';\r\n const res = await fetch(url, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Accept': 'application/json',\r\n 'X-Requested-With': 'XMLHttpRequest'\r\n },\r\n body: JSON.stringify(payload)\r\n });\r\n if(!res.ok) {\r\n const errorText = await res.text();\r\n throw new Error(errorText);\r\n };\r\n const cartItem = await res.json();\r\n showToast('Added to cart!', 'success', 3000);\r\n return cartItem;\r\n } catch (error) {\r\n showToast('Error adding to cart', 'error', 5000);\r\n throw error;\r\n };\r\n};"],"names":["state","showToast"],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
 
3
3
  var index = require('./index-LRS48Qt3.js');
4
4
  var factory = require('./factory-DYuJXHFx.js');
5
- var factory$1 = require('./factory-DOvX72Vv.js');
5
+ var factory$1 = require('./factory-NSOuLE3E.js');
6
6
 
7
7
  let CACHED_MAP;
8
8
  const getIconMap = () => {
@@ -2,7 +2,7 @@
2
2
 
3
3
  var index = require('./index-LRS48Qt3.js');
4
4
  var factory = require('./factory-DYuJXHFx.js');
5
- var factory$1 = require('./factory-DOvX72Vv.js');
5
+ var factory$1 = require('./factory-NSOuLE3E.js');
6
6
 
7
7
  const ivCardCss = ".iv-card{display:var(--iv-card-display, block);box-sizing:border-box;padding:var(--iv-card-padding, 0);margin:var(--iv-card-margin, 0);background:var(--iv-card-bg, transparent);color:var(--iv-card-color, inherit);border:var(--iv-card-border, none);border-radius:var(--iv-card-border-radius, 0);box-shadow:var(--iv-card-shadow, none);font-size:var(--iv-card-font-size, inherit);line-height:var(--iv-card-line-height, 1.4);position:relative;text-decoration:none;transition:var(--iv-card-transition, background-color 0.2s ease, color 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease);gap:var(--iv-card-gap, 0.75rem);display:var(--iv-card-layout, flex);flex-direction:var(--iv-card-flex-direction, column)}.iv-card a,.iv-card a:visited,.iv-card a:hover,.iv-card a:focus{text-decoration:var(--iv-card-link-text-decoration, none);color:var(--iv-card-link-color, inherit)}.iv-card[href],.iv-card.is-interactive{cursor:pointer}.iv-card[href]:hover,.iv-card[href]:focus-visible,.iv-card.is-interactive:hover,.iv-card.is-interactive:focus-visible{background:var(--iv-card-hover-bg, var(--iv-card-bg, transparent));border:var(--iv-card-hover-border, var(--iv-card-border, none));box-shadow:var(--iv-card-hover-shadow, var(--iv-card-shadow, none));outline:var(--iv-card-focus-outline, none);box-shadow:var(--iv-card-focus-ring, var(--iv-card-hover-shadow, var(--iv-card-shadow, none)))}.iv-card-link-wrapper{display:var(--iv-card-link-wrapper-display, contents);text-decoration:none;color:inherit;cursor:pointer}.iv-card-field{display:block;margin:0;padding:0;font-weight:var(--iv-card-field-font-weight, inherit);color:var(--iv-card-field-color, inherit);word-break:break-word;text-decoration:none}.iv-card .iv-card-add-to-cart-btn{position:relative;z-index:2}.iv-card-link-wrapper:hover .iv-card-field,.iv-card-link-wrapper:focus-visible .iv-card-field{text-decoration:none}.iv-card-link-wrapper:hover,.iv-card-link-wrapper:focus-visible{background:var(--iv-card-link-hover-bg, var(--iv-card-hover-bg, transparent))}.iv-card-image{display:block;width:100%;height:auto;aspect-ratio:var(--iv-card-image-aspect-ratio, auto);object-fit:var(--iv-card-image-object-fit, cover);border-radius:var(--iv-card-image-border-radius, var(--iv-card-border-radius, 0));background:var(--iv-card-image-bg, transparent)}.iv-card-title{font-weight:var(--iv-card-heading-font-weight, 600);font-size:var(--iv-card-title-font-size, 1em);line-height:var(--iv-card-title-line-height, 1.2)}.iv-card-price{color:var(--iv-card-price-color, inherit);font-weight:var(--iv-card-price-weight, 500)}.iv-card-controls{display:flex;flex-wrap:wrap;gap:var(--iv-card-control-gap, 0.5rem);align-items:center;margin-top:var(--iv-card-controls-margin-top, var(--iv-card-gap, 0.75rem))}.iv-card-add-to-cart-btn{--iv-button-variant:var(--iv-card-button-variant, primary)}.iv-card-inner{width:100%;display:contents}@media (prefers-reduced-motion: reduce){.iv-card{transition:none}}";
8
8
 
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var index = require('./index-LRS48Qt3.js');
4
- var factory = require('./factory-DOvX72Vv.js');
4
+ var factory = require('./factory-NSOuLE3E.js');
5
5
  var productCache = require('./productCache-DAt5ukE_.js');
6
6
 
7
7
  const ivDynamicProductsCarouselCss = ":host{display:block}.iv-dynamic-products-carousel{position:relative}.iv-dynamic-products-carousel-carousel{position:relative}.iv-dynamic-products-carousel-viewport{overflow:hidden;width:100%}.iv-dynamic-products-carousel-track{display:flex;width:100%;transition:transform 0.55s cubic-bezier(0.4, 0.7, 0.2, 1);will-change:transform}.iv-dynamic-products-carousel-slide{flex:0 0 100%;box-sizing:border-box;padding:0.25rem 0.5rem;display:grid;grid-template-columns:repeat(6, minmax(0, 1fr));gap:1rem;align-items:stretch;grid-auto-rows:1fr}@media (max-width: 1200px){.iv-dynamic-products-carousel-slide{grid-template-columns:repeat(4, minmax(0, 1fr))}}@media (max-width: 900px){.iv-dynamic-products-carousel-slide{grid-template-columns:repeat(3, minmax(0, 1fr))}}@media (max-width: 640px){.iv-dynamic-products-carousel-slide{grid-template-columns:repeat(2, minmax(0, 1fr));gap:0.75rem}}.iv-dynamic-products-carousel-card{height:100%;display:flex;flex-direction:column;background:#fff;padding:0.75rem 0.75rem 0.9rem;box-shadow:0 2px 6px rgba(0, 0, 0, 0.08);transition:box-shadow 0.2s ease, transform 0.2s ease}.iv-dynamic-products-carousel-card .iv-card-title{line-height:1.2;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;overflow:hidden;min-height:2.4em}.iv-dynamic-products-carousel-card .iv-card-controls{margin-top:auto;}.iv-dynamic-products-carousel-card:hover{box-shadow:0 4px 14px rgba(0, 0, 0, 0.15);transform:translateY(-2px)}.iv-dynamic-products-carousel-card:active{transform:translateY(0);box-shadow:0 2px 6px rgba(0, 0, 0, 0.12)}.iv-dynamic-products-carousel-card img,.iv-dynamic-products-carousel-card picture,.iv-dynamic-products-carousel-card .media{width:100%;aspect-ratio:1/1;object-fit:contain;display:flex;align-items:center;justify-content:center;margin:0 0 0.65rem}.iv-dynamic-products-carousel-nav{position:absolute;top:50%;transform:translateY(-50%);background:var(--iv-carousel-nav-bg, rgba(0, 0, 0, 0.55));color:#fff;border:none;width:2.75rem;height:2.75rem;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;backdrop-filter:blur(6px);box-shadow:0 4px 12px rgba(0, 0, 0, 0.25);transition:background 0.2s ease, transform 0.2s ease;outline:none;z-index:10}.iv-dynamic-products-carousel-nav:focus-visible{outline:2px solid #fff;outline-offset:3px}.iv-dynamic-products-carousel-nav:hover:not(:disabled){background:var(--iv-carousel-nav-bg-hover, rgba(0, 0, 0, 0.75));transform:translateY(-50%) scale(1.05);box-shadow:0 6px 18px rgba(0, 0, 0, 0.35)}.iv-dynamic-products-carousel-nav:disabled{opacity:0.4;cursor:default}.iv-dynamic-products-carousel-nav-prev{left:0.25rem}.iv-dynamic-products-carousel-nav-next{right:0.25rem}.iv-dynamic-products-carousel-status{margin-top:0.75rem;font-size:0.875rem;text-align:center;color:var(--iv-carousel-status-color, #555)}.iv-dynamic-products-carousel-viewport::-webkit-scrollbar{display:none}.iv-dynamic-products-carousel-viewport{-ms-overflow-style:none;scrollbar-width:none}";
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var index = require('./index-LRS48Qt3.js');
4
- var factory = require('./factory-DOvX72Vv.js');
4
+ var factory = require('./factory-NSOuLE3E.js');
5
5
  var productCache = require('./productCache-DAt5ukE_.js');
6
6
 
7
7
  const ivDynamicProductsCss = ".iv-dynamic-products{box-sizing:border-box;width:var(--iv-dynamic-products-width, 100%);max-width:var(--iv-dynamic-products-max-width, 100%);margin:var(--iv-dynamic-products-margin, 0);padding:var(--iv-dynamic-products-padding, 0);background:var(--iv-dynamic-products-bg, transparent);border:var(--iv-dynamic-products-border, none);border-radius:var(--iv-dynamic-products-radius, 0);box-shadow:var(--iv-dynamic-products-shadow, none);color:var(--iv-dynamic-products-color, inherit);--iv-layout-gap:var(--iv-dynamic-products-gap, 1.5rem)}.iv-dynamic-products-title{margin:var(--iv-dynamic-products-title-margin, 0 0 1rem 0);font-size:var(--iv-dynamic-products-title-font-size, clamp(1.125rem, 1vw + 1rem, 1.75rem));font-weight:var(--iv-dynamic-products-title-font-weight, 600);line-height:var(--iv-dynamic-products-title-line-height, 1.2);letter-spacing:var(--iv-dynamic-products-title-letter-spacing, normal)}.iv-dynamic-products-error,.iv-dynamic-products-empty{padding:var(--iv-dynamic-products-state-padding, 1rem);border:var(--iv-dynamic-products-state-border, none);background:var(--iv-dynamic-products-state-bg, transparent);color:var(--iv-dynamic-products-state-color, inherit);font-size:var(--iv-dynamic-products-state-font-size, 0.875rem);text-align:var(--iv-dynamic-products-state-text-align, center)}.iv-dynamic-products-products{width:100%;margin:var(--iv-dynamic-products-products-margin, 0);padding:var(--iv-dynamic-products-products-padding, 0)}.iv-layout--iv-dynamic-products-layout{--iv-layout-gap:var(--iv-dynamic-products-grid-gap, var(--iv-dynamic-products-gap, 1.5rem));align-items:var(--iv-dynamic-products-grid-align, stretch);justify-content:var(--iv-dynamic-products-grid-justify, flex-start)}.iv-dynamic-products .iv-card{margin:var(--iv-dynamic-products-card-margin, 0);--iv-card-padding:var(--iv-dynamic-products-card-padding, var(--iv-card-padding, 0))}@media (min-width: 40rem){.iv-dynamic-products{--iv-dynamic-products-gap:var(--iv-dynamic-products-gap-md, var(--iv-dynamic-products-gap, 1.5rem))}}@media (min-width: 64rem){.iv-dynamic-products{--iv-dynamic-products-gap:var(--iv-dynamic-products-gap-lg, var(--iv-dynamic-products-gap, 1.5rem))}}.iv-dynamic-products--scroll-x .iv-layout--iv-dynamic-products-layout{display:flex !important;overflow-x:auto;scrollbar-width:var(--iv-dynamic-products-scrollbar-width, thin);-webkit-overflow-scrolling:touch}.iv-dynamic-products--scroll-x .iv-layout--iv-dynamic-products-layout>*{flex:0 0 var(--iv-dynamic-products-scroll-item-width, 75%)}@media (prefers-reduced-motion: reduce){.iv-dynamic-products{scroll-behavior:auto}}";
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var index = require('./index-LRS48Qt3.js');
4
- var factory$1 = require('./factory-DOvX72Vv.js');
4
+ var factory$1 = require('./factory-NSOuLE3E.js');
5
5
  var factory = require('./factory-DYuJXHFx.js');
6
6
 
7
7
  const ivRecentlyViewedCss = ".iv-recently-viewed{background:var(--iv-recently-viewed-background, none);padding:var(--iv-recently-viewed-padding, 1rem 0);margin:var(--iv-recently-viewed-margin, 0);border:var(--iv-recently-viewed-border, none);border-radius:var(--iv-recently-viewed-radius, 0);position:relative;box-sizing:border-box;width:100%;display:block}.iv-recently-viewed-title{margin:var(--iv-recently-viewed-title-margin, 0 0 0.75rem);font-size:var(--iv-recently-viewed-title-font-size, 1.25rem);line-height:var(--iv-recently-viewed-title-line-height, 1.2);font-weight:var(--iv-recently-viewed-title-weight, 600);color:var(--iv-recently-viewed-title-color, inherit)}.iv-recently-viewed__list,.iv-recently-viewed__items{list-style:none;margin:0;padding:0}.iv-recently-viewed iv-layout,.iv-recently-viewed .iv-layout{--gap:var(--iv-recently-viewed-gap, 1rem);gap:var(--iv-recently-viewed-gap, 1rem)}.iv-recently-viewed iv-card,.iv-recently-viewed .iv-card{max-width:var(--iv-recently-viewed-card-max-width, 260px);width:100%}.iv-recently-viewed-no-history,.iv-recently-viewed__no-history,.iv-recently-viewed-no-history-message{font-size:var(--iv-recently-viewed-no-history-font-size, 0.875rem);color:var(--iv-recently-viewed-no-history-color, #666);padding:var(--iv-recently-viewed-no-history-padding, 0.5rem 0)}.iv-recently-viewed>*+*{margin-top:var(--iv-recently-viewed-stack-gap, 1rem)}@media (min-width: 640px){.iv-recently-viewed{padding:var(--iv-recently-viewed-padding-md, var(--iv-recently-viewed-padding, 1.25rem 0))}.iv-recently-viewed-title{font-size:var(--iv-recently-viewed-title-font-size-md, 1.375rem)}}@media (min-width: 960px){.iv-recently-viewed-title{font-size:var(--iv-recently-viewed-title-font-size-lg, 1.5rem)}}.iv-recently-viewed::after{content:var(--iv-recently-viewed-after-content, \"\");display:var(--iv-recently-viewed-after-display, none);position:absolute;left:0;right:0;bottom:0;height:1px;background:var(--iv-recently-viewed-after-border-color, currentColor);opacity:var(--iv-recently-viewed-after-opacity, 0.1)}.iv-recently-viewed[data-tight]{--iv-recently-viewed-gap:0.5rem;--iv-recently-viewed-stack-gap:0.75rem}";
@@ -3,7 +3,8 @@ async function shopifyFetch(query, variables = {}) {
3
3
  try {
4
4
  if (!state.shopDomainApi || !state.storefrontToken)
5
5
  throw new Error('Missing Shopify configuration (shopDomain/storefrontToken)');
6
- const endpoint = `https://${state.shopDomainApi}/api/2025-07/graphql.json`;
6
+ // const endpoint = `https://${state.shopDomainApi}/api/2025-07/graphql.json`;
7
+ const endpoint = 'https://craftnberry-co-uk.myshopify.com/api/2025-07/graphql.json';
7
8
  console.log('[IV] Shopify Fetch to', endpoint);
8
9
  const token = state.storefrontToken;
9
10
  console.log('[IV] Using storefront token', token);
@@ -1 +1 @@
1
- {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../../src/utils/storefront_api/factory.ts"],"names":[],"mappings":"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","sourcesContent":["import { state, showToast } from \"../store/store\";\r\n\r\nasync function shopifyFetch(query: string, variables: Record<string, any> = {}): Promise<any> {\r\n try {\r\n if(!state.shopDomainApi || !state.storefrontToken) throw new Error('Missing Shopify configuration (shopDomain/storefrontToken)');\r\n const endpoint = `https://${state.shopDomainApi}/api/2025-07/graphql.json`;\r\n console.log('[IV] Shopify Fetch to', endpoint);\r\n const token = state.storefrontToken;\r\n console.log('[IV] Using storefront token', token);\r\n const res = await fetch(endpoint, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-Shopify-Storefront-Access-Token': token\r\n },\r\n body: JSON.stringify({ query, variables })\r\n });\r\n const json = await res.json();\r\n if(json.errors) throw new Error(json.errors.map((e: any) => e.message).join(', '));\r\n return json.data;\r\n } catch(error) {\r\n console.error('Shopify Fetch Error:', error);\r\n throw error; \r\n };\r\n};\r\n\r\nexport async function getIdFromHandle(handle: string): Promise<string | null> {\r\n const query = `\r\n query ($handle: String!) {\r\n product(handle: $handle) {\r\n id\r\n }\r\n }`;\r\n try {\r\n const data = await shopifyFetch(query, { handle });\r\n return data?.product?.id || null;\r\n } catch (error) {\r\n console.error('getIdFromHandle error:', error);\r\n return null;\r\n };\r\n};\r\n\r\n// Field + normalization helpers\r\nconst BASE_PRODUCT_FIELDS = ['id','handle','title'];\r\nconst DEFAULT_VARIANT_FIELDS = ['id','title','price { amount currencyCode }'];\r\n\r\nfunction mergeFields(requested: string[] | string, defaults: string[]): string[] {\r\n const req = (Array.isArray(requested) ? requested : requested.split(','))\r\n .map(f => f.trim())\r\n .filter(Boolean);\r\n const seen = new Set<string>();\r\n const ordered: string[] = [];\r\n for(const f of req) { \r\n if(!seen.has(f)) { \r\n seen.add(f); ordered.push(f); \r\n }; \r\n };\r\n for(const d of defaults) { \r\n if(!seen.has(d)) { \r\n seen.add(d); \r\n ordered.push(d); \r\n }; \r\n };\r\n return ordered;\r\n};\r\n\r\nfunction expandProductFields(fields: string[]): string {\r\n return fields\r\n .filter(f => f !== 'price')\r\n .map(f => {\r\n if(f === 'images') return 'images(first: 10) { nodes { url altText } }';\r\n return f;\r\n })\r\n .join('\\n');\r\n};\r\n\r\nfunction variantSelection(fields: string[] = DEFAULT_VARIANT_FIELDS): string {\r\n return fields.join('\\n');\r\n};\r\n\r\ninterface NormalizedProduct {\r\n id: string;\r\n handle?: string;\r\n title?: string;\r\n variantId?: string;\r\n price?: string | null;\r\n imageUrl?: string | null;\r\n imageAlt?: string | null;\r\n // index signature for dynamic requested fields\r\n [key: string]: any;\r\n};\r\n\r\nfunction normalizeProduct(product: any, selectedVariant?: any): NormalizedProduct {\r\n const variant = selectedVariant || product.variants?.edges?.[0]?.node || {};\r\n let imageUrl = null;\r\n let imageAlt = null;\r\n if(product.images?.nodes && product.images.nodes.length > 0) {\r\n imageUrl = product.images.nodes[0].url || null;\r\n imageAlt = product.images.nodes[0].altText || null;\r\n };\r\n const { id: variantId, price } = variant;\r\n return {\r\n id: product.id,\r\n ...Object.fromEntries(Object.entries(product).filter(([key]) => key !== 'variants')),\r\n variantId,\r\n price: price?.amount || null,\r\n imageUrl,\r\n imageAlt,\r\n };\r\n};\r\n\r\n// Query builders\r\nfunction buildProductsQuery(fieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($limit: Int!, $sortKey: ProductSortKeys!, $reverse: Boolean) {\r\n products(first: $limit, sortKey: $sortKey, reverse: $reverse) {\r\n edges {\r\n node {\r\n ${fieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }\r\n }\r\n }`;\r\n};\r\n\r\nfunction buildCollectionProductsQuery(fieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($handle: String!, $limit: Int!, $sortKey: ProductCollectionSortKeys!, $reverse: Boolean) {\r\n collection(handle: $handle) {\r\n products(first: $limit, sortKey: $sortKey, reverse: $reverse) {\r\n edges {\r\n node {\r\n ${fieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }\r\n }\r\n }\r\n }`;\r\n};\r\n\r\nfunction buildSingleProductQuery(fieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($id: ID!) {\r\n product(id: $id) {\r\n ${fieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }`;\r\n};\r\n\r\nfunction buildVariantProductQuery(productFieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($id: ID!) {\r\n productVariant(id: $id) {\r\n ${variantFieldsString}\r\n product {\r\n ${productFieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }\r\n }`;\r\n};\r\n\r\n// Public API\r\nexport async function fetchProducts(limit: number, collectionHandle: string, sortKey: string, fields: string[] | string, reversed: boolean = false) {\r\n try {\r\n const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);\r\n const fieldsString = expandProductFields(merged);\r\n const variantFieldsString = variantSelection();\r\n const isAll = !collectionHandle || collectionHandle === 'all';\r\n const query = isAll ? buildProductsQuery(fieldsString, variantFieldsString) : buildCollectionProductsQuery(fieldsString, variantFieldsString);\r\n const reverse = !!reversed;\r\n const variables: Record<string, any> = isAll ? { limit, sortKey, reverse } : { handle: collectionHandle, limit, sortKey, reverse };\r\n const data = await shopifyFetch(query, variables);\r\n const productEdges = data.products?.edges || data.collection?.products?.edges || [];\r\n return productEdges.map((edge: any) => normalizeProduct(edge.node));\r\n } catch(error) { \r\n console.error('Fetch Products Error:', error); throw error;\r\n };\r\n};\r\n\r\nexport async function fetchProductByID(id: string, fields: string[] | string, options?: { variantId?: string }): Promise<NormalizedProduct | null> {\r\n try {\r\n if(options?.variantId) return await getVariantProduct(options.variantId, fields);\r\n const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);\r\n const fieldsString = expandProductFields(merged);\r\n const variantFieldsString = variantSelection();\r\n const query = buildSingleProductQuery(fieldsString, variantFieldsString);\r\n const data = await shopifyFetch(query, { id });\r\n const product = data?.product;\r\n if(!product) return null;\r\n return normalizeProduct(product);\r\n } catch(error) { console.error('Fetch Product By ID Error:', error); throw error; };\r\n};\r\n\r\nexport async function getVariantProduct(variantId: string, fields: string[] | string): Promise<NormalizedProduct | null> {\r\n try {\r\n const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);\r\n const productFieldsString = expandProductFields(merged);\r\n const variantFieldsString = variantSelection();\r\n const query = buildVariantProductQuery(productFieldsString, variantFieldsString);\r\n const data = await shopifyFetch(query, { id: variantId });\r\n const variantNode = data?.productVariant;\r\n if(!variantNode) return null;\r\n const product = variantNode.product;\r\n if(!product) return null;\r\n return normalizeProduct(product, variantNode); \r\n } catch(error) { console.error('Get Variant Product Error:', error); throw error; };\r\n};\r\n\r\nexport async function addToCart(options: {\r\n id: number;\r\n quantity?: number;\r\n properties?: Record<string, any>;\r\n}) {\r\n try {\r\n console.log('IV add to cart called');\r\n if(!options.id) throw new Error('No variant id provided for addToCart');\r\n const quantity = options.quantity || 1;\r\n const properties = options.properties || {};\r\n const payload = {\r\n items: [\r\n {\r\n id: options.id,\r\n quantity,\r\n properties\r\n }\r\n ]\r\n };\r\n const url = '/cart/add.js';\r\n const res = await fetch(url, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Accept': 'application/json',\r\n 'X-Requested-With': 'XMLHttpRequest'\r\n },\r\n body: JSON.stringify(payload)\r\n });\r\n if(!res.ok) {\r\n const errorText = await res.text();\r\n throw new Error(errorText);\r\n };\r\n const cartItem = await res.json();\r\n showToast('Added to cart!', 'success', 3000);\r\n return cartItem;\r\n } catch (error) {\r\n showToast('Error adding to cart', 'error', 5000);\r\n throw error;\r\n };\r\n};"]}
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../../src/utils/storefront_api/factory.ts"],"names":[],"mappings":"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","sourcesContent":["import { state, showToast } from \"../store/store\";\r\nasync function shopifyFetch(query: string, variables: Record<string, any> = {}): Promise<any> {\r\n try {\r\n if(!state.shopDomainApi || !state.storefrontToken) throw new Error('Missing Shopify configuration (shopDomain/storefrontToken)');\r\n // const endpoint = `https://${state.shopDomainApi}/api/2025-07/graphql.json`;\r\n const endpoint = 'https://craftnberry-co-uk.myshopify.com/api/2025-07/graphql.json';\r\n console.log('[IV] Shopify Fetch to', endpoint);\r\n const token = state.storefrontToken;\r\n console.log('[IV] Using storefront token', token);\r\n const res = await fetch(endpoint, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-Shopify-Storefront-Access-Token': token\r\n },\r\n body: JSON.stringify({ query, variables })\r\n });\r\n const json = await res.json();\r\n if(json.errors) throw new Error(json.errors.map((e: any) => e.message).join(', '));\r\n return json.data;\r\n } catch(error) {\r\n console.error('Shopify Fetch Error:', error);\r\n throw error; \r\n };\r\n};\r\n\r\nexport async function getIdFromHandle(handle: string): Promise<string | null> {\r\n const query = `\r\n query ($handle: String!) {\r\n product(handle: $handle) {\r\n id\r\n }\r\n }`;\r\n try {\r\n const data = await shopifyFetch(query, { handle });\r\n return data?.product?.id || null;\r\n } catch (error) {\r\n console.error('getIdFromHandle error:', error);\r\n return null;\r\n };\r\n};\r\n\r\n// Field + normalization helpers\r\nconst BASE_PRODUCT_FIELDS = ['id','handle','title'];\r\nconst DEFAULT_VARIANT_FIELDS = ['id','title','price { amount currencyCode }'];\r\n\r\nfunction mergeFields(requested: string[] | string, defaults: string[]): string[] {\r\n const req = (Array.isArray(requested) ? requested : requested.split(','))\r\n .map(f => f.trim())\r\n .filter(Boolean);\r\n const seen = new Set<string>();\r\n const ordered: string[] = [];\r\n for(const f of req) { \r\n if(!seen.has(f)) { \r\n seen.add(f); ordered.push(f); \r\n }; \r\n };\r\n for(const d of defaults) { \r\n if(!seen.has(d)) { \r\n seen.add(d); \r\n ordered.push(d); \r\n }; \r\n };\r\n return ordered;\r\n};\r\n\r\nfunction expandProductFields(fields: string[]): string {\r\n return fields\r\n .filter(f => f !== 'price')\r\n .map(f => {\r\n if(f === 'images') return 'images(first: 10) { nodes { url altText } }';\r\n return f;\r\n })\r\n .join('\\n');\r\n};\r\n\r\nfunction variantSelection(fields: string[] = DEFAULT_VARIANT_FIELDS): string {\r\n return fields.join('\\n');\r\n};\r\n\r\ninterface NormalizedProduct {\r\n id: string;\r\n handle?: string;\r\n title?: string;\r\n variantId?: string;\r\n price?: string | null;\r\n imageUrl?: string | null;\r\n imageAlt?: string | null;\r\n // index signature for dynamic requested fields\r\n [key: string]: any;\r\n};\r\n\r\nfunction normalizeProduct(product: any, selectedVariant?: any): NormalizedProduct {\r\n const variant = selectedVariant || product.variants?.edges?.[0]?.node || {};\r\n let imageUrl = null;\r\n let imageAlt = null;\r\n if(product.images?.nodes && product.images.nodes.length > 0) {\r\n imageUrl = product.images.nodes[0].url || null;\r\n imageAlt = product.images.nodes[0].altText || null;\r\n };\r\n const { id: variantId, price } = variant;\r\n return {\r\n id: product.id,\r\n ...Object.fromEntries(Object.entries(product).filter(([key]) => key !== 'variants')),\r\n variantId,\r\n price: price?.amount || null,\r\n imageUrl,\r\n imageAlt,\r\n };\r\n};\r\n\r\n// Query builders\r\nfunction buildProductsQuery(fieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($limit: Int!, $sortKey: ProductSortKeys!, $reverse: Boolean) {\r\n products(first: $limit, sortKey: $sortKey, reverse: $reverse) {\r\n edges {\r\n node {\r\n ${fieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }\r\n }\r\n }`;\r\n};\r\n\r\nfunction buildCollectionProductsQuery(fieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($handle: String!, $limit: Int!, $sortKey: ProductCollectionSortKeys!, $reverse: Boolean) {\r\n collection(handle: $handle) {\r\n products(first: $limit, sortKey: $sortKey, reverse: $reverse) {\r\n edges {\r\n node {\r\n ${fieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }\r\n }\r\n }\r\n }`;\r\n};\r\n\r\nfunction buildSingleProductQuery(fieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($id: ID!) {\r\n product(id: $id) {\r\n ${fieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }`;\r\n};\r\n\r\nfunction buildVariantProductQuery(productFieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($id: ID!) {\r\n productVariant(id: $id) {\r\n ${variantFieldsString}\r\n product {\r\n ${productFieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }\r\n }`;\r\n};\r\n\r\n// Public API\r\nexport async function fetchProducts(limit: number, collectionHandle: string, sortKey: string, fields: string[] | string, reversed: boolean = false) {\r\n try {\r\n const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);\r\n const fieldsString = expandProductFields(merged);\r\n const variantFieldsString = variantSelection();\r\n const isAll = !collectionHandle || collectionHandle === 'all';\r\n const query = isAll ? buildProductsQuery(fieldsString, variantFieldsString) : buildCollectionProductsQuery(fieldsString, variantFieldsString);\r\n const reverse = !!reversed;\r\n const variables: Record<string, any> = isAll ? { limit, sortKey, reverse } : { handle: collectionHandle, limit, sortKey, reverse };\r\n const data = await shopifyFetch(query, variables);\r\n const productEdges = data.products?.edges || data.collection?.products?.edges || [];\r\n return productEdges.map((edge: any) => normalizeProduct(edge.node));\r\n } catch(error) { \r\n console.error('Fetch Products Error:', error); throw error;\r\n };\r\n};\r\n\r\nexport async function fetchProductByID(id: string, fields: string[] | string, options?: { variantId?: string }): Promise<NormalizedProduct | null> {\r\n try {\r\n if(options?.variantId) return await getVariantProduct(options.variantId, fields);\r\n const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);\r\n const fieldsString = expandProductFields(merged);\r\n const variantFieldsString = variantSelection();\r\n const query = buildSingleProductQuery(fieldsString, variantFieldsString);\r\n const data = await shopifyFetch(query, { id });\r\n const product = data?.product;\r\n if(!product) return null;\r\n return normalizeProduct(product);\r\n } catch(error) { console.error('Fetch Product By ID Error:', error); throw error; };\r\n};\r\n\r\nexport async function getVariantProduct(variantId: string, fields: string[] | string): Promise<NormalizedProduct | null> {\r\n try {\r\n const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);\r\n const productFieldsString = expandProductFields(merged);\r\n const variantFieldsString = variantSelection();\r\n const query = buildVariantProductQuery(productFieldsString, variantFieldsString);\r\n const data = await shopifyFetch(query, { id: variantId });\r\n const variantNode = data?.productVariant;\r\n if(!variantNode) return null;\r\n const product = variantNode.product;\r\n if(!product) return null;\r\n return normalizeProduct(product, variantNode); \r\n } catch(error) { console.error('Get Variant Product Error:', error); throw error; };\r\n};\r\n\r\nexport async function addToCart(options: {\r\n id: number;\r\n quantity?: number;\r\n properties?: Record<string, any>;\r\n}) {\r\n try {\r\n console.log('IV add to cart called');\r\n if(!options.id) throw new Error('No variant id provided for addToCart');\r\n const quantity = options.quantity || 1;\r\n const properties = options.properties || {};\r\n const payload = {\r\n items: [\r\n {\r\n id: options.id,\r\n quantity,\r\n properties\r\n }\r\n ]\r\n };\r\n const url = '/cart/add.js';\r\n const res = await fetch(url, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Accept': 'application/json',\r\n 'X-Requested-With': 'XMLHttpRequest'\r\n },\r\n body: JSON.stringify(payload)\r\n });\r\n if(!res.ok) {\r\n const errorText = await res.text();\r\n throw new Error(errorText);\r\n };\r\n const cartItem = await res.json();\r\n showToast('Added to cart!', 'success', 3000);\r\n return cartItem;\r\n } catch (error) {\r\n showToast('Error adding to cart', 'error', 5000);\r\n throw error;\r\n };\r\n};"]}
@@ -1,4 +1,4 @@
1
- import { I as IvCard$1, d as defineCustomElement$1 } from './p-DbjqrXQL.js';
1
+ import { I as IvCard$1, d as defineCustomElement$1 } from './p-IJUHvLzw.js';
2
2
 
3
3
  const IvCard = IvCard$1;
4
4
  const defineCustomElement = defineCustomElement$1;
@@ -1,8 +1,8 @@
1
1
  import { p as proxyCustomElement, H, e as createErrorHandler, s as state, h } from './p-XXtzVg2d.js';
2
- import { f as fetchProducts } from './p-CTpPxZeS.js';
2
+ import { f as fetchProducts } from './p-BVL7DqEj.js';
3
3
  import { p as productCache } from './p-Cx7D8zH9.js';
4
4
  import { d as defineCustomElement$5 } from './p-DVvBorxR.js';
5
- import { d as defineCustomElement$4 } from './p-DbjqrXQL.js';
5
+ import { d as defineCustomElement$4 } from './p-IJUHvLzw.js';
6
6
  import { d as defineCustomElement$3 } from './p-dpzz67iI.js';
7
7
  import { d as defineCustomElement$2 } from './p-BMsgAmDZ.js';
8
8
 
@@ -1,8 +1,8 @@
1
1
  import { p as proxyCustomElement, H, e as createErrorHandler, s as state, h } from './p-XXtzVg2d.js';
2
- import { f as fetchProducts } from './p-CTpPxZeS.js';
2
+ import { f as fetchProducts } from './p-BVL7DqEj.js';
3
3
  import { p as productCache } from './p-Cx7D8zH9.js';
4
4
  import { d as defineCustomElement$6 } from './p-DVvBorxR.js';
5
- import { d as defineCustomElement$5 } from './p-DbjqrXQL.js';
5
+ import { d as defineCustomElement$5 } from './p-IJUHvLzw.js';
6
6
  import { d as defineCustomElement$4 } from './p-BpdXCMak.js';
7
7
  import { d as defineCustomElement$3 } from './p-dpzz67iI.js';
8
8
  import { d as defineCustomElement$2 } from './p-BMsgAmDZ.js';
@@ -1,7 +1,7 @@
1
1
  import { p as proxyCustomElement, H, h, d as Host } from './p-XXtzVg2d.js';
2
2
  import { c as createNewsletterTimerState, p as pauseNewsletterTimer, h as hasNewsletterPopupShown, s as startNewsletterTimer, a as handleNewsletterExitIntent, r as resumeNewsletterTimer } from './p-C9_L_NlM.js';
3
3
  import { d as defineCustomElement$3 } from './p-DVvBorxR.js';
4
- import { d as defineCustomElement$2 } from './p-CZzebQGC.js';
4
+ import { d as defineCustomElement$2 } from './p-DE0H3IbO.js';
5
5
 
6
6
  const ivModalCss = ".iv-modal-overlay{position:fixed;top:0;left:0;width:100vw;height:100vh;background:rgba(0, 0, 0, 0.5);display:flex;align-items:center;justify-content:center;z-index:9999}.iv-modal{background:#fff;border-radius:8px;box-shadow:0 4px 24px rgba(0, 0, 0, 0.18);padding:2rem;min-width:320px;max-width:90vw;max-height:90vh;overflow-y:auto;position:relative}.iv-modal-close{position:absolute;top:1rem;right:1rem;background:none;border:none;font-size:2rem;cursor:pointer;color:#333}.iv-modal-wishlist{margin-top:1rem}.iv-modal-wishlist-item{border-bottom:1px solid #eee;padding:1rem 0;display:flex;gap:1rem;align-items:center}.iv-modal-wishlist-field{font-size:1rem;color:#222}.iv-modal-wishlist-empty{text-align:center;color:#888;padding:2rem 0}";
7
7
 
@@ -1,8 +1,8 @@
1
1
  import { p as proxyCustomElement, H, h } from './p-XXtzVg2d.js';
2
- import { g as getIdFromHandle, a as fetchProductByID } from './p-CTpPxZeS.js';
2
+ import { g as getIdFromHandle, a as fetchProductByID } from './p-BVL7DqEj.js';
3
3
  import { b as getProductHandle } from './p-CN-O5_EW.js';
4
4
  import { d as defineCustomElement$5 } from './p-DVvBorxR.js';
5
- import { d as defineCustomElement$4 } from './p-DbjqrXQL.js';
5
+ import { d as defineCustomElement$4 } from './p-IJUHvLzw.js';
6
6
  import { d as defineCustomElement$3 } from './p-BpdXCMak.js';
7
7
  import { d as defineCustomElement$2 } from './p-dpzz67iI.js';
8
8
 
@@ -1,7 +1,7 @@
1
1
  import { p as proxyCustomElement, H, h } from './p-XXtzVg2d.js';
2
2
  import { c as createNewsletterTimerState, p as pauseNewsletterTimer, h as hasNewsletterPopupShown, s as startNewsletterTimer, a as handleNewsletterExitIntent, r as resumeNewsletterTimer } from './p-C9_L_NlM.js';
3
3
  import { d as defineCustomElement$3 } from './p-DVvBorxR.js';
4
- import { d as defineCustomElement$2 } from './p-CZzebQGC.js';
4
+ import { d as defineCustomElement$2 } from './p-DE0H3IbO.js';
5
5
 
6
6
  const ivSidebarCss = "iv-sidebar .iv-sidebar{position:fixed;top:0;right:0;left:auto;height:100%;background-color:#fff;box-shadow:2px 0 5px rgba(0, 0, 0, 0.1);transform:translateX(100%);transition:transform 0.3s ease-in-out;z-index:1001;padding:var(--iv-sidebar-padding-top, 2rem) var(--iv-sidebar-padding-right, 2rem) var(--iv-sidebar-padding-bottom, 2rem) var(--iv-sidebar-padding-left, 2rem);overflow-y:auto;max-height:100vh;box-sizing:border-box;display:flex;flex-direction:column;width:40%}@media (max-width: 1024px){iv-sidebar .iv-sidebar{width:95%}}iv-sidebar .iv-sidebar.close{font-size:2.25rem;font-weight:400;pointer-events:none;user-select:none;line-height:1;color:inherit;display:flex;align-items:center;justify-content:center}iv-sidebar .iv-sidebar.open{transform:translateX(0)}iv-sidebar .iv-sidebar-close-button{position:absolute;top:1rem;right:1rem;background:none;border:none;color:#111;font-size:2.25rem;font-weight:400;line-height:1;cursor:pointer;padding:0;width:2.5rem;height:2.5rem;display:flex;align-items:center;justify-content:center;z-index:1002;transition:color 0.2s}iv-sidebar .iv-sidebar-close-button:hover{color:#000}iv-sidebar .iv-sidebar-close-button:focus{outline:none;color:#000}iv-sidebar .iv-sidebar-overlay{position:fixed;top:0;left:0;width:100%;height:100%;backdrop-filter:blur(8px);background-color:rgba(14, 13, 13, 0.5019607843);opacity:0;visibility:hidden;transition:opacity 0.3s ease-in-out, visibility 0.3s ease-in-out;z-index:1000}iv-sidebar .iv-sidebar-overlay.open{opacity:1;visibility:visible}";
7
7
 
@@ -2,7 +2,7 @@ import { p as proxyCustomElement, H, h } from './p-XXtzVg2d.js';
2
2
  import { d as decodeJsonString } from './p-CN-O5_EW.js';
3
3
  import { d as defineCustomElement$6 } from './p-CUI6hRMI.js';
4
4
  import { d as defineCustomElement$5 } from './p-DVvBorxR.js';
5
- import { d as defineCustomElement$4 } from './p-DbjqrXQL.js';
5
+ import { d as defineCustomElement$4 } from './p-IJUHvLzw.js';
6
6
  import { d as defineCustomElement$3 } from './p-BpdXCMak.js';
7
7
  import { d as defineCustomElement$2 } from './p-dpzz67iI.js';
8
8
 
@@ -1,4 +1,4 @@
1
- import { I as IvWishlistView$1, d as defineCustomElement$1 } from './p-CZzebQGC.js';
1
+ import { I as IvWishlistView$1, d as defineCustomElement$1 } from './p-DE0H3IbO.js';
2
2
 
3
3
  const IvWishlistView = IvWishlistView$1;
4
4
  const defineCustomElement = defineCustomElement$1;
@@ -4,7 +4,8 @@ async function shopifyFetch(query, variables = {}) {
4
4
  try {
5
5
  if (!state.shopDomainApi || !state.storefrontToken)
6
6
  throw new Error('Missing Shopify configuration (shopDomain/storefrontToken)');
7
- const endpoint = `https://${state.shopDomainApi}/api/2025-07/graphql.json`;
7
+ // const endpoint = `https://${state.shopDomainApi}/api/2025-07/graphql.json`;
8
+ const endpoint = 'https://craftnberry-co-uk.myshopify.com/api/2025-07/graphql.json';
8
9
  console.log('[IV] Shopify Fetch to', endpoint);
9
10
  const token = state.storefrontToken;
10
11
  console.log('[IV] Using storefront token', token);
@@ -211,6 +212,6 @@ async function addToCart(options) {
211
212
  }
212
213
 
213
214
  export { fetchProductByID as a, addToCart as b, fetchProducts as f, getIdFromHandle as g };
214
- //# sourceMappingURL=p-CTpPxZeS.js.map
215
+ //# sourceMappingURL=p-BVL7DqEj.js.map
215
216
 
216
- //# sourceMappingURL=p-CTpPxZeS.js.map
217
+ //# sourceMappingURL=p-BVL7DqEj.js.map
@@ -0,0 +1 @@
1
+ {"file":"p-BVL7DqEj.js","mappings":"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","names":[],"sources":["src/utils/storefront_api/factory.ts"],"sourcesContent":["import { state, showToast } from \"../store/store\";\r\nasync function shopifyFetch(query: string, variables: Record<string, any> = {}): Promise<any> {\r\n try {\r\n if(!state.shopDomainApi || !state.storefrontToken) throw new Error('Missing Shopify configuration (shopDomain/storefrontToken)');\r\n // const endpoint = `https://${state.shopDomainApi}/api/2025-07/graphql.json`;\r\n const endpoint = 'https://craftnberry-co-uk.myshopify.com/api/2025-07/graphql.json';\r\n console.log('[IV] Shopify Fetch to', endpoint);\r\n const token = state.storefrontToken;\r\n console.log('[IV] Using storefront token', token);\r\n const res = await fetch(endpoint, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-Shopify-Storefront-Access-Token': token\r\n },\r\n body: JSON.stringify({ query, variables })\r\n });\r\n const json = await res.json();\r\n if(json.errors) throw new Error(json.errors.map((e: any) => e.message).join(', '));\r\n return json.data;\r\n } catch(error) {\r\n console.error('Shopify Fetch Error:', error);\r\n throw error; \r\n };\r\n};\r\n\r\nexport async function getIdFromHandle(handle: string): Promise<string | null> {\r\n const query = `\r\n query ($handle: String!) {\r\n product(handle: $handle) {\r\n id\r\n }\r\n }`;\r\n try {\r\n const data = await shopifyFetch(query, { handle });\r\n return data?.product?.id || null;\r\n } catch (error) {\r\n console.error('getIdFromHandle error:', error);\r\n return null;\r\n };\r\n};\r\n\r\n// Field + normalization helpers\r\nconst BASE_PRODUCT_FIELDS = ['id','handle','title'];\r\nconst DEFAULT_VARIANT_FIELDS = ['id','title','price { amount currencyCode }'];\r\n\r\nfunction mergeFields(requested: string[] | string, defaults: string[]): string[] {\r\n const req = (Array.isArray(requested) ? requested : requested.split(','))\r\n .map(f => f.trim())\r\n .filter(Boolean);\r\n const seen = new Set<string>();\r\n const ordered: string[] = [];\r\n for(const f of req) { \r\n if(!seen.has(f)) { \r\n seen.add(f); ordered.push(f); \r\n }; \r\n };\r\n for(const d of defaults) { \r\n if(!seen.has(d)) { \r\n seen.add(d); \r\n ordered.push(d); \r\n }; \r\n };\r\n return ordered;\r\n};\r\n\r\nfunction expandProductFields(fields: string[]): string {\r\n return fields\r\n .filter(f => f !== 'price')\r\n .map(f => {\r\n if(f === 'images') return 'images(first: 10) { nodes { url altText } }';\r\n return f;\r\n })\r\n .join('\\n');\r\n};\r\n\r\nfunction variantSelection(fields: string[] = DEFAULT_VARIANT_FIELDS): string {\r\n return fields.join('\\n');\r\n};\r\n\r\ninterface NormalizedProduct {\r\n id: string;\r\n handle?: string;\r\n title?: string;\r\n variantId?: string;\r\n price?: string | null;\r\n imageUrl?: string | null;\r\n imageAlt?: string | null;\r\n // index signature for dynamic requested fields\r\n [key: string]: any;\r\n};\r\n\r\nfunction normalizeProduct(product: any, selectedVariant?: any): NormalizedProduct {\r\n const variant = selectedVariant || product.variants?.edges?.[0]?.node || {};\r\n let imageUrl = null;\r\n let imageAlt = null;\r\n if(product.images?.nodes && product.images.nodes.length > 0) {\r\n imageUrl = product.images.nodes[0].url || null;\r\n imageAlt = product.images.nodes[0].altText || null;\r\n };\r\n const { id: variantId, price } = variant;\r\n return {\r\n id: product.id,\r\n ...Object.fromEntries(Object.entries(product).filter(([key]) => key !== 'variants')),\r\n variantId,\r\n price: price?.amount || null,\r\n imageUrl,\r\n imageAlt,\r\n };\r\n};\r\n\r\n// Query builders\r\nfunction buildProductsQuery(fieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($limit: Int!, $sortKey: ProductSortKeys!, $reverse: Boolean) {\r\n products(first: $limit, sortKey: $sortKey, reverse: $reverse) {\r\n edges {\r\n node {\r\n ${fieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }\r\n }\r\n }`;\r\n};\r\n\r\nfunction buildCollectionProductsQuery(fieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($handle: String!, $limit: Int!, $sortKey: ProductCollectionSortKeys!, $reverse: Boolean) {\r\n collection(handle: $handle) {\r\n products(first: $limit, sortKey: $sortKey, reverse: $reverse) {\r\n edges {\r\n node {\r\n ${fieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }\r\n }\r\n }\r\n }`;\r\n};\r\n\r\nfunction buildSingleProductQuery(fieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($id: ID!) {\r\n product(id: $id) {\r\n ${fieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }`;\r\n};\r\n\r\nfunction buildVariantProductQuery(productFieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($id: ID!) {\r\n productVariant(id: $id) {\r\n ${variantFieldsString}\r\n product {\r\n ${productFieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }\r\n }`;\r\n};\r\n\r\n// Public API\r\nexport async function fetchProducts(limit: number, collectionHandle: string, sortKey: string, fields: string[] | string, reversed: boolean = false) {\r\n try {\r\n const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);\r\n const fieldsString = expandProductFields(merged);\r\n const variantFieldsString = variantSelection();\r\n const isAll = !collectionHandle || collectionHandle === 'all';\r\n const query = isAll ? buildProductsQuery(fieldsString, variantFieldsString) : buildCollectionProductsQuery(fieldsString, variantFieldsString);\r\n const reverse = !!reversed;\r\n const variables: Record<string, any> = isAll ? { limit, sortKey, reverse } : { handle: collectionHandle, limit, sortKey, reverse };\r\n const data = await shopifyFetch(query, variables);\r\n const productEdges = data.products?.edges || data.collection?.products?.edges || [];\r\n return productEdges.map((edge: any) => normalizeProduct(edge.node));\r\n } catch(error) { \r\n console.error('Fetch Products Error:', error); throw error;\r\n };\r\n};\r\n\r\nexport async function fetchProductByID(id: string, fields: string[] | string, options?: { variantId?: string }): Promise<NormalizedProduct | null> {\r\n try {\r\n if(options?.variantId) return await getVariantProduct(options.variantId, fields);\r\n const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);\r\n const fieldsString = expandProductFields(merged);\r\n const variantFieldsString = variantSelection();\r\n const query = buildSingleProductQuery(fieldsString, variantFieldsString);\r\n const data = await shopifyFetch(query, { id });\r\n const product = data?.product;\r\n if(!product) return null;\r\n return normalizeProduct(product);\r\n } catch(error) { console.error('Fetch Product By ID Error:', error); throw error; };\r\n};\r\n\r\nexport async function getVariantProduct(variantId: string, fields: string[] | string): Promise<NormalizedProduct | null> {\r\n try {\r\n const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);\r\n const productFieldsString = expandProductFields(merged);\r\n const variantFieldsString = variantSelection();\r\n const query = buildVariantProductQuery(productFieldsString, variantFieldsString);\r\n const data = await shopifyFetch(query, { id: variantId });\r\n const variantNode = data?.productVariant;\r\n if(!variantNode) return null;\r\n const product = variantNode.product;\r\n if(!product) return null;\r\n return normalizeProduct(product, variantNode); \r\n } catch(error) { console.error('Get Variant Product Error:', error); throw error; };\r\n};\r\n\r\nexport async function addToCart(options: {\r\n id: number;\r\n quantity?: number;\r\n properties?: Record<string, any>;\r\n}) {\r\n try {\r\n console.log('IV add to cart called');\r\n if(!options.id) throw new Error('No variant id provided for addToCart');\r\n const quantity = options.quantity || 1;\r\n const properties = options.properties || {};\r\n const payload = {\r\n items: [\r\n {\r\n id: options.id,\r\n quantity,\r\n properties\r\n }\r\n ]\r\n };\r\n const url = '/cart/add.js';\r\n const res = await fetch(url, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Accept': 'application/json',\r\n 'X-Requested-With': 'XMLHttpRequest'\r\n },\r\n body: JSON.stringify(payload)\r\n });\r\n if(!res.ok) {\r\n const errorText = await res.text();\r\n throw new Error(errorText);\r\n };\r\n const cartItem = await res.json();\r\n showToast('Added to cart!', 'success', 3000);\r\n return cartItem;\r\n } catch (error) {\r\n showToast('Error adding to cart', 'error', 5000);\r\n throw error;\r\n };\r\n};"],"version":3}
@@ -1,6 +1,6 @@
1
1
  import { p as proxyCustomElement, H, h, s as state, m as removeFromWishlist } from './p-XXtzVg2d.js';
2
2
  import { c as getProductIDFromGid } from './p-CN-O5_EW.js';
3
- import { b as addToCart } from './p-CTpPxZeS.js';
3
+ import { b as addToCart } from './p-BVL7DqEj.js';
4
4
  import { d as defineCustomElement$1 } from './p-DVvBorxR.js';
5
5
 
6
6
  const ivWishlistViewCss = ":host{display:block}";
@@ -40,6 +40,6 @@ function defineCustomElement() {
40
40
  defineCustomElement();
41
41
 
42
42
  export { IvWishlistView as I, defineCustomElement as d };
43
- //# sourceMappingURL=p-CZzebQGC.js.map
43
+ //# sourceMappingURL=p-DE0H3IbO.js.map
44
44
 
45
- //# sourceMappingURL=p-CZzebQGC.js.map
45
+ //# sourceMappingURL=p-DE0H3IbO.js.map
@@ -1 +1 @@
1
- {"file":"p-CZzebQGC.js","mappings":";;;;;AAAA,MAAM,iBAAiB,GAAG,sBAAsB;;ACKhD,MAAM,KAAK,GAAG,kBAAkB;MAQnB,cAAc,iBAAAA,kBAAA,CAAA,MAAA,cAAA,SAAAC,CAAA,CAAA;;;;;;;IAEzB,MAAM,GAAA;AAEJ,QAAA,QAEE,CAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAK,KAAK,EAAE,KAAK,EAAA,EACf,CAAA,CAAA,IAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAI,KAAK,EAAE,CAAG,EAAA,KAAK,OAAO,EAAA,EACvB,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAC1B,CAAA,CAAA,IAAA,EAAA,EAAI,KAAK,EAAE,CAAA,EAAG,KAAK,CAAA,MAAA,CAAQ,EAAA,EAAG,KAAK,CAAC,cAAc,CAAC,YAAY,CAAM,KAErE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,MAC3B,CAAI,CAAA,IAAA,EAAA,EAAA,KAAK,EAAE,CAAG,EAAA,KAAK,CAAO,KAAA,CAAA,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAA,EAC7C,CAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAE,CAAA,EAAG,KAAK,CAAA,OAAA,CAAS,EAAA,EAC1B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,MACrC,WAAK,KAAK,EAAE,CAAG,EAAA,KAAK,CAAU,OAAA,EAAA,KAAK,CAAU,OAAA,EAAA,GAAG,CAAE,CAAA,EAAA,EAAG,KAAK,CAAO,CAClE,CAAC,CACE,EACN,CAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAE,CAAG,EAAA,KAAK,CAAU,QAAA,CAAA,EAAA,EAC5B,CAAA,CAAA,WAAA,EAAA,EACE,aAAa,EAAE,CAAA,EAAG,KAAK,CAAA,OAAA,CAAS,EAChC,OAAO,EAAE,MAAM,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAA,EACxC,CAAA,CAAA,MAAA,EAAA,EAAM,KAAK,EAAC,cAAc,EAAC,SAAS,EAAE,KAAK,CAAC,cAAc,CAAC,WAAW,EAAA,CAAS,CACvE,EACZ,CACE,CAAA,WAAA,EAAA,EAAA,aAAa,EAAE,CAAG,EAAA,KAAK,CAAc,YAAA,CAAA,EACrC,OAAO,EAAE,MAAM,SAAS,CAAC,EAAE,EAAE,EAAE,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAA,EAE5D,CAAM,CAAA,MAAA,EAAA,EAAA,KAAK,EAAC,cAAc,EAAC,SAAS,EAAE,KAAK,CAAC,cAAc,CAAC,cAAc,EAAS,CAAA,CAC1E,CACR,CACH,CACJ,CAAC,CACH,CACA,CACD;;;;;;;;;;;;;;;;;;;;;;;;;;;","names":["__stencil_proxyCustomElement","HTMLElement"],"sources":["src/components/iv-wishlist-view/iv-wishlist-view.scss?tag=iv-wishlist-view","src/components/iv-wishlist-view/iv-wishlist-view.tsx"],"sourcesContent":[":host {\r\n display: block;\r\n}\r\n","import { Component, h } from '@stencil/core';\r\nimport { state, removeFromWishlist } from '../../utils/store/store';\r\nimport { getProductIDFromGid } from '../../utils/helpers/factory';\r\nimport { addToCart } from '../../utils/storefront_api/factory';\r\n\r\nconst BLOCK = 'iv-wishlist-view';\r\n\r\n@Component({\r\n tag: 'iv-wishlist-view',\r\n styleUrl: 'iv-wishlist-view.scss',\r\n shadow: false\r\n})\r\n\r\nexport class IvWishlistView {\r\n\r\n render() {\r\n\r\n return (\r\n \r\n <div class={BLOCK}>\r\n <ul class={`${BLOCK}-list`}>\r\n {state.wishlist.length === 0 ? (\r\n <li class={`${BLOCK}-empty`}>{state.wishlistLabels.emptyMessage}</li>\r\n ) : (\r\n state.wishlist.map((item, idx) => (\r\n <li class={`${BLOCK}-item`} key={item.id || idx}>\r\n <div class={`${BLOCK}-fields`}>\r\n {Object.entries(item).map(([key, value]) => (\r\n <div class={`${BLOCK}-field ${BLOCK}-field-${key}`}>{value}</div>\r\n ))}\r\n </div>\r\n <div class={`${BLOCK}-actions`}>\r\n <iv-button\r\n classmodifier={`${BLOCK}-remove`}\r\n onClick={() => removeFromWishlist(item.id)}>\r\n <span class=\"inner-button\" innerHTML={state.wishlistLabels.removeLabel}></span>\r\n </iv-button>\r\n <iv-button\r\n classmodifier={`${BLOCK}-add-to-cart`}\r\n onClick={() => addToCart({ id: getProductIDFromGid(item.id) })}> \r\n {/* the getProductID() above may not be needed, can't remember the format here. */}\r\n <span class=\"inner-button\" innerHTML={state.wishlistLabels.addToCartLabel}></span>\r\n </iv-button>\r\n </div>\r\n </li>\r\n ))\r\n )}\r\n </ul>\r\n </div>\r\n \r\n );\r\n\r\n };\r\n\r\n};"],"version":3}
1
+ {"file":"p-DE0H3IbO.js","mappings":";;;;;AAAA,MAAM,iBAAiB,GAAG,sBAAsB;;ACKhD,MAAM,KAAK,GAAG,kBAAkB;MAQnB,cAAc,iBAAAA,kBAAA,CAAA,MAAA,cAAA,SAAAC,CAAA,CAAA;;;;;;;IAEzB,MAAM,GAAA;AAEJ,QAAA,QAEE,CAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAK,KAAK,EAAE,KAAK,EAAA,EACf,CAAA,CAAA,IAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAI,KAAK,EAAE,CAAG,EAAA,KAAK,OAAO,EAAA,EACvB,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAC1B,CAAA,CAAA,IAAA,EAAA,EAAI,KAAK,EAAE,CAAA,EAAG,KAAK,CAAA,MAAA,CAAQ,EAAA,EAAG,KAAK,CAAC,cAAc,CAAC,YAAY,CAAM,KAErE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,GAAG,MAC3B,CAAI,CAAA,IAAA,EAAA,EAAA,KAAK,EAAE,CAAG,EAAA,KAAK,CAAO,KAAA,CAAA,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAA,EAC7C,CAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAE,CAAA,EAAG,KAAK,CAAA,OAAA,CAAS,EAAA,EAC1B,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,MACrC,WAAK,KAAK,EAAE,CAAG,EAAA,KAAK,CAAU,OAAA,EAAA,KAAK,CAAU,OAAA,EAAA,GAAG,CAAE,CAAA,EAAA,EAAG,KAAK,CAAO,CAClE,CAAC,CACE,EACN,CAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAE,CAAG,EAAA,KAAK,CAAU,QAAA,CAAA,EAAA,EAC5B,CAAA,CAAA,WAAA,EAAA,EACE,aAAa,EAAE,CAAA,EAAG,KAAK,CAAA,OAAA,CAAS,EAChC,OAAO,EAAE,MAAM,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAA,EACxC,CAAA,CAAA,MAAA,EAAA,EAAM,KAAK,EAAC,cAAc,EAAC,SAAS,EAAE,KAAK,CAAC,cAAc,CAAC,WAAW,EAAA,CAAS,CACvE,EACZ,CACE,CAAA,WAAA,EAAA,EAAA,aAAa,EAAE,CAAG,EAAA,KAAK,CAAc,YAAA,CAAA,EACrC,OAAO,EAAE,MAAM,SAAS,CAAC,EAAE,EAAE,EAAE,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAA,EAE5D,CAAM,CAAA,MAAA,EAAA,EAAA,KAAK,EAAC,cAAc,EAAC,SAAS,EAAE,KAAK,CAAC,cAAc,CAAC,cAAc,EAAS,CAAA,CAC1E,CACR,CACH,CACJ,CAAC,CACH,CACA,CACD;;;;;;;;;;;;;;;;;;;;;;;;;;;","names":["__stencil_proxyCustomElement","HTMLElement"],"sources":["src/components/iv-wishlist-view/iv-wishlist-view.scss?tag=iv-wishlist-view","src/components/iv-wishlist-view/iv-wishlist-view.tsx"],"sourcesContent":[":host {\r\n display: block;\r\n}\r\n","import { Component, h } from '@stencil/core';\r\nimport { state, removeFromWishlist } from '../../utils/store/store';\r\nimport { getProductIDFromGid } from '../../utils/helpers/factory';\r\nimport { addToCart } from '../../utils/storefront_api/factory';\r\n\r\nconst BLOCK = 'iv-wishlist-view';\r\n\r\n@Component({\r\n tag: 'iv-wishlist-view',\r\n styleUrl: 'iv-wishlist-view.scss',\r\n shadow: false\r\n})\r\n\r\nexport class IvWishlistView {\r\n\r\n render() {\r\n\r\n return (\r\n \r\n <div class={BLOCK}>\r\n <ul class={`${BLOCK}-list`}>\r\n {state.wishlist.length === 0 ? (\r\n <li class={`${BLOCK}-empty`}>{state.wishlistLabels.emptyMessage}</li>\r\n ) : (\r\n state.wishlist.map((item, idx) => (\r\n <li class={`${BLOCK}-item`} key={item.id || idx}>\r\n <div class={`${BLOCK}-fields`}>\r\n {Object.entries(item).map(([key, value]) => (\r\n <div class={`${BLOCK}-field ${BLOCK}-field-${key}`}>{value}</div>\r\n ))}\r\n </div>\r\n <div class={`${BLOCK}-actions`}>\r\n <iv-button\r\n classmodifier={`${BLOCK}-remove`}\r\n onClick={() => removeFromWishlist(item.id)}>\r\n <span class=\"inner-button\" innerHTML={state.wishlistLabels.removeLabel}></span>\r\n </iv-button>\r\n <iv-button\r\n classmodifier={`${BLOCK}-add-to-cart`}\r\n onClick={() => addToCart({ id: getProductIDFromGid(item.id) })}> \r\n {/* the getProductID() above may not be needed, can't remember the format here. */}\r\n <span class=\"inner-button\" innerHTML={state.wishlistLabels.addToCartLabel}></span>\r\n </iv-button>\r\n </div>\r\n </li>\r\n ))\r\n )}\r\n </ul>\r\n </div>\r\n \r\n );\r\n\r\n };\r\n\r\n};"],"version":3}
@@ -1,6 +1,6 @@
1
1
  import { p as proxyCustomElement, H, h, s as state } from './p-XXtzVg2d.js';
2
2
  import { r as requestedFields, c as getProductIDFromGid, f as formatMoney } from './p-CN-O5_EW.js';
3
- import { b as addToCart } from './p-CTpPxZeS.js';
3
+ import { b as addToCart } from './p-BVL7DqEj.js';
4
4
  import { d as defineCustomElement$2 } from './p-DVvBorxR.js';
5
5
  import { d as defineCustomElement$1 } from './p-dpzz67iI.js';
6
6
 
@@ -115,6 +115,6 @@ function defineCustomElement() {
115
115
  defineCustomElement();
116
116
 
117
117
  export { IvCard as I, defineCustomElement as d };
118
- //# sourceMappingURL=p-DbjqrXQL.js.map
118
+ //# sourceMappingURL=p-IJUHvLzw.js.map
119
119
 
120
- //# sourceMappingURL=p-DbjqrXQL.js.map
120
+ //# sourceMappingURL=p-IJUHvLzw.js.map
@@ -1 +1 @@
1
- {"file":"p-DbjqrXQL.js","mappings":"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","names":["__stencil_proxyCustomElement","HTMLElement"],"sources":["src/components/iv-card/iv-card.scss?tag=iv-card","src/components/iv-card/iv-card.tsx"],"sourcesContent":["// Base iv-card styles with theming tokens (CSS custom properties)\r\n// Designers override --iv-card-* variables in theme / scope; we keep safe fallbacks.\r\n\r\n.iv-card {\r\n display: var(--iv-card-display, block);\r\n box-sizing: border-box;\r\n padding: var(--iv-card-padding, 0);\r\n margin: var(--iv-card-margin, 0);\r\n background: var(--iv-card-bg, transparent);\r\n color: var(--iv-card-color, inherit);\r\n border: var(--iv-card-border, none);\r\n border-radius: var(--iv-card-border-radius, 0);\r\n box-shadow: var(--iv-card-shadow, none);\r\n font-size: var(--iv-card-font-size, inherit);\r\n line-height: var(--iv-card-line-height, 1.4);\r\n position: relative;\r\n text-decoration: none;\r\n transition: var(--iv-card-transition, background-color .2s ease, color .2s ease, box-shadow .2s ease, border-color .2s ease);\r\n gap: var(--iv-card-gap, 0.75rem);\r\n display: var(--iv-card-layout, flex);\r\n flex-direction: var(--iv-card-flex-direction, column);\r\n\r\n a, a:visited, a:hover, a:focus {\r\n text-decoration: var(--iv-card-link-text-decoration, none);\r\n color: var(--iv-card-link-color, inherit);\r\n }\r\n}\r\n\r\n.iv-card[href],\r\n.iv-card.is-interactive {\r\n cursor: pointer;\r\n}\r\n\r\n.iv-card[href]:hover,\r\n.iv-card[href]:focus-visible,\r\n.iv-card.is-interactive:hover,\r\n.iv-card.is-interactive:focus-visible {\r\n background: var(--iv-card-hover-bg, var(--iv-card-bg, transparent));\r\n border: var(--iv-card-hover-border, var(--iv-card-border, none));\r\n box-shadow: var(--iv-card-hover-shadow, var(--iv-card-shadow, none));\r\n outline: var(--iv-card-focus-outline, none);\r\n box-shadow: var(--iv-card-focus-ring, var(--iv-card-hover-shadow, var(--iv-card-shadow, none)));\r\n}\r\n\r\n// Wrapper link (when whole card is clickable) gets its own modifier class\r\n.iv-card-link-wrapper {\r\n display: var(--iv-card-link-wrapper-display, contents); // allows children to layout naturally\r\n text-decoration: none;\r\n color: inherit;\r\n cursor: pointer;\r\n}\r\n\r\n// Prevent underline / link style bleed onto data fields\r\n.iv-card-field {\r\n display: block;\r\n margin: 0;\r\n padding: 0;\r\n font-weight: var(--iv-card-field-font-weight, inherit);\r\n color: var(--iv-card-field-color, inherit);\r\n word-break: break-word;\r\n text-decoration: none;\r\n}\r\n\r\n// Ensure Add to Cart button remains clickable and visually distinct inside clickable card\r\n.iv-card .iv-card-add-to-cart-btn {\r\n position: relative;\r\n z-index: 2;\r\n}\r\n\r\n// Hover / focus styling only adjusts background / shadow, not text decoration\r\n.iv-card-link-wrapper:hover .iv-card-field,\r\n.iv-card-link-wrapper:focus-visible .iv-card-field {\r\n text-decoration: none;\r\n}\r\n\r\n// Optional variable-driven hover state (kept non-invasive)\r\n.iv-card-link-wrapper:hover,\r\n.iv-card-link-wrapper:focus-visible {\r\n background: var(--iv-card-link-hover-bg, var(--iv-card-hover-bg, transparent));\r\n}\r\n\r\n.iv-card-image {\r\n display: block;\r\n width: 100%;\r\n height: auto;\r\n aspect-ratio: var(--iv-card-image-aspect-ratio, auto);\r\n object-fit: var(--iv-card-image-object-fit, cover);\r\n border-radius: var(--iv-card-image-border-radius, var(--iv-card-border-radius, 0));\r\n background: var(--iv-card-image-bg, transparent);\r\n}\r\n\r\n.iv-card-title { \r\n font-weight: var(--iv-card-heading-font-weight, 600);\r\n font-size: var(--iv-card-title-font-size, 1em);\r\n line-height: var(--iv-card-title-line-height, 1.2);\r\n}\r\n\r\n.iv-card-price {\r\n color: var(--iv-card-price-color, inherit);\r\n font-weight: var(--iv-card-price-weight, 500);\r\n}\r\n\r\n.iv-card-controls {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: var(--iv-card-control-gap, 0.5rem);\r\n align-items: center;\r\n margin-top: var(--iv-card-controls-margin-top, var(--iv-card-gap, 0.75rem));\r\n}\r\n\r\n.iv-card-add-to-cart-btn {\r\n --iv-button-variant: var(--iv-card-button-variant, primary);\r\n}\r\n\r\n.iv-card-inner { \r\n width: 100%;\r\n display: contents; \r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n .iv-card {\r\n transition: none;\r\n }\r\n}","import { Component, h, Prop } from '@stencil/core';\r\nimport { state } from '../../utils/store/store';\r\nimport { formatMoney, getProductIDFromGid, requestedFields } from '../../utils/helpers/factory';\r\nimport { addToCart } from '../../utils/storefront_api/factory';\r\n\r\nconst BLOCK = 'iv-card';\r\nconst HIDDEN_FIELDS = new Set([\r\n 'id',\r\n 'handle',\r\n 'url',\r\n 'productUrl',\r\n 'imageUrl',\r\n 'imageAlt',\r\n 'variantId',\r\n 'images'\r\n]);\r\n\r\n@Component({\r\n tag: 'iv-card',\r\n styleUrl: 'iv-card.scss',\r\n shadow: false\r\n})\r\n\r\nexport class IvCard {\r\n @Prop() data: Record<string, any>;\r\n @Prop() fields?: string;\r\n @Prop() cardtype?: string; \r\n @Prop() classmodifier?: string;\r\n @Prop() buttontext?: string;\r\n @Prop() calltoaction: boolean = false;\r\n @Prop() addtocarttext?: string;\r\n\r\n private allowedFields: string[] | null = null;\r\n\r\n componentWillLoad() {\r\n if(this.fields) this.allowedFields = requestedFields(this.fields);\r\n };\r\n\r\n private generateImage(url: string, alt: string) {\r\n return (<img src={url} alt={alt || 'Product image'} class={`${BLOCK}-image`}/>);\r\n };\r\n\r\n private appendAddToCartButton(gid: string, quantity: number){\r\n const id: number = getProductIDFromGid(gid);\r\n return (\r\n <iv-button \r\n classmodifier={`${BLOCK}-add-to-cart-btn`} \r\n onClick={(e: any) => { e.preventDefault(); e.stopPropagation(); addToCart({id, quantity}); }}>\r\n <span class=\"inner-button\" innerHTML={this.addtocarttext}></span>\r\n </iv-button>\r\n );\r\n };\r\n\r\n private buildProductHref(): string | null {\r\n const handle = this.data?.handle;\r\n if(!handle) return null;\r\n const base = this.cardtype || 'products';\r\n return `/${base}/${handle}`.replace(/\\\\+/g,'/');\r\n };\r\n\r\n render() {\r\n let entries: [string, any][] = this.data ? Object.entries(this.data) : [];\r\n if(this.allowedFields && this.allowedFields.length > 0) entries = entries.filter(([key]) => this.allowedFields.includes(key));\r\n const imageUrl = this.data?.imageUrl;\r\n const imageAlt = this.data?.imageAlt;\r\n const wantsImage = !this.allowedFields || this.allowedFields.includes('imageUrl') || this.allowedFields.includes('images');\r\n const showImage = wantsImage && !!imageUrl;\r\n const href = this.buildProductHref();\r\n const content = [\r\n showImage ? this.generateImage(imageUrl, imageAlt) : null,\r\n ...entries.map(([key, value]) => {\r\n if(HIDDEN_FIELDS.has(key)) return null; // suppress structural fields\r\n if(value === undefined || value === null || value === '') return null;\r\n return (\r\n <span key={key} class={`${BLOCK}-field ${BLOCK}-${key}`}>\r\n {key.includes('price') ? formatMoney(value, state.currencyCode) : value}\r\n </span>\r\n );\r\n })\r\n ];\r\n\r\n if(this.calltoaction && href) {\r\n return (\r\n <div class={`${BLOCK} ${this.classmodifier || ''}`.trim()}>\r\n <iv-link \r\n classmodifier={`${BLOCK}-link-wrapper`} \r\n linktype='wrapper'\r\n linkhref={href}>\r\n {content}\r\n </iv-link>\r\n <div class={`${BLOCK}-controls`}>\r\n {this.buttontext && (\r\n <iv-link \r\n linktype='button'\r\n classmodifier={`${BLOCK}-cta-btn`} \r\n linkhref={href}>\r\n {this.buttontext}\r\n </iv-link>\r\n )}\r\n {this.addtocarttext && this.data?.variantId && this.appendAddToCartButton(this.data.variantId, 1)}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div class={`${BLOCK} ${this.classmodifier || ''}`.trim()}>\r\n {content}\r\n <div class={`${BLOCK}-controls`}>\r\n {this.buttontext && href && (\r\n <iv-link \r\n linktype='button'\r\n classmodifier={`${BLOCK}-cta-btn`} \r\n linkhref={href}>\r\n {this.buttontext}\r\n </iv-link>\r\n )}\r\n {this.addtocarttext && this.data?.variantId && this.appendAddToCartButton(this.data.variantId, 1)}\r\n </div>\r\n </div>\r\n );\r\n\r\n };\r\n\r\n};"],"version":3}
1
+ {"file":"p-IJUHvLzw.js","mappings":"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","names":["__stencil_proxyCustomElement","HTMLElement"],"sources":["src/components/iv-card/iv-card.scss?tag=iv-card","src/components/iv-card/iv-card.tsx"],"sourcesContent":["// Base iv-card styles with theming tokens (CSS custom properties)\r\n// Designers override --iv-card-* variables in theme / scope; we keep safe fallbacks.\r\n\r\n.iv-card {\r\n display: var(--iv-card-display, block);\r\n box-sizing: border-box;\r\n padding: var(--iv-card-padding, 0);\r\n margin: var(--iv-card-margin, 0);\r\n background: var(--iv-card-bg, transparent);\r\n color: var(--iv-card-color, inherit);\r\n border: var(--iv-card-border, none);\r\n border-radius: var(--iv-card-border-radius, 0);\r\n box-shadow: var(--iv-card-shadow, none);\r\n font-size: var(--iv-card-font-size, inherit);\r\n line-height: var(--iv-card-line-height, 1.4);\r\n position: relative;\r\n text-decoration: none;\r\n transition: var(--iv-card-transition, background-color .2s ease, color .2s ease, box-shadow .2s ease, border-color .2s ease);\r\n gap: var(--iv-card-gap, 0.75rem);\r\n display: var(--iv-card-layout, flex);\r\n flex-direction: var(--iv-card-flex-direction, column);\r\n\r\n a, a:visited, a:hover, a:focus {\r\n text-decoration: var(--iv-card-link-text-decoration, none);\r\n color: var(--iv-card-link-color, inherit);\r\n }\r\n}\r\n\r\n.iv-card[href],\r\n.iv-card.is-interactive {\r\n cursor: pointer;\r\n}\r\n\r\n.iv-card[href]:hover,\r\n.iv-card[href]:focus-visible,\r\n.iv-card.is-interactive:hover,\r\n.iv-card.is-interactive:focus-visible {\r\n background: var(--iv-card-hover-bg, var(--iv-card-bg, transparent));\r\n border: var(--iv-card-hover-border, var(--iv-card-border, none));\r\n box-shadow: var(--iv-card-hover-shadow, var(--iv-card-shadow, none));\r\n outline: var(--iv-card-focus-outline, none);\r\n box-shadow: var(--iv-card-focus-ring, var(--iv-card-hover-shadow, var(--iv-card-shadow, none)));\r\n}\r\n\r\n// Wrapper link (when whole card is clickable) gets its own modifier class\r\n.iv-card-link-wrapper {\r\n display: var(--iv-card-link-wrapper-display, contents); // allows children to layout naturally\r\n text-decoration: none;\r\n color: inherit;\r\n cursor: pointer;\r\n}\r\n\r\n// Prevent underline / link style bleed onto data fields\r\n.iv-card-field {\r\n display: block;\r\n margin: 0;\r\n padding: 0;\r\n font-weight: var(--iv-card-field-font-weight, inherit);\r\n color: var(--iv-card-field-color, inherit);\r\n word-break: break-word;\r\n text-decoration: none;\r\n}\r\n\r\n// Ensure Add to Cart button remains clickable and visually distinct inside clickable card\r\n.iv-card .iv-card-add-to-cart-btn {\r\n position: relative;\r\n z-index: 2;\r\n}\r\n\r\n// Hover / focus styling only adjusts background / shadow, not text decoration\r\n.iv-card-link-wrapper:hover .iv-card-field,\r\n.iv-card-link-wrapper:focus-visible .iv-card-field {\r\n text-decoration: none;\r\n}\r\n\r\n// Optional variable-driven hover state (kept non-invasive)\r\n.iv-card-link-wrapper:hover,\r\n.iv-card-link-wrapper:focus-visible {\r\n background: var(--iv-card-link-hover-bg, var(--iv-card-hover-bg, transparent));\r\n}\r\n\r\n.iv-card-image {\r\n display: block;\r\n width: 100%;\r\n height: auto;\r\n aspect-ratio: var(--iv-card-image-aspect-ratio, auto);\r\n object-fit: var(--iv-card-image-object-fit, cover);\r\n border-radius: var(--iv-card-image-border-radius, var(--iv-card-border-radius, 0));\r\n background: var(--iv-card-image-bg, transparent);\r\n}\r\n\r\n.iv-card-title { \r\n font-weight: var(--iv-card-heading-font-weight, 600);\r\n font-size: var(--iv-card-title-font-size, 1em);\r\n line-height: var(--iv-card-title-line-height, 1.2);\r\n}\r\n\r\n.iv-card-price {\r\n color: var(--iv-card-price-color, inherit);\r\n font-weight: var(--iv-card-price-weight, 500);\r\n}\r\n\r\n.iv-card-controls {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: var(--iv-card-control-gap, 0.5rem);\r\n align-items: center;\r\n margin-top: var(--iv-card-controls-margin-top, var(--iv-card-gap, 0.75rem));\r\n}\r\n\r\n.iv-card-add-to-cart-btn {\r\n --iv-button-variant: var(--iv-card-button-variant, primary);\r\n}\r\n\r\n.iv-card-inner { \r\n width: 100%;\r\n display: contents; \r\n}\r\n\r\n@media (prefers-reduced-motion: reduce) {\r\n .iv-card {\r\n transition: none;\r\n }\r\n}","import { Component, h, Prop } from '@stencil/core';\r\nimport { state } from '../../utils/store/store';\r\nimport { formatMoney, getProductIDFromGid, requestedFields } from '../../utils/helpers/factory';\r\nimport { addToCart } from '../../utils/storefront_api/factory';\r\n\r\nconst BLOCK = 'iv-card';\r\nconst HIDDEN_FIELDS = new Set([\r\n 'id',\r\n 'handle',\r\n 'url',\r\n 'productUrl',\r\n 'imageUrl',\r\n 'imageAlt',\r\n 'variantId',\r\n 'images'\r\n]);\r\n\r\n@Component({\r\n tag: 'iv-card',\r\n styleUrl: 'iv-card.scss',\r\n shadow: false\r\n})\r\n\r\nexport class IvCard {\r\n @Prop() data: Record<string, any>;\r\n @Prop() fields?: string;\r\n @Prop() cardtype?: string; \r\n @Prop() classmodifier?: string;\r\n @Prop() buttontext?: string;\r\n @Prop() calltoaction: boolean = false;\r\n @Prop() addtocarttext?: string;\r\n\r\n private allowedFields: string[] | null = null;\r\n\r\n componentWillLoad() {\r\n if(this.fields) this.allowedFields = requestedFields(this.fields);\r\n };\r\n\r\n private generateImage(url: string, alt: string) {\r\n return (<img src={url} alt={alt || 'Product image'} class={`${BLOCK}-image`}/>);\r\n };\r\n\r\n private appendAddToCartButton(gid: string, quantity: number){\r\n const id: number = getProductIDFromGid(gid);\r\n return (\r\n <iv-button \r\n classmodifier={`${BLOCK}-add-to-cart-btn`} \r\n onClick={(e: any) => { e.preventDefault(); e.stopPropagation(); addToCart({id, quantity}); }}>\r\n <span class=\"inner-button\" innerHTML={this.addtocarttext}></span>\r\n </iv-button>\r\n );\r\n };\r\n\r\n private buildProductHref(): string | null {\r\n const handle = this.data?.handle;\r\n if(!handle) return null;\r\n const base = this.cardtype || 'products';\r\n return `/${base}/${handle}`.replace(/\\\\+/g,'/');\r\n };\r\n\r\n render() {\r\n let entries: [string, any][] = this.data ? Object.entries(this.data) : [];\r\n if(this.allowedFields && this.allowedFields.length > 0) entries = entries.filter(([key]) => this.allowedFields.includes(key));\r\n const imageUrl = this.data?.imageUrl;\r\n const imageAlt = this.data?.imageAlt;\r\n const wantsImage = !this.allowedFields || this.allowedFields.includes('imageUrl') || this.allowedFields.includes('images');\r\n const showImage = wantsImage && !!imageUrl;\r\n const href = this.buildProductHref();\r\n const content = [\r\n showImage ? this.generateImage(imageUrl, imageAlt) : null,\r\n ...entries.map(([key, value]) => {\r\n if(HIDDEN_FIELDS.has(key)) return null; // suppress structural fields\r\n if(value === undefined || value === null || value === '') return null;\r\n return (\r\n <span key={key} class={`${BLOCK}-field ${BLOCK}-${key}`}>\r\n {key.includes('price') ? formatMoney(value, state.currencyCode) : value}\r\n </span>\r\n );\r\n })\r\n ];\r\n\r\n if(this.calltoaction && href) {\r\n return (\r\n <div class={`${BLOCK} ${this.classmodifier || ''}`.trim()}>\r\n <iv-link \r\n classmodifier={`${BLOCK}-link-wrapper`} \r\n linktype='wrapper'\r\n linkhref={href}>\r\n {content}\r\n </iv-link>\r\n <div class={`${BLOCK}-controls`}>\r\n {this.buttontext && (\r\n <iv-link \r\n linktype='button'\r\n classmodifier={`${BLOCK}-cta-btn`} \r\n linkhref={href}>\r\n {this.buttontext}\r\n </iv-link>\r\n )}\r\n {this.addtocarttext && this.data?.variantId && this.appendAddToCartButton(this.data.variantId, 1)}\r\n </div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div class={`${BLOCK} ${this.classmodifier || ''}`.trim()}>\r\n {content}\r\n <div class={`${BLOCK}-controls`}>\r\n {this.buttontext && href && (\r\n <iv-link \r\n linktype='button'\r\n classmodifier={`${BLOCK}-cta-btn`} \r\n linkhref={href}>\r\n {this.buttontext}\r\n </iv-link>\r\n )}\r\n {this.addtocarttext && this.data?.variantId && this.appendAddToCartButton(this.data.variantId, 1)}\r\n </div>\r\n </div>\r\n );\r\n\r\n };\r\n\r\n};"],"version":3}
@@ -4,7 +4,8 @@ async function shopifyFetch(query, variables = {}) {
4
4
  try {
5
5
  if (!state.shopDomainApi || !state.storefrontToken)
6
6
  throw new Error('Missing Shopify configuration (shopDomain/storefrontToken)');
7
- const endpoint = `https://${state.shopDomainApi}/api/2025-07/graphql.json`;
7
+ // const endpoint = `https://${state.shopDomainApi}/api/2025-07/graphql.json`;
8
+ const endpoint = 'https://craftnberry-co-uk.myshopify.com/api/2025-07/graphql.json';
8
9
  console.log('[IV] Shopify Fetch to', endpoint);
9
10
  const token = state.storefrontToken;
10
11
  console.log('[IV] Using storefront token', token);
@@ -211,6 +212,6 @@ async function addToCart(options) {
211
212
  }
212
213
 
213
214
  export { addToCart as a, fetchProductByID as b, fetchProducts as f, getIdFromHandle as g };
214
- //# sourceMappingURL=factory-CEG06b1_.js.map
215
+ //# sourceMappingURL=factory-Bf2IW1Vz.js.map
215
216
 
216
- //# sourceMappingURL=factory-CEG06b1_.js.map
217
+ //# sourceMappingURL=factory-Bf2IW1Vz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory-Bf2IW1Vz.js","sources":["src/utils/storefront_api/factory.ts"],"sourcesContent":["import { state, showToast } from \"../store/store\";\r\nasync function shopifyFetch(query: string, variables: Record<string, any> = {}): Promise<any> {\r\n try {\r\n if(!state.shopDomainApi || !state.storefrontToken) throw new Error('Missing Shopify configuration (shopDomain/storefrontToken)');\r\n // const endpoint = `https://${state.shopDomainApi}/api/2025-07/graphql.json`;\r\n const endpoint = 'https://craftnberry-co-uk.myshopify.com/api/2025-07/graphql.json';\r\n console.log('[IV] Shopify Fetch to', endpoint);\r\n const token = state.storefrontToken;\r\n console.log('[IV] Using storefront token', token);\r\n const res = await fetch(endpoint, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-Shopify-Storefront-Access-Token': token\r\n },\r\n body: JSON.stringify({ query, variables })\r\n });\r\n const json = await res.json();\r\n if(json.errors) throw new Error(json.errors.map((e: any) => e.message).join(', '));\r\n return json.data;\r\n } catch(error) {\r\n console.error('Shopify Fetch Error:', error);\r\n throw error; \r\n };\r\n};\r\n\r\nexport async function getIdFromHandle(handle: string): Promise<string | null> {\r\n const query = `\r\n query ($handle: String!) {\r\n product(handle: $handle) {\r\n id\r\n }\r\n }`;\r\n try {\r\n const data = await shopifyFetch(query, { handle });\r\n return data?.product?.id || null;\r\n } catch (error) {\r\n console.error('getIdFromHandle error:', error);\r\n return null;\r\n };\r\n};\r\n\r\n// Field + normalization helpers\r\nconst BASE_PRODUCT_FIELDS = ['id','handle','title'];\r\nconst DEFAULT_VARIANT_FIELDS = ['id','title','price { amount currencyCode }'];\r\n\r\nfunction mergeFields(requested: string[] | string, defaults: string[]): string[] {\r\n const req = (Array.isArray(requested) ? requested : requested.split(','))\r\n .map(f => f.trim())\r\n .filter(Boolean);\r\n const seen = new Set<string>();\r\n const ordered: string[] = [];\r\n for(const f of req) { \r\n if(!seen.has(f)) { \r\n seen.add(f); ordered.push(f); \r\n }; \r\n };\r\n for(const d of defaults) { \r\n if(!seen.has(d)) { \r\n seen.add(d); \r\n ordered.push(d); \r\n }; \r\n };\r\n return ordered;\r\n};\r\n\r\nfunction expandProductFields(fields: string[]): string {\r\n return fields\r\n .filter(f => f !== 'price')\r\n .map(f => {\r\n if(f === 'images') return 'images(first: 10) { nodes { url altText } }';\r\n return f;\r\n })\r\n .join('\\n');\r\n};\r\n\r\nfunction variantSelection(fields: string[] = DEFAULT_VARIANT_FIELDS): string {\r\n return fields.join('\\n');\r\n};\r\n\r\ninterface NormalizedProduct {\r\n id: string;\r\n handle?: string;\r\n title?: string;\r\n variantId?: string;\r\n price?: string | null;\r\n imageUrl?: string | null;\r\n imageAlt?: string | null;\r\n // index signature for dynamic requested fields\r\n [key: string]: any;\r\n};\r\n\r\nfunction normalizeProduct(product: any, selectedVariant?: any): NormalizedProduct {\r\n const variant = selectedVariant || product.variants?.edges?.[0]?.node || {};\r\n let imageUrl = null;\r\n let imageAlt = null;\r\n if(product.images?.nodes && product.images.nodes.length > 0) {\r\n imageUrl = product.images.nodes[0].url || null;\r\n imageAlt = product.images.nodes[0].altText || null;\r\n };\r\n const { id: variantId, price } = variant;\r\n return {\r\n id: product.id,\r\n ...Object.fromEntries(Object.entries(product).filter(([key]) => key !== 'variants')),\r\n variantId,\r\n price: price?.amount || null,\r\n imageUrl,\r\n imageAlt,\r\n };\r\n};\r\n\r\n// Query builders\r\nfunction buildProductsQuery(fieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($limit: Int!, $sortKey: ProductSortKeys!, $reverse: Boolean) {\r\n products(first: $limit, sortKey: $sortKey, reverse: $reverse) {\r\n edges {\r\n node {\r\n ${fieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }\r\n }\r\n }`;\r\n};\r\n\r\nfunction buildCollectionProductsQuery(fieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($handle: String!, $limit: Int!, $sortKey: ProductCollectionSortKeys!, $reverse: Boolean) {\r\n collection(handle: $handle) {\r\n products(first: $limit, sortKey: $sortKey, reverse: $reverse) {\r\n edges {\r\n node {\r\n ${fieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }\r\n }\r\n }\r\n }`;\r\n};\r\n\r\nfunction buildSingleProductQuery(fieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($id: ID!) {\r\n product(id: $id) {\r\n ${fieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }`;\r\n};\r\n\r\nfunction buildVariantProductQuery(productFieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($id: ID!) {\r\n productVariant(id: $id) {\r\n ${variantFieldsString}\r\n product {\r\n ${productFieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }\r\n }`;\r\n};\r\n\r\n// Public API\r\nexport async function fetchProducts(limit: number, collectionHandle: string, sortKey: string, fields: string[] | string, reversed: boolean = false) {\r\n try {\r\n const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);\r\n const fieldsString = expandProductFields(merged);\r\n const variantFieldsString = variantSelection();\r\n const isAll = !collectionHandle || collectionHandle === 'all';\r\n const query = isAll ? buildProductsQuery(fieldsString, variantFieldsString) : buildCollectionProductsQuery(fieldsString, variantFieldsString);\r\n const reverse = !!reversed;\r\n const variables: Record<string, any> = isAll ? { limit, sortKey, reverse } : { handle: collectionHandle, limit, sortKey, reverse };\r\n const data = await shopifyFetch(query, variables);\r\n const productEdges = data.products?.edges || data.collection?.products?.edges || [];\r\n return productEdges.map((edge: any) => normalizeProduct(edge.node));\r\n } catch(error) { \r\n console.error('Fetch Products Error:', error); throw error;\r\n };\r\n};\r\n\r\nexport async function fetchProductByID(id: string, fields: string[] | string, options?: { variantId?: string }): Promise<NormalizedProduct | null> {\r\n try {\r\n if(options?.variantId) return await getVariantProduct(options.variantId, fields);\r\n const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);\r\n const fieldsString = expandProductFields(merged);\r\n const variantFieldsString = variantSelection();\r\n const query = buildSingleProductQuery(fieldsString, variantFieldsString);\r\n const data = await shopifyFetch(query, { id });\r\n const product = data?.product;\r\n if(!product) return null;\r\n return normalizeProduct(product);\r\n } catch(error) { console.error('Fetch Product By ID Error:', error); throw error; };\r\n};\r\n\r\nexport async function getVariantProduct(variantId: string, fields: string[] | string): Promise<NormalizedProduct | null> {\r\n try {\r\n const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);\r\n const productFieldsString = expandProductFields(merged);\r\n const variantFieldsString = variantSelection();\r\n const query = buildVariantProductQuery(productFieldsString, variantFieldsString);\r\n const data = await shopifyFetch(query, { id: variantId });\r\n const variantNode = data?.productVariant;\r\n if(!variantNode) return null;\r\n const product = variantNode.product;\r\n if(!product) return null;\r\n return normalizeProduct(product, variantNode); \r\n } catch(error) { console.error('Get Variant Product Error:', error); throw error; };\r\n};\r\n\r\nexport async function addToCart(options: {\r\n id: number;\r\n quantity?: number;\r\n properties?: Record<string, any>;\r\n}) {\r\n try {\r\n console.log('IV add to cart called');\r\n if(!options.id) throw new Error('No variant id provided for addToCart');\r\n const quantity = options.quantity || 1;\r\n const properties = options.properties || {};\r\n const payload = {\r\n items: [\r\n {\r\n id: options.id,\r\n quantity,\r\n properties\r\n }\r\n ]\r\n };\r\n const url = '/cart/add.js';\r\n const res = await fetch(url, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Accept': 'application/json',\r\n 'X-Requested-With': 'XMLHttpRequest'\r\n },\r\n body: JSON.stringify(payload)\r\n });\r\n if(!res.ok) {\r\n const errorText = await res.text();\r\n throw new Error(errorText);\r\n };\r\n const cartItem = await res.json();\r\n showToast('Added to cart!', 'success', 3000);\r\n return cartItem;\r\n } catch (error) {\r\n showToast('Error adding to cart', 'error', 5000);\r\n throw error;\r\n };\r\n};"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { g as getAssetPath, r as registerInstance, h, H as Host, c as getElement, d as createEvent, a as state, e as removeFromWishlist } from './index-Cb3Nnjkn.js';
2
2
  import { r as requestedFields, i as isValueEmail, a as isValuePhoneNumber, c as classNames, g as getProductIDFromGid } from './factory-CL9gCgzW.js';
3
- import { a as addToCart } from './factory-CEG06b1_.js';
3
+ import { a as addToCart } from './factory-Bf2IW1Vz.js';
4
4
 
5
5
  let CACHED_MAP;
6
6
  const getIconMap = () => {
@@ -1,6 +1,6 @@
1
1
  import { r as registerInstance, h, a as state } from './index-Cb3Nnjkn.js';
2
2
  import { r as requestedFields, g as getProductIDFromGid, f as formatMoney } from './factory-CL9gCgzW.js';
3
- import { a as addToCart } from './factory-CEG06b1_.js';
3
+ import { a as addToCart } from './factory-Bf2IW1Vz.js';
4
4
 
5
5
  const ivCardCss = ".iv-card{display:var(--iv-card-display, block);box-sizing:border-box;padding:var(--iv-card-padding, 0);margin:var(--iv-card-margin, 0);background:var(--iv-card-bg, transparent);color:var(--iv-card-color, inherit);border:var(--iv-card-border, none);border-radius:var(--iv-card-border-radius, 0);box-shadow:var(--iv-card-shadow, none);font-size:var(--iv-card-font-size, inherit);line-height:var(--iv-card-line-height, 1.4);position:relative;text-decoration:none;transition:var(--iv-card-transition, background-color 0.2s ease, color 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease);gap:var(--iv-card-gap, 0.75rem);display:var(--iv-card-layout, flex);flex-direction:var(--iv-card-flex-direction, column)}.iv-card a,.iv-card a:visited,.iv-card a:hover,.iv-card a:focus{text-decoration:var(--iv-card-link-text-decoration, none);color:var(--iv-card-link-color, inherit)}.iv-card[href],.iv-card.is-interactive{cursor:pointer}.iv-card[href]:hover,.iv-card[href]:focus-visible,.iv-card.is-interactive:hover,.iv-card.is-interactive:focus-visible{background:var(--iv-card-hover-bg, var(--iv-card-bg, transparent));border:var(--iv-card-hover-border, var(--iv-card-border, none));box-shadow:var(--iv-card-hover-shadow, var(--iv-card-shadow, none));outline:var(--iv-card-focus-outline, none);box-shadow:var(--iv-card-focus-ring, var(--iv-card-hover-shadow, var(--iv-card-shadow, none)))}.iv-card-link-wrapper{display:var(--iv-card-link-wrapper-display, contents);text-decoration:none;color:inherit;cursor:pointer}.iv-card-field{display:block;margin:0;padding:0;font-weight:var(--iv-card-field-font-weight, inherit);color:var(--iv-card-field-color, inherit);word-break:break-word;text-decoration:none}.iv-card .iv-card-add-to-cart-btn{position:relative;z-index:2}.iv-card-link-wrapper:hover .iv-card-field,.iv-card-link-wrapper:focus-visible .iv-card-field{text-decoration:none}.iv-card-link-wrapper:hover,.iv-card-link-wrapper:focus-visible{background:var(--iv-card-link-hover-bg, var(--iv-card-hover-bg, transparent))}.iv-card-image{display:block;width:100%;height:auto;aspect-ratio:var(--iv-card-image-aspect-ratio, auto);object-fit:var(--iv-card-image-object-fit, cover);border-radius:var(--iv-card-image-border-radius, var(--iv-card-border-radius, 0));background:var(--iv-card-image-bg, transparent)}.iv-card-title{font-weight:var(--iv-card-heading-font-weight, 600);font-size:var(--iv-card-title-font-size, 1em);line-height:var(--iv-card-title-line-height, 1.2)}.iv-card-price{color:var(--iv-card-price-color, inherit);font-weight:var(--iv-card-price-weight, 500)}.iv-card-controls{display:flex;flex-wrap:wrap;gap:var(--iv-card-control-gap, 0.5rem);align-items:center;margin-top:var(--iv-card-controls-margin-top, var(--iv-card-gap, 0.75rem))}.iv-card-add-to-cart-btn{--iv-button-variant:var(--iv-card-button-variant, primary)}.iv-card-inner{width:100%;display:contents}@media (prefers-reduced-motion: reduce){.iv-card{transition:none}}";
6
6
 
@@ -1,5 +1,5 @@
1
1
  import { r as registerInstance, j as createErrorHandler, a as state, h } from './index-Cb3Nnjkn.js';
2
- import { f as fetchProducts } from './factory-CEG06b1_.js';
2
+ import { f as fetchProducts } from './factory-Bf2IW1Vz.js';
3
3
  import { p as productCache } from './productCache-C9YXddZh.js';
4
4
 
5
5
  const ivDynamicProductsCarouselCss = ":host{display:block}.iv-dynamic-products-carousel{position:relative}.iv-dynamic-products-carousel-carousel{position:relative}.iv-dynamic-products-carousel-viewport{overflow:hidden;width:100%}.iv-dynamic-products-carousel-track{display:flex;width:100%;transition:transform 0.55s cubic-bezier(0.4, 0.7, 0.2, 1);will-change:transform}.iv-dynamic-products-carousel-slide{flex:0 0 100%;box-sizing:border-box;padding:0.25rem 0.5rem;display:grid;grid-template-columns:repeat(6, minmax(0, 1fr));gap:1rem;align-items:stretch;grid-auto-rows:1fr}@media (max-width: 1200px){.iv-dynamic-products-carousel-slide{grid-template-columns:repeat(4, minmax(0, 1fr))}}@media (max-width: 900px){.iv-dynamic-products-carousel-slide{grid-template-columns:repeat(3, minmax(0, 1fr))}}@media (max-width: 640px){.iv-dynamic-products-carousel-slide{grid-template-columns:repeat(2, minmax(0, 1fr));gap:0.75rem}}.iv-dynamic-products-carousel-card{height:100%;display:flex;flex-direction:column;background:#fff;padding:0.75rem 0.75rem 0.9rem;box-shadow:0 2px 6px rgba(0, 0, 0, 0.08);transition:box-shadow 0.2s ease, transform 0.2s ease}.iv-dynamic-products-carousel-card .iv-card-title{line-height:1.2;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;overflow:hidden;min-height:2.4em}.iv-dynamic-products-carousel-card .iv-card-controls{margin-top:auto;}.iv-dynamic-products-carousel-card:hover{box-shadow:0 4px 14px rgba(0, 0, 0, 0.15);transform:translateY(-2px)}.iv-dynamic-products-carousel-card:active{transform:translateY(0);box-shadow:0 2px 6px rgba(0, 0, 0, 0.12)}.iv-dynamic-products-carousel-card img,.iv-dynamic-products-carousel-card picture,.iv-dynamic-products-carousel-card .media{width:100%;aspect-ratio:1/1;object-fit:contain;display:flex;align-items:center;justify-content:center;margin:0 0 0.65rem}.iv-dynamic-products-carousel-nav{position:absolute;top:50%;transform:translateY(-50%);background:var(--iv-carousel-nav-bg, rgba(0, 0, 0, 0.55));color:#fff;border:none;width:2.75rem;height:2.75rem;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;backdrop-filter:blur(6px);box-shadow:0 4px 12px rgba(0, 0, 0, 0.25);transition:background 0.2s ease, transform 0.2s ease;outline:none;z-index:10}.iv-dynamic-products-carousel-nav:focus-visible{outline:2px solid #fff;outline-offset:3px}.iv-dynamic-products-carousel-nav:hover:not(:disabled){background:var(--iv-carousel-nav-bg-hover, rgba(0, 0, 0, 0.75));transform:translateY(-50%) scale(1.05);box-shadow:0 6px 18px rgba(0, 0, 0, 0.35)}.iv-dynamic-products-carousel-nav:disabled{opacity:0.4;cursor:default}.iv-dynamic-products-carousel-nav-prev{left:0.25rem}.iv-dynamic-products-carousel-nav-next{right:0.25rem}.iv-dynamic-products-carousel-status{margin-top:0.75rem;font-size:0.875rem;text-align:center;color:var(--iv-carousel-status-color, #555)}.iv-dynamic-products-carousel-viewport::-webkit-scrollbar{display:none}.iv-dynamic-products-carousel-viewport{-ms-overflow-style:none;scrollbar-width:none}";