the-foxy-library 1.0.1 → 1.0.2

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.
@@ -4,7 +4,7 @@ var index = require('./index-DiBg0RCo.js');
4
4
  var factory$1 = require('./factory-CktIyPWt.js');
5
5
  var factory = require('./factory-CffqQl1G.js');
6
6
 
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;border:1px solid #111;border-radius:4px;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: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}.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}";
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: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}";
8
8
 
9
9
  const BLOCK = 'iv-dynamic-products-carousel';
10
10
  const IvDynamicProductsCarousel = class {
@@ -1 +1 @@
1
- {"version":3,"file":"iv-dynamic-products-carousel.entry.cjs.js","sources":["src/components/iv-dynamic-products-carousel/iv-dynamic-products-carousel.scss?tag=iv-dynamic-products-carousel","src/components/iv-dynamic-products-carousel/iv-dynamic-products-carousel.tsx"],"sourcesContent":[":host {\n display: block;\n}\n\n.iv-dynamic-products-carousel { position:relative; }\n\n.iv-dynamic-products-carousel-carousel { position:relative; }\n\n.iv-dynamic-products-carousel-viewport { overflow:hidden; width:100%; }\n\n.iv-dynamic-products-carousel-track { display:flex; width:100%; transition: transform .55s cubic-bezier(.4,.7,.2,1); will-change:transform; }\n\n.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; }\n\n@media (max-width: 1200px) { .iv-dynamic-products-carousel-slide { grid-template-columns:repeat(4, minmax(0,1fr)); } }\n@media (max-width: 900px) { .iv-dynamic-products-carousel-slide { grid-template-columns:repeat(3, minmax(0,1fr)); } }\n@media (max-width: 640px) { .iv-dynamic-products-carousel-slide { grid-template-columns:repeat(2, minmax(0,1fr)); gap:0.75rem; } }\n\n.iv-dynamic-products-carousel-card { \n height:100%; \n display:flex; \n flex-direction:column; \n background:#fff; \n border:1px solid #111; \n border-radius:4px; \n padding:0.75rem 0.75rem 0.9rem; \n box-shadow:0 2px 6px rgba(0,0,0,.08); \n transition:box-shadow .2s ease, transform .2s ease; \n}\n.iv-dynamic-products-carousel-card:hover { box-shadow:0 4px 14px rgba(0,0,0,.15); transform:translateY(-2px); }\n.iv-dynamic-products-carousel-card:active { transform:translateY(0); box-shadow:0 2px 6px rgba(0,0,0,.12); }\n\n.iv-dynamic-products-carousel-card img, \n.iv-dynamic-products-carousel-card picture, \n.iv-dynamic-products-carousel-card .media { \n width:100%; \n aspect-ratio:1/1; \n object-fit:contain; \n display:flex; \n align-items:center; \n justify-content:center; \n margin:0 0 .65rem; \n}\n\n.iv-dynamic-products-carousel-nav { position:absolute; top:50%; transform:translateY(-50%); background:var(--iv-carousel-nav-bg, rgba(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,.25); transition:background .2s ease, transform .2s ease; outline:none; }\n.iv-dynamic-products-carousel-nav:focus-visible { outline:2px solid #fff; outline-offset:3px; }\n.iv-dynamic-products-carousel-nav:hover:not(:disabled){ background:var(--iv-carousel-nav-bg-hover, rgba(0,0,0,.75)); transform:translateY(-50%) scale(1.05); box-shadow:0 6px 18px rgba(0,0,0,.35); }\n.iv-dynamic-products-carousel-nav:disabled{ opacity:.4; cursor:default; }\n.iv-dynamic-products-carousel-nav-prev { left:0.25rem; }\n.iv-dynamic-products-carousel-nav-next { right:0.25rem; }\n\n.iv-dynamic-products-carousel-status { margin-top:0.75rem; font-size:0.875rem; text-align:center; color:var(--iv-carousel-status-color, #555); }\n\n/* Hide potential scrollbars in some environments (defensive) */\n.iv-dynamic-products-carousel-viewport::-webkit-scrollbar { display:none; }\n.iv-dynamic-products-carousel-viewport { -ms-overflow-style:none; scrollbar-width:none; }\n","import { Component, h, Prop, State, Watch } from '@stencil/core';\nimport { state } from '../../utils/store/store';\nimport { fetchProducts } from '../../utils/storefront_api/factory';\nimport { productCache } from '../../utils/caching/productCache';\nimport { createErrorHandler } from '../../utils/error_handling/factory';\n\nconst BLOCK = 'iv-dynamic-products-carousel';\n\n@Component({\n tag: 'iv-dynamic-products-carousel',\n styleUrl: 'iv-dynamic-products-carousel.scss',\n shadow: false\n})\n\nexport class IvDynamicProductsCarousel {\n @Prop() type: 'CREATED' | 'BEST_SELLING' | 'PRICE' | 'TITLE' | 'RELEVANCE' = 'CREATED'; \n @Prop() limit: number = 24;\n @Prop() reversed: boolean = false; \n @Prop() componenttitle?: string;\n @Prop() titletag: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' = 'h2';\n @Prop() collectionhandle: string = 'all';\n @Prop() requestedfields: string;\n @Prop() calltoaction: boolean = false;\n @Prop() buttontext?: string;\n @Prop() addtocarttext?: string;\n @Prop() emptystring: string = 'No products found';\n @Prop() cachettl?: number; \n @Prop() stale?: boolean = true; \n \n @State() products: any[] = [];\n @State() errorMsg: string; \n @State() staleData: boolean = false;\n @State() page: number = 0; \n\n private readonly itemsPerPage = 6;\n\n private errors = createErrorHandler({ component: 'iv-dynamic-products-carousel' });\n\n @Watch('type')\n @Watch('limit')\n @Watch('collectionhandle')\n @Watch('requestedfields')\n handlePropChange() { this.loadProducts(true); }\n\n async componentWillLoad() { \n await this.loadProducts(false); \n };\n \n private buildParams() {\n return {\n handle: this.collectionhandle,\n sort: this.type,\n fields: this.requestedfields,\n limit: this.limit,\n currency: state.currencyCode,\n reversed: this.reversed\n };\n };\n\n private async loadProducts(fromWatch: boolean) {\n const params = this.buildParams();\n const ttl = this.cachettl || 1000 * 60 * 5;\n state.loading = !fromWatch; \n try {\n const data = await productCache.getOrSetData(\n params,\n async () => {\n const fresh = await fetchProducts(this.limit, this.collectionhandle, this.type, this.requestedfields, this.reversed);\n return fresh;\n },\n {\n ttl,\n staleWhileRevalidate: this.stale,\n transform: (fresh) => fresh \n }\n );\n const metaCheck = productCache.getData<typeof data>(params);\n this.staleData = metaCheck.isExpired && metaCheck.isStale;\n this.products = data || [];\n this.page = 0;\n } catch (err: any) {\n this.errorMsg = 'Failed to load products';\n this.errors.handle({\n error: err,\n scope: 'loadProducts',\n userMessage: 'Unable to load products right now.',\n devMessage: 'fetchProducts failed in iv-dynamic-products',\n severity: 'error'\n });\n } finally {\n state.loading = false;\n };\n };\n\n private pagedProducts() {\n const chunks: any[][] = [];\n for(let i=0; i < this.products.length; i += this.itemsPerPage) {\n chunks.push(this.products.slice(i, i + this.itemsPerPage));\n };\n return chunks;\n };\n\n private next = () => { \n const pages = this.pagedProducts().length;\n if(this.page < pages - 1) this.page++;\n };\n\n private prev = () => { \n if(this.page > 0) this.page--;\n };\n\n render() {\n\n const TAG = this.titletag as any;\n\n return (\n <div class={BLOCK} data-stale={this.staleData ? 'true' : 'false'}>\n {this.componenttitle && <TAG class={`${BLOCK}-title`}>{this.componenttitle}</TAG>}\n {state.loading ? (\n <iv-spinner></iv-spinner>\n ) : this.errorMsg ? (\n <div class={`${BLOCK}-error`}>{this.errorMsg}</div>\n ) : this.products.length === 0 ? (\n <div class={`${BLOCK}-empty`}>{this.emptystring}</div>\n ) : (\n <div class={`${BLOCK}-carousel`} aria-roledescription=\"carousel\">\n <button class={`${BLOCK}-nav ${BLOCK}-nav-prev`} onClick={this.prev} disabled={this.page===0} aria-label=\"Previous\" type=\"button\">\n ‹\n </button>\n <div class={`${BLOCK}-viewport`}>\n <div class={`${BLOCK}-track`} style={{ transform: `translateX(-${this.page * 100}%)` }}>\n {this.pagedProducts().map((group, i) => (\n <div class={`${BLOCK}-slide`} role=\"group\" aria-label={`Slide ${i+1} of ${this.pagedProducts().length}`}> \n {group.map(product => (\n <iv-card\n cardtype='products'\n calltoaction={this.calltoaction}\n buttontext={this.buttontext}\n addtocarttext={this.addtocarttext}\n data={product}\n classmodifier={`${BLOCK}-card`} />\n ))}\n </div>\n ))}\n </div>\n </div>\n <button class={`${BLOCK}-nav ${BLOCK}-nav-next`} onClick={this.next} disabled={this.page===this.pagedProducts().length-1} aria-label=\"Next\" type=\"button\">\n ›\n </button>\n <div class={`${BLOCK}-status`} aria-live=\"polite\">{this.pagedProducts().length > 1 ? `Slide ${this.page+1} of ${this.pagedProducts().length}` : ''}</div>\n {this.staleData && (\n <div class={`${BLOCK}-stale-indicator`} aria-live=\"polite\">Refreshing…</div>\n )}\n </div>\n )}\n </div>\n );\n };\n\n};"],"names":["createErrorHandler","state","productCache","fetchProducts","h"],"mappings":"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"}
1
+ {"version":3,"file":"iv-dynamic-products-carousel.entry.cjs.js","sources":["src/components/iv-dynamic-products-carousel/iv-dynamic-products-carousel.scss?tag=iv-dynamic-products-carousel","src/components/iv-dynamic-products-carousel/iv-dynamic-products-carousel.tsx"],"sourcesContent":[":host {\n display: block;\n}\n\n.iv-dynamic-products-carousel { \n position:relative;\n}\n\n.iv-dynamic-products-carousel-carousel { \n position:relative;\n}\n\n.iv-dynamic-products-carousel-viewport { \n overflow:hidden; \n width:100%;\n}\n\n.iv-dynamic-products-carousel-track { \n display:flex; \n width:100%; \n transition: \n transform .55s cubic-bezier(.4,.7,.2,1); \n will-change:transform;\n}\n\n.iv-dynamic-products-carousel-slide { \n flex:0 0 100%; \n box-sizing:border-box; \n padding:0.25rem 0.5rem; \n display:grid; \n grid-template-columns:repeat(6, minmax(0,1fr)); \n gap:1rem; \n align-items:stretch; \n grid-auto-rows:1fr; \n}\n\n@media (max-width: 1200px) { \n .iv-dynamic-products-carousel-slide { \n grid-template-columns:repeat(4, minmax(0,1fr)); \n } \n}\n\n@media (max-width: 900px) { \n .iv-dynamic-products-carousel-slide { \n grid-template-columns:repeat(3, minmax(0,1fr)); \n } \n}\n\n@media (max-width: 640px) { \n .iv-dynamic-products-carousel-slide { \n grid-template-columns:repeat(2, minmax(0,1fr)); \n gap:0.75rem; \n } \n}\n\n.iv-dynamic-products-carousel-card { \n height:100%; \n display:flex; \n flex-direction:column; \n background:#fff; \n padding:0.75rem 0.75rem 0.9rem; \n box-shadow:0 2px 6px rgba(0,0,0,.08); \n transition:box-shadow .2s ease, transform .2s ease; \n}\n\n.iv-dynamic-products-carousel-card:hover { \n box-shadow:0 4px 14px rgba(0,0,0,.15); \n transform:translateY(-2px); \n}\n\n.iv-dynamic-products-carousel-card:active { \n transform:translateY(0); \n box-shadow:0 2px 6px rgba(0,0,0,.12); \n}\n\n.iv-dynamic-products-carousel-card img, \n.iv-dynamic-products-carousel-card picture, \n.iv-dynamic-products-carousel-card .media { \n width:100%; \n aspect-ratio:1/1; \n object-fit:contain; \n display:flex; \n align-items:center; \n justify-content:center; \n margin:0 0 .65rem; \n}\n\n.iv-dynamic-products-carousel-nav { \n position:absolute; \n top:50%; \n transform:translateY(-50%); \n background:var(--iv-carousel-nav-bg, rgba(0,0,0,.55)); \n color:#fff; \n border:none; \n width:2.75rem; \n height:2.75rem; \n border-radius:50%; \n display:flex; \n align-items:center; \n justify-content:center; \n cursor:pointer; \n backdrop-filter:blur(6px); \n box-shadow:0 4px 12px rgba(0,0,0,.25); \n transition:background .2s ease, \n transform .2s ease; \n outline:none;\n z-index: 10;\n }\n\n.iv-dynamic-products-carousel-nav:focus-visible { \n outline:2px solid #fff; \n outline-offset:3px; \n}\n\n.iv-dynamic-products-carousel-nav:hover:not(:disabled){\n background:var(--iv-carousel-nav-bg-hover, rgba(0,0,0,.75)); \n transform:translateY(-50%) scale(1.05); \n box-shadow:0 6px 18px rgba(0,0,0,.35);\n}\n\n.iv-dynamic-products-carousel-nav:disabled{ \n opacity:.4; cursor:default; \n}\n\n.iv-dynamic-products-carousel-nav-prev { \n left:0.25rem; \n}\n\n.iv-dynamic-products-carousel-nav-next { \n right:0.25rem; \n}\n\n.iv-dynamic-products-carousel-status { \n margin-top:0.75rem; \n font-size:0.875rem; \n text-align:center; \n color:var(--iv-carousel-status-color, #555); \n}\n\n.iv-dynamic-products-carousel-viewport::-webkit-scrollbar { \n display:none; \n}\n\n.iv-dynamic-products-carousel-viewport { \n -ms-overflow-style:none; \n scrollbar-width:none; \n}","import { Component, h, Prop, State, Watch } from '@stencil/core';\nimport { state } from '../../utils/store/store';\nimport { fetchProducts } from '../../utils/storefront_api/factory';\nimport { productCache } from '../../utils/caching/productCache';\nimport { createErrorHandler } from '../../utils/error_handling/factory';\n\nconst BLOCK = 'iv-dynamic-products-carousel';\n\n@Component({\n tag: 'iv-dynamic-products-carousel',\n styleUrl: 'iv-dynamic-products-carousel.scss',\n shadow: false\n})\n\nexport class IvDynamicProductsCarousel {\n @Prop() type: 'CREATED' | 'BEST_SELLING' | 'PRICE' | 'TITLE' | 'RELEVANCE' = 'CREATED'; \n @Prop() limit: number = 24;\n @Prop() reversed: boolean = false; \n @Prop() componenttitle?: string;\n @Prop() titletag: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' = 'h2';\n @Prop() collectionhandle: string = 'all';\n @Prop() requestedfields: string;\n @Prop() calltoaction: boolean = false;\n @Prop() buttontext?: string;\n @Prop() addtocarttext?: string;\n @Prop() emptystring: string = 'No products found';\n @Prop() cachettl?: number; \n @Prop() stale?: boolean = true; \n \n @State() products: any[] = [];\n @State() errorMsg: string; \n @State() staleData: boolean = false;\n @State() page: number = 0; \n\n private readonly itemsPerPage = 6;\n\n private errors = createErrorHandler({ component: 'iv-dynamic-products-carousel' });\n\n @Watch('type')\n @Watch('limit')\n @Watch('collectionhandle')\n @Watch('requestedfields')\n handlePropChange() { this.loadProducts(true); }\n\n async componentWillLoad() { \n await this.loadProducts(false); \n };\n \n private buildParams() {\n return {\n handle: this.collectionhandle,\n sort: this.type,\n fields: this.requestedfields,\n limit: this.limit,\n currency: state.currencyCode,\n reversed: this.reversed\n };\n };\n\n private async loadProducts(fromWatch: boolean) {\n const params = this.buildParams();\n const ttl = this.cachettl || 1000 * 60 * 5;\n state.loading = !fromWatch; \n try {\n const data = await productCache.getOrSetData(\n params,\n async () => {\n const fresh = await fetchProducts(this.limit, this.collectionhandle, this.type, this.requestedfields, this.reversed);\n return fresh;\n },\n {\n ttl,\n staleWhileRevalidate: this.stale,\n transform: (fresh) => fresh \n }\n );\n const metaCheck = productCache.getData<typeof data>(params);\n this.staleData = metaCheck.isExpired && metaCheck.isStale;\n this.products = data || [];\n this.page = 0;\n } catch (err: any) {\n this.errorMsg = 'Failed to load products';\n this.errors.handle({\n error: err,\n scope: 'loadProducts',\n userMessage: 'Unable to load products right now.',\n devMessage: 'fetchProducts failed in iv-dynamic-products',\n severity: 'error'\n });\n } finally {\n state.loading = false;\n };\n };\n\n private pagedProducts() {\n const chunks: any[][] = [];\n for(let i=0; i < this.products.length; i += this.itemsPerPage) {\n chunks.push(this.products.slice(i, i + this.itemsPerPage));\n };\n return chunks;\n };\n\n private next = () => { \n const pages = this.pagedProducts().length;\n if(this.page < pages - 1) this.page++;\n };\n\n private prev = () => { \n if(this.page > 0) this.page--;\n };\n\n render() {\n\n const TAG = this.titletag as any;\n\n return (\n <div class={BLOCK} data-stale={this.staleData ? 'true' : 'false'}>\n {this.componenttitle && <TAG class={`${BLOCK}-title`}>{this.componenttitle}</TAG>}\n {state.loading ? (\n <iv-spinner></iv-spinner>\n ) : this.errorMsg ? (\n <div class={`${BLOCK}-error`}>{this.errorMsg}</div>\n ) : this.products.length === 0 ? (\n <div class={`${BLOCK}-empty`}>{this.emptystring}</div>\n ) : (\n <div class={`${BLOCK}-carousel`} aria-roledescription=\"carousel\">\n <button class={`${BLOCK}-nav ${BLOCK}-nav-prev`} onClick={this.prev} disabled={this.page===0} aria-label=\"Previous\" type=\"button\">\n ‹\n </button>\n <div class={`${BLOCK}-viewport`}>\n <div class={`${BLOCK}-track`} style={{ transform: `translateX(-${this.page * 100}%)` }}>\n {this.pagedProducts().map((group, i) => (\n <div class={`${BLOCK}-slide`} role=\"group\" aria-label={`Slide ${i+1} of ${this.pagedProducts().length}`}> \n {group.map(product => (\n <iv-card\n cardtype='products'\n calltoaction={this.calltoaction}\n buttontext={this.buttontext}\n addtocarttext={this.addtocarttext}\n data={product}\n classmodifier={`${BLOCK}-card`} />\n ))}\n </div>\n ))}\n </div>\n </div>\n <button class={`${BLOCK}-nav ${BLOCK}-nav-next`} onClick={this.next} disabled={this.page===this.pagedProducts().length-1} aria-label=\"Next\" type=\"button\">\n ›\n </button>\n <div class={`${BLOCK}-status`} aria-live=\"polite\">{this.pagedProducts().length > 1 ? `Slide ${this.page+1} of ${this.pagedProducts().length}` : ''}</div>\n {this.staleData && (\n <div class={`${BLOCK}-stale-indicator`} aria-live=\"polite\">Refreshing…</div>\n )}\n </div>\n )}\n </div>\n );\n };\n\n};"],"names":["createErrorHandler","state","productCache","fetchProducts","h"],"mappings":"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"}
@@ -54,8 +54,6 @@
54
54
  display: flex;
55
55
  flex-direction: column;
56
56
  background: #fff;
57
- border: 1px solid #111;
58
- border-radius: 4px;
59
57
  padding: 0.75rem 0.75rem 0.9rem;
60
58
  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.08);
61
59
  transition: box-shadow 0.2s ease, transform 0.2s ease;
@@ -101,6 +99,7 @@
101
99
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.25);
102
100
  transition: background 0.2s ease, transform 0.2s ease;
103
101
  outline: none;
102
+ z-index: 10;
104
103
  }
105
104
 
106
105
  .iv-dynamic-products-carousel-nav:focus-visible {
@@ -134,7 +133,6 @@
134
133
  color: var(--iv-carousel-status-color, #555);
135
134
  }
136
135
 
137
- /* Hide potential scrollbars in some environments (defensive) */
138
136
  .iv-dynamic-products-carousel-viewport::-webkit-scrollbar {
139
137
  display: none;
140
138
  }
@@ -6,7 +6,7 @@ import { d as defineCustomElement$4 } from './p-GgFls1_9.js';
6
6
  import { d as defineCustomElement$3 } from './p-DwwyNs2H.js';
7
7
  import { d as defineCustomElement$2 } from './p-B0FwtJkz.js';
8
8
 
9
- 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;border:1px solid #111;border-radius:4px;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: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}.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}";
9
+ 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: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}";
10
10
 
11
11
  const BLOCK = 'iv-dynamic-products-carousel';
12
12
  const IvDynamicProductsCarousel$1 = /*@__PURE__*/ proxyCustomElement(class IvDynamicProductsCarousel extends H {
@@ -1 +1 @@
1
- {"file":"iv-dynamic-products-carousel.js","mappings":"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","names":["IvDynamicProductsCarousel","__stencil_proxyCustomElement","HTMLElement"],"sources":["src/components/iv-dynamic-products-carousel/iv-dynamic-products-carousel.scss?tag=iv-dynamic-products-carousel","src/components/iv-dynamic-products-carousel/iv-dynamic-products-carousel.tsx"],"sourcesContent":[":host {\n display: block;\n}\n\n.iv-dynamic-products-carousel { position:relative; }\n\n.iv-dynamic-products-carousel-carousel { position:relative; }\n\n.iv-dynamic-products-carousel-viewport { overflow:hidden; width:100%; }\n\n.iv-dynamic-products-carousel-track { display:flex; width:100%; transition: transform .55s cubic-bezier(.4,.7,.2,1); will-change:transform; }\n\n.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; }\n\n@media (max-width: 1200px) { .iv-dynamic-products-carousel-slide { grid-template-columns:repeat(4, minmax(0,1fr)); } }\n@media (max-width: 900px) { .iv-dynamic-products-carousel-slide { grid-template-columns:repeat(3, minmax(0,1fr)); } }\n@media (max-width: 640px) { .iv-dynamic-products-carousel-slide { grid-template-columns:repeat(2, minmax(0,1fr)); gap:0.75rem; } }\n\n.iv-dynamic-products-carousel-card { \n height:100%; \n display:flex; \n flex-direction:column; \n background:#fff; \n border:1px solid #111; \n border-radius:4px; \n padding:0.75rem 0.75rem 0.9rem; \n box-shadow:0 2px 6px rgba(0,0,0,.08); \n transition:box-shadow .2s ease, transform .2s ease; \n}\n.iv-dynamic-products-carousel-card:hover { box-shadow:0 4px 14px rgba(0,0,0,.15); transform:translateY(-2px); }\n.iv-dynamic-products-carousel-card:active { transform:translateY(0); box-shadow:0 2px 6px rgba(0,0,0,.12); }\n\n.iv-dynamic-products-carousel-card img, \n.iv-dynamic-products-carousel-card picture, \n.iv-dynamic-products-carousel-card .media { \n width:100%; \n aspect-ratio:1/1; \n object-fit:contain; \n display:flex; \n align-items:center; \n justify-content:center; \n margin:0 0 .65rem; \n}\n\n.iv-dynamic-products-carousel-nav { position:absolute; top:50%; transform:translateY(-50%); background:var(--iv-carousel-nav-bg, rgba(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,.25); transition:background .2s ease, transform .2s ease; outline:none; }\n.iv-dynamic-products-carousel-nav:focus-visible { outline:2px solid #fff; outline-offset:3px; }\n.iv-dynamic-products-carousel-nav:hover:not(:disabled){ background:var(--iv-carousel-nav-bg-hover, rgba(0,0,0,.75)); transform:translateY(-50%) scale(1.05); box-shadow:0 6px 18px rgba(0,0,0,.35); }\n.iv-dynamic-products-carousel-nav:disabled{ opacity:.4; cursor:default; }\n.iv-dynamic-products-carousel-nav-prev { left:0.25rem; }\n.iv-dynamic-products-carousel-nav-next { right:0.25rem; }\n\n.iv-dynamic-products-carousel-status { margin-top:0.75rem; font-size:0.875rem; text-align:center; color:var(--iv-carousel-status-color, #555); }\n\n/* Hide potential scrollbars in some environments (defensive) */\n.iv-dynamic-products-carousel-viewport::-webkit-scrollbar { display:none; }\n.iv-dynamic-products-carousel-viewport { -ms-overflow-style:none; scrollbar-width:none; }\n","import { Component, h, Prop, State, Watch } from '@stencil/core';\nimport { state } from '../../utils/store/store';\nimport { fetchProducts } from '../../utils/storefront_api/factory';\nimport { productCache } from '../../utils/caching/productCache';\nimport { createErrorHandler } from '../../utils/error_handling/factory';\n\nconst BLOCK = 'iv-dynamic-products-carousel';\n\n@Component({\n tag: 'iv-dynamic-products-carousel',\n styleUrl: 'iv-dynamic-products-carousel.scss',\n shadow: false\n})\n\nexport class IvDynamicProductsCarousel {\n @Prop() type: 'CREATED' | 'BEST_SELLING' | 'PRICE' | 'TITLE' | 'RELEVANCE' = 'CREATED'; \n @Prop() limit: number = 24;\n @Prop() reversed: boolean = false; \n @Prop() componenttitle?: string;\n @Prop() titletag: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' = 'h2';\n @Prop() collectionhandle: string = 'all';\n @Prop() requestedfields: string;\n @Prop() calltoaction: boolean = false;\n @Prop() buttontext?: string;\n @Prop() addtocarttext?: string;\n @Prop() emptystring: string = 'No products found';\n @Prop() cachettl?: number; \n @Prop() stale?: boolean = true; \n \n @State() products: any[] = [];\n @State() errorMsg: string; \n @State() staleData: boolean = false;\n @State() page: number = 0; \n\n private readonly itemsPerPage = 6;\n\n private errors = createErrorHandler({ component: 'iv-dynamic-products-carousel' });\n\n @Watch('type')\n @Watch('limit')\n @Watch('collectionhandle')\n @Watch('requestedfields')\n handlePropChange() { this.loadProducts(true); }\n\n async componentWillLoad() { \n await this.loadProducts(false); \n };\n \n private buildParams() {\n return {\n handle: this.collectionhandle,\n sort: this.type,\n fields: this.requestedfields,\n limit: this.limit,\n currency: state.currencyCode,\n reversed: this.reversed\n };\n };\n\n private async loadProducts(fromWatch: boolean) {\n const params = this.buildParams();\n const ttl = this.cachettl || 1000 * 60 * 5;\n state.loading = !fromWatch; \n try {\n const data = await productCache.getOrSetData(\n params,\n async () => {\n const fresh = await fetchProducts(this.limit, this.collectionhandle, this.type, this.requestedfields, this.reversed);\n return fresh;\n },\n {\n ttl,\n staleWhileRevalidate: this.stale,\n transform: (fresh) => fresh \n }\n );\n const metaCheck = productCache.getData<typeof data>(params);\n this.staleData = metaCheck.isExpired && metaCheck.isStale;\n this.products = data || [];\n this.page = 0;\n } catch (err: any) {\n this.errorMsg = 'Failed to load products';\n this.errors.handle({\n error: err,\n scope: 'loadProducts',\n userMessage: 'Unable to load products right now.',\n devMessage: 'fetchProducts failed in iv-dynamic-products',\n severity: 'error'\n });\n } finally {\n state.loading = false;\n };\n };\n\n private pagedProducts() {\n const chunks: any[][] = [];\n for(let i=0; i < this.products.length; i += this.itemsPerPage) {\n chunks.push(this.products.slice(i, i + this.itemsPerPage));\n };\n return chunks;\n };\n\n private next = () => { \n const pages = this.pagedProducts().length;\n if(this.page < pages - 1) this.page++;\n };\n\n private prev = () => { \n if(this.page > 0) this.page--;\n };\n\n render() {\n\n const TAG = this.titletag as any;\n\n return (\n <div class={BLOCK} data-stale={this.staleData ? 'true' : 'false'}>\n {this.componenttitle && <TAG class={`${BLOCK}-title`}>{this.componenttitle}</TAG>}\n {state.loading ? (\n <iv-spinner></iv-spinner>\n ) : this.errorMsg ? (\n <div class={`${BLOCK}-error`}>{this.errorMsg}</div>\n ) : this.products.length === 0 ? (\n <div class={`${BLOCK}-empty`}>{this.emptystring}</div>\n ) : (\n <div class={`${BLOCK}-carousel`} aria-roledescription=\"carousel\">\n <button class={`${BLOCK}-nav ${BLOCK}-nav-prev`} onClick={this.prev} disabled={this.page===0} aria-label=\"Previous\" type=\"button\">\n ‹\n </button>\n <div class={`${BLOCK}-viewport`}>\n <div class={`${BLOCK}-track`} style={{ transform: `translateX(-${this.page * 100}%)` }}>\n {this.pagedProducts().map((group, i) => (\n <div class={`${BLOCK}-slide`} role=\"group\" aria-label={`Slide ${i+1} of ${this.pagedProducts().length}`}> \n {group.map(product => (\n <iv-card\n cardtype='products'\n calltoaction={this.calltoaction}\n buttontext={this.buttontext}\n addtocarttext={this.addtocarttext}\n data={product}\n classmodifier={`${BLOCK}-card`} />\n ))}\n </div>\n ))}\n </div>\n </div>\n <button class={`${BLOCK}-nav ${BLOCK}-nav-next`} onClick={this.next} disabled={this.page===this.pagedProducts().length-1} aria-label=\"Next\" type=\"button\">\n ›\n </button>\n <div class={`${BLOCK}-status`} aria-live=\"polite\">{this.pagedProducts().length > 1 ? `Slide ${this.page+1} of ${this.pagedProducts().length}` : ''}</div>\n {this.staleData && (\n <div class={`${BLOCK}-stale-indicator`} aria-live=\"polite\">Refreshing…</div>\n )}\n </div>\n )}\n </div>\n );\n };\n\n};"],"version":3}
1
+ {"file":"iv-dynamic-products-carousel.js","mappings":"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","names":["IvDynamicProductsCarousel","__stencil_proxyCustomElement","HTMLElement"],"sources":["src/components/iv-dynamic-products-carousel/iv-dynamic-products-carousel.scss?tag=iv-dynamic-products-carousel","src/components/iv-dynamic-products-carousel/iv-dynamic-products-carousel.tsx"],"sourcesContent":[":host {\n display: block;\n}\n\n.iv-dynamic-products-carousel { \n position:relative;\n}\n\n.iv-dynamic-products-carousel-carousel { \n position:relative;\n}\n\n.iv-dynamic-products-carousel-viewport { \n overflow:hidden; \n width:100%;\n}\n\n.iv-dynamic-products-carousel-track { \n display:flex; \n width:100%; \n transition: \n transform .55s cubic-bezier(.4,.7,.2,1); \n will-change:transform;\n}\n\n.iv-dynamic-products-carousel-slide { \n flex:0 0 100%; \n box-sizing:border-box; \n padding:0.25rem 0.5rem; \n display:grid; \n grid-template-columns:repeat(6, minmax(0,1fr)); \n gap:1rem; \n align-items:stretch; \n grid-auto-rows:1fr; \n}\n\n@media (max-width: 1200px) { \n .iv-dynamic-products-carousel-slide { \n grid-template-columns:repeat(4, minmax(0,1fr)); \n } \n}\n\n@media (max-width: 900px) { \n .iv-dynamic-products-carousel-slide { \n grid-template-columns:repeat(3, minmax(0,1fr)); \n } \n}\n\n@media (max-width: 640px) { \n .iv-dynamic-products-carousel-slide { \n grid-template-columns:repeat(2, minmax(0,1fr)); \n gap:0.75rem; \n } \n}\n\n.iv-dynamic-products-carousel-card { \n height:100%; \n display:flex; \n flex-direction:column; \n background:#fff; \n padding:0.75rem 0.75rem 0.9rem; \n box-shadow:0 2px 6px rgba(0,0,0,.08); \n transition:box-shadow .2s ease, transform .2s ease; \n}\n\n.iv-dynamic-products-carousel-card:hover { \n box-shadow:0 4px 14px rgba(0,0,0,.15); \n transform:translateY(-2px); \n}\n\n.iv-dynamic-products-carousel-card:active { \n transform:translateY(0); \n box-shadow:0 2px 6px rgba(0,0,0,.12); \n}\n\n.iv-dynamic-products-carousel-card img, \n.iv-dynamic-products-carousel-card picture, \n.iv-dynamic-products-carousel-card .media { \n width:100%; \n aspect-ratio:1/1; \n object-fit:contain; \n display:flex; \n align-items:center; \n justify-content:center; \n margin:0 0 .65rem; \n}\n\n.iv-dynamic-products-carousel-nav { \n position:absolute; \n top:50%; \n transform:translateY(-50%); \n background:var(--iv-carousel-nav-bg, rgba(0,0,0,.55)); \n color:#fff; \n border:none; \n width:2.75rem; \n height:2.75rem; \n border-radius:50%; \n display:flex; \n align-items:center; \n justify-content:center; \n cursor:pointer; \n backdrop-filter:blur(6px); \n box-shadow:0 4px 12px rgba(0,0,0,.25); \n transition:background .2s ease, \n transform .2s ease; \n outline:none;\n z-index: 10;\n }\n\n.iv-dynamic-products-carousel-nav:focus-visible { \n outline:2px solid #fff; \n outline-offset:3px; \n}\n\n.iv-dynamic-products-carousel-nav:hover:not(:disabled){\n background:var(--iv-carousel-nav-bg-hover, rgba(0,0,0,.75)); \n transform:translateY(-50%) scale(1.05); \n box-shadow:0 6px 18px rgba(0,0,0,.35);\n}\n\n.iv-dynamic-products-carousel-nav:disabled{ \n opacity:.4; cursor:default; \n}\n\n.iv-dynamic-products-carousel-nav-prev { \n left:0.25rem; \n}\n\n.iv-dynamic-products-carousel-nav-next { \n right:0.25rem; \n}\n\n.iv-dynamic-products-carousel-status { \n margin-top:0.75rem; \n font-size:0.875rem; \n text-align:center; \n color:var(--iv-carousel-status-color, #555); \n}\n\n.iv-dynamic-products-carousel-viewport::-webkit-scrollbar { \n display:none; \n}\n\n.iv-dynamic-products-carousel-viewport { \n -ms-overflow-style:none; \n scrollbar-width:none; \n}","import { Component, h, Prop, State, Watch } from '@stencil/core';\nimport { state } from '../../utils/store/store';\nimport { fetchProducts } from '../../utils/storefront_api/factory';\nimport { productCache } from '../../utils/caching/productCache';\nimport { createErrorHandler } from '../../utils/error_handling/factory';\n\nconst BLOCK = 'iv-dynamic-products-carousel';\n\n@Component({\n tag: 'iv-dynamic-products-carousel',\n styleUrl: 'iv-dynamic-products-carousel.scss',\n shadow: false\n})\n\nexport class IvDynamicProductsCarousel {\n @Prop() type: 'CREATED' | 'BEST_SELLING' | 'PRICE' | 'TITLE' | 'RELEVANCE' = 'CREATED'; \n @Prop() limit: number = 24;\n @Prop() reversed: boolean = false; \n @Prop() componenttitle?: string;\n @Prop() titletag: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' = 'h2';\n @Prop() collectionhandle: string = 'all';\n @Prop() requestedfields: string;\n @Prop() calltoaction: boolean = false;\n @Prop() buttontext?: string;\n @Prop() addtocarttext?: string;\n @Prop() emptystring: string = 'No products found';\n @Prop() cachettl?: number; \n @Prop() stale?: boolean = true; \n \n @State() products: any[] = [];\n @State() errorMsg: string; \n @State() staleData: boolean = false;\n @State() page: number = 0; \n\n private readonly itemsPerPage = 6;\n\n private errors = createErrorHandler({ component: 'iv-dynamic-products-carousel' });\n\n @Watch('type')\n @Watch('limit')\n @Watch('collectionhandle')\n @Watch('requestedfields')\n handlePropChange() { this.loadProducts(true); }\n\n async componentWillLoad() { \n await this.loadProducts(false); \n };\n \n private buildParams() {\n return {\n handle: this.collectionhandle,\n sort: this.type,\n fields: this.requestedfields,\n limit: this.limit,\n currency: state.currencyCode,\n reversed: this.reversed\n };\n };\n\n private async loadProducts(fromWatch: boolean) {\n const params = this.buildParams();\n const ttl = this.cachettl || 1000 * 60 * 5;\n state.loading = !fromWatch; \n try {\n const data = await productCache.getOrSetData(\n params,\n async () => {\n const fresh = await fetchProducts(this.limit, this.collectionhandle, this.type, this.requestedfields, this.reversed);\n return fresh;\n },\n {\n ttl,\n staleWhileRevalidate: this.stale,\n transform: (fresh) => fresh \n }\n );\n const metaCheck = productCache.getData<typeof data>(params);\n this.staleData = metaCheck.isExpired && metaCheck.isStale;\n this.products = data || [];\n this.page = 0;\n } catch (err: any) {\n this.errorMsg = 'Failed to load products';\n this.errors.handle({\n error: err,\n scope: 'loadProducts',\n userMessage: 'Unable to load products right now.',\n devMessage: 'fetchProducts failed in iv-dynamic-products',\n severity: 'error'\n });\n } finally {\n state.loading = false;\n };\n };\n\n private pagedProducts() {\n const chunks: any[][] = [];\n for(let i=0; i < this.products.length; i += this.itemsPerPage) {\n chunks.push(this.products.slice(i, i + this.itemsPerPage));\n };\n return chunks;\n };\n\n private next = () => { \n const pages = this.pagedProducts().length;\n if(this.page < pages - 1) this.page++;\n };\n\n private prev = () => { \n if(this.page > 0) this.page--;\n };\n\n render() {\n\n const TAG = this.titletag as any;\n\n return (\n <div class={BLOCK} data-stale={this.staleData ? 'true' : 'false'}>\n {this.componenttitle && <TAG class={`${BLOCK}-title`}>{this.componenttitle}</TAG>}\n {state.loading ? (\n <iv-spinner></iv-spinner>\n ) : this.errorMsg ? (\n <div class={`${BLOCK}-error`}>{this.errorMsg}</div>\n ) : this.products.length === 0 ? (\n <div class={`${BLOCK}-empty`}>{this.emptystring}</div>\n ) : (\n <div class={`${BLOCK}-carousel`} aria-roledescription=\"carousel\">\n <button class={`${BLOCK}-nav ${BLOCK}-nav-prev`} onClick={this.prev} disabled={this.page===0} aria-label=\"Previous\" type=\"button\">\n ‹\n </button>\n <div class={`${BLOCK}-viewport`}>\n <div class={`${BLOCK}-track`} style={{ transform: `translateX(-${this.page * 100}%)` }}>\n {this.pagedProducts().map((group, i) => (\n <div class={`${BLOCK}-slide`} role=\"group\" aria-label={`Slide ${i+1} of ${this.pagedProducts().length}`}> \n {group.map(product => (\n <iv-card\n cardtype='products'\n calltoaction={this.calltoaction}\n buttontext={this.buttontext}\n addtocarttext={this.addtocarttext}\n data={product}\n classmodifier={`${BLOCK}-card`} />\n ))}\n </div>\n ))}\n </div>\n </div>\n <button class={`${BLOCK}-nav ${BLOCK}-nav-next`} onClick={this.next} disabled={this.page===this.pagedProducts().length-1} aria-label=\"Next\" type=\"button\">\n ›\n </button>\n <div class={`${BLOCK}-status`} aria-live=\"polite\">{this.pagedProducts().length > 1 ? `Slide ${this.page+1} of ${this.pagedProducts().length}` : ''}</div>\n {this.staleData && (\n <div class={`${BLOCK}-stale-indicator`} aria-live=\"polite\">Refreshing…</div>\n )}\n </div>\n )}\n </div>\n );\n };\n\n};"],"version":3}
@@ -2,7 +2,7 @@ import { r as registerInstance, c as state, h } from './index-C4-XLZHN.js';
2
2
  import { b as fetchProducts } from './factory-ClqXFNr2.js';
3
3
  import { c as createErrorHandler, p as productCache } from './factory-Opl8iokX.js';
4
4
 
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;border:1px solid #111;border-radius:4px;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: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}.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}";
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: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}";
6
6
 
7
7
  const BLOCK = 'iv-dynamic-products-carousel';
8
8
  const IvDynamicProductsCarousel = class {
@@ -1 +1 @@
1
- {"version":3,"file":"iv-dynamic-products-carousel.entry.js","sources":["src/components/iv-dynamic-products-carousel/iv-dynamic-products-carousel.scss?tag=iv-dynamic-products-carousel","src/components/iv-dynamic-products-carousel/iv-dynamic-products-carousel.tsx"],"sourcesContent":[":host {\n display: block;\n}\n\n.iv-dynamic-products-carousel { position:relative; }\n\n.iv-dynamic-products-carousel-carousel { position:relative; }\n\n.iv-dynamic-products-carousel-viewport { overflow:hidden; width:100%; }\n\n.iv-dynamic-products-carousel-track { display:flex; width:100%; transition: transform .55s cubic-bezier(.4,.7,.2,1); will-change:transform; }\n\n.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; }\n\n@media (max-width: 1200px) { .iv-dynamic-products-carousel-slide { grid-template-columns:repeat(4, minmax(0,1fr)); } }\n@media (max-width: 900px) { .iv-dynamic-products-carousel-slide { grid-template-columns:repeat(3, minmax(0,1fr)); } }\n@media (max-width: 640px) { .iv-dynamic-products-carousel-slide { grid-template-columns:repeat(2, minmax(0,1fr)); gap:0.75rem; } }\n\n.iv-dynamic-products-carousel-card { \n height:100%; \n display:flex; \n flex-direction:column; \n background:#fff; \n border:1px solid #111; \n border-radius:4px; \n padding:0.75rem 0.75rem 0.9rem; \n box-shadow:0 2px 6px rgba(0,0,0,.08); \n transition:box-shadow .2s ease, transform .2s ease; \n}\n.iv-dynamic-products-carousel-card:hover { box-shadow:0 4px 14px rgba(0,0,0,.15); transform:translateY(-2px); }\n.iv-dynamic-products-carousel-card:active { transform:translateY(0); box-shadow:0 2px 6px rgba(0,0,0,.12); }\n\n.iv-dynamic-products-carousel-card img, \n.iv-dynamic-products-carousel-card picture, \n.iv-dynamic-products-carousel-card .media { \n width:100%; \n aspect-ratio:1/1; \n object-fit:contain; \n display:flex; \n align-items:center; \n justify-content:center; \n margin:0 0 .65rem; \n}\n\n.iv-dynamic-products-carousel-nav { position:absolute; top:50%; transform:translateY(-50%); background:var(--iv-carousel-nav-bg, rgba(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,.25); transition:background .2s ease, transform .2s ease; outline:none; }\n.iv-dynamic-products-carousel-nav:focus-visible { outline:2px solid #fff; outline-offset:3px; }\n.iv-dynamic-products-carousel-nav:hover:not(:disabled){ background:var(--iv-carousel-nav-bg-hover, rgba(0,0,0,.75)); transform:translateY(-50%) scale(1.05); box-shadow:0 6px 18px rgba(0,0,0,.35); }\n.iv-dynamic-products-carousel-nav:disabled{ opacity:.4; cursor:default; }\n.iv-dynamic-products-carousel-nav-prev { left:0.25rem; }\n.iv-dynamic-products-carousel-nav-next { right:0.25rem; }\n\n.iv-dynamic-products-carousel-status { margin-top:0.75rem; font-size:0.875rem; text-align:center; color:var(--iv-carousel-status-color, #555); }\n\n/* Hide potential scrollbars in some environments (defensive) */\n.iv-dynamic-products-carousel-viewport::-webkit-scrollbar { display:none; }\n.iv-dynamic-products-carousel-viewport { -ms-overflow-style:none; scrollbar-width:none; }\n","import { Component, h, Prop, State, Watch } from '@stencil/core';\nimport { state } from '../../utils/store/store';\nimport { fetchProducts } from '../../utils/storefront_api/factory';\nimport { productCache } from '../../utils/caching/productCache';\nimport { createErrorHandler } from '../../utils/error_handling/factory';\n\nconst BLOCK = 'iv-dynamic-products-carousel';\n\n@Component({\n tag: 'iv-dynamic-products-carousel',\n styleUrl: 'iv-dynamic-products-carousel.scss',\n shadow: false\n})\n\nexport class IvDynamicProductsCarousel {\n @Prop() type: 'CREATED' | 'BEST_SELLING' | 'PRICE' | 'TITLE' | 'RELEVANCE' = 'CREATED'; \n @Prop() limit: number = 24;\n @Prop() reversed: boolean = false; \n @Prop() componenttitle?: string;\n @Prop() titletag: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' = 'h2';\n @Prop() collectionhandle: string = 'all';\n @Prop() requestedfields: string;\n @Prop() calltoaction: boolean = false;\n @Prop() buttontext?: string;\n @Prop() addtocarttext?: string;\n @Prop() emptystring: string = 'No products found';\n @Prop() cachettl?: number; \n @Prop() stale?: boolean = true; \n \n @State() products: any[] = [];\n @State() errorMsg: string; \n @State() staleData: boolean = false;\n @State() page: number = 0; \n\n private readonly itemsPerPage = 6;\n\n private errors = createErrorHandler({ component: 'iv-dynamic-products-carousel' });\n\n @Watch('type')\n @Watch('limit')\n @Watch('collectionhandle')\n @Watch('requestedfields')\n handlePropChange() { this.loadProducts(true); }\n\n async componentWillLoad() { \n await this.loadProducts(false); \n };\n \n private buildParams() {\n return {\n handle: this.collectionhandle,\n sort: this.type,\n fields: this.requestedfields,\n limit: this.limit,\n currency: state.currencyCode,\n reversed: this.reversed\n };\n };\n\n private async loadProducts(fromWatch: boolean) {\n const params = this.buildParams();\n const ttl = this.cachettl || 1000 * 60 * 5;\n state.loading = !fromWatch; \n try {\n const data = await productCache.getOrSetData(\n params,\n async () => {\n const fresh = await fetchProducts(this.limit, this.collectionhandle, this.type, this.requestedfields, this.reversed);\n return fresh;\n },\n {\n ttl,\n staleWhileRevalidate: this.stale,\n transform: (fresh) => fresh \n }\n );\n const metaCheck = productCache.getData<typeof data>(params);\n this.staleData = metaCheck.isExpired && metaCheck.isStale;\n this.products = data || [];\n this.page = 0;\n } catch (err: any) {\n this.errorMsg = 'Failed to load products';\n this.errors.handle({\n error: err,\n scope: 'loadProducts',\n userMessage: 'Unable to load products right now.',\n devMessage: 'fetchProducts failed in iv-dynamic-products',\n severity: 'error'\n });\n } finally {\n state.loading = false;\n };\n };\n\n private pagedProducts() {\n const chunks: any[][] = [];\n for(let i=0; i < this.products.length; i += this.itemsPerPage) {\n chunks.push(this.products.slice(i, i + this.itemsPerPage));\n };\n return chunks;\n };\n\n private next = () => { \n const pages = this.pagedProducts().length;\n if(this.page < pages - 1) this.page++;\n };\n\n private prev = () => { \n if(this.page > 0) this.page--;\n };\n\n render() {\n\n const TAG = this.titletag as any;\n\n return (\n <div class={BLOCK} data-stale={this.staleData ? 'true' : 'false'}>\n {this.componenttitle && <TAG class={`${BLOCK}-title`}>{this.componenttitle}</TAG>}\n {state.loading ? (\n <iv-spinner></iv-spinner>\n ) : this.errorMsg ? (\n <div class={`${BLOCK}-error`}>{this.errorMsg}</div>\n ) : this.products.length === 0 ? (\n <div class={`${BLOCK}-empty`}>{this.emptystring}</div>\n ) : (\n <div class={`${BLOCK}-carousel`} aria-roledescription=\"carousel\">\n <button class={`${BLOCK}-nav ${BLOCK}-nav-prev`} onClick={this.prev} disabled={this.page===0} aria-label=\"Previous\" type=\"button\">\n ‹\n </button>\n <div class={`${BLOCK}-viewport`}>\n <div class={`${BLOCK}-track`} style={{ transform: `translateX(-${this.page * 100}%)` }}>\n {this.pagedProducts().map((group, i) => (\n <div class={`${BLOCK}-slide`} role=\"group\" aria-label={`Slide ${i+1} of ${this.pagedProducts().length}`}> \n {group.map(product => (\n <iv-card\n cardtype='products'\n calltoaction={this.calltoaction}\n buttontext={this.buttontext}\n addtocarttext={this.addtocarttext}\n data={product}\n classmodifier={`${BLOCK}-card`} />\n ))}\n </div>\n ))}\n </div>\n </div>\n <button class={`${BLOCK}-nav ${BLOCK}-nav-next`} onClick={this.next} disabled={this.page===this.pagedProducts().length-1} aria-label=\"Next\" type=\"button\">\n ›\n </button>\n <div class={`${BLOCK}-status`} aria-live=\"polite\">{this.pagedProducts().length > 1 ? `Slide ${this.page+1} of ${this.pagedProducts().length}` : ''}</div>\n {this.staleData && (\n <div class={`${BLOCK}-stale-indicator`} aria-live=\"polite\">Refreshing…</div>\n )}\n </div>\n )}\n </div>\n );\n };\n\n};"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"iv-dynamic-products-carousel.entry.js","sources":["src/components/iv-dynamic-products-carousel/iv-dynamic-products-carousel.scss?tag=iv-dynamic-products-carousel","src/components/iv-dynamic-products-carousel/iv-dynamic-products-carousel.tsx"],"sourcesContent":[":host {\n display: block;\n}\n\n.iv-dynamic-products-carousel { \n position:relative;\n}\n\n.iv-dynamic-products-carousel-carousel { \n position:relative;\n}\n\n.iv-dynamic-products-carousel-viewport { \n overflow:hidden; \n width:100%;\n}\n\n.iv-dynamic-products-carousel-track { \n display:flex; \n width:100%; \n transition: \n transform .55s cubic-bezier(.4,.7,.2,1); \n will-change:transform;\n}\n\n.iv-dynamic-products-carousel-slide { \n flex:0 0 100%; \n box-sizing:border-box; \n padding:0.25rem 0.5rem; \n display:grid; \n grid-template-columns:repeat(6, minmax(0,1fr)); \n gap:1rem; \n align-items:stretch; \n grid-auto-rows:1fr; \n}\n\n@media (max-width: 1200px) { \n .iv-dynamic-products-carousel-slide { \n grid-template-columns:repeat(4, minmax(0,1fr)); \n } \n}\n\n@media (max-width: 900px) { \n .iv-dynamic-products-carousel-slide { \n grid-template-columns:repeat(3, minmax(0,1fr)); \n } \n}\n\n@media (max-width: 640px) { \n .iv-dynamic-products-carousel-slide { \n grid-template-columns:repeat(2, minmax(0,1fr)); \n gap:0.75rem; \n } \n}\n\n.iv-dynamic-products-carousel-card { \n height:100%; \n display:flex; \n flex-direction:column; \n background:#fff; \n padding:0.75rem 0.75rem 0.9rem; \n box-shadow:0 2px 6px rgba(0,0,0,.08); \n transition:box-shadow .2s ease, transform .2s ease; \n}\n\n.iv-dynamic-products-carousel-card:hover { \n box-shadow:0 4px 14px rgba(0,0,0,.15); \n transform:translateY(-2px); \n}\n\n.iv-dynamic-products-carousel-card:active { \n transform:translateY(0); \n box-shadow:0 2px 6px rgba(0,0,0,.12); \n}\n\n.iv-dynamic-products-carousel-card img, \n.iv-dynamic-products-carousel-card picture, \n.iv-dynamic-products-carousel-card .media { \n width:100%; \n aspect-ratio:1/1; \n object-fit:contain; \n display:flex; \n align-items:center; \n justify-content:center; \n margin:0 0 .65rem; \n}\n\n.iv-dynamic-products-carousel-nav { \n position:absolute; \n top:50%; \n transform:translateY(-50%); \n background:var(--iv-carousel-nav-bg, rgba(0,0,0,.55)); \n color:#fff; \n border:none; \n width:2.75rem; \n height:2.75rem; \n border-radius:50%; \n display:flex; \n align-items:center; \n justify-content:center; \n cursor:pointer; \n backdrop-filter:blur(6px); \n box-shadow:0 4px 12px rgba(0,0,0,.25); \n transition:background .2s ease, \n transform .2s ease; \n outline:none;\n z-index: 10;\n }\n\n.iv-dynamic-products-carousel-nav:focus-visible { \n outline:2px solid #fff; \n outline-offset:3px; \n}\n\n.iv-dynamic-products-carousel-nav:hover:not(:disabled){\n background:var(--iv-carousel-nav-bg-hover, rgba(0,0,0,.75)); \n transform:translateY(-50%) scale(1.05); \n box-shadow:0 6px 18px rgba(0,0,0,.35);\n}\n\n.iv-dynamic-products-carousel-nav:disabled{ \n opacity:.4; cursor:default; \n}\n\n.iv-dynamic-products-carousel-nav-prev { \n left:0.25rem; \n}\n\n.iv-dynamic-products-carousel-nav-next { \n right:0.25rem; \n}\n\n.iv-dynamic-products-carousel-status { \n margin-top:0.75rem; \n font-size:0.875rem; \n text-align:center; \n color:var(--iv-carousel-status-color, #555); \n}\n\n.iv-dynamic-products-carousel-viewport::-webkit-scrollbar { \n display:none; \n}\n\n.iv-dynamic-products-carousel-viewport { \n -ms-overflow-style:none; \n scrollbar-width:none; \n}","import { Component, h, Prop, State, Watch } from '@stencil/core';\nimport { state } from '../../utils/store/store';\nimport { fetchProducts } from '../../utils/storefront_api/factory';\nimport { productCache } from '../../utils/caching/productCache';\nimport { createErrorHandler } from '../../utils/error_handling/factory';\n\nconst BLOCK = 'iv-dynamic-products-carousel';\n\n@Component({\n tag: 'iv-dynamic-products-carousel',\n styleUrl: 'iv-dynamic-products-carousel.scss',\n shadow: false\n})\n\nexport class IvDynamicProductsCarousel {\n @Prop() type: 'CREATED' | 'BEST_SELLING' | 'PRICE' | 'TITLE' | 'RELEVANCE' = 'CREATED'; \n @Prop() limit: number = 24;\n @Prop() reversed: boolean = false; \n @Prop() componenttitle?: string;\n @Prop() titletag: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' = 'h2';\n @Prop() collectionhandle: string = 'all';\n @Prop() requestedfields: string;\n @Prop() calltoaction: boolean = false;\n @Prop() buttontext?: string;\n @Prop() addtocarttext?: string;\n @Prop() emptystring: string = 'No products found';\n @Prop() cachettl?: number; \n @Prop() stale?: boolean = true; \n \n @State() products: any[] = [];\n @State() errorMsg: string; \n @State() staleData: boolean = false;\n @State() page: number = 0; \n\n private readonly itemsPerPage = 6;\n\n private errors = createErrorHandler({ component: 'iv-dynamic-products-carousel' });\n\n @Watch('type')\n @Watch('limit')\n @Watch('collectionhandle')\n @Watch('requestedfields')\n handlePropChange() { this.loadProducts(true); }\n\n async componentWillLoad() { \n await this.loadProducts(false); \n };\n \n private buildParams() {\n return {\n handle: this.collectionhandle,\n sort: this.type,\n fields: this.requestedfields,\n limit: this.limit,\n currency: state.currencyCode,\n reversed: this.reversed\n };\n };\n\n private async loadProducts(fromWatch: boolean) {\n const params = this.buildParams();\n const ttl = this.cachettl || 1000 * 60 * 5;\n state.loading = !fromWatch; \n try {\n const data = await productCache.getOrSetData(\n params,\n async () => {\n const fresh = await fetchProducts(this.limit, this.collectionhandle, this.type, this.requestedfields, this.reversed);\n return fresh;\n },\n {\n ttl,\n staleWhileRevalidate: this.stale,\n transform: (fresh) => fresh \n }\n );\n const metaCheck = productCache.getData<typeof data>(params);\n this.staleData = metaCheck.isExpired && metaCheck.isStale;\n this.products = data || [];\n this.page = 0;\n } catch (err: any) {\n this.errorMsg = 'Failed to load products';\n this.errors.handle({\n error: err,\n scope: 'loadProducts',\n userMessage: 'Unable to load products right now.',\n devMessage: 'fetchProducts failed in iv-dynamic-products',\n severity: 'error'\n });\n } finally {\n state.loading = false;\n };\n };\n\n private pagedProducts() {\n const chunks: any[][] = [];\n for(let i=0; i < this.products.length; i += this.itemsPerPage) {\n chunks.push(this.products.slice(i, i + this.itemsPerPage));\n };\n return chunks;\n };\n\n private next = () => { \n const pages = this.pagedProducts().length;\n if(this.page < pages - 1) this.page++;\n };\n\n private prev = () => { \n if(this.page > 0) this.page--;\n };\n\n render() {\n\n const TAG = this.titletag as any;\n\n return (\n <div class={BLOCK} data-stale={this.staleData ? 'true' : 'false'}>\n {this.componenttitle && <TAG class={`${BLOCK}-title`}>{this.componenttitle}</TAG>}\n {state.loading ? (\n <iv-spinner></iv-spinner>\n ) : this.errorMsg ? (\n <div class={`${BLOCK}-error`}>{this.errorMsg}</div>\n ) : this.products.length === 0 ? (\n <div class={`${BLOCK}-empty`}>{this.emptystring}</div>\n ) : (\n <div class={`${BLOCK}-carousel`} aria-roledescription=\"carousel\">\n <button class={`${BLOCK}-nav ${BLOCK}-nav-prev`} onClick={this.prev} disabled={this.page===0} aria-label=\"Previous\" type=\"button\">\n ‹\n </button>\n <div class={`${BLOCK}-viewport`}>\n <div class={`${BLOCK}-track`} style={{ transform: `translateX(-${this.page * 100}%)` }}>\n {this.pagedProducts().map((group, i) => (\n <div class={`${BLOCK}-slide`} role=\"group\" aria-label={`Slide ${i+1} of ${this.pagedProducts().length}`}> \n {group.map(product => (\n <iv-card\n cardtype='products'\n calltoaction={this.calltoaction}\n buttontext={this.buttontext}\n addtocarttext={this.addtocarttext}\n data={product}\n classmodifier={`${BLOCK}-card`} />\n ))}\n </div>\n ))}\n </div>\n </div>\n <button class={`${BLOCK}-nav ${BLOCK}-nav-next`} onClick={this.next} disabled={this.page===this.pagedProducts().length-1} aria-label=\"Next\" type=\"button\">\n ›\n </button>\n <div class={`${BLOCK}-status`} aria-live=\"polite\">{this.pagedProducts().length > 1 ? `Slide ${this.page+1} of ${this.pagedProducts().length}` : ''}</div>\n {this.staleData && (\n <div class={`${BLOCK}-stale-indicator`} aria-live=\"polite\">Refreshing…</div>\n )}\n </div>\n )}\n </div>\n );\n };\n\n};"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory-1QinX-o0.js","sources":["src/utils/storefront_api/factory.ts"],"sourcesContent":["import { state, showToast } from \"../store/store\";\n\nasync function shopifyFetch(query: string, variables: Record<string, any> = {}): Promise<any> {\n try {\n if(!state.shopDomain || !state.storefrontToken) throw new Error('Missing Shopify configuration (shopDomain/storefrontToken)');\n const endpoint = `https://${state.shopDomain}/api/2025-07/graphql.json`;\n const token = state.storefrontToken;\n const res = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'X-Shopify-Storefront-Access-Token': token\n },\n body: JSON.stringify({ query, variables })\n });\n const json = await res.json();\n if(json.errors) throw new Error(json.errors.map((e: any) => e.message).join(', '));\n return json.data;\n } catch(error) {\n console.error('Shopify Fetch Error:', error);\n throw error; \n };\n};\n\nexport async function getIdFromHandle(handle: string): Promise<string | null> {\n const query = `\n query ($handle: String!) {\n product(handle: $handle) {\n id\n }\n }`;\n try {\n const data = await shopifyFetch(query, { handle });\n return data?.product?.id || null;\n } catch (error) {\n console.error('getIdFromHandle error:', error);\n return null;\n };\n};\n\n// Field + normalization helpers\nconst BASE_PRODUCT_FIELDS = ['id','handle','title'];\nconst DEFAULT_VARIANT_FIELDS = ['id','title','price { amount currencyCode }'];\n\nfunction mergeFields(requested: string[] | string, defaults: string[]): string[] {\n const req = (Array.isArray(requested) ? requested : requested.split(','))\n .map(f => f.trim())\n .filter(Boolean);\n const seen = new Set<string>();\n const ordered: string[] = [];\n for(const f of req) { \n if(!seen.has(f)) { \n seen.add(f); ordered.push(f); \n }; \n };\n for(const d of defaults) { \n if(!seen.has(d)) { \n seen.add(d); \n ordered.push(d); \n }; \n };\n return ordered;\n};\n\nfunction expandProductFields(fields: string[]): string {\n return fields\n .filter(f => f !== 'price')\n .map(f => {\n if(f === 'images') return 'images(first: 10) { nodes { url altText } }';\n return f;\n })\n .join('\\n');\n};\n\nfunction variantSelection(fields: string[] = DEFAULT_VARIANT_FIELDS): string {\n return fields.join('\\n');\n};\n\ninterface NormalizedProduct {\n id: string;\n handle?: string;\n title?: string;\n variantId?: string;\n price?: string | null;\n imageUrl?: string | null;\n imageAlt?: string | null;\n // index signature for dynamic requested fields\n [key: string]: any;\n};\n\nfunction normalizeProduct(product: any, selectedVariant?: any): NormalizedProduct {\n const variant = selectedVariant || product.variants?.edges?.[0]?.node || {};\n let imageUrl = null;\n let imageAlt = null;\n if(product.images?.nodes && product.images.nodes.length > 0) {\n imageUrl = product.images.nodes[0].url || null;\n imageAlt = product.images.nodes[0].altText || null;\n };\n const { id: variantId, price } = variant;\n return {\n id: product.id,\n ...Object.fromEntries(Object.entries(product).filter(([key]) => key !== 'variants')),\n variantId,\n price: price?.amount || null,\n imageUrl,\n imageAlt,\n };\n};\n\n// Query builders\nfunction buildProductsQuery(fieldsString: string, variantFieldsString: string) {\n return `\n query ($limit: Int!, $sortKey: ProductSortKeys!, $reverse: Boolean) {\n products(first: $limit, sortKey: $sortKey, reverse: $reverse) {\n edges {\n node {\n ${fieldsString}\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\n }\n }\n }\n }`;\n};\n\nfunction buildCollectionProductsQuery(fieldsString: string, variantFieldsString: string) {\n return `\n query ($handle: String!, $limit: Int!, $sortKey: ProductCollectionSortKeys!, $reverse: Boolean) {\n collection(handle: $handle) {\n products(first: $limit, sortKey: $sortKey, reverse: $reverse) {\n edges {\n node {\n ${fieldsString}\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\n }\n }\n }\n }\n }`;\n};\n\nfunction buildSingleProductQuery(fieldsString: string, variantFieldsString: string) {\n return `\n query ($id: ID!) {\n product(id: $id) {\n ${fieldsString}\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\n }\n }`;\n};\n\nfunction buildVariantProductQuery(productFieldsString: string, variantFieldsString: string) {\n return `\n query ($id: ID!) {\n productVariant(id: $id) {\n ${variantFieldsString}\n product {\n ${productFieldsString}\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\n }\n }\n }`;\n};\n\n// Public API\nexport async function fetchProducts(limit: number, collectionHandle: string, sortKey: string, fields: string[] | string, reversed: boolean = false) {\n try {\n const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);\n const fieldsString = expandProductFields(merged);\n const variantFieldsString = variantSelection();\n const isAll = !collectionHandle || collectionHandle === 'all';\n const query = isAll ? buildProductsQuery(fieldsString, variantFieldsString) : buildCollectionProductsQuery(fieldsString, variantFieldsString);\n const reverse = !!reversed;\n const variables: Record<string, any> = isAll ? { limit, sortKey, reverse } : { handle: collectionHandle, limit, sortKey, reverse };\n const data = await shopifyFetch(query, variables);\n const productEdges = data.products?.edges || data.collection?.products?.edges || [];\n return productEdges.map((edge: any) => normalizeProduct(edge.node));\n } catch(error) { \n console.error('Fetch Products Error:', error); throw error;\n };\n};\n\nexport async function fetchProductByID(id: string, fields: string[] | string, options?: { variantId?: string }): Promise<NormalizedProduct | null> {\n try {\n if(options?.variantId) return await getVariantProduct(options.variantId, fields);\n const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);\n const fieldsString = expandProductFields(merged);\n const variantFieldsString = variantSelection();\n const query = buildSingleProductQuery(fieldsString, variantFieldsString);\n const data = await shopifyFetch(query, { id });\n const product = data?.product;\n if(!product) return null;\n return normalizeProduct(product);\n } catch(error) { console.error('Fetch Product By ID Error:', error); throw error; };\n};\n\nexport async function getVariantProduct(variantId: string, fields: string[] | string): Promise<NormalizedProduct | null> {\n try {\n const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);\n const productFieldsString = expandProductFields(merged);\n const variantFieldsString = variantSelection();\n const query = buildVariantProductQuery(productFieldsString, variantFieldsString);\n const data = await shopifyFetch(query, { id: variantId });\n const variantNode = data?.productVariant;\n if(!variantNode) return null;\n const product = variantNode.product;\n if(!product) return null;\n return normalizeProduct(product, variantNode); \n } catch(error) { console.error('Get Variant Product Error:', error); throw error; };\n};\n\nexport async function addToCart(options: {\n id: number;\n quantity?: number;\n properties?: Record<string, any>;\n}) {\n try {\n console.log('IV add to cart called');\n if(!options.id) throw new Error('No variant id provided for addToCart');\n const quantity = options.quantity || 1;\n const properties = options.properties || {};\n const payload = {\n items: [\n {\n id: options.id,\n quantity,\n properties\n }\n ]\n };\n const url = '/cart/add.js';\n const res = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n 'X-Requested-With': 'XMLHttpRequest'\n },\n body: JSON.stringify(payload)\n });\n if(!res.ok) {\n const errorText = await res.text();\n throw new Error(errorText);\n };\n const cartItem = await res.json();\n showToast('Added to cart!', 'success', 3000);\n return cartItem;\n } catch (error) {\n showToast('Error adding to cart', 'error', 5000);\n throw error;\n };\n};"],"names":[],"mappings":";;AAEA,eAAe,YAAY,CAAC,KAAa,EAAE,YAAiC,EAAE,EAAA;AAC5E,IAAA,IAAI;QACF,IAAG,CAAC,KAAK,CAAC,UAAU,IAAI,CAAC,KAAK,CAAC,eAAe;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC;AAC7H,QAAA,MAAM,QAAQ,GAAG,CAAA,QAAA,EAAW,KAAK,CAAC,UAAU,2BAA2B;AACvE,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,eAAe;AACnC,QAAA,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;AAChC,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,OAAO,EAAE;AACP,gBAAA,cAAc,EAAE,kBAAkB;AAClC,gBAAA,mCAAmC,EAAE;AACtC,aAAA;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;AAC1C,SAAA,CAAC;AACF,QAAA,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE;QAC7B,IAAG,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC,IAAI;;IAChB,OAAM,KAAK,EAAE;AACb,QAAA,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,KAAK,CAAC;AAC5C,QAAA,MAAM,KAAK;;IACZ;AACH;AAAC;AAEM,eAAe,eAAe,CAAC,MAAc,EAAA;AAClD,IAAA,MAAM,KAAK,GAAG;;;;;MAKV;AACJ,IAAA,IAAI;QACF,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC;AAClD,QAAA,OAAO,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,IAAI;;IAChC,OAAO,KAAK,EAAE;AACd,QAAA,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC;AAC9C,QAAA,OAAO,IAAI;;IACZ;AACH;AAAC;AAED;AACA,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAC,QAAQ,EAAC,OAAO,CAAC;AACnD,MAAM,sBAAsB,GAAG,CAAC,IAAI,EAAC,OAAO,EAAC,+BAA+B,CAAC;AAE7E,SAAS,WAAW,CAAC,SAA4B,EAAE,QAAkB,EAAA;IACnE,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC;SACrE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;SACjB,MAAM,CAAC,OAAO,CAAC;AAClB,IAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU;IAC9B,MAAM,OAAO,GAAa,EAAE;AAC5B,IAAA,KAAI,MAAM,CAAC,IAAI,GAAG,EAAE;QAClB,IAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;AACf,YAAA,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAAE,YAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;;QAC7B;;IACF;AACD,IAAA,KAAI,MAAM,CAAC,IAAI,QAAQ,EAAE;QACvB,IAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;AACf,YAAA,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACX,YAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;;QAChB;;IACF;AACD,IAAA,OAAO,OAAO;AAChB;AAAC;AAED,SAAS,mBAAmB,CAAC,MAAgB,EAAA;AAC3C,IAAA,OAAO;SACJ,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,OAAO;SACzB,GAAG,CAAC,CAAC,IAAG;QACP,IAAG,CAAC,KAAK,QAAQ;AAAE,YAAA,OAAO,6CAA6C;AACvE,QAAA,OAAO,CAAC;AACV,KAAC;SACA,IAAI,CAAC,IAAI,CAAC;AACf;AAAC;AAED,SAAS,gBAAgB,CAAC,MAAA,GAAmB,sBAAsB,EAAA;AACjE,IAAA,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;AAC1B;AAAC;AAYA;AAED,SAAS,gBAAgB,CAAC,OAAY,EAAE,eAAqB,EAAA;AAC3D,IAAA,MAAM,OAAO,GAAG,eAAe,IAAI,OAAO,CAAC,QAAQ,EAAE,KAAK,GAAG,CAAC,CAAC,EAAE,IAAI,IAAI,EAAE;IAC3E,IAAI,QAAQ,GAAG,IAAI;IACnB,IAAI,QAAQ,GAAG,IAAI;AACnB,IAAA,IAAG,OAAO,CAAC,MAAM,EAAE,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3D,QAAA,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI;AAC9C,QAAA,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,IAAI;;IACnD;IACD,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,OAAO;IACxC,OAAO;QACL,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,UAAU,CAAC,CAAC;QACpF,SAAS;AACT,QAAA,KAAK,EAAE,KAAK,EAAE,MAAM,IAAI,IAAI;QAC5B,QAAQ;QACR,QAAQ;KACT;AACH;AAAC;AAED;AACA,SAAS,kBAAkB,CAAC,YAAoB,EAAE,mBAA2B,EAAA;IAC3E,OAAO;;;;;cAKK,YAAY;kDACwB,mBAAmB,CAAA;;;;MAI/D;AACN;AAAC;AAED,SAAS,4BAA4B,CAAC,YAAoB,EAAE,mBAA2B,EAAA;IACrF,OAAO;;;;;;gBAMO,YAAY;oDACwB,mBAAmB,CAAA;;;;;MAKjE;AACN;AAAC;AAED,SAAS,uBAAuB,CAAC,YAAoB,EAAE,mBAA2B,EAAA;IAChF,OAAO;;;UAGC,YAAY;8CACwB,mBAAmB,CAAA;;MAE3D;AACN;AAAC;AAED,SAAS,wBAAwB,CAAC,mBAA2B,EAAE,mBAA2B,EAAA;IACxF,OAAO;;;UAGC,mBAAmB;;YAEjB,mBAAmB;gDACiB,mBAAmB,CAAA;;;MAG7D;AACN;AAAC;AAED;AACO,eAAe,aAAa,CAAC,KAAa,EAAE,gBAAwB,EAAE,OAAe,EAAE,MAAyB,EAAE,WAAoB,KAAK,EAAA;AAChJ,IAAA,IAAI;QACF,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,mBAAmB,CAAC;AACvD,QAAA,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAAC;AAChD,QAAA,MAAM,mBAAmB,GAAG,gBAAgB,EAAE;QAC9C,MAAM,KAAK,GAAG,CAAC,gBAAgB,IAAI,gBAAgB,KAAK,KAAK;QAC7D,MAAM,KAAK,GAAG,KAAK,GAAG,kBAAkB,CAAC,YAAY,EAAE,mBAAmB,CAAC,GAAG,4BAA4B,CAAC,YAAY,EAAE,mBAAmB,CAAC;AAC7I,QAAA,MAAM,OAAO,GAAG,CAAC,CAAC,QAAQ;QAC1B,MAAM,SAAS,GAAwB,KAAK,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE;QAClI,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC;AACjD,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,IAAI,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,IAAI,EAAE;AACnF,QAAA,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC,IAAS,KAAK,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;IACnE,OAAM,KAAK,EAAE;AACb,QAAA,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC;AAAE,QAAA,MAAM,KAAK;;IAC3D;AACH;AAAC;AAEM,eAAe,gBAAgB,CAAC,EAAU,EAAE,MAAyB,EAAE,OAAgC,EAAA;AAC5G,IAAA,IAAI;QACF,IAAG,OAAO,EAAE,SAAS;YAAE,OAAO,MAAM,iBAAiB,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;QAChF,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,mBAAmB,CAAC;AACvD,QAAA,MAAM,YAAY,GAAG,mBAAmB,CAAC,MAAM,CAAC;AAChD,QAAA,MAAM,mBAAmB,GAAG,gBAAgB,EAAE;QAC9C,MAAM,KAAK,GAAG,uBAAuB,CAAC,YAAY,EAAE,mBAAmB,CAAC;QACxE,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC;AAC9C,QAAA,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO;AAC7B,QAAA,IAAG,CAAC,OAAO;AAAE,YAAA,OAAO,IAAI;AACxB,QAAA,OAAO,gBAAgB,CAAC,OAAO,CAAC;;IAChC,OAAM,KAAK,EAAE;AAAE,QAAA,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC;AAAE,QAAA,MAAM,KAAK;;IAAG;AACrF;AAAC;AAEM,eAAe,iBAAiB,CAAC,SAAiB,EAAE,MAAyB,EAAA;AAClF,IAAA,IAAI;QACF,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,mBAAmB,CAAC;AACvD,QAAA,MAAM,mBAAmB,GAAG,mBAAmB,CAAC,MAAM,CAAC;AACvD,QAAA,MAAM,mBAAmB,GAAG,gBAAgB,EAAE;QAC9C,MAAM,KAAK,GAAG,wBAAwB,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;AAChF,QAAA,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC;AACzD,QAAA,MAAM,WAAW,GAAG,IAAI,EAAE,cAAc;AACxC,QAAA,IAAG,CAAC,WAAW;AAAE,YAAA,OAAO,IAAI;AAC5B,QAAA,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO;AACnC,QAAA,IAAG,CAAC,OAAO;AAAE,YAAA,OAAO,IAAI;AACxB,QAAA,OAAO,gBAAgB,CAAC,OAAO,EAAE,WAAW,CAAC;;IAC7C,OAAM,KAAK,EAAE;AAAE,QAAA,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC;AAAE,QAAA,MAAM,KAAK;;IAAG;AACrF;AAAC;AAEM,eAAe,SAAS,CAAC,OAI/B,EAAA;AACC,IAAA,IAAI;AACF,QAAA,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;QACpC,IAAG,CAAC,OAAO,CAAC,EAAE;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC;AACvE,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,CAAC;AACtC,QAAA,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,EAAE;AAC3C,QAAA,MAAM,OAAO,GAAG;AACd,YAAA,KAAK,EAAE;AACL,gBAAA;oBACE,EAAE,EAAE,OAAO,CAAC,EAAE;oBACd,QAAQ;oBACR;AACD;AACF;SACF;QACD,MAAM,GAAG,GAAG,cAAc;AAC1B,QAAA,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;AAC3B,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,OAAO,EAAE;AACP,gBAAA,cAAc,EAAE,kBAAkB;AAClC,gBAAA,QAAQ,EAAE,kBAAkB;AAC5B,gBAAA,kBAAkB,EAAE;AACrB,aAAA;AACD,YAAA,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO;AAC7B,SAAA,CAAC;AACF,QAAA,IAAG,CAAC,GAAG,CAAC,EAAE,EAAE;AACV,YAAA,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE;AAClC,YAAA,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC;;QAC3B;AACD,QAAA,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE;AACjC,QAAA,SAAS,CAAC,gBAAgB,EAAE,SAAS,EAAE,IAAI,CAAC;AAC5C,QAAA,OAAO,QAAQ;;IACf,OAAO,KAAK,EAAE;AACd,QAAA,SAAS,CAAC,sBAAsB,EAAE,OAAO,EAAE,IAAI,CAAC;AAChD,QAAA,MAAM,KAAK;;IACZ;AACH;AAAC;;;;"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory-JClanx-E.js","sources":["src/utils/caching/factory.ts","src/utils/caching/productCache.ts","src/utils/error_handling/factory.ts"],"sourcesContent":["/*\n Generic caching factory for component data (and optionally pre-rendered markup).\n Focus: Avoid repeated Storefront API calls across page loads & multiple instances.\n\n Strategy:\n - Cache normalized data (preferred) so Stencil still renders & binds events.\n - Optional markup caching (only for fully static / idempotent HTML) via setMarkup/getMarkup helpers.\n - Deterministic key: namespace + stable-hash(params + version + type).\n - Supports localStorage / sessionStorage / memory fallback.\n - TTL + optional staleWhileRevalidate.\n - Inflight request dedupe (single network fetch per key at a time).\n - Event emission (CustomEvent 'iv-cache') for diagnostics (hit/miss/stale/set/purge/error).\n\n IMPORTANT NOTE ABOUT MARKUP CACHING:\n Injecting raw cached markup can skip Stencil lifecycle & event listener binding.\n Prefer data caching and regular render path. Use markup caching only for static read-only fragments.\n*/\n\nexport interface CacheStored<T=any> {\n v: string; // version\n ts: number; // timestamp (ms)\n ttl: number; // time-to-live (ms)\n t: 'data' | 'markup'; // entry type\n data: T; // payload (string for markup)\n meta?: Record<string, any>;\n}\n\nexport interface CacheGetResult<T=any> {\n data?: T;\n meta?: Record<string, any>;\n isExpired: boolean;\n isStale: boolean;\n ageMs: number;\n raw?: CacheStored<T>;\n}\n\nexport interface CacheEventDetail {\n action: 'hit' | 'miss' | 'stale' | 'set' | 'purge' | 'error' | 'evict';\n key: string;\n namespace: string;\n info?: any;\n}\n\ninterface StorageAdapter {\n getItem(k: string): string | null;\n setItem(k: string, v: string): void;\n removeItem(k: string): void;\n keys(): string[]; // restricted to ones we can iterate\n}\n\ninterface CreateCacheOptions {\n namespace: string; // e.g. 'iv-dynamic-products'\n version?: string; // bump to invalidate all\n storage?: 'local' | 'session' | 'memory';\n prefix?: string; // key prefix\n defaultTTL?: number; // ms (fresh window)\n staleTTL?: number; // optional extra stale window (stale-while-revalidate)\n maxEntries?: number; // soft cap\n maxValueBytes?: number; // guard large payloads\n serialize?: (v: any) => string;\n deserialize?: (s: string) => any;\n dispatchEvents?: boolean; // emit CustomEvents\n target?: HTMLElement | Window; // event target\n}\n\ninterface GetOrSetOptions<T=any> {\n ttl?: number;\n meta?: Record<string, any>;\n staleWhileRevalidate?: boolean;\n type?: 'data' | 'markup';\n transform?: (fresh: any) => T; // allow post-processing before store\n}\n\nexport function createCache(options: CreateCacheOptions) {\n const {\n namespace,\n version = '1',\n storage = 'local',\n prefix = 'iv:cache:',\n defaultTTL = 1000 * 60 * 5,\n staleTTL,\n maxEntries = 200,\n maxValueBytes = 250_000, // ~250 KB safety guard\n serialize = JSON.stringify,\n deserialize = JSON.parse,\n dispatchEvents = true,\n target = (typeof window !== 'undefined' ? window : undefined)\n } = options;\n\n const adapter = resolveAdapter(storage);\n const inflight = new Map<string, Promise<any>>();\n let opCount = 0;\n\n function emit(action: CacheEventDetail['action'], key: string, info?: any) {\n if(!dispatchEvents || !target || typeof (target as any).dispatchEvent !== 'function') return;\n try {\n const detail: CacheEventDetail = { action, key, namespace, info };\n target.dispatchEvent(new CustomEvent('iv-cache', { detail, bubbles: true, composed: true }));\n } catch(_) {}\n }\n\n function stableString(obj: any): string {\n if(obj === null) return 'null';\n const type = typeof obj;\n if(type !== 'object') return JSON.stringify(obj);\n if(Array.isArray(obj)) return '[' + obj.map(stableString).join(',') + ']';\n const keys = Object.keys(obj).sort();\n return '{' + keys.map(k => JSON.stringify(k)+':'+stableString(obj[k])).join(',') + '}';\n }\n\n function hash(str: string): string {\n let h = 5381, i = str.length;\n while(i) h = (h * 33) ^ str.charCodeAt(--i);\n return (h >>> 0).toString(36);\n }\n\n function buildKey(type: 'data' | 'markup', params: Record<string, any>): string {\n const base = stableString(params);\n return `${prefix}${namespace}:${type}:${version}:${hash(base)}`;\n }\n\n function read<T>(key: string): CacheGetResult<T> {\n try {\n const rawStr = adapter.getItem(key);\n if(!rawStr) return { isExpired: true, isStale: false, ageMs: 0 };\n const stored: CacheStored<T> = deserialize(rawStr);\n if(!stored || stored.v !== version) return { isExpired: true, isStale: false, ageMs: 0 };\n const ageMs = Date.now() - stored.ts;\n const isExpired = ageMs > stored.ttl;\n const isStale = isExpired && staleTTL ? ageMs <= stored.ttl + staleTTL : false;\n return { data: stored.data, meta: stored.meta, isExpired, isStale, ageMs, raw: stored };\n } catch(err) {\n emit('error', key, { err: (err as any)?.message });\n return { isExpired: true, isStale: false, ageMs: 0 };\n }\n }\n\n function write<T>(key: string, type: 'data' | 'markup', data: T, cfg?: { ttl?: number; meta?: Record<string, any> }) {\n const ttl = cfg?.ttl ?? defaultTTL;\n const stored: CacheStored<T> = { v: version, ts: Date.now(), ttl, t: type, data, meta: cfg?.meta };\n try {\n const payload = serialize(stored);\n if(maxValueBytes && byteLength(payload) > maxValueBytes) {\n emit('error', key, { reason: 'oversize', bytes: byteLength(payload) });\n return;\n }\n adapter.setItem(key, payload);\n emit('set', key, { ttl, type });\n enforceLimit();\n } catch(err) {\n emit('error', key, { err: (err as any)?.message });\n }\n }\n\n function get<T>(key: string): CacheGetResult<T> {\n const res = read<T>(key);\n if(res.data && !res.isExpired) emit('hit', key, { ageMs: res.ageMs });\n else if(res.data && res.isExpired && res.isStale) emit('stale', key, { ageMs: res.ageMs });\n else emit('miss', key);\n return res;\n }\n\n async function getOrSet<T>(key: string, type: 'data' | 'markup', fetcher: () => Promise<T>, opts?: GetOrSetOptions<T>): Promise<T> {\n const existing = get<T>(key);\n if(existing.data && !existing.isExpired) return existing.data;\n if(existing.data && existing.isStale && opts?.staleWhileRevalidate) {\n // return stale, refresh in background\n refresh(key, type, fetcher, opts);\n return existing.data;\n }\n if(inflight.has(key)) return inflight.get(key)!;\n const p = (async () => {\n try {\n const raw = await fetcher();\n const transformed = opts?.transform ? opts.transform(raw) : raw;\n write(key, type, transformed, { ttl: opts?.ttl, meta: opts?.meta });\n return transformed;\n } finally {\n inflight.delete(key);\n }\n })();\n inflight.set(key, p);\n return p;\n }\n\n function refresh<T>(key: string, type: 'data' | 'markup', fetcher: () => Promise<T>, opts?: GetOrSetOptions<T>) {\n return getOrSet(key, type, fetcher, opts); // reuse logic\n }\n\n function purge(key: string) {\n adapter.removeItem(key);\n emit('purge', key);\n }\n\n function purgePattern(pattern: RegExp | ((k: string) => boolean)) {\n const keys = adapter.keys();\n for(const k of keys) {\n if(!k.startsWith(`${prefix}${namespace}:`)) continue;\n const matched = typeof pattern === 'function' ? pattern(k) : pattern.test(k);\n if(matched) purge(k);\n }\n }\n\n function clearNamespace() { purgePattern(() => true); }\n\n function enforceLimit() {\n if(!adapter.keys) return;\n opCount++;\n // only enforce every 20 writes to reduce overhead\n if(opCount % 20 !== 0) return;\n const keys = adapter.keys().filter(k => k.startsWith(`${prefix}${namespace}:`));\n if(keys.length <= maxEntries) return;\n const arr = keys.map(k => {\n try { const raw = deserialize(adapter.getItem(k)!); return { k, ts: raw?.ts || 0 }; } catch { return { k, ts: 0 }; }\n }).sort((a,b) => a.ts - b.ts); // oldest first\n const removeCount = keys.length - maxEntries;\n arr.slice(0, removeCount).forEach(e => { purge(e.k); emit('evict', e.k); });\n }\n\n // Convenience wrappers for common patterns\n function keyForData(params: Record<string, any>) { return buildKey('data', params); }\n function keyForMarkup(params: Record<string, any>) { return buildKey('markup', params); }\n\n function setData<T>(params: Record<string, any>, data: T, cfg?: { ttl?: number; meta?: Record<string, any> }) {\n write(keyForData(params), 'data', data, cfg);\n }\n\n function getData<T>(params: Record<string, any>): CacheGetResult<T> {\n return get<T>(keyForData(params));\n }\n\n function getOrSetData<T>(params: Record<string, any>, fetcher: () => Promise<T>, opts?: GetOrSetOptions<T>) {\n return getOrSet(keyForData(params), 'data', fetcher, opts);\n }\n\n function setMarkup(params: Record<string, any>, html: string, cfg?: { ttl?: number; meta?: Record<string, any> }) {\n write(keyForMarkup(params), 'markup', html, cfg);\n }\n\n function getMarkup(params: Record<string, any>): CacheGetResult<string> {\n return get<string>(keyForMarkup(params));\n }\n\n function getOrSetMarkup(params: Record<string, any>, producer: () => Promise<string>, opts?: GetOrSetOptions<string>) {\n return getOrSet(keyForMarkup(params), 'markup', producer, opts);\n }\n\n return {\n // generic\n buildKey,\n get,\n set: write,\n getOrSet,\n refresh,\n purge,\n purgePattern,\n clearNamespace,\n inflight,\n // data-specific helpers\n keyForData,\n getData,\n setData,\n getOrSetData,\n // markup-specific helpers\n keyForMarkup,\n getMarkup,\n setMarkup,\n getOrSetMarkup\n };\n}\n\nfunction resolveAdapter(sel: 'local' | 'session' | 'memory'): StorageAdapter {\n if(sel === 'memory') return createMemoryAdapter();\n const store = safeStorage(sel === 'session' ? 'session' : 'local');\n if(!store) return createMemoryAdapter();\n return {\n getItem: k => store.getItem(k),\n setItem: (k,v) => store.setItem(k,v),\n removeItem: k => store.removeItem(k),\n keys: () => {\n const arr: string[] = [];\n for(let i=0;i<store.length;i++) { const key = store.key(i); if(key) arr.push(key); }\n return arr;\n }\n };\n}\n\nfunction safeStorage(type: 'local' | 'session'): Storage | undefined {\n try {\n if(typeof window === 'undefined') return undefined;\n const s = type === 'local' ? window.localStorage : window.sessionStorage;\n const testKey = '__iv_cache_test__';\n s.setItem(testKey, '1');\n s.removeItem(testKey);\n return s;\n } catch { return undefined; }\n}\n\nfunction createMemoryAdapter(): StorageAdapter {\n const map = new Map<string, string>();\n return {\n getItem: k => map.get(k) || null,\n setItem: (k,v) => { map.set(k,v); },\n removeItem: k => { map.delete(k); },\n keys: () => Array.from(map.keys())\n };\n}\n\nfunction byteLength(str: string) {\n if(typeof Blob !== 'undefined') return new Blob([str]).size;\n // fallback rough estimate\n return encodeURIComponent(str).replace(/%../g, 'x').length;\n}\n\n/*\nUSAGE EXAMPLES (iv-dynamic-products):\n\nimport { createCache } from '../../utils/caching/factory';\nimport { fetchProducts } from '../../utils/storefront_api/factory';\n\nconst productCache = createCache({\n namespace: 'iv-dynamic-products',\n version: '1',\n storage: 'local',\n defaultTTL: 1000 * 60 * 5, // 5 minutes fresh\n staleTTL: 1000 * 60 * 5 // additional 5 minutes stale window\n});\n\nasync function loadProducts(params) {\n const data = await productCache.getOrSetData(\n { handle: params.handle, sort: params.sort, fields: params.fields, limit: params.limit, currency: params.currency },\n () => fetchProducts(params),\n { ttl: 1000 * 60 * 5, staleWhileRevalidate: true }\n );\n // assign to component state & let Stencil render\n this.products = data;\n}\n\n// Optional MARKUP caching (only if safe & static):\nasync function getMarkupFast(params) {\n return productCache.getOrSetMarkup(\n { handle: params.handle, sort: params.sort, limit: params.limit },\n async () => {\n const data = await fetchProducts(params);\n // build HTML string (ensure no dynamic listeners needed)\n return data.map(p => `<div class=\\\"iv-card\\\">${p.title}</div>`).join('');\n },\n { ttl: 1000 * 60 * 2, staleWhileRevalidate: true }\n );\n}\n\n/*\n============================================================\nCACHING FACTORY – USAGE & RATIONALE NOTES\n============================================================\nPurpose:\n Provide a unified, lightweight, observable cache for normalized DATA (preferred) and optionally static MARKUP.\n Designed to prevent redundant Shopify Storefront API calls across multiple component instances / navigations.\n\nCore Concepts:\n Key Derivation: stable, deterministic hash of (params + namespace + version + type).\n Data vs Markup: Markup support exists but is discouraged for interactive Stencil components (event binding loss).\n Fresh vs Stale vs Expired:\n - fresh: age <= ttl\n - expired + stale window active: treat as stale (returned immediately if staleWhileRevalidate enabled)\n - expired beyond stale window: treated as miss\n Stale‑While‑Revalidate: returns stale value immediately while background refresh updates cache.\n Inflight Dedupe: concurrent requests for same key share the same Promise.\n Size Guard: prevents storing overly large payloads (default ~250KB serialized).\n Soft Eviction: oldest entries removed when exceeding maxEntries (checked every 20 writes).\n Events: CustomEvent 'iv-cache' with actions (hit|miss|stale|set|purge|error|evict) for telemetry / debugging.\n\nRecommended Usage Pattern (Data):\n 1. Create one shared cache per domain concern (e.g. productCache, predictiveSearchCache).\n 2. Always cache normalized data objects – keep UI rendering inside Stencil.\n 3. Include parameters that materially affect the response in the key params object (collection handle, sort key, limit, currency).\n 4. Use staleWhileRevalidate for UX smoothness (fast paint + silent refresh).\n 5. Avoid caching partial markup for interactive components.\n\nExample (Products):\n import { productCache } from '../caching/productCache';\n import { fetchProducts } from '../storefront_api/factory';\n const products = await productCache.getOrSetData(\n { handle, sort, limit, fields, currency },\n () => fetchProducts({ collectionHandle: handle, sortKey: sort, limit, fields }),\n { ttl: 1000 * 60 * 5, staleWhileRevalidate: true }\n );\n\nDeciding TTL / Stale:\n High traffic / slow changing catalog: longer ttl (5–15m) + generous stale window.\n Rapidly changing pricing/inventory: shorter ttl (1–2m) or disable stale if consistency is critical.\n\nWhen NOT to Use This Cache:\n - Server authoritative real-time inventory checks pre‑purchase.\n - Personalized data (user-specific recommendations) unless key includes identity.\n - Security sensitive payloads (never store secrets / tokens).\n\nExtensibility Ideas:\n - BroadcastChannel or storage event listener to sync invalidations across tabs.\n - Add diff hashing of payload to skip downstream re-renders.\n - Integrate global telemetry to record hit/miss ratio.\n\nDebugging Tips:\n window.addEventListener('iv-cache', e => console.log('cache event', e.detail));\n productCache.clearNamespace() // manual purge\n\nMigration Path If Dropping Markup:\n 1. Remove 'markup' references and helpers.\n 2. Narrow CacheStored.t to implicit 'data'.\n 3. Delete keyForMarkup / setMarkup / getMarkup / getOrSetMarkup usages.\n\nSafety Notes:\n - Serialization errors are caught and emitted as 'error' events.\n - Oversize entries are skipped (no partial writes).\n - Stale return path never blocks UI; refresh runs through same deduped pipeline.\n============================================================\n*/\n","// Shared product cache singleton for product-related data across components.\n// Focused on data (not markup) to preserve Stencil lifecycle & event binding.\n// Includes stale-while-revalidate so multiple component instances reuse results.\n\nimport { createCache } from './factory';\n\nexport const productCache = createCache({\n namespace: 'products',\n version: '1',\n storage: 'local',\n defaultTTL: 1000 * 60 * 5, // 5 minutes fresh\n staleTTL: 1000 * 60 * 5, // additional 5 minutes stale window\n dispatchEvents: true\n});\n\nexport type ProductCacheParams = {\n handle: string;\n sort: string;\n fields: string;\n limit: number;\n currency: string;\n};\n\n/*\n============================================================\nPRODUCT CACHE – USAGE NOTES\n============================================================\nGoal:\n Provide a shared, cross-component data cache for normalized Shopify product lists.\n Prevents duplicate Storefront API queries when multiple components (e.g. carousels, grids) request the same dataset.\n\nWhy Data (Not Markup):\n Data caching keeps Stencil's render lifecycle & event listeners intact.\n Markup caching risks stale styling, missed hydration, lost interactivity.\n\nKey Parameters Included in Cache Key:\n handle : collection or 'all'\n sort : sort key (BEST_SELLING, PRICE, etc.)\n fields : requested GraphQL fields (affects shape / payload size)\n limit : number of products\n currency : ensures price formatting differences are segregated\n\nStale-While-Revalidate Flow:\n 1. Fresh hit -> returned immediately.\n 2. Expired but within stale window + staleWhileRevalidate=true -> stale data returned; background refresh updates cache.\n 3. Expired beyond stale window -> treated as miss; new fetch awaited.\n\nBasic Usage in a Component:\n import { productCache } from '../../utils/caching/productCache';\n import { fetchProducts } from '../../utils/storefront_api/factory';\n\n async function load() {\n const params = { handle: 'all', sort: 'BEST_SELLING', fields: 'id,title,images', limit: 8, currency: 'GBP' };\n const products = await productCache.getOrSetData(\n params,\n () => fetchProducts({\n collectionHandle: params.handle,\n sortKey: params.sort,\n limit: params.limit,\n fields: params.fields,\n }),\n { ttl: 1000 * 60 * 5, staleWhileRevalidate: true }\n );\n // render products...\n }\n\nListening for Cache Diagnostics:\n window.addEventListener('iv-cache', e => {\n const { action, key, namespace, info } = (e as CustomEvent).detail;\n if(namespace === 'products') console.debug('[productCache]', action, { key, info });\n });\n\nManual Invalidation Examples:\n productCache.clearNamespace(); // purge everything in 'products'\n // or targeted:\n // productCache.purge(specificKey);\n\nAdjusting Freshness Strategy:\n - High stability content: increase defaultTTL (10–15m) + keep staleTTL (same or larger).\n - Rapid inventory changes: shorten TTL (1–2m) or disable staleWhileRevalidate on critical views.\n\nExtending:\n - Add a lightweight wrapper that injects user segment into params if personalization introduced.\n - Introduce a background warm-up (call getOrSetData on route prefetch).\n\nSafety:\n - Oversize payloads are ignored (error event emitted) to guard storage quota.\n - Serialization failures fail open (miss on next access).\n============================================================\n*/\n","import { showToast } from '../store/store';\n\nexport type errorSeverity = 'debug' | 'info' | 'warn' | 'error' | 'critical';\n\nexport interface NormalizedError {\n id: string;\n ts: number;\n component?: string;\n scope: string;\n severity: errorSeverity;\n userSafe: boolean;\n userMessage?: string;\n devMessage?: string;\n raw?: any;\n meta?: Record<string, any>;\n deduped?: boolean;\n stack?: string;\n};\n\ninterface TelemetryConfig {\n record: (n: NormalizedError) => void | Promise<void>;\n sampleRate?: number;\n filter?: (n: NormalizedError) => boolean;\n enrich?: (n: NormalizedError) => Partial<NormalizedError>;\n};\n\ninterface CreateHandlerConfig {\n component?: string;\n toast?: (opts: { message: string; variant?: string }) => void; \n toastDuration?: number;\n emitEvents?: boolean;\n target?: HTMLElement | Window;\n classifier?: (ctx: { error: any; scope: string }) => Partial<{ userSafe: boolean; severity: errorSeverity; userMessage: string }>;\n dedupeMs?: number;\n defaultUserMessage?: string;\n maxConsoleStack?: number;\n telemetry?: TelemetryConfig;\n _sharedRecent?: Map<string, number>;\n};\n\ninterface HandleOptions {\n error: any;\n scope: string;\n userMessage?: string;\n devMessage?: string;\n severity?: errorSeverity;\n level?: errorSeverity;\n emitEvent?: boolean;\n meta?: Record<string, any>;\n};\n\nexport function createErrorHandler(config: CreateHandlerConfig = {}) {\n const {\n component,\n toast,\n toastDuration = 3000,\n emitEvents = true,\n target = window,\n classifier,\n dedupeMs = 4000,\n defaultUserMessage = 'Something went wrong. Please try again.',\n maxConsoleStack = 6,\n telemetry,\n _sharedRecent\n } = config;\n\n const recent = _sharedRecent || new Map<string, number>();\n\n function severityToToastType(sev: errorSeverity): 'info' | 'success' | 'warning' | 'error' {\n if(sev === 'warn') return 'warning';\n if(sev === 'debug' || sev === 'info') return 'info';\n return 'error';\n };\n\n function dispatchToast(message: string, severity: errorSeverity) {\n const type = severityToToastType(severity);\n try {\n toast ? toast({ message, variant: type }) : showToast(message, type, toastDuration);\n } catch(_) { /* swallow toast errors */ };\n };\n \n function classify(base: HandleOptions): { userSafe: boolean; severity: errorSeverity; userMessage?: string } {\n let severity: errorSeverity = base.severity || base.level || 'error';\n let userSafe = !!base.userMessage;\n let userMessage = base.userMessage;\n const err = base.error;\n const isNetwork = err?.name === 'TypeError' && /fetch/i.test(err?.message || '');\n if(isNetwork) { userSafe = true; userMessage ||= 'Network issue. Please retry.'; };\n const status = err?.status || err?.response?.status;\n if(status) {\n if(status >= 400 && status < 500) userSafe = true;\n if(status >= 500) { userSafe = false; severity = 'error'; } \n };\n if(!userMessage && userSafe) userMessage = defaultUserMessage;\n if(classifier) {\n const override = classifier({ error: err, scope: base.scope }) || {};\n if(override.userSafe !== undefined) userSafe = override.userSafe;\n if(override.severity) severity = override.severity;\n if(override.userMessage) userMessage = override.userMessage;\n };\n if(!userSafe) userMessage = undefined;\n return { userSafe, severity, userMessage };\n };\n\n function dedupeKey(n: NormalizedError) {\n return `${n.component||''}|${n.scope}|${n.devMessage||n.userMessage||n.raw?.message||''}|${n.severity}`;\n };\n\n function handle(opts: HandleOptions): NormalizedError {\n const { error, scope, devMessage, meta } = opts;\n const { userSafe, severity, userMessage } = classify(opts);\n const stack = (error?.stack || '').split('\\n').slice(0, maxConsoleStack).join('\\n');\n const normalized: NormalizedError = {\n id: crypto?.randomUUID ? crypto.randomUUID() : Date.now().toString(36)+Math.random().toString(36).slice(2),\n ts: Date.now(),\n component,\n scope,\n severity,\n userSafe,\n userMessage,\n devMessage: devMessage ?? (userSafe ? error?.message : undefined),\n raw: error,\n meta,\n stack\n };\n \n if(telemetry?.enrich) {\n try { Object.assign(normalized, telemetry.enrich(normalized)); } catch(_) {}\n };\n\n const key = dedupeKey(normalized);\n const last = recent.get(key);\n last && (Date.now() - last) < dedupeMs ? normalized.deduped = true : recent.set(key, Date.now());\n\n const consolePayload = { ...normalized, raw: undefined };\n if(severity === 'debug') console.debug('[iv-error]', consolePayload, error);\n else if(severity === 'info') console.info('[iv-error]', consolePayload, error);\n else if(severity === 'warn') console.warn('[iv-error]', consolePayload, error);\n else console.error('[iv-error]', consolePayload, error);\n \n if(userSafe && !normalized.deduped && userMessage) {\n dispatchToast(userMessage, severity);\n };\n \n if(emitEvents && (opts.emitEvent !== false) && target && typeof (target as any).dispatchEvent === 'function') {\n try {\n target.dispatchEvent(new CustomEvent('iv-error', { detail: normalized, bubbles: true, composed: true }));\n } catch(_) {}\n };\n\n if(telemetry && (!telemetry.sampleRate || Math.random() < telemetry.sampleRate)) {\n if(!telemetry.filter || telemetry.filter(normalized)) {\n try { Promise.resolve(telemetry.record(normalized)).catch(()=>{}); } catch(_) {}\n };\n };\n return normalized;\n };\n return { handle };\n};\n\n// Usage in a component:\n/*\nimport { createErrorHandler } from '../../utils/error_handling/factory';\nconst errors = createErrorHandler({ component: 'iv-dynamic-products', toast: showToast });\n\ntry {\n await fetchProducts(...);\n} catch(err) {\n errors.handle({\n error: err,\n scope: 'fetchProducts',\n userMessage: 'Could not load products.',\n devMessage: 'Storefront API fetch failed',\n severity: 'error'\n });\n}\n\nSo simplest component usage: \nconst errors = createErrorHandler({ component: 'iv-card' }); try { ... } catch (e) { errors.handle({ error: e, scope: 'load', userMessage: 'Failed to load.' }); }\n*/"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory-mrqy6XUM.js","sources":["src/utils/helpers/factory.ts"],"sourcesContent":["export function decodeJsonString(str: string): string {\n return str.replace(/&quot;/g, '\"');\n};\n\nexport function requestedFields(fields: string): string[] | null {\n return fields ? fields.split(',').map(f => f.trim()) : null;\n}; \n\nexport function formatMoney(amount: number, currencyCode: string = 'GBP', locale: string = 'en-GB'): string {\n // return new Intl.NumberFormat(locale, { style: 'currency', currency: currencyCode }).format(amount / 100);\n return new Intl.NumberFormat(locale, { style: 'currency', currency: currencyCode }).format(amount);\n};\n\nexport function getCurrencySymbol(currencyCode: string = 'GBP', locale: string = 'en-GB'): string {\n return (0).toLocaleString(locale, {\n style: 'currency',\n currency: currencyCode,\n minimumFractionDigits: 0,\n maximumFractionDigits: 0\n }).replace(/\\d/g, '').trim();\n};\n\nexport function getProductIDFromGid(id: string): number {\n return Number(id.split('/').pop()); \n};\n\nexport function getProductHandle(): string {\n const path = window.location.pathname;\n return path.startsWith('/products/') ? path.replace('/products/', '').split('/')[0] : null;\n};"],"names":[],"mappings":"AAAM,SAAU,gBAAgB,CAAC,GAAW,EAAA;IAC1C,OAAO,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;AACpC;AAAC;AAEK,SAAU,eAAe,CAAC,MAAc,EAAA;IAC5C,OAAO,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;AAC7D;AAAC;AAEK,SAAU,WAAW,CAAC,MAAc,EAAE,YAAuB,GAAA,KAAK,EAAE,MAAA,GAAiB,OAAO,EAAA;;IAEhG,OAAO,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;AACpG;AAAC;AAEK,SAAU,iBAAiB,CAAC,eAAuB,KAAK,EAAE,SAAiB,OAAO,EAAA;AACtF,IAAA,OAAO,CAAC,CAAC,EAAE,cAAc,CAAC,MAAM,EAAE;AAChC,QAAA,KAAK,EAAE,UAAU;AACjB,QAAA,QAAQ,EAAE,YAAY;AACtB,QAAA,qBAAqB,EAAE,CAAC;AACxB,QAAA,qBAAqB,EAAE;KACxB,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE;AAC9B;AAAC;AAEK,SAAU,mBAAmB,CAAC,EAAU,EAAA;AAC5C,IAAA,OAAO,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;AACpC;AAAC;SAEe,gBAAgB,GAAA;AAC9B,IAAA,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ;AACrC,IAAA,OAAO,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;AAC5F;AAAC;;;;"}