the-foxy-library 1.2.0 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/app-globals-DMja435B.js.map +1 -1
- package/dist/cjs/intravenous.cjs.js +1 -1
- package/dist/cjs/iv-dynamic-products-carousel.cjs.entry.js +3 -3
- package/dist/cjs/iv-dynamic-products-carousel.entry.cjs.js.map +1 -1
- package/dist/cjs/iv-pill.cjs.entry.js +5 -4
- package/dist/cjs/iv-pill.entry.cjs.js.map +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/collection/components/iv-dynamic-products-carousel/iv-dynamic-products-carousel.js +5 -5
- package/dist/collection/components/iv-dynamic-products-carousel/iv-dynamic-products-carousel.js.map +1 -1
- package/dist/collection/components/iv-newsletter/iv-newsletter.js +2 -2
- package/dist/collection/components/iv-pill/iv-pill.css +2 -0
- package/dist/collection/components/iv-pill/iv-pill.js +4 -3
- package/dist/collection/components/iv-pill/iv-pill.js.map +1 -1
- package/dist/components/index.js.map +1 -1
- package/dist/components/iv-dynamic-products-carousel.js +4 -4
- package/dist/components/iv-dynamic-products-carousel.js.map +1 -1
- package/dist/components/iv-pill.js +5 -4
- package/dist/components/iv-pill.js.map +1 -1
- package/dist/esm/app-globals-vUQfdhxo.js.map +1 -1
- package/dist/esm/intravenous.js +1 -1
- package/dist/esm/iv-dynamic-products-carousel.entry.js +3 -3
- package/dist/esm/iv-dynamic-products-carousel.entry.js.map +1 -1
- package/dist/esm/iv-pill.entry.js +5 -4
- package/dist/esm/iv-pill.entry.js.map +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/intravenous/intravenous.esm.js +1 -1
- package/dist/intravenous/iv-dynamic-products-carousel.entry.esm.js.map +1 -1
- package/dist/intravenous/iv-pill.entry.esm.js.map +1 -1
- package/dist/intravenous/p-003e4edf.entry.js +2 -0
- package/dist/intravenous/{p-33ad5791.entry.js.map → p-003e4edf.entry.js.map} +1 -1
- package/dist/intravenous/p-DFXVdw7Z.js.map +1 -1
- package/dist/intravenous/{p-a5620fb5.entry.js → p-f13e0eaa.entry.js} +2 -2
- package/dist/intravenous/{p-a5620fb5.entry.js.map → p-f13e0eaa.entry.js.map} +1 -1
- package/dist/types/components/iv-dynamic-products-carousel/iv-dynamic-products-carousel.d.ts +1 -1
- package/dist/types/components.d.ts +2 -2
- package/package.json +1 -1
- package/dist/intravenous/p-33ad5791.entry.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-globals-DMja435B.js","sources":["@stencil/core/internal/app-globals"],"sourcesContent":["import appGlobalScript from 'C:/Users/bbuxt/OneDrive/Documents/Development/Freelance/
|
|
1
|
+
{"version":3,"file":"app-globals-DMja435B.js","sources":["@stencil/core/internal/app-globals"],"sourcesContent":["import appGlobalScript from 'C:/Users/bbuxt/OneDrive/Documents/Development/Freelance/The-Foxy-Library/src/global/app.ts';\nexport const globalScripts = appGlobalScript;\nexport const globalStyles = \"\";\n"],"names":["appGlobalScript"],"mappings":";;;;AACY,MAAC,aAAa,GAAGA;;;;"}
|
|
@@ -19,7 +19,7 @@ var patchBrowser = () => {
|
|
|
19
19
|
|
|
20
20
|
patchBrowser().then(async (options) => {
|
|
21
21
|
await appGlobals.globalScripts();
|
|
22
|
-
return index.bootstrapLazy([["iv-dynamic-products.cjs",[[256,"iv-dynamic-products",{"type":[1],"limit":[2],"reversed":[4],"componenttitle":[1],"titletag":[1],"collectionhandle":[1],"carousel":[4],"requestedfields":[1],"calltoaction":[4],"buttontext":[1],"addtocarttext":[1],"emptystring":[1],"gridlayout":[1],"cachettl":[2],"stale":[4],"products":[32],"errorMsg":[32],"staleData":[32]},null,{"type":["handlePropChange"],"limit":["handlePropChange"],"collectionhandle":["handlePropChange"],"requestedfields":["handlePropChange"]}]]],["iv-suggest.cjs",[[256,"iv-suggest",{"topqueries":[1],"collections":[1],"products":[1],"banner":[1],"bannerurl":[1],"bannertitle":[1],"bannertitletag":[1],"bannerbuttontext":[1],"topquerytitle":[1],"productstitle":[1],"collectionstitle":[1],"gridlayout":[1],"requestfields":[1]}]]],["iv-dynamic-products-carousel.cjs",[[256,"iv-dynamic-products-carousel",{"type":[1],"limit":[2],"reversed":[4],"componenttitle":[1],"titletag":[1],"collectionhandle":[1],"requestedfields":[1],"calltoaction":[4],"buttontext":[1],"addtocarttext":[1],"emptystring":[1],"cachettl":[2],"stale":[4],"
|
|
22
|
+
return index.bootstrapLazy([["iv-dynamic-products.cjs",[[256,"iv-dynamic-products",{"type":[1],"limit":[2],"reversed":[4],"componenttitle":[1],"titletag":[1],"collectionhandle":[1],"carousel":[4],"requestedfields":[1],"calltoaction":[4],"buttontext":[1],"addtocarttext":[1],"emptystring":[1],"gridlayout":[1],"cachettl":[2],"stale":[4],"products":[32],"errorMsg":[32],"staleData":[32]},null,{"type":["handlePropChange"],"limit":["handlePropChange"],"collectionhandle":["handlePropChange"],"requestedfields":["handlePropChange"]}]]],["iv-suggest.cjs",[[256,"iv-suggest",{"topqueries":[1],"collections":[1],"products":[1],"banner":[1],"bannerurl":[1],"bannertitle":[1],"bannertitletag":[1],"bannerbuttontext":[1],"topquerytitle":[1],"productstitle":[1],"collectionstitle":[1],"gridlayout":[1],"requestfields":[1]}]]],["iv-dynamic-products-carousel.cjs",[[256,"iv-dynamic-products-carousel",{"type":[1],"limit":[2],"reversed":[4],"componenttitle":[1],"titletag":[1],"collectionhandle":[1],"requestedfields":[1],"calltoaction":[4],"buttontext":[1],"addtocarttext":[1],"emptystring":[1],"cachettl":[2],"stale":[4],"exclude":[1],"products":[32],"errorMsg":[32],"staleData":[32],"page":[32]},null,{"type":["handlePropChange"],"limit":["handlePropChange"],"collectionhandle":["handlePropChange"],"requestedfields":["handlePropChange"]}]]],["iv-predictive-search.cjs",[[256,"iv-predictive-search",{"searchlabel":[1],"labelposition":[1],"action":[1],"placeholder":[1],"minchars":[2],"resultslimit":[2],"showspinner":[4],"noresultstext":[1],"requestedfields":[1],"requestedresources":[1],"showallbuttontext":[1],"querybuttontext":[1],"clearbutton":[1],"expandable":[4],"tablayout":[1],"gridlayout":[1],"searchTerm":[32],"searchReturnData":[32],"noResults":[32]}]]],["iv-recently-viewed.cjs",[[256,"iv-recently-viewed",{"componenttitle":[1],"titletag":[1],"numbertoshow":[2],"noviewhistory":[1],"requestedfields":[1],"items":[32]}]]],["iv-link-list.cjs",[[256,"iv-link-list",{"linktype":[1],"showicons":[4],"links":[1],"layout":[1]}]]],["iv-shop-the-look.cjs",[[260,"iv-shop-the-look",{"behaviour":[1],"coordinates":[1],"producthandles":[1]}]]],["iv-toast-container.cjs",[[256,"iv-toast-container",{"_bump":[32]}]]],["iv-wishlist.cjs",[[256,"iv-wishlist",{"buttonaddvalue":[1],"buttonremovevalue":[1],"wishlistempty":[1],"buttonaddtocartvalue":[1],"viewwishlistvalue":[1],"productdata":[1],"usefields":[1],"previewtype":[1]}]]],["iv-carousel.cjs",[[260,"iv-carousel",{"navarrows":[4],"navdots":[4],"showslidecount":[4],"autoplay":[4],"autoplayspeed":[2],"valign":[1],"halign":[1],"hasoverlay":[4],"currentIndex":[32],"items":[32]}]]],["iv-compare-product.cjs",[[256,"iv-compare-product"]]],["iv-filters.cjs",[[256,"iv-filters"]]],["iv-footer.cjs",[[260,"iv-footer",{"gridtemplateareas":[1],"footerbackground":[1],"blockElements":[32]}]]],["iv-pill.cjs",[[256,"iv-pill",{"label":[1],"content":[1],"bordered":[4],"internalspacing":[1],"externalspacing":[1],"roundedcorners":[1]}]]],["iv-product-upsell.cjs",[[257,"iv-product-upsell"]]],["iv-two-col-media.cjs",[[260,"iv-two-col-media",{"mobilebehaviour":[1],"whichcolumn":[1],"stackorder":[1],"verticalalign":[1],"horizontalalign":[1],"gap":[1],"hasMediaCol1":[32],"hasMediaCol2":[32]}]]],["sw-in-grid-content.cjs",[[260,"sw-in-grid-content"]]],["sw-size-guide.cjs",[[260,"sw-size-guide",{"sizeUnits":[32]}]]],["iv-banner.cjs",[[260,"iv-banner",{"classmodifier":[1],"bannerurl":[1],"bannerbuttontext":[1],"bannertype":[1]}]]],["iv-product-pin.cjs",[[256,"iv-product-pin",{"pinProduct":[1,"pin-product"],"pinKey":[2,"pin-key"],"pinCords":[16],"pinBehaviour":[1,"pin-behaviour"]}]]],["iv-tabs.cjs",[[260,"iv-tabs",{"labels":[16],"classModifier":[1,"class-modifier"],"tabLayout":[1,"tab-layout"],"activeTab":[32]}]]],["iv-toast.cjs",[[256,"iv-toast",{"message":[1],"toastId":[2,"toast-id"],"duration":[2],"type":[1]}]]],["ion-icon_9.cjs",[[257,"iv-modal",{"newsletterpopuptrigger":[1],"newsletterpopuptimedelay":[2],"modalState":[32],"contentName":[32]},[[4,"openModal","handleOpenModal"]]],[260,"iv-sidebar",{"newsletterpopuptrigger":[1],"newsletterpopuptimedelay":[2],"sidebarState":[32],"contentName":[32]},[[4,"openSidebar","handleopenSidebar"]]],[260,"iv-accordion",{"labels":[1],"allowmultiple":[4],"startopen":[4],"acordionlayout":[1],"contentplacement":[1],"dropdownicon":[1],"openPanels":[32]}],[256,"iv-newsletter",{"formimageurl":[1],"formimageposition":[1],"formimageheight":[1],"formsubmitbtntext":[1],"formsuccessmessage":[1],"formfailuremessage":[1],"formplaceholdertext":[1],"formlabeltext":[1],"formstackbutton":[4],"formtitletag":[1],"formtitletext":[1],"formdescriptiontext":[1],"includeloadingspinner":[4],"newsletterpopupdisclaimer":[1],"classmodifier":[1],"email":[32],"formFeedback":[32],"status":[32]}],[260,"iv-event-button",{"eventname":[1],"eventdetail":[8],"buttontext":[1]}],[256,"iv-wishlist-view"],[257,"ion-icon",{"mode":[1025],"color":[1],"ios":[1],"md":[1],"flipRtl":[4,"flip-rtl"],"name":[513],"src":[1],"icon":[8],"size":[1],"lazy":[4],"sanitize":[4],"svgContent":[32],"isVisible":[32]},null,{"name":["loadIcon"],"src":["loadIcon"],"icon":["loadIcon"],"ios":["loadIcon"],"md":["loadIcon"]}],[256,"iv-spinner",{"show":[4]}],[260,"iv-button",{"type":[1],"classmodifier":[1],"eventname":[1],"eventdetail":[1],"buttonClick":[16]}]]],["iv-card_3.cjs",[[256,"iv-card",{"data":[16],"fields":[1],"cardtype":[1],"classmodifier":[1],"buttontext":[1],"calltoaction":[4],"addtocarttext":[1]}],[260,"iv-layout",{"sectionId":[1,"section-id"],"gridTemplateAreas":[1,"grid-template-areas"],"gap":[1],"verticalAlign":[1,"vertical-align"],"horizontalAlign":[1,"horizontal-align"],"wrapperTag":[1,"wrapper-tag"],"classModifier":[1,"class-modifier"]}],[260,"iv-link",{"classmodifier":[1],"linktype":[1],"linkhref":[1],"linktarget":[1],"linkrel":[1],"linkariaLabel":[1,"linkaria-label"]}]]]], options);
|
|
23
23
|
});
|
|
24
24
|
|
|
25
25
|
exports.setNonce = index.setNonce;
|
|
@@ -159,7 +159,7 @@ const IvDynamicProductsCarousel = class {
|
|
|
159
159
|
emptystring = 'No products found';
|
|
160
160
|
cachettl;
|
|
161
161
|
stale = true;
|
|
162
|
-
|
|
162
|
+
exclude;
|
|
163
163
|
products = [];
|
|
164
164
|
errorMsg;
|
|
165
165
|
staleData = false;
|
|
@@ -192,12 +192,12 @@ const IvDynamicProductsCarousel = class {
|
|
|
192
192
|
}
|
|
193
193
|
;
|
|
194
194
|
filterAndSliceProducts(data) {
|
|
195
|
-
if (!this.
|
|
195
|
+
if (!this.exclude)
|
|
196
196
|
return data.slice(0, this.limit);
|
|
197
197
|
if (!this.requestedfields || !this.requestedfields.includes('productType')) {
|
|
198
198
|
this.requestedfields = this.ensureProductTypeField(this.requestedfields);
|
|
199
199
|
}
|
|
200
|
-
const filtered = data.filter(p => p.productType !== this.
|
|
200
|
+
const filtered = data.filter(p => p.productType !== this.exclude);
|
|
201
201
|
return filtered.slice(0, this.limit);
|
|
202
202
|
}
|
|
203
203
|
;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iv-dynamic-products-carousel.entry.cjs.js","sources":["src/utils/storefront_api/queries.ts","src/utils/storefront_api/normalize.ts","src/utils/storefront_api/methods.ts","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":["export function getIdFromHandleQuery(): string {\r\n return `\r\n query ($handle: String!) {\r\n product(handle: $handle) {\r\n id\r\n }\r\n }`;\r\n};\r\n\r\nexport function buildProductsQuery(fieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($limit: Int!, $sortKey: ProductSortKeys!, $reverse: Boolean) {\r\n products(first: $limit, sortKey: $sortKey, reverse: $reverse) {\r\n edges {\r\n node {\r\n ${fieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }\r\n }\r\n }`;\r\n};\r\n\r\nexport function buildCollectionProductsQuery(fieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($handle: String!, $limit: Int!, $sortKey: ProductCollectionSortKeys!, $reverse: Boolean) {\r\n collection(handle: $handle) {\r\n products(first: $limit, sortKey: $sortKey, reverse: $reverse) {\r\n edges {\r\n node {\r\n ${fieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }\r\n }\r\n }\r\n }`;\r\n};\r\n\r\nexport function buildSingleProductQuery(fieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($id: ID!) {\r\n product(id: $id) {\r\n ${fieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }`;\r\n};\r\n\r\nexport function buildVariantProductQuery(productFieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($id: ID!) {\r\n productVariant(id: $id) {\r\n ${variantFieldsString}\r\n product {\r\n ${productFieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }\r\n }`;\r\n};\r\n\r\n// Change this to emit an event that the toast component can listen for\r\n// getProductByHandle\r\n// getProducts\r\n// getCollections (with sorting)\r\n// getMetafield\r\n// getMetafields","export interface NormalizedProduct {\r\n id: string;\r\n handle?: string;\r\n title?: string;\r\n variantId?: string;\r\n price?: string | null;\r\n imageUrl?: string | null;\r\n imageAlt?: string | null;\r\n [key: string]: any;\r\n};\r\n\r\nexport function normalizeProduct(product: any, selectedVariant?: any): NormalizedProduct {\r\n const variant = selectedVariant || product.variants?.edges?.[0]?.node || {};\r\n let imageUrl = null;\r\n let imageAlt = null;\r\n if(product.images?.nodes && product.images.nodes.length > 0) {\r\n imageUrl = product.images.nodes[0].url || null;\r\n imageAlt = product.images.nodes[0].altText || null;\r\n };\r\n const { id: variantId, price } = variant;\r\n return {\r\n id: product.id,\r\n ...Object.fromEntries(Object.entries(product).filter(([key]) => key !== 'variants')),\r\n variantId,\r\n price: price?.amount || null,\r\n imageUrl,\r\n imageAlt,\r\n };\r\n};","import { apiConfig } from './config';\r\nimport { createErrorHandler } from '../../utils/error_handling/factory';\r\nimport { getIdFromHandleQuery, buildProductsQuery, buildSingleProductQuery, buildVariantProductQuery, buildCollectionProductsQuery } from './queries';\r\nimport { normalizeProduct, NormalizedProduct } from './normalize';\r\n\r\nconst BASE_PRODUCT_FIELDS = ['id','handle','title'];\r\nconst DEFAULT_VARIANT_FIELDS = ['id','title','price { amount currencyCode }'];\r\nconst errors = createErrorHandler({ component: 'storefront-api-module-config' });\r\n\r\nexport async function shopifyFetch(query: string, variables: Record<string, any> = {}): Promise<any> { \r\n try {\r\n if(!apiConfig.isConnected()) throw new Error('Shopify config not connected');\r\n const res = await fetch(apiConfig.endpoint, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-Shopify-Storefront-Access-Token': apiConfig.token\r\n },\r\n body: JSON.stringify({ query, variables })\r\n });\r\n const json = await res.json();\r\n if(json.errors) throw new Error(json.errors.map((e: any) => e.message).join(', '));\r\n return json.data;\r\n } catch(err: any) {\r\n errors.handle({\r\n error: err,\r\n scope: 'loadProducts',\r\n userMessage: 'Unable to load products right now.',\r\n devMessage: 'fetchProducts failed in iv-dynamic-products',\r\n severity: 'error'\r\n });\r\n return null;\r\n };\r\n};\r\n\r\nexport async function getIdFromHandle(handle: string): Promise<string | null> {\r\n try {\r\n const query = getIdFromHandleQuery();\r\n const data = await shopifyFetch(query, { handle });\r\n const id = data?.product?.id;\r\n if(!id) throw new Error('No product found for given handle');\r\n return id;\r\n } catch (err: any) {\r\n errors.handle({\r\n error: err,\r\n scope: 'getIdFromHandle',\r\n userMessage: 'Unable to get product ID from handle right now.',\r\n devMessage: 'getIdFromHandle failed in iv-dynamic-products',\r\n severity: 'error'\r\n });\r\n return null;\r\n };\r\n};\r\n\r\nfunction mergeFields(requested: string[] | string, defaults: string[]): string[] {\r\n const req = (Array.isArray(requested) ? requested : requested.split(','))\r\n .map(f => f.trim())\r\n .filter(Boolean);\r\n const seen = new Set<string>();\r\n const ordered: string[] = [];\r\n for(const f of req) { \r\n if(!seen.has(f)) seen.add(f); ordered.push(f); \r\n };\r\n for(const d of defaults) { \r\n if(!seen.has(d)) { \r\n seen.add(d); \r\n ordered.push(d); \r\n }; \r\n };\r\n return ordered;\r\n};\r\n\r\nfunction expandProductFields(fields: string[]): string {\r\n return fields\r\n .filter(f => f !== 'price')\r\n .map(f => {\r\n if(f === 'images') return 'images(first: 10) { nodes { url altText } }';\r\n return f;\r\n })\r\n .join('\\n');\r\n};\r\n\r\nfunction variantSelection(fields: string[] = DEFAULT_VARIANT_FIELDS): string {\r\n return fields.join('\\n');\r\n};\r\n\r\nexport async function fetchProducts(\r\n limit: number, \r\n collectionHandle: string, \r\n sortKey: string, \r\n fields: string[] | string, \r\n reversed: boolean = false) {\r\n try {\r\n const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);\r\n const fieldsString = expandProductFields(merged);\r\n const variantFieldsString = variantSelection();\r\n const isAll = !collectionHandle || collectionHandle === 'all';\r\n const query = isAll ? buildProductsQuery(fieldsString, variantFieldsString) : buildCollectionProductsQuery(fieldsString, variantFieldsString);\r\n const reverse = !!reversed;\r\n const variables: Record<string, any> = isAll ? { limit, sortKey, reverse } : { handle: collectionHandle, limit, sortKey, reverse };\r\n const data = await shopifyFetch(query, variables);\r\n const productEdges = data.products?.edges || data.collection?.products?.edges || [];\r\n return productEdges.map((edge: any) => normalizeProduct(edge.node));\r\n } catch(error) { \r\n console.error('Fetch Products Error:', error); throw error;\r\n };\r\n};\r\n\r\nexport async function fetchProductByID(id: string, fields: string[] | string, options?: { variantId?: string }): Promise<NormalizedProduct | null> {\r\n try {\r\n if(options?.variantId) return await getVariantProduct(options.variantId, fields);\r\n const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);\r\n const fieldsString = expandProductFields(merged);\r\n const variantFieldsString = variantSelection();\r\n const query = buildSingleProductQuery(fieldsString, variantFieldsString);\r\n const data = await shopifyFetch(query, { id });\r\n const product = data?.product;\r\n if(!product) return null;\r\n return normalizeProduct(product);\r\n } catch(error) { \r\n console.error('Fetch Product By ID Error:', error); throw error; \r\n };\r\n};\r\n\r\nexport async function getVariantProduct(variantId: string, fields: string[] | string): Promise<NormalizedProduct | null> {\r\n try {\r\n const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);\r\n const productFieldsString = expandProductFields(merged);\r\n const variantFieldsString = variantSelection();\r\n const query = buildVariantProductQuery(productFieldsString, variantFieldsString);\r\n const data = await shopifyFetch(query, { id: variantId });\r\n const variantNode = data?.productVariant;\r\n if(!variantNode) return null;\r\n const product = variantNode.product;\r\n if(!product) return null;\r\n return normalizeProduct(product, variantNode); \r\n } catch(error) { \r\n console.error('Get Variant Product Error:', error); throw error; \r\n };\r\n};",":host {\r\n display: block;\r\n}\r\n\r\n.iv-dynamic-products-carousel { \r\n position:relative;\r\n}\r\n\r\n.iv-dynamic-products-carousel-carousel { \r\n position:relative;\r\n}\r\n\r\n.iv-dynamic-products-carousel-viewport { \r\n overflow:hidden; \r\n width:100%;\r\n}\r\n\r\n.iv-dynamic-products-carousel-track { \r\n display:flex; \r\n width:100%; \r\n transition: \r\n transform .55s cubic-bezier(.4,.7,.2,1); \r\n will-change:transform;\r\n}\r\n\r\n.iv-dynamic-products-carousel-slide { \r\n flex:0 0 100%; \r\n box-sizing:border-box; \r\n padding:0.25rem 0.5rem; \r\n display:grid; \r\n grid-template-columns:repeat(6, minmax(0,1fr)); \r\n gap:1rem; \r\n align-items:stretch; \r\n grid-auto-rows:1fr; \r\n}\r\n\r\n@media (max-width: 1200px) { \r\n .iv-dynamic-products-carousel-slide { \r\n grid-template-columns:repeat(4, minmax(0,1fr)); \r\n } \r\n}\r\n\r\n@media (max-width: 900px) { \r\n .iv-dynamic-products-carousel-slide { \r\n grid-template-columns:repeat(3, minmax(0,1fr)); \r\n } \r\n}\r\n\r\n@media (max-width: 640px) { \r\n .iv-dynamic-products-carousel-slide { \r\n grid-template-columns:repeat(2, minmax(0,1fr)); \r\n gap:0.75rem; \r\n } \r\n}\r\n\r\n.iv-dynamic-products-carousel-card { \r\n height:100%; \r\n display:flex; \r\n flex-direction:column; \r\n background:#fff; \r\n padding:0.75rem 0.75rem 0.9rem; \r\n box-shadow:0 2px 6px rgba(0,0,0,.08); \r\n transition:box-shadow .2s ease, transform .2s ease; \r\n}\r\n\r\n/* Alignment fix: reserve consistent height for titles (2 lines) and anchor controls at bottom */\r\n.iv-dynamic-products-carousel-card .iv-card-title {\r\n line-height:1.2;\r\n display:-webkit-box;\r\n -webkit-box-orient:vertical;\r\n -webkit-line-clamp:2;\r\n line-clamp:2;\r\n overflow:hidden;\r\n min-height:calc(2 * 1.2em);\r\n}\r\n\r\n.iv-dynamic-products-carousel-card .iv-card-controls {\r\n margin-top:auto; /* push controls to bottom of flex column for uniform vertical alignment */\r\n}\r\n\r\n.iv-dynamic-products-carousel-card:hover { \r\n box-shadow:0 4px 14px rgba(0,0,0,.15); \r\n transform:translateY(-2px); \r\n}\r\n\r\n.iv-dynamic-products-carousel-card:active { \r\n transform:translateY(0); \r\n box-shadow:0 2px 6px rgba(0,0,0,.12); \r\n}\r\n\r\n.iv-dynamic-products-carousel-card img, \r\n.iv-dynamic-products-carousel-card picture, \r\n.iv-dynamic-products-carousel-card .media { \r\n width:100%; \r\n aspect-ratio:1/1; \r\n object-fit:contain; \r\n display:flex; \r\n align-items:center; \r\n justify-content:center; \r\n margin:0 0 .65rem; \r\n}\r\n\r\n.iv-dynamic-products-carousel-nav { \r\n position:absolute; \r\n top:50%; \r\n transform:translateY(-50%); \r\n background:var(--iv-carousel-nav-bg, rgba(0,0,0,.55)); \r\n color:#fff; \r\n border:none; \r\n width:2.75rem; \r\n height:2.75rem; \r\n border-radius:50%; \r\n display:flex; \r\n align-items:center; \r\n justify-content:center; \r\n cursor:pointer; \r\n backdrop-filter:blur(6px); \r\n box-shadow:0 4px 12px rgba(0,0,0,.25); \r\n transition:background .2s ease, \r\n transform .2s ease; \r\n outline:none;\r\n z-index: 10;\r\n }\r\n\r\n.iv-dynamic-products-carousel-nav:focus-visible { \r\n outline:2px solid #fff; \r\n outline-offset:3px; \r\n}\r\n\r\n.iv-dynamic-products-carousel-nav:hover:not(:disabled){\r\n background:var(--iv-carousel-nav-bg-hover, rgba(0,0,0,.75)); \r\n transform:translateY(-50%) scale(1.05); \r\n box-shadow:0 6px 18px rgba(0,0,0,.35);\r\n}\r\n\r\n.iv-dynamic-products-carousel-nav:disabled{ \r\n opacity:.4; cursor:default; \r\n}\r\n\r\n.iv-dynamic-products-carousel-nav-prev { \r\n left:0.25rem; \r\n}\r\n\r\n.iv-dynamic-products-carousel-nav-next { \r\n right:0.25rem; \r\n}\r\n\r\n.iv-dynamic-products-carousel-status { \r\n margin-top:0.75rem; \r\n font-size:0.875rem; \r\n text-align:center; \r\n color:var(--iv-carousel-status-color, #555); \r\n}\r\n\r\n.iv-dynamic-products-carousel-viewport::-webkit-scrollbar { \r\n display:none; \r\n}\r\n\r\n.iv-dynamic-products-carousel-viewport { \r\n -ms-overflow-style:none; \r\n scrollbar-width:none; \r\n}","// Refactor this to use the iv-carousel component\r\n\r\nimport { Component, h, Prop, State, Watch } from '@stencil/core';\r\nimport { state } from '../../utils/store/store';\r\nimport { fetchProducts } from '../../utils/storefront_api';\r\nimport { productCache } from '../../utils/caching/productCache';\r\nimport { createErrorHandler } from '../../utils/error_handling/factory';\r\n\r\nconst BLOCK = 'iv-dynamic-products-carousel';\r\n\r\n@Component({\r\n tag: 'iv-dynamic-products-carousel',\r\n styleUrl: 'iv-dynamic-products-carousel.scss',\r\n shadow: false\r\n})\r\n\r\nexport class IvDynamicProductsCarousel {\r\n @Prop() type: 'CREATED' | 'CREATED_AT' | 'BEST_SELLING' | 'PRICE' | 'TITLE' | 'RELEVANCE' = 'CREATED_AT'; \r\n @Prop() limit: number = 24;\r\n @Prop() reversed: boolean = false; \r\n @Prop() componenttitle?: string;\r\n @Prop() titletag: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' = 'h2';\r\n @Prop() collectionhandle: string = 'all';\r\n @Prop() requestedfields: string;\r\n @Prop() calltoaction: boolean = false;\r\n @Prop() buttontext?: string;\r\n @Prop() addtocarttext?: string;\r\n @Prop() emptystring: string = 'No products found';\r\n @Prop() cachettl?: number; \r\n @Prop() stale?: boolean = true;\r\n @Prop() excluse?: string;\r\n \r\n @State() products: any[] = [];\r\n @State() errorMsg: string; \r\n @State() staleData: boolean = false;\r\n @State() page: number = 0; \r\n\r\n private readonly itemsPerPage = 6;\r\n\r\n private errors = createErrorHandler({ component: 'iv-dynamic-products-carousel' });\r\n\r\n @Watch('type')\r\n @Watch('limit')\r\n @Watch('collectionhandle')\r\n @Watch('requestedfields')\r\n handlePropChange() { this.loadProducts(true); }\r\n\r\n async componentWillLoad() { \r\n await this.loadProducts(false); \r\n };\r\n \r\n private buildParams() {\r\n return {\r\n handle: this.collectionhandle,\r\n sort: this.type,\r\n fields: this.requestedfields,\r\n limit: 36, // Always fetch 36 products for filtering\r\n currency: state.currencyCode,\r\n reversed: this.reversed\r\n };\r\n };\r\n\r\n private ensureProductTypeField(fields: string): string {\r\n if(!fields) return 'productType';\r\n const arr = fields.split(',').map(f => f.trim());\r\n if(!arr.includes('productType')) arr.push('productType');\r\n return arr.join(',');\r\n };\r\n\r\n private filterAndSliceProducts(data: any[]): any[] {\r\n if(!this.excluse) return data.slice(0, this.limit);\r\n if(!this.requestedfields || !this.requestedfields.includes('productType')) {\r\n this.requestedfields = this.ensureProductTypeField(this.requestedfields);\r\n };\r\n const filtered = data.filter(p => p.productType !== this.excluse);\r\n return filtered.slice(0, this.limit);\r\n };\r\n\r\n private async loadProducts(fromWatch: boolean) {\r\n const params = this.buildParams();\r\n const ttl = this.cachettl || 1000 * 60 * 5;\r\n state.loading = !fromWatch;\r\n try {\r\n const data = await productCache.getOrSetData(\r\n params,\r\n async () => {\r\n const fresh = await fetchProducts(\r\n 36, \r\n this.collectionhandle, \r\n this.type, \r\n this.requestedfields, \r\n this.reversed\r\n );\r\n return fresh;\r\n },\r\n {\r\n ttl,\r\n staleWhileRevalidate: this.stale,\r\n transform: (fresh) => fresh \r\n }\r\n );\r\n const metaCheck = productCache.getData<typeof data>(params);\r\n this.staleData = metaCheck.isExpired && metaCheck.isStale;\r\n this.products = Array.isArray(data) ? this.filterAndSliceProducts(data) : [];\r\n this.page = 0;\r\n } catch (err: any) {\r\n this.errorMsg = 'Failed to load products';\r\n this.errors.handle({\r\n error: err,\r\n scope: 'loadProducts',\r\n userMessage: 'Unable to load products right now.',\r\n devMessage: 'fetchProducts failed in iv-dynamic-products',\r\n severity: 'error'\r\n });\r\n } finally {\r\n state.loading = false;\r\n };\r\n };\r\n \r\n private pagedProducts() {\r\n const chunks: any[][] = [];\r\n for(let i=0; i < this.products.length; i += this.itemsPerPage) {\r\n chunks.push(this.products.slice(i, i + this.itemsPerPage));\r\n };\r\n return chunks;\r\n };\r\n\r\n private next = () => { \r\n const pages = this.pagedProducts().length;\r\n if(this.page < pages - 1) this.page++;\r\n };\r\n\r\n private prev = () => { \r\n if(this.page > 0) this.page--;\r\n };\r\n\r\n render() {\r\n\r\n const TAG = this.titletag as any;\r\n\r\n return (\r\n <div class={BLOCK} data-stale={this.staleData ? 'true' : 'false'}>\r\n {this.componenttitle && <TAG class={`${BLOCK}-title`}>{this.componenttitle}</TAG>}\r\n {state.loading ? (\r\n <iv-spinner></iv-spinner>\r\n ) : this.errorMsg ? (\r\n <div class={`${BLOCK}-error`}>{this.errorMsg}</div>\r\n ) : this.products.length === 0 ? (\r\n <div class={`${BLOCK}-empty`}>{this.emptystring}</div>\r\n ) : (\r\n <div class={`${BLOCK}-carousel`} aria-roledescription=\"carousel\">\r\n <button class={`${BLOCK}-nav ${BLOCK}-nav-prev`} onClick={this.prev} disabled={this.page===0} aria-label=\"Previous\" type=\"button\">\r\n ‹\r\n </button>\r\n <div class={`${BLOCK}-viewport`}>\r\n <div class={`${BLOCK}-track`} style={{ transform: `translateX(-${this.page * 100}%)` }}>\r\n {this.pagedProducts().map((group, i) => (\r\n <div class={`${BLOCK}-slide`} role=\"group\" aria-label={`Slide ${i+1} of ${this.pagedProducts().length}`}> \r\n {group.map(product => (\r\n <iv-card\r\n cardtype='products'\r\n calltoaction={this.calltoaction}\r\n buttontext={this.buttontext}\r\n addtocarttext={this.addtocarttext}\r\n data={product}\r\n classmodifier={`${BLOCK}-card`} />\r\n ))}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n <button class={`${BLOCK}-nav ${BLOCK}-nav-next`} onClick={this.next} disabled={this.page===this.pagedProducts().length-1} aria-label=\"Next\" type=\"button\">\r\n ›\r\n </button>\r\n <div class={`${BLOCK}-status`} aria-live=\"polite\">{this.pagedProducts().length > 1 ? `Slide ${this.page+1} of ${this.pagedProducts().length}` : ''}</div>\r\n {this.staleData && (\r\n <div class={`${BLOCK}-stale-indicator`} aria-live=\"polite\">Refreshing…</div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n };\r\n\r\n};"],"names":["createErrorHandler","apiConfig","state","productCache","h"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"iv-dynamic-products-carousel.entry.cjs.js","sources":["src/utils/storefront_api/queries.ts","src/utils/storefront_api/normalize.ts","src/utils/storefront_api/methods.ts","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":["export function getIdFromHandleQuery(): string {\r\n return `\r\n query ($handle: String!) {\r\n product(handle: $handle) {\r\n id\r\n }\r\n }`;\r\n};\r\n\r\nexport function buildProductsQuery(fieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($limit: Int!, $sortKey: ProductSortKeys!, $reverse: Boolean) {\r\n products(first: $limit, sortKey: $sortKey, reverse: $reverse) {\r\n edges {\r\n node {\r\n ${fieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }\r\n }\r\n }`;\r\n};\r\n\r\nexport function buildCollectionProductsQuery(fieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($handle: String!, $limit: Int!, $sortKey: ProductCollectionSortKeys!, $reverse: Boolean) {\r\n collection(handle: $handle) {\r\n products(first: $limit, sortKey: $sortKey, reverse: $reverse) {\r\n edges {\r\n node {\r\n ${fieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }\r\n }\r\n }\r\n }`;\r\n};\r\n\r\nexport function buildSingleProductQuery(fieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($id: ID!) {\r\n product(id: $id) {\r\n ${fieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }`;\r\n};\r\n\r\nexport function buildVariantProductQuery(productFieldsString: string, variantFieldsString: string) {\r\n return `\r\n query ($id: ID!) {\r\n productVariant(id: $id) {\r\n ${variantFieldsString}\r\n product {\r\n ${productFieldsString}\r\n variants(first: 1) { edges { node { ${variantFieldsString} } } }\r\n }\r\n }\r\n }`;\r\n};\r\n\r\n// Change this to emit an event that the toast component can listen for\r\n// getProductByHandle\r\n// getProducts\r\n// getCollections (with sorting)\r\n// getMetafield\r\n// getMetafields","export interface NormalizedProduct {\r\n id: string;\r\n handle?: string;\r\n title?: string;\r\n variantId?: string;\r\n price?: string | null;\r\n imageUrl?: string | null;\r\n imageAlt?: string | null;\r\n [key: string]: any;\r\n};\r\n\r\nexport function normalizeProduct(product: any, selectedVariant?: any): NormalizedProduct {\r\n const variant = selectedVariant || product.variants?.edges?.[0]?.node || {};\r\n let imageUrl = null;\r\n let imageAlt = null;\r\n if(product.images?.nodes && product.images.nodes.length > 0) {\r\n imageUrl = product.images.nodes[0].url || null;\r\n imageAlt = product.images.nodes[0].altText || null;\r\n };\r\n const { id: variantId, price } = variant;\r\n return {\r\n id: product.id,\r\n ...Object.fromEntries(Object.entries(product).filter(([key]) => key !== 'variants')),\r\n variantId,\r\n price: price?.amount || null,\r\n imageUrl,\r\n imageAlt,\r\n };\r\n};","import { apiConfig } from './config';\r\nimport { createErrorHandler } from '../../utils/error_handling/factory';\r\nimport { getIdFromHandleQuery, buildProductsQuery, buildSingleProductQuery, buildVariantProductQuery, buildCollectionProductsQuery } from './queries';\r\nimport { normalizeProduct, NormalizedProduct } from './normalize';\r\n\r\nconst BASE_PRODUCT_FIELDS = ['id','handle','title'];\r\nconst DEFAULT_VARIANT_FIELDS = ['id','title','price { amount currencyCode }'];\r\nconst errors = createErrorHandler({ component: 'storefront-api-module-config' });\r\n\r\nexport async function shopifyFetch(query: string, variables: Record<string, any> = {}): Promise<any> { \r\n try {\r\n if(!apiConfig.isConnected()) throw new Error('Shopify config not connected');\r\n const res = await fetch(apiConfig.endpoint, {\r\n method: 'POST',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'X-Shopify-Storefront-Access-Token': apiConfig.token\r\n },\r\n body: JSON.stringify({ query, variables })\r\n });\r\n const json = await res.json();\r\n if(json.errors) throw new Error(json.errors.map((e: any) => e.message).join(', '));\r\n return json.data;\r\n } catch(err: any) {\r\n errors.handle({\r\n error: err,\r\n scope: 'loadProducts',\r\n userMessage: 'Unable to load products right now.',\r\n devMessage: 'fetchProducts failed in iv-dynamic-products',\r\n severity: 'error'\r\n });\r\n return null;\r\n };\r\n};\r\n\r\nexport async function getIdFromHandle(handle: string): Promise<string | null> {\r\n try {\r\n const query = getIdFromHandleQuery();\r\n const data = await shopifyFetch(query, { handle });\r\n const id = data?.product?.id;\r\n if(!id) throw new Error('No product found for given handle');\r\n return id;\r\n } catch (err: any) {\r\n errors.handle({\r\n error: err,\r\n scope: 'getIdFromHandle',\r\n userMessage: 'Unable to get product ID from handle right now.',\r\n devMessage: 'getIdFromHandle failed in iv-dynamic-products',\r\n severity: 'error'\r\n });\r\n return null;\r\n };\r\n};\r\n\r\nfunction mergeFields(requested: string[] | string, defaults: string[]): string[] {\r\n const req = (Array.isArray(requested) ? requested : requested.split(','))\r\n .map(f => f.trim())\r\n .filter(Boolean);\r\n const seen = new Set<string>();\r\n const ordered: string[] = [];\r\n for(const f of req) { \r\n if(!seen.has(f)) seen.add(f); ordered.push(f); \r\n };\r\n for(const d of defaults) { \r\n if(!seen.has(d)) { \r\n seen.add(d); \r\n ordered.push(d); \r\n }; \r\n };\r\n return ordered;\r\n};\r\n\r\nfunction expandProductFields(fields: string[]): string {\r\n return fields\r\n .filter(f => f !== 'price')\r\n .map(f => {\r\n if(f === 'images') return 'images(first: 10) { nodes { url altText } }';\r\n return f;\r\n })\r\n .join('\\n');\r\n};\r\n\r\nfunction variantSelection(fields: string[] = DEFAULT_VARIANT_FIELDS): string {\r\n return fields.join('\\n');\r\n};\r\n\r\nexport async function fetchProducts(\r\n limit: number, \r\n collectionHandle: string, \r\n sortKey: string, \r\n fields: string[] | string, \r\n reversed: boolean = false) {\r\n try {\r\n const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);\r\n const fieldsString = expandProductFields(merged);\r\n const variantFieldsString = variantSelection();\r\n const isAll = !collectionHandle || collectionHandle === 'all';\r\n const query = isAll ? buildProductsQuery(fieldsString, variantFieldsString) : buildCollectionProductsQuery(fieldsString, variantFieldsString);\r\n const reverse = !!reversed;\r\n const variables: Record<string, any> = isAll ? { limit, sortKey, reverse } : { handle: collectionHandle, limit, sortKey, reverse };\r\n const data = await shopifyFetch(query, variables);\r\n const productEdges = data.products?.edges || data.collection?.products?.edges || [];\r\n return productEdges.map((edge: any) => normalizeProduct(edge.node));\r\n } catch(error) { \r\n console.error('Fetch Products Error:', error); throw error;\r\n };\r\n};\r\n\r\nexport async function fetchProductByID(id: string, fields: string[] | string, options?: { variantId?: string }): Promise<NormalizedProduct | null> {\r\n try {\r\n if(options?.variantId) return await getVariantProduct(options.variantId, fields);\r\n const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);\r\n const fieldsString = expandProductFields(merged);\r\n const variantFieldsString = variantSelection();\r\n const query = buildSingleProductQuery(fieldsString, variantFieldsString);\r\n const data = await shopifyFetch(query, { id });\r\n const product = data?.product;\r\n if(!product) return null;\r\n return normalizeProduct(product);\r\n } catch(error) { \r\n console.error('Fetch Product By ID Error:', error); throw error; \r\n };\r\n};\r\n\r\nexport async function getVariantProduct(variantId: string, fields: string[] | string): Promise<NormalizedProduct | null> {\r\n try {\r\n const merged = mergeFields(fields, BASE_PRODUCT_FIELDS);\r\n const productFieldsString = expandProductFields(merged);\r\n const variantFieldsString = variantSelection();\r\n const query = buildVariantProductQuery(productFieldsString, variantFieldsString);\r\n const data = await shopifyFetch(query, { id: variantId });\r\n const variantNode = data?.productVariant;\r\n if(!variantNode) return null;\r\n const product = variantNode.product;\r\n if(!product) return null;\r\n return normalizeProduct(product, variantNode); \r\n } catch(error) { \r\n console.error('Get Variant Product Error:', error); throw error; \r\n };\r\n};",":host {\r\n display: block;\r\n}\r\n\r\n.iv-dynamic-products-carousel { \r\n position:relative;\r\n}\r\n\r\n.iv-dynamic-products-carousel-carousel { \r\n position:relative;\r\n}\r\n\r\n.iv-dynamic-products-carousel-viewport { \r\n overflow:hidden; \r\n width:100%;\r\n}\r\n\r\n.iv-dynamic-products-carousel-track { \r\n display:flex; \r\n width:100%; \r\n transition: \r\n transform .55s cubic-bezier(.4,.7,.2,1); \r\n will-change:transform;\r\n}\r\n\r\n.iv-dynamic-products-carousel-slide { \r\n flex:0 0 100%; \r\n box-sizing:border-box; \r\n padding:0.25rem 0.5rem; \r\n display:grid; \r\n grid-template-columns:repeat(6, minmax(0,1fr)); \r\n gap:1rem; \r\n align-items:stretch; \r\n grid-auto-rows:1fr; \r\n}\r\n\r\n@media (max-width: 1200px) { \r\n .iv-dynamic-products-carousel-slide { \r\n grid-template-columns:repeat(4, minmax(0,1fr)); \r\n } \r\n}\r\n\r\n@media (max-width: 900px) { \r\n .iv-dynamic-products-carousel-slide { \r\n grid-template-columns:repeat(3, minmax(0,1fr)); \r\n } \r\n}\r\n\r\n@media (max-width: 640px) { \r\n .iv-dynamic-products-carousel-slide { \r\n grid-template-columns:repeat(2, minmax(0,1fr)); \r\n gap:0.75rem; \r\n } \r\n}\r\n\r\n.iv-dynamic-products-carousel-card { \r\n height:100%; \r\n display:flex; \r\n flex-direction:column; \r\n background:#fff; \r\n padding:0.75rem 0.75rem 0.9rem; \r\n box-shadow:0 2px 6px rgba(0,0,0,.08); \r\n transition:box-shadow .2s ease, transform .2s ease; \r\n}\r\n\r\n/* Alignment fix: reserve consistent height for titles (2 lines) and anchor controls at bottom */\r\n.iv-dynamic-products-carousel-card .iv-card-title {\r\n line-height:1.2;\r\n display:-webkit-box;\r\n -webkit-box-orient:vertical;\r\n -webkit-line-clamp:2;\r\n line-clamp:2;\r\n overflow:hidden;\r\n min-height:calc(2 * 1.2em);\r\n}\r\n\r\n.iv-dynamic-products-carousel-card .iv-card-controls {\r\n margin-top:auto; /* push controls to bottom of flex column for uniform vertical alignment */\r\n}\r\n\r\n.iv-dynamic-products-carousel-card:hover { \r\n box-shadow:0 4px 14px rgba(0,0,0,.15); \r\n transform:translateY(-2px); \r\n}\r\n\r\n.iv-dynamic-products-carousel-card:active { \r\n transform:translateY(0); \r\n box-shadow:0 2px 6px rgba(0,0,0,.12); \r\n}\r\n\r\n.iv-dynamic-products-carousel-card img, \r\n.iv-dynamic-products-carousel-card picture, \r\n.iv-dynamic-products-carousel-card .media { \r\n width:100%; \r\n aspect-ratio:1/1; \r\n object-fit:contain; \r\n display:flex; \r\n align-items:center; \r\n justify-content:center; \r\n margin:0 0 .65rem; \r\n}\r\n\r\n.iv-dynamic-products-carousel-nav { \r\n position:absolute; \r\n top:50%; \r\n transform:translateY(-50%); \r\n background:var(--iv-carousel-nav-bg, rgba(0,0,0,.55)); \r\n color:#fff; \r\n border:none; \r\n width:2.75rem; \r\n height:2.75rem; \r\n border-radius:50%; \r\n display:flex; \r\n align-items:center; \r\n justify-content:center; \r\n cursor:pointer; \r\n backdrop-filter:blur(6px); \r\n box-shadow:0 4px 12px rgba(0,0,0,.25); \r\n transition:background .2s ease, \r\n transform .2s ease; \r\n outline:none;\r\n z-index: 10;\r\n }\r\n\r\n.iv-dynamic-products-carousel-nav:focus-visible { \r\n outline:2px solid #fff; \r\n outline-offset:3px; \r\n}\r\n\r\n.iv-dynamic-products-carousel-nav:hover:not(:disabled){\r\n background:var(--iv-carousel-nav-bg-hover, rgba(0,0,0,.75)); \r\n transform:translateY(-50%) scale(1.05); \r\n box-shadow:0 6px 18px rgba(0,0,0,.35);\r\n}\r\n\r\n.iv-dynamic-products-carousel-nav:disabled{ \r\n opacity:.4; cursor:default; \r\n}\r\n\r\n.iv-dynamic-products-carousel-nav-prev { \r\n left:0.25rem; \r\n}\r\n\r\n.iv-dynamic-products-carousel-nav-next { \r\n right:0.25rem; \r\n}\r\n\r\n.iv-dynamic-products-carousel-status { \r\n margin-top:0.75rem; \r\n font-size:0.875rem; \r\n text-align:center; \r\n color:var(--iv-carousel-status-color, #555); \r\n}\r\n\r\n.iv-dynamic-products-carousel-viewport::-webkit-scrollbar { \r\n display:none; \r\n}\r\n\r\n.iv-dynamic-products-carousel-viewport { \r\n -ms-overflow-style:none; \r\n scrollbar-width:none; \r\n}","// Refactor this to use the iv-carousel component\r\n\r\nimport { Component, h, Prop, State, Watch } from '@stencil/core';\r\nimport { state } from '../../utils/store/store';\r\nimport { fetchProducts } from '../../utils/storefront_api';\r\nimport { productCache } from '../../utils/caching/productCache';\r\nimport { createErrorHandler } from '../../utils/error_handling/factory';\r\n\r\nconst BLOCK = 'iv-dynamic-products-carousel';\r\n\r\n@Component({\r\n tag: 'iv-dynamic-products-carousel',\r\n styleUrl: 'iv-dynamic-products-carousel.scss',\r\n shadow: false\r\n})\r\n\r\nexport class IvDynamicProductsCarousel {\r\n @Prop() type: 'CREATED' | 'CREATED_AT' | 'BEST_SELLING' | 'PRICE' | 'TITLE' | 'RELEVANCE' = 'CREATED_AT'; \r\n @Prop() limit: number = 24;\r\n @Prop() reversed: boolean = false; \r\n @Prop() componenttitle?: string;\r\n @Prop() titletag: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' = 'h2';\r\n @Prop() collectionhandle: string = 'all';\r\n @Prop() requestedfields: string;\r\n @Prop() calltoaction: boolean = false;\r\n @Prop() buttontext?: string;\r\n @Prop() addtocarttext?: string;\r\n @Prop() emptystring: string = 'No products found';\r\n @Prop() cachettl?: number; \r\n @Prop() stale?: boolean = true;\r\n @Prop() exclude?: string;\r\n \r\n @State() products: any[] = [];\r\n @State() errorMsg: string; \r\n @State() staleData: boolean = false;\r\n @State() page: number = 0; \r\n\r\n private readonly itemsPerPage = 6;\r\n\r\n private errors = createErrorHandler({ component: 'iv-dynamic-products-carousel' });\r\n\r\n @Watch('type')\r\n @Watch('limit')\r\n @Watch('collectionhandle')\r\n @Watch('requestedfields')\r\n handlePropChange() { this.loadProducts(true); }\r\n\r\n async componentWillLoad() { \r\n await this.loadProducts(false); \r\n };\r\n \r\n private buildParams() {\r\n return {\r\n handle: this.collectionhandle,\r\n sort: this.type,\r\n fields: this.requestedfields,\r\n limit: 36, // Always fetch 36 products for filtering\r\n currency: state.currencyCode,\r\n reversed: this.reversed\r\n };\r\n };\r\n\r\n private ensureProductTypeField(fields: string): string {\r\n if(!fields) return 'productType';\r\n const arr = fields.split(',').map(f => f.trim());\r\n if(!arr.includes('productType')) arr.push('productType');\r\n return arr.join(',');\r\n };\r\n\r\n private filterAndSliceProducts(data: any[]): any[] {\r\n if(!this.exclude) return data.slice(0, this.limit);\r\n if(!this.requestedfields || !this.requestedfields.includes('productType')) {\r\n this.requestedfields = this.ensureProductTypeField(this.requestedfields);\r\n };\r\n const filtered = data.filter(p => p.productType !== this.exclude);\r\n return filtered.slice(0, this.limit);\r\n };\r\n\r\n private async loadProducts(fromWatch: boolean) {\r\n const params = this.buildParams();\r\n const ttl = this.cachettl || 1000 * 60 * 5;\r\n state.loading = !fromWatch;\r\n try {\r\n const data = await productCache.getOrSetData(\r\n params,\r\n async () => {\r\n const fresh = await fetchProducts(\r\n 36, \r\n this.collectionhandle, \r\n this.type, \r\n this.requestedfields, \r\n this.reversed\r\n );\r\n return fresh;\r\n },\r\n {\r\n ttl,\r\n staleWhileRevalidate: this.stale,\r\n transform: (fresh) => fresh \r\n }\r\n );\r\n const metaCheck = productCache.getData<typeof data>(params);\r\n this.staleData = metaCheck.isExpired && metaCheck.isStale;\r\n this.products = Array.isArray(data) ? this.filterAndSliceProducts(data) : [];\r\n this.page = 0;\r\n } catch (err: any) {\r\n this.errorMsg = 'Failed to load products';\r\n this.errors.handle({\r\n error: err,\r\n scope: 'loadProducts',\r\n userMessage: 'Unable to load products right now.',\r\n devMessage: 'fetchProducts failed in iv-dynamic-products',\r\n severity: 'error'\r\n });\r\n } finally {\r\n state.loading = false;\r\n };\r\n };\r\n \r\n private pagedProducts() {\r\n const chunks: any[][] = [];\r\n for(let i=0; i < this.products.length; i += this.itemsPerPage) {\r\n chunks.push(this.products.slice(i, i + this.itemsPerPage));\r\n };\r\n return chunks;\r\n };\r\n\r\n private next = () => { \r\n const pages = this.pagedProducts().length;\r\n if(this.page < pages - 1) this.page++;\r\n };\r\n\r\n private prev = () => { \r\n if(this.page > 0) this.page--;\r\n };\r\n\r\n render() {\r\n\r\n const TAG = this.titletag as any;\r\n\r\n return (\r\n <div class={BLOCK} data-stale={this.staleData ? 'true' : 'false'}>\r\n {this.componenttitle && <TAG class={`${BLOCK}-title`}>{this.componenttitle}</TAG>}\r\n {state.loading ? (\r\n <iv-spinner></iv-spinner>\r\n ) : this.errorMsg ? (\r\n <div class={`${BLOCK}-error`}>{this.errorMsg}</div>\r\n ) : this.products.length === 0 ? (\r\n <div class={`${BLOCK}-empty`}>{this.emptystring}</div>\r\n ) : (\r\n <div class={`${BLOCK}-carousel`} aria-roledescription=\"carousel\">\r\n <button class={`${BLOCK}-nav ${BLOCK}-nav-prev`} onClick={this.prev} disabled={this.page===0} aria-label=\"Previous\" type=\"button\">\r\n ‹\r\n </button>\r\n <div class={`${BLOCK}-viewport`}>\r\n <div class={`${BLOCK}-track`} style={{ transform: `translateX(-${this.page * 100}%)` }}>\r\n {this.pagedProducts().map((group, i) => (\r\n <div class={`${BLOCK}-slide`} role=\"group\" aria-label={`Slide ${i+1} of ${this.pagedProducts().length}`}> \r\n {group.map(product => (\r\n <iv-card\r\n cardtype='products'\r\n calltoaction={this.calltoaction}\r\n buttontext={this.buttontext}\r\n addtocarttext={this.addtocarttext}\r\n data={product}\r\n classmodifier={`${BLOCK}-card`} />\r\n ))}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n <button class={`${BLOCK}-nav ${BLOCK}-nav-next`} onClick={this.next} disabled={this.page===this.pagedProducts().length-1} aria-label=\"Next\" type=\"button\">\r\n ›\r\n </button>\r\n <div class={`${BLOCK}-status`} aria-live=\"polite\">{this.pagedProducts().length > 1 ? `Slide ${this.page+1} of ${this.pagedProducts().length}` : ''}</div>\r\n {this.staleData && (\r\n <div class={`${BLOCK}-stale-indicator`} aria-live=\"polite\">Refreshing…</div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n };\r\n\r\n};"],"names":["createErrorHandler","apiConfig","state","productCache","h"],"mappings":";;;;;AASgB,SAAA,kBAAkB,CAAC,YAAoB,EAAE,mBAA2B,EAAA;IAClF,OAAO,CAAA;;;;;cAKK,YAAY,CAAA;kDACwB,mBAAmB,CAAA;;;;MAI/D;AACN;AAEgB,SAAA,4BAA4B,CAAC,YAAoB,EAAE,mBAA2B,EAAA;IAC5F,OAAO,CAAA;;;;;;gBAMO,YAAY,CAAA;oDACwB,mBAAmB,CAAA;;;;;MAKjE;AACN;AAyBA;AACA;AACA;AACA;AACA;AACA;;ACxDgB,SAAA,gBAAgB,CAAC,OAAY,EAAE,eAAqB,EAAA;AAClE,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;;IAEpD,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;;ACvBA,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAC,QAAQ,EAAC,OAAO,CAAC;AACnD,MAAM,sBAAsB,GAAG,CAAC,IAAI,EAAC,OAAO,EAAC,+BAA+B,CAAC;AAC7E,MAAM,MAAM,GAAGA,wBAAkB,CAAC,EAAE,SAAS,EAAE,8BAA8B,EAAE,CAAC;AAEzE,eAAe,YAAY,CAAC,KAAa,EAAE,YAAiC,EAAE,EAAA;AACnF,IAAA,IAAI;AACF,QAAA,IAAG,CAACC,eAAS,CAAC,WAAW,EAAE;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC;QAC5E,MAAM,GAAG,GAAG,MAAM,KAAK,CAACA,eAAS,CAAC,QAAQ,EAAE;AAC1C,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,OAAO,EAAE;AACP,gBAAA,cAAc,EAAE,kBAAkB;gBAClC,mCAAmC,EAAEA,eAAS,CAAC;AAChD,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,GAAQ,EAAE;QAChB,MAAM,CAAC,MAAM,CAAC;AACZ,YAAA,KAAK,EAAE,GAAG;AACV,YAAA,KAAK,EAAE,cAAc;AACrB,YAAA,WAAW,EAAE,oCAAoC;AACjD,YAAA,UAAU,EAAE,6CAA6C;AACzD,YAAA,QAAQ,EAAE;AACX,SAAA,CAAC;AACF,QAAA,OAAO,IAAI;;AAEf;AAqBA,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;AAClB,QAAA,IAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAAE,YAAA,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAAE,QAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;;AAE/C,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;;;AAGnB,IAAA,OAAO,OAAO;AAChB;AAEA,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;AAEA,SAAS,gBAAgB,CAAC,MAAA,GAAmB,sBAAsB,EAAA;AACjE,IAAA,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;AAC1B;AAEO,eAAe,aAAa,CACjC,KAAa,EACb,gBAAwB,EACxB,OAAe,EACf,MAAyB,EACzB,WAAoB,KAAK,EAAA;AACzB,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;;AAE9D;;AC1GA,MAAM,4BAA4B,GAAG,87FAA87F;;ACQn+F,MAAM,KAAK,GAAG,8BAA8B;MAQ/B,yBAAyB,GAAA,MAAA;;;;IAC5B,IAAI,GAAgF,YAAY;IAChG,KAAK,GAAW,EAAE;IAClB,QAAQ,GAAY,KAAK;AACzB,IAAA,cAAc;IACd,QAAQ,GAA4C,IAAI;IACxD,gBAAgB,GAAW,KAAK;AAChC,IAAA,eAAe;IACf,YAAY,GAAY,KAAK;AAC7B,IAAA,UAAU;AACV,IAAA,aAAa;IACb,WAAW,GAAW,mBAAmB;AACzC,IAAA,QAAQ;IACR,KAAK,GAAa,IAAI;AACtB,IAAA,OAAO;IAEN,QAAQ,GAAU,EAAE;AACpB,IAAA,QAAQ;IACR,SAAS,GAAY,KAAK;IAC1B,IAAI,GAAW,CAAC;IAER,YAAY,GAAG,CAAC;IAEzB,MAAM,GAAGD,wBAAkB,CAAC,EAAE,SAAS,EAAE,8BAA8B,EAAE,CAAC;IAMlF,gBAAgB,GAAA,EAAK,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AAE7C,IAAA,MAAM,iBAAiB,GAAA;AACrB,QAAA,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;;;IAGxB,WAAW,GAAA;QACjB,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,gBAAgB;YAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,IAAI,CAAC,eAAe;YAC5B,KAAK,EAAE,EAAE;YACT,QAAQ,EAAEE,WAAK,CAAC,YAAY;YAC5B,QAAQ,EAAE,IAAI,CAAC;SAChB;;;AAGK,IAAA,sBAAsB,CAAC,MAAc,EAAA;AAC3C,QAAA,IAAG,CAAC,MAAM;AAAE,YAAA,OAAO,aAAa;QAChC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;AAChD,QAAA,IAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC;AAAE,YAAA,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC;AACxD,QAAA,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;;;AAGd,IAAA,sBAAsB,CAAC,IAAW,EAAA;QACxC,IAAG,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC;AAClD,QAAA,IAAG,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;YACzE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,eAAe,CAAC;;AAE1E,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC,OAAO,CAAC;QACjE,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC;;;IAG9B,MAAM,YAAY,CAAC,SAAkB,EAAA;AAC3C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,GAAG,EAAE,GAAG,CAAC;AAC1C,QAAAA,WAAK,CAAC,OAAO,GAAG,CAAC,SAAS;AAC1B,QAAA,IAAI;YACF,MAAM,IAAI,GAAG,MAAMC,yBAAY,CAAC,YAAY,CAC1C,MAAM,EACN,YAAW;gBACT,MAAM,KAAK,GAAG,MAAM,aAAa,CAC/B,EAAE,EACF,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,QAAQ,CACd;AACD,gBAAA,OAAO,KAAK;AACd,aAAC,EACD;gBACE,GAAG;gBACH,oBAAoB,EAAE,IAAI,CAAC,KAAK;AAChC,gBAAA,SAAS,EAAE,CAAC,KAAK,KAAK;AACvB,aAAA,CACF;YACD,MAAM,SAAS,GAAGA,yBAAY,CAAC,OAAO,CAAc,MAAM,CAAC;YAC3D,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,OAAO;YACzD,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,GAAG,EAAE;AAC5E,YAAA,IAAI,CAAC,IAAI,GAAG,CAAC;;QACb,OAAO,GAAQ,EAAE;AACjB,YAAA,IAAI,CAAC,QAAQ,GAAG,yBAAyB;AACzC,YAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;AACjB,gBAAA,KAAK,EAAE,GAAG;AACV,gBAAA,KAAK,EAAE,cAAc;AACrB,gBAAA,WAAW,EAAE,oCAAoC;AACjD,gBAAA,UAAU,EAAE,6CAA6C;AACzD,gBAAA,QAAQ,EAAE;AACX,aAAA,CAAC;;gBACM;AACR,YAAAD,WAAK,CAAC,OAAO,GAAG,KAAK;;;;IAIjB,aAAa,GAAA;QACnB,MAAM,MAAM,GAAY,EAAE;AAC1B,QAAA,KAAI,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,IAAI,CAAC,YAAY,EAAE;AAC7D,YAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;;AAE5D,QAAA,OAAO,MAAM;;;IAGP,IAAI,GAAG,MAAK;QAClB,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM;AACzC,QAAA,IAAG,IAAI,CAAC,IAAI,GAAG,KAAK,GAAG,CAAC;YAAE,IAAI,CAAC,IAAI,EAAE;AACvC,KAAC;IAEO,IAAI,GAAG,MAAK;AAClB,QAAA,IAAG,IAAI,CAAC,IAAI,GAAG,CAAC;YAAE,IAAI,CAAC,IAAI,EAAE;AAC/B,KAAC;IAED,MAAM,GAAA;AAEJ,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,QAAe;QAEhC,QACEE,OAAK,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAE,KAAK,gBAAc,IAAI,CAAC,SAAS,GAAG,MAAM,GAAG,OAAO,EAAA,EAC7D,IAAI,CAAC,cAAc,IAAIA,OAAA,CAAC,GAAG,EAAC,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAE,CAAA,EAAG,KAAK,CAAA,MAAA,CAAQ,EAAA,EAAG,IAAI,CAAC,cAAc,CAAO,EAChFF,WAAK,CAAC,OAAO,IACZE,OAAyB,CAAA,YAAA,EAAA,IAAA,CAAA,IACvB,IAAI,CAAC,QAAQ,IACfA,OAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAE,CAAG,EAAA,KAAK,CAAQ,MAAA,CAAA,EAAG,EAAA,IAAI,CAAC,QAAQ,CAAO,IACjD,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAC5BA,OAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAE,CAAA,EAAG,KAAK,CAAQ,MAAA,CAAA,EAAA,EAAG,IAAI,CAAC,WAAW,CAAO,KAEtDA,OAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAE,CAAA,EAAG,KAAK,CAAW,SAAA,CAAA,0BAAuB,UAAU,EAAA,EAC9DA,OAAQ,CAAA,QAAA,EAAA,EAAA,KAAK,EAAE,CAAG,EAAA,KAAK,CAAQ,KAAA,EAAA,KAAK,CAAW,SAAA,CAAA,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,KAAG,CAAC,EAAa,YAAA,EAAA,UAAU,EAAC,IAAI,EAAC,QAAQ,EAExH,EAAA,QAAA,CAAA,EACTA,OAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAE,CAAG,EAAA,KAAK,WAAW,EAAA,EAC7BA,OAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAE,CAAG,EAAA,KAAK,CAAQ,MAAA,CAAA,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,CAAe,YAAA,EAAA,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA,EAAA,CAAI,EAAE,EACnF,EAAA,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,MACjCA,OAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAE,CAAA,EAAG,KAAK,CAAA,MAAA,CAAQ,EAAE,IAAI,EAAC,OAAO,EAAA,YAAA,EAAa,CAAS,MAAA,EAAA,CAAC,GAAC,CAAC,CAAA,IAAA,EAAO,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,CAAA,CAAE,EACpG,EAAA,KAAK,CAAC,GAAG,CAAC,OAAO,KAChBA,OACE,CAAA,SAAA,EAAA,EAAA,QAAQ,EAAC,UAAU,EACnB,YAAY,EAAE,IAAI,CAAC,YAAY,EAC/B,UAAU,EAAE,IAAI,CAAC,UAAU,EAC3B,aAAa,EAAE,IAAI,CAAC,aAAa,EACjC,IAAI,EAAE,OAAO,EACb,aAAa,EAAE,CAAG,EAAA,KAAK,OAAO,EAAI,CAAA,CACrC,CAAC,CACE,CACP,CAAC,CACE,CACF,EACNA,OAAA,CAAA,QAAA,EAAA,EAAQ,KAAK,EAAE,CAAA,EAAG,KAAK,CAAA,KAAA,EAAQ,KAAK,CAAW,SAAA,CAAA,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,IAAI,KAAG,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,GAAC,CAAC,gBAAa,MAAM,EAAC,IAAI,EAAC,QAAQ,EAEhJ,EAAA,QAAA,CAAA,EACTA,OAAA,CAAA,KAAA,EAAA,EAAK,KAAK,EAAE,CAAG,EAAA,KAAK,CAAS,OAAA,CAAA,eAAY,QAAQ,EAAA,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,GAAG,CAAC,GAAG,SAAS,IAAI,CAAC,IAAI,GAAC,CAAC,CAAA,IAAA,EAAO,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,CAAA,CAAE,GAAG,EAAE,CAAO,EACxJ,IAAI,CAAC,SAAS,KACbA,OAAK,CAAA,KAAA,EAAA,EAAA,KAAK,EAAE,CAAA,EAAG,KAAK,CAAA,gBAAA,CAAkB,EAAA,WAAA,EAAY,QAAQ,EAAkB,EAAA,kBAAA,CAAA,CAC7E,CACG,CACP,CACG;;;;;;;;;;;;;;"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
var index = require('./index-CwOil7xd.js');
|
|
4
4
|
|
|
5
|
-
const ivPillCss = ".iv-pill{background:var(--iv-pill-bgcolor, transparent)}.iv-pill.bordered{border-color:var(--iv-pill-bordercolor, black);border-width:1px;border-style:solid}.iv-pill.internal-none{padding:0}.iv-pill.internal-small{padding:0.25rem 0.5rem}.iv-pill.internal-medium{padding:0.5rem 1rem}.iv-pill.internal-large{padding:0.75rem 1.5rem}.iv-pill.external-none{margin:0}.iv-pill.external-small{margin:0.5rem}.iv-pill.external-medium{margin:0.75rem}.iv-pill.external-large{margin:1rem}.iv-pill.corners-none{border-radius:0}.iv-pill.corners-small{border-radius:0.5rem}.iv-pill.corners-medium{border-radius:1rem}.iv-pill.corners-large{border-radius:2rem}.iv-pill-content{color:var(--iv-pill-textcolor, black)}.iv-pill-label{font-weight:bold;margin-right:0.5rem}";
|
|
5
|
+
const ivPillCss = ".iv-pill{background:var(--iv-pill-bgcolor, transparent);width:fit-content;display:inline-block}.iv-pill.bordered{border-color:var(--iv-pill-bordercolor, black);border-width:1px;border-style:solid}.iv-pill.internal-none{padding:0}.iv-pill.internal-small{padding:0.25rem 0.5rem}.iv-pill.internal-medium{padding:0.5rem 1rem}.iv-pill.internal-large{padding:0.75rem 1.5rem}.iv-pill.external-none{margin:0}.iv-pill.external-small{margin:0.5rem}.iv-pill.external-medium{margin:0.75rem}.iv-pill.external-large{margin:1rem}.iv-pill.corners-none{border-radius:0}.iv-pill.corners-small{border-radius:0.5rem}.iv-pill.corners-medium{border-radius:1rem}.iv-pill.corners-large{border-radius:2rem}.iv-pill-content{color:var(--iv-pill-textcolor, black)}.iv-pill-label{font-weight:bold;margin-right:0.5rem}";
|
|
6
6
|
|
|
7
7
|
const BLOCK = 'iv-pill';
|
|
8
8
|
const IvPill = class {
|
|
@@ -16,11 +16,12 @@ const IvPill = class {
|
|
|
16
16
|
externalspacing = 'none';
|
|
17
17
|
roundedcorners = 'medium';
|
|
18
18
|
render() {
|
|
19
|
-
return (index.h("div", { key: '
|
|
19
|
+
return (index.h("div", { key: '0babc05c3604fd666838d6bea498781d569a4f6f', class: BLOCK
|
|
20
|
+
+ (this.bordered ? ' bordered' : '')
|
|
20
21
|
+ ` internal-${this.internalspacing}`
|
|
21
22
|
+ ` external-${this.externalspacing}`
|
|
22
|
-
+ ` corners-${this.roundedcorners}` }, index.h("p", { key: '
|
|
23
|
-
index.h("span", { key: '
|
|
23
|
+
+ ` corners-${this.roundedcorners}` }, index.h("p", { key: '51816bcac1a1f30311b93eb0eddc5d7f6f5d6952', class: `${BLOCK}-content` }, this.label &&
|
|
24
|
+
index.h("span", { key: 'ef3aa3d8a44e23e469560501d71fc4b1409796f5', class: `${BLOCK}-label` }, this.label), this.content)));
|
|
24
25
|
}
|
|
25
26
|
;
|
|
26
27
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iv-pill.entry.cjs.js","sources":["src/components/iv-pill/iv-pill.scss?tag=iv-pill","src/components/iv-pill/iv-pill.tsx"],"sourcesContent":[".iv-pill {\n background: var(--iv-pill-bgcolor, transparent);\n\n &.bordered {\n border-color: var(--iv-pill-bordercolor, black);\n border-width: 1px;\n border-style: solid;\n }\n\n &.internal-none {\n padding: 0;\n }\n\n &.internal-small {\n padding: 0.25rem 0.5rem;\n }\n\n &.internal-medium {\n padding: 0.5rem 1rem;\n }\n\n &.internal-large {\n padding: 0.75rem 1.5rem;\n }\n\n &.external-none {\n margin: 0;\n }\n\n &.external-small {\n margin: .5rem;\n }\n\n &.external-medium {\n margin: .75rem;\n }\n\n &.external-large {\n margin: 1rem;\n }\n\n &.corners-none {\n border-radius: 0;\n }\n\n &.corners-small {\n border-radius: 0.5rem;\n }\n\n &.corners-medium {\n border-radius: 1rem;\n }\n\n &.corners-large {\n border-radius: 2rem;\n }\n\n &-content {\n color: var(--iv-pill-textcolor, black);\n }\n\n &-label {\n font-weight: bold;\n margin-right: 0.5rem;\n }\n\n}","import { Component, h, Prop } from '@stencil/core';\n\nconst BLOCK = 'iv-pill';\n\n@Component({\n tag: 'iv-pill',\n styleUrl: 'iv-pill.scss',\n shadow: false\n})\n\nexport class IvPill {\n\n @Prop() label?: string;\n @Prop() content: string;\n @Prop() bordered: boolean = true;\n @Prop() internalspacing: 'small' | 'medium' | 'large' = 'medium';\n @Prop() externalspacing: 'none' | 'small' | 'medium' | 'large' = 'none';\n @Prop() roundedcorners: 'none' | 'small' | 'medium' | 'large' = 'medium';\n\n render() {\n\n return (\n <div class={\n BLOCK + this.bordered
|
|
1
|
+
{"version":3,"file":"iv-pill.entry.cjs.js","sources":["src/components/iv-pill/iv-pill.scss?tag=iv-pill","src/components/iv-pill/iv-pill.tsx"],"sourcesContent":[".iv-pill {\n background: var(--iv-pill-bgcolor, transparent);\n width: fit-content;\n display: inline-block;\n\n &.bordered {\n border-color: var(--iv-pill-bordercolor, black);\n border-width: 1px;\n border-style: solid;\n }\n\n &.internal-none {\n padding: 0;\n }\n\n &.internal-small {\n padding: 0.25rem 0.5rem;\n }\n\n &.internal-medium {\n padding: 0.5rem 1rem;\n }\n\n &.internal-large {\n padding: 0.75rem 1.5rem;\n }\n\n &.external-none {\n margin: 0;\n }\n\n &.external-small {\n margin: .5rem;\n }\n\n &.external-medium {\n margin: .75rem;\n }\n\n &.external-large {\n margin: 1rem;\n }\n\n &.corners-none {\n border-radius: 0;\n }\n\n &.corners-small {\n border-radius: 0.5rem;\n }\n\n &.corners-medium {\n border-radius: 1rem;\n }\n\n &.corners-large {\n border-radius: 2rem;\n }\n\n &-content {\n color: var(--iv-pill-textcolor, black);\n }\n\n &-label {\n font-weight: bold;\n margin-right: 0.5rem;\n }\n\n}","import { Component, h, Prop } from '@stencil/core';\n\nconst BLOCK = 'iv-pill';\n\n@Component({\n tag: 'iv-pill',\n styleUrl: 'iv-pill.scss',\n shadow: false\n})\n\nexport class IvPill {\n\n @Prop() label?: string;\n @Prop() content: string;\n @Prop() bordered: boolean = true;\n @Prop() internalspacing: 'small' | 'medium' | 'large' = 'medium';\n @Prop() externalspacing: 'none' | 'small' | 'medium' | 'large' = 'none';\n @Prop() roundedcorners: 'none' | 'small' | 'medium' | 'large' = 'medium';\n\n render() {\n\n return (\n <div class={\n BLOCK \n + (this.bordered ? ' bordered' : '')\n + ` internal-${this.internalspacing}`\n + ` external-${this.externalspacing}`\n + ` corners-${this.roundedcorners}`\n }>\n <p class={`${BLOCK}-content`}>\n {this.label && \n <span class={`${BLOCK}-label`}>{this.label}</span>\n }\n {this.content}\n </p>\n </div>\n );\n\n };\n\n};"],"names":["h"],"mappings":";;;;AAAA,MAAM,SAAS,GAAG,sxBAAsxB;;ACExyB,MAAM,KAAK,GAAG,SAAS;MAQV,MAAM,GAAA,MAAA;;;;AAET,IAAA,KAAK;AACL,IAAA,OAAO;IACP,QAAQ,GAAY,IAAI;IACxB,eAAe,GAAiC,QAAQ;IACxD,eAAe,GAA0C,MAAM;IAC/D,cAAc,GAA0C,QAAQ;IAExE,MAAM,GAAA;AAEJ,QAAA,QACEA,OAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAK,KAAK,EACR;mBACG,IAAI,CAAC,QAAQ,GAAG,WAAW,GAAG,EAAE;kBACjC,CAAa,UAAA,EAAA,IAAI,CAAC,eAAe,CAAE;kBACnC,CAAa,UAAA,EAAA,IAAI,CAAC,eAAe,CAAE;kBACnC,CAAY,SAAA,EAAA,IAAI,CAAC,cAAc,CAAE,CAAA,EAAA,EAEnCA,OAAA,CAAA,GAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAG,KAAK,EAAE,CAAG,EAAA,KAAK,UAAU,EAAA,EACzB,IAAI,CAAC,KAAK;YACTA,OAAM,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAE,CAAA,EAAG,KAAK,CAAA,MAAA,CAAQ,EAAG,EAAA,IAAI,CAAC,KAAK,CAAQ,EAEnD,IAAI,CAAC,OAAO,CACX,CACA;;;;;;;;"}
|
package/dist/cjs/loader.cjs.js
CHANGED
|
@@ -6,7 +6,7 @@ var appGlobals = require('./app-globals-DMja435B.js');
|
|
|
6
6
|
const defineCustomElements = async (win, options) => {
|
|
7
7
|
if (typeof window === 'undefined') return undefined;
|
|
8
8
|
await appGlobals.globalScripts();
|
|
9
|
-
return index.bootstrapLazy([["iv-dynamic-products.cjs",[[256,"iv-dynamic-products",{"type":[1],"limit":[2],"reversed":[4],"componenttitle":[1],"titletag":[1],"collectionhandle":[1],"carousel":[4],"requestedfields":[1],"calltoaction":[4],"buttontext":[1],"addtocarttext":[1],"emptystring":[1],"gridlayout":[1],"cachettl":[2],"stale":[4],"products":[32],"errorMsg":[32],"staleData":[32]},null,{"type":["handlePropChange"],"limit":["handlePropChange"],"collectionhandle":["handlePropChange"],"requestedfields":["handlePropChange"]}]]],["iv-suggest.cjs",[[256,"iv-suggest",{"topqueries":[1],"collections":[1],"products":[1],"banner":[1],"bannerurl":[1],"bannertitle":[1],"bannertitletag":[1],"bannerbuttontext":[1],"topquerytitle":[1],"productstitle":[1],"collectionstitle":[1],"gridlayout":[1],"requestfields":[1]}]]],["iv-dynamic-products-carousel.cjs",[[256,"iv-dynamic-products-carousel",{"type":[1],"limit":[2],"reversed":[4],"componenttitle":[1],"titletag":[1],"collectionhandle":[1],"requestedfields":[1],"calltoaction":[4],"buttontext":[1],"addtocarttext":[1],"emptystring":[1],"cachettl":[2],"stale":[4],"
|
|
9
|
+
return index.bootstrapLazy([["iv-dynamic-products.cjs",[[256,"iv-dynamic-products",{"type":[1],"limit":[2],"reversed":[4],"componenttitle":[1],"titletag":[1],"collectionhandle":[1],"carousel":[4],"requestedfields":[1],"calltoaction":[4],"buttontext":[1],"addtocarttext":[1],"emptystring":[1],"gridlayout":[1],"cachettl":[2],"stale":[4],"products":[32],"errorMsg":[32],"staleData":[32]},null,{"type":["handlePropChange"],"limit":["handlePropChange"],"collectionhandle":["handlePropChange"],"requestedfields":["handlePropChange"]}]]],["iv-suggest.cjs",[[256,"iv-suggest",{"topqueries":[1],"collections":[1],"products":[1],"banner":[1],"bannerurl":[1],"bannertitle":[1],"bannertitletag":[1],"bannerbuttontext":[1],"topquerytitle":[1],"productstitle":[1],"collectionstitle":[1],"gridlayout":[1],"requestfields":[1]}]]],["iv-dynamic-products-carousel.cjs",[[256,"iv-dynamic-products-carousel",{"type":[1],"limit":[2],"reversed":[4],"componenttitle":[1],"titletag":[1],"collectionhandle":[1],"requestedfields":[1],"calltoaction":[4],"buttontext":[1],"addtocarttext":[1],"emptystring":[1],"cachettl":[2],"stale":[4],"exclude":[1],"products":[32],"errorMsg":[32],"staleData":[32],"page":[32]},null,{"type":["handlePropChange"],"limit":["handlePropChange"],"collectionhandle":["handlePropChange"],"requestedfields":["handlePropChange"]}]]],["iv-predictive-search.cjs",[[256,"iv-predictive-search",{"searchlabel":[1],"labelposition":[1],"action":[1],"placeholder":[1],"minchars":[2],"resultslimit":[2],"showspinner":[4],"noresultstext":[1],"requestedfields":[1],"requestedresources":[1],"showallbuttontext":[1],"querybuttontext":[1],"clearbutton":[1],"expandable":[4],"tablayout":[1],"gridlayout":[1],"searchTerm":[32],"searchReturnData":[32],"noResults":[32]}]]],["iv-recently-viewed.cjs",[[256,"iv-recently-viewed",{"componenttitle":[1],"titletag":[1],"numbertoshow":[2],"noviewhistory":[1],"requestedfields":[1],"items":[32]}]]],["iv-link-list.cjs",[[256,"iv-link-list",{"linktype":[1],"showicons":[4],"links":[1],"layout":[1]}]]],["iv-shop-the-look.cjs",[[260,"iv-shop-the-look",{"behaviour":[1],"coordinates":[1],"producthandles":[1]}]]],["iv-toast-container.cjs",[[256,"iv-toast-container",{"_bump":[32]}]]],["iv-wishlist.cjs",[[256,"iv-wishlist",{"buttonaddvalue":[1],"buttonremovevalue":[1],"wishlistempty":[1],"buttonaddtocartvalue":[1],"viewwishlistvalue":[1],"productdata":[1],"usefields":[1],"previewtype":[1]}]]],["iv-carousel.cjs",[[260,"iv-carousel",{"navarrows":[4],"navdots":[4],"showslidecount":[4],"autoplay":[4],"autoplayspeed":[2],"valign":[1],"halign":[1],"hasoverlay":[4],"currentIndex":[32],"items":[32]}]]],["iv-compare-product.cjs",[[256,"iv-compare-product"]]],["iv-filters.cjs",[[256,"iv-filters"]]],["iv-footer.cjs",[[260,"iv-footer",{"gridtemplateareas":[1],"footerbackground":[1],"blockElements":[32]}]]],["iv-pill.cjs",[[256,"iv-pill",{"label":[1],"content":[1],"bordered":[4],"internalspacing":[1],"externalspacing":[1],"roundedcorners":[1]}]]],["iv-product-upsell.cjs",[[257,"iv-product-upsell"]]],["iv-two-col-media.cjs",[[260,"iv-two-col-media",{"mobilebehaviour":[1],"whichcolumn":[1],"stackorder":[1],"verticalalign":[1],"horizontalalign":[1],"gap":[1],"hasMediaCol1":[32],"hasMediaCol2":[32]}]]],["sw-in-grid-content.cjs",[[260,"sw-in-grid-content"]]],["sw-size-guide.cjs",[[260,"sw-size-guide",{"sizeUnits":[32]}]]],["iv-banner.cjs",[[260,"iv-banner",{"classmodifier":[1],"bannerurl":[1],"bannerbuttontext":[1],"bannertype":[1]}]]],["iv-product-pin.cjs",[[256,"iv-product-pin",{"pinProduct":[1,"pin-product"],"pinKey":[2,"pin-key"],"pinCords":[16],"pinBehaviour":[1,"pin-behaviour"]}]]],["iv-tabs.cjs",[[260,"iv-tabs",{"labels":[16],"classModifier":[1,"class-modifier"],"tabLayout":[1,"tab-layout"],"activeTab":[32]}]]],["iv-toast.cjs",[[256,"iv-toast",{"message":[1],"toastId":[2,"toast-id"],"duration":[2],"type":[1]}]]],["ion-icon_9.cjs",[[257,"iv-modal",{"newsletterpopuptrigger":[1],"newsletterpopuptimedelay":[2],"modalState":[32],"contentName":[32]},[[4,"openModal","handleOpenModal"]]],[260,"iv-sidebar",{"newsletterpopuptrigger":[1],"newsletterpopuptimedelay":[2],"sidebarState":[32],"contentName":[32]},[[4,"openSidebar","handleopenSidebar"]]],[260,"iv-accordion",{"labels":[1],"allowmultiple":[4],"startopen":[4],"acordionlayout":[1],"contentplacement":[1],"dropdownicon":[1],"openPanels":[32]}],[256,"iv-newsletter",{"formimageurl":[1],"formimageposition":[1],"formimageheight":[1],"formsubmitbtntext":[1],"formsuccessmessage":[1],"formfailuremessage":[1],"formplaceholdertext":[1],"formlabeltext":[1],"formstackbutton":[4],"formtitletag":[1],"formtitletext":[1],"formdescriptiontext":[1],"includeloadingspinner":[4],"newsletterpopupdisclaimer":[1],"classmodifier":[1],"email":[32],"formFeedback":[32],"status":[32]}],[260,"iv-event-button",{"eventname":[1],"eventdetail":[8],"buttontext":[1]}],[256,"iv-wishlist-view"],[257,"ion-icon",{"mode":[1025],"color":[1],"ios":[1],"md":[1],"flipRtl":[4,"flip-rtl"],"name":[513],"src":[1],"icon":[8],"size":[1],"lazy":[4],"sanitize":[4],"svgContent":[32],"isVisible":[32]},null,{"name":["loadIcon"],"src":["loadIcon"],"icon":["loadIcon"],"ios":["loadIcon"],"md":["loadIcon"]}],[256,"iv-spinner",{"show":[4]}],[260,"iv-button",{"type":[1],"classmodifier":[1],"eventname":[1],"eventdetail":[1],"buttonClick":[16]}]]],["iv-card_3.cjs",[[256,"iv-card",{"data":[16],"fields":[1],"cardtype":[1],"classmodifier":[1],"buttontext":[1],"calltoaction":[4],"addtocarttext":[1]}],[260,"iv-layout",{"sectionId":[1,"section-id"],"gridTemplateAreas":[1,"grid-template-areas"],"gap":[1],"verticalAlign":[1,"vertical-align"],"horizontalAlign":[1,"horizontal-align"],"wrapperTag":[1,"wrapper-tag"],"classModifier":[1,"class-modifier"]}],[260,"iv-link",{"classmodifier":[1],"linktype":[1],"linkhref":[1],"linktarget":[1],"linkrel":[1],"linkariaLabel":[1,"linkaria-label"]}]]]], options);
|
|
10
10
|
};
|
|
11
11
|
|
|
12
12
|
exports.setNonce = index.setNonce;
|
package/dist/collection/components/iv-dynamic-products-carousel/iv-dynamic-products-carousel.js
CHANGED
|
@@ -19,7 +19,7 @@ export class IvDynamicProductsCarousel {
|
|
|
19
19
|
emptystring = 'No products found';
|
|
20
20
|
cachettl;
|
|
21
21
|
stale = true;
|
|
22
|
-
|
|
22
|
+
exclude;
|
|
23
23
|
products = [];
|
|
24
24
|
errorMsg;
|
|
25
25
|
staleData = false;
|
|
@@ -52,13 +52,13 @@ export class IvDynamicProductsCarousel {
|
|
|
52
52
|
}
|
|
53
53
|
;
|
|
54
54
|
filterAndSliceProducts(data) {
|
|
55
|
-
if (!this.
|
|
55
|
+
if (!this.exclude)
|
|
56
56
|
return data.slice(0, this.limit);
|
|
57
57
|
if (!this.requestedfields || !this.requestedfields.includes('productType')) {
|
|
58
58
|
this.requestedfields = this.ensureProductTypeField(this.requestedfields);
|
|
59
59
|
}
|
|
60
60
|
;
|
|
61
|
-
const filtered = data.filter(p => p.productType !== this.
|
|
61
|
+
const filtered = data.filter(p => p.productType !== this.exclude);
|
|
62
62
|
return filtered.slice(0, this.limit);
|
|
63
63
|
}
|
|
64
64
|
;
|
|
@@ -387,7 +387,7 @@ export class IvDynamicProductsCarousel {
|
|
|
387
387
|
"attribute": "stale",
|
|
388
388
|
"defaultValue": "true"
|
|
389
389
|
},
|
|
390
|
-
"
|
|
390
|
+
"exclude": {
|
|
391
391
|
"type": "string",
|
|
392
392
|
"mutable": false,
|
|
393
393
|
"complexType": {
|
|
@@ -404,7 +404,7 @@ export class IvDynamicProductsCarousel {
|
|
|
404
404
|
"getter": false,
|
|
405
405
|
"setter": false,
|
|
406
406
|
"reflect": false,
|
|
407
|
-
"attribute": "
|
|
407
|
+
"attribute": "exclude"
|
|
408
408
|
}
|
|
409
409
|
};
|
|
410
410
|
}
|
package/dist/collection/components/iv-dynamic-products-carousel/iv-dynamic-products-carousel.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iv-dynamic-products-carousel.js","sourceRoot":"","sources":["../../../src/components/iv-dynamic-products-carousel/iv-dynamic-products-carousel.tsx"],"names":[],"mappings":"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","sourcesContent":["// Refactor this to use the iv-carousel component\r\n\r\nimport { Component, h, Prop, State, Watch } from '@stencil/core';\r\nimport { state } from '../../utils/store/store';\r\nimport { fetchProducts } from '../../utils/storefront_api';\r\nimport { productCache } from '../../utils/caching/productCache';\r\nimport { createErrorHandler } from '../../utils/error_handling/factory';\r\n\r\nconst BLOCK = 'iv-dynamic-products-carousel';\r\n\r\n@Component({\r\n tag: 'iv-dynamic-products-carousel',\r\n styleUrl: 'iv-dynamic-products-carousel.scss',\r\n shadow: false\r\n})\r\n\r\nexport class IvDynamicProductsCarousel {\r\n @Prop() type: 'CREATED' | 'CREATED_AT' | 'BEST_SELLING' | 'PRICE' | 'TITLE' | 'RELEVANCE' = 'CREATED_AT'; \r\n @Prop() limit: number = 24;\r\n @Prop() reversed: boolean = false; \r\n @Prop() componenttitle?: string;\r\n @Prop() titletag: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' = 'h2';\r\n @Prop() collectionhandle: string = 'all';\r\n @Prop() requestedfields: string;\r\n @Prop() calltoaction: boolean = false;\r\n @Prop() buttontext?: string;\r\n @Prop() addtocarttext?: string;\r\n @Prop() emptystring: string = 'No products found';\r\n @Prop() cachettl?: number; \r\n @Prop() stale?: boolean = true;\r\n @Prop() excluse?: string;\r\n \r\n @State() products: any[] = [];\r\n @State() errorMsg: string; \r\n @State() staleData: boolean = false;\r\n @State() page: number = 0; \r\n\r\n private readonly itemsPerPage = 6;\r\n\r\n private errors = createErrorHandler({ component: 'iv-dynamic-products-carousel' });\r\n\r\n @Watch('type')\r\n @Watch('limit')\r\n @Watch('collectionhandle')\r\n @Watch('requestedfields')\r\n handlePropChange() { this.loadProducts(true); }\r\n\r\n async componentWillLoad() { \r\n await this.loadProducts(false); \r\n };\r\n \r\n private buildParams() {\r\n return {\r\n handle: this.collectionhandle,\r\n sort: this.type,\r\n fields: this.requestedfields,\r\n limit: 36, // Always fetch 36 products for filtering\r\n currency: state.currencyCode,\r\n reversed: this.reversed\r\n };\r\n };\r\n\r\n private ensureProductTypeField(fields: string): string {\r\n if(!fields) return 'productType';\r\n const arr = fields.split(',').map(f => f.trim());\r\n if(!arr.includes('productType')) arr.push('productType');\r\n return arr.join(',');\r\n };\r\n\r\n private filterAndSliceProducts(data: any[]): any[] {\r\n if(!this.excluse) return data.slice(0, this.limit);\r\n if(!this.requestedfields || !this.requestedfields.includes('productType')) {\r\n this.requestedfields = this.ensureProductTypeField(this.requestedfields);\r\n };\r\n const filtered = data.filter(p => p.productType !== this.excluse);\r\n return filtered.slice(0, this.limit);\r\n };\r\n\r\n private async loadProducts(fromWatch: boolean) {\r\n const params = this.buildParams();\r\n const ttl = this.cachettl || 1000 * 60 * 5;\r\n state.loading = !fromWatch;\r\n try {\r\n const data = await productCache.getOrSetData(\r\n params,\r\n async () => {\r\n const fresh = await fetchProducts(\r\n 36, \r\n this.collectionhandle, \r\n this.type, \r\n this.requestedfields, \r\n this.reversed\r\n );\r\n return fresh;\r\n },\r\n {\r\n ttl,\r\n staleWhileRevalidate: this.stale,\r\n transform: (fresh) => fresh \r\n }\r\n );\r\n const metaCheck = productCache.getData<typeof data>(params);\r\n this.staleData = metaCheck.isExpired && metaCheck.isStale;\r\n this.products = Array.isArray(data) ? this.filterAndSliceProducts(data) : [];\r\n this.page = 0;\r\n } catch (err: any) {\r\n this.errorMsg = 'Failed to load products';\r\n this.errors.handle({\r\n error: err,\r\n scope: 'loadProducts',\r\n userMessage: 'Unable to load products right now.',\r\n devMessage: 'fetchProducts failed in iv-dynamic-products',\r\n severity: 'error'\r\n });\r\n } finally {\r\n state.loading = false;\r\n };\r\n };\r\n \r\n private pagedProducts() {\r\n const chunks: any[][] = [];\r\n for(let i=0; i < this.products.length; i += this.itemsPerPage) {\r\n chunks.push(this.products.slice(i, i + this.itemsPerPage));\r\n };\r\n return chunks;\r\n };\r\n\r\n private next = () => { \r\n const pages = this.pagedProducts().length;\r\n if(this.page < pages - 1) this.page++;\r\n };\r\n\r\n private prev = () => { \r\n if(this.page > 0) this.page--;\r\n };\r\n\r\n render() {\r\n\r\n const TAG = this.titletag as any;\r\n\r\n return (\r\n <div class={BLOCK} data-stale={this.staleData ? 'true' : 'false'}>\r\n {this.componenttitle && <TAG class={`${BLOCK}-title`}>{this.componenttitle}</TAG>}\r\n {state.loading ? (\r\n <iv-spinner></iv-spinner>\r\n ) : this.errorMsg ? (\r\n <div class={`${BLOCK}-error`}>{this.errorMsg}</div>\r\n ) : this.products.length === 0 ? (\r\n <div class={`${BLOCK}-empty`}>{this.emptystring}</div>\r\n ) : (\r\n <div class={`${BLOCK}-carousel`} aria-roledescription=\"carousel\">\r\n <button class={`${BLOCK}-nav ${BLOCK}-nav-prev`} onClick={this.prev} disabled={this.page===0} aria-label=\"Previous\" type=\"button\">\r\n ‹\r\n </button>\r\n <div class={`${BLOCK}-viewport`}>\r\n <div class={`${BLOCK}-track`} style={{ transform: `translateX(-${this.page * 100}%)` }}>\r\n {this.pagedProducts().map((group, i) => (\r\n <div class={`${BLOCK}-slide`} role=\"group\" aria-label={`Slide ${i+1} of ${this.pagedProducts().length}`}> \r\n {group.map(product => (\r\n <iv-card\r\n cardtype='products'\r\n calltoaction={this.calltoaction}\r\n buttontext={this.buttontext}\r\n addtocarttext={this.addtocarttext}\r\n data={product}\r\n classmodifier={`${BLOCK}-card`} />\r\n ))}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n <button class={`${BLOCK}-nav ${BLOCK}-nav-next`} onClick={this.next} disabled={this.page===this.pagedProducts().length-1} aria-label=\"Next\" type=\"button\">\r\n ›\r\n </button>\r\n <div class={`${BLOCK}-status`} aria-live=\"polite\">{this.pagedProducts().length > 1 ? `Slide ${this.page+1} of ${this.pagedProducts().length}` : ''}</div>\r\n {this.staleData && (\r\n <div class={`${BLOCK}-stale-indicator`} aria-live=\"polite\">Refreshing…</div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n };\r\n\r\n};"]}
|
|
1
|
+
{"version":3,"file":"iv-dynamic-products-carousel.js","sourceRoot":"","sources":["../../../src/components/iv-dynamic-products-carousel/iv-dynamic-products-carousel.tsx"],"names":[],"mappings":"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","sourcesContent":["// Refactor this to use the iv-carousel component\r\n\r\nimport { Component, h, Prop, State, Watch } from '@stencil/core';\r\nimport { state } from '../../utils/store/store';\r\nimport { fetchProducts } from '../../utils/storefront_api';\r\nimport { productCache } from '../../utils/caching/productCache';\r\nimport { createErrorHandler } from '../../utils/error_handling/factory';\r\n\r\nconst BLOCK = 'iv-dynamic-products-carousel';\r\n\r\n@Component({\r\n tag: 'iv-dynamic-products-carousel',\r\n styleUrl: 'iv-dynamic-products-carousel.scss',\r\n shadow: false\r\n})\r\n\r\nexport class IvDynamicProductsCarousel {\r\n @Prop() type: 'CREATED' | 'CREATED_AT' | 'BEST_SELLING' | 'PRICE' | 'TITLE' | 'RELEVANCE' = 'CREATED_AT'; \r\n @Prop() limit: number = 24;\r\n @Prop() reversed: boolean = false; \r\n @Prop() componenttitle?: string;\r\n @Prop() titletag: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' = 'h2';\r\n @Prop() collectionhandle: string = 'all';\r\n @Prop() requestedfields: string;\r\n @Prop() calltoaction: boolean = false;\r\n @Prop() buttontext?: string;\r\n @Prop() addtocarttext?: string;\r\n @Prop() emptystring: string = 'No products found';\r\n @Prop() cachettl?: number; \r\n @Prop() stale?: boolean = true;\r\n @Prop() exclude?: string;\r\n \r\n @State() products: any[] = [];\r\n @State() errorMsg: string; \r\n @State() staleData: boolean = false;\r\n @State() page: number = 0; \r\n\r\n private readonly itemsPerPage = 6;\r\n\r\n private errors = createErrorHandler({ component: 'iv-dynamic-products-carousel' });\r\n\r\n @Watch('type')\r\n @Watch('limit')\r\n @Watch('collectionhandle')\r\n @Watch('requestedfields')\r\n handlePropChange() { this.loadProducts(true); }\r\n\r\n async componentWillLoad() { \r\n await this.loadProducts(false); \r\n };\r\n \r\n private buildParams() {\r\n return {\r\n handle: this.collectionhandle,\r\n sort: this.type,\r\n fields: this.requestedfields,\r\n limit: 36, // Always fetch 36 products for filtering\r\n currency: state.currencyCode,\r\n reversed: this.reversed\r\n };\r\n };\r\n\r\n private ensureProductTypeField(fields: string): string {\r\n if(!fields) return 'productType';\r\n const arr = fields.split(',').map(f => f.trim());\r\n if(!arr.includes('productType')) arr.push('productType');\r\n return arr.join(',');\r\n };\r\n\r\n private filterAndSliceProducts(data: any[]): any[] {\r\n if(!this.exclude) return data.slice(0, this.limit);\r\n if(!this.requestedfields || !this.requestedfields.includes('productType')) {\r\n this.requestedfields = this.ensureProductTypeField(this.requestedfields);\r\n };\r\n const filtered = data.filter(p => p.productType !== this.exclude);\r\n return filtered.slice(0, this.limit);\r\n };\r\n\r\n private async loadProducts(fromWatch: boolean) {\r\n const params = this.buildParams();\r\n const ttl = this.cachettl || 1000 * 60 * 5;\r\n state.loading = !fromWatch;\r\n try {\r\n const data = await productCache.getOrSetData(\r\n params,\r\n async () => {\r\n const fresh = await fetchProducts(\r\n 36, \r\n this.collectionhandle, \r\n this.type, \r\n this.requestedfields, \r\n this.reversed\r\n );\r\n return fresh;\r\n },\r\n {\r\n ttl,\r\n staleWhileRevalidate: this.stale,\r\n transform: (fresh) => fresh \r\n }\r\n );\r\n const metaCheck = productCache.getData<typeof data>(params);\r\n this.staleData = metaCheck.isExpired && metaCheck.isStale;\r\n this.products = Array.isArray(data) ? this.filterAndSliceProducts(data) : [];\r\n this.page = 0;\r\n } catch (err: any) {\r\n this.errorMsg = 'Failed to load products';\r\n this.errors.handle({\r\n error: err,\r\n scope: 'loadProducts',\r\n userMessage: 'Unable to load products right now.',\r\n devMessage: 'fetchProducts failed in iv-dynamic-products',\r\n severity: 'error'\r\n });\r\n } finally {\r\n state.loading = false;\r\n };\r\n };\r\n \r\n private pagedProducts() {\r\n const chunks: any[][] = [];\r\n for(let i=0; i < this.products.length; i += this.itemsPerPage) {\r\n chunks.push(this.products.slice(i, i + this.itemsPerPage));\r\n };\r\n return chunks;\r\n };\r\n\r\n private next = () => { \r\n const pages = this.pagedProducts().length;\r\n if(this.page < pages - 1) this.page++;\r\n };\r\n\r\n private prev = () => { \r\n if(this.page > 0) this.page--;\r\n };\r\n\r\n render() {\r\n\r\n const TAG = this.titletag as any;\r\n\r\n return (\r\n <div class={BLOCK} data-stale={this.staleData ? 'true' : 'false'}>\r\n {this.componenttitle && <TAG class={`${BLOCK}-title`}>{this.componenttitle}</TAG>}\r\n {state.loading ? (\r\n <iv-spinner></iv-spinner>\r\n ) : this.errorMsg ? (\r\n <div class={`${BLOCK}-error`}>{this.errorMsg}</div>\r\n ) : this.products.length === 0 ? (\r\n <div class={`${BLOCK}-empty`}>{this.emptystring}</div>\r\n ) : (\r\n <div class={`${BLOCK}-carousel`} aria-roledescription=\"carousel\">\r\n <button class={`${BLOCK}-nav ${BLOCK}-nav-prev`} onClick={this.prev} disabled={this.page===0} aria-label=\"Previous\" type=\"button\">\r\n ‹\r\n </button>\r\n <div class={`${BLOCK}-viewport`}>\r\n <div class={`${BLOCK}-track`} style={{ transform: `translateX(-${this.page * 100}%)` }}>\r\n {this.pagedProducts().map((group, i) => (\r\n <div class={`${BLOCK}-slide`} role=\"group\" aria-label={`Slide ${i+1} of ${this.pagedProducts().length}`}> \r\n {group.map(product => (\r\n <iv-card\r\n cardtype='products'\r\n calltoaction={this.calltoaction}\r\n buttontext={this.buttontext}\r\n addtocarttext={this.addtocarttext}\r\n data={product}\r\n classmodifier={`${BLOCK}-card`} />\r\n ))}\r\n </div>\r\n ))}\r\n </div>\r\n </div>\r\n <button class={`${BLOCK}-nav ${BLOCK}-nav-next`} onClick={this.next} disabled={this.page===this.pagedProducts().length-1} aria-label=\"Next\" type=\"button\">\r\n ›\r\n </button>\r\n <div class={`${BLOCK}-status`} aria-live=\"polite\">{this.pagedProducts().length > 1 ? `Slide ${this.page+1} of ${this.pagedProducts().length}` : ''}</div>\r\n {this.staleData && (\r\n <div class={`${BLOCK}-stale-indicator`} aria-live=\"polite\">Refreshing…</div>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n };\r\n\r\n};"]}
|
|
@@ -401,7 +401,7 @@ export class IvNewsletter {
|
|
|
401
401
|
"references": {
|
|
402
402
|
"NewsletterSuccessDetail": {
|
|
403
403
|
"location": "local",
|
|
404
|
-
"path": "C:/Users/bbuxt/OneDrive/Documents/Development/Freelance/
|
|
404
|
+
"path": "C:/Users/bbuxt/OneDrive/Documents/Development/Freelance/The-Foxy-Library/src/components/iv-newsletter/iv-newsletter.tsx",
|
|
405
405
|
"id": "src/components/iv-newsletter/iv-newsletter.tsx::NewsletterSuccessDetail"
|
|
406
406
|
}
|
|
407
407
|
}
|
|
@@ -422,7 +422,7 @@ export class IvNewsletter {
|
|
|
422
422
|
"references": {
|
|
423
423
|
"NewsletterFailDetail": {
|
|
424
424
|
"location": "local",
|
|
425
|
-
"path": "C:/Users/bbuxt/OneDrive/Documents/Development/Freelance/
|
|
425
|
+
"path": "C:/Users/bbuxt/OneDrive/Documents/Development/Freelance/The-Foxy-Library/src/components/iv-newsletter/iv-newsletter.tsx",
|
|
426
426
|
"id": "src/components/iv-newsletter/iv-newsletter.tsx::NewsletterFailDetail"
|
|
427
427
|
}
|
|
428
428
|
}
|
|
@@ -8,11 +8,12 @@ export class IvPill {
|
|
|
8
8
|
externalspacing = 'none';
|
|
9
9
|
roundedcorners = 'medium';
|
|
10
10
|
render() {
|
|
11
|
-
return (h("div", { key: '
|
|
11
|
+
return (h("div", { key: '0babc05c3604fd666838d6bea498781d569a4f6f', class: BLOCK
|
|
12
|
+
+ (this.bordered ? ' bordered' : '')
|
|
12
13
|
+ ` internal-${this.internalspacing}`
|
|
13
14
|
+ ` external-${this.externalspacing}`
|
|
14
|
-
+ ` corners-${this.roundedcorners}` }, h("p", { key: '
|
|
15
|
-
h("span", { key: '
|
|
15
|
+
+ ` corners-${this.roundedcorners}` }, h("p", { key: '51816bcac1a1f30311b93eb0eddc5d7f6f5d6952', class: `${BLOCK}-content` }, this.label &&
|
|
16
|
+
h("span", { key: 'ef3aa3d8a44e23e469560501d71fc4b1409796f5', class: `${BLOCK}-label` }, this.label), this.content)));
|
|
16
17
|
}
|
|
17
18
|
;
|
|
18
19
|
static get is() { return "iv-pill"; }
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"iv-pill.js","sourceRoot":"","sources":["../../../src/components/iv-pill/iv-pill.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,KAAK,GAAG,SAAS,CAAC;AAQxB,MAAM,OAAO,MAAM;IAET,KAAK,CAAU;IACf,OAAO,CAAS;IAChB,QAAQ,GAAY,IAAI,CAAC;IACzB,eAAe,GAAiC,QAAQ,CAAC;IACzD,eAAe,GAA0C,MAAM,CAAC;IAChE,cAAc,GAA0C,QAAQ,CAAC;IAEzE,MAAM;QAEJ,OAAO,CACL,4DAAK,KAAK,EACR,KAAK,
|
|
1
|
+
{"version":3,"file":"iv-pill.js","sourceRoot":"","sources":["../../../src/components/iv-pill/iv-pill.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,KAAK,GAAG,SAAS,CAAC;AAQxB,MAAM,OAAO,MAAM;IAET,KAAK,CAAU;IACf,OAAO,CAAS;IAChB,QAAQ,GAAY,IAAI,CAAC;IACzB,eAAe,GAAiC,QAAQ,CAAC;IACzD,eAAe,GAA0C,MAAM,CAAC;IAChE,cAAc,GAA0C,QAAQ,CAAC;IAEzE,MAAM;QAEJ,OAAO,CACL,4DAAK,KAAK,EACR,KAAK;kBACH,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;kBAClC,aAAa,IAAI,CAAC,eAAe,EAAE;kBACnC,aAAa,IAAI,CAAC,eAAe,EAAE;kBACnC,YAAY,IAAI,CAAC,cAAc,EAAE;YAEnC,0DAAG,KAAK,EAAE,GAAG,KAAK,UAAU;gBACzB,IAAI,CAAC,KAAK;oBACT,6DAAM,KAAK,EAAE,GAAG,KAAK,QAAQ,IAAG,IAAI,CAAC,KAAK,CAAQ;gBAEnD,IAAI,CAAC,OAAO,CACX,CACA,CACP,CAAC;IAEJ,CAAC;IAAA,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAEH;AAAA,CAAC","sourcesContent":["import { Component, h, Prop } from '@stencil/core';\n\nconst BLOCK = 'iv-pill';\n\n@Component({\n tag: 'iv-pill',\n styleUrl: 'iv-pill.scss',\n shadow: false\n})\n\nexport class IvPill {\n\n @Prop() label?: string;\n @Prop() content: string;\n @Prop() bordered: boolean = true;\n @Prop() internalspacing: 'small' | 'medium' | 'large' = 'medium';\n @Prop() externalspacing: 'none' | 'small' | 'medium' | 'large' = 'none';\n @Prop() roundedcorners: 'none' | 'small' | 'medium' | 'large' = 'medium';\n\n render() {\n\n return (\n <div class={\n BLOCK \n + (this.bordered ? ' bordered' : '')\n + ` internal-${this.internalspacing}`\n + ` external-${this.externalspacing}`\n + ` corners-${this.roundedcorners}`\n }>\n <p class={`${BLOCK}-content`}>\n {this.label && \n <span class={`${BLOCK}-label`}>{this.label}</span>\n }\n {this.content}\n </p>\n </div>\n );\n\n };\n\n};"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"index.js","mappings":";;;AACO,MAAM,aAAa,GAAGA,IAAe;;SCD5B,MAAM,CAAC,KAAc,EAAE,MAAe,EAAE,IAAa,EAAA;AACnE,IAAA,OAAO,CAAC,KAAK,IAAI,EAAE,KAAK,MAAM,GAAG,CAAI,CAAA,EAAA,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,CAAI,CAAA,EAAA,IAAI,EAAE,GAAG,EAAE,CAAC;AAChF;;;;;;","names":["appGlobalScript"],"sources":["@stencil/core/internal/app-globals","src/utils/utils.ts"],"sourcesContent":["import appGlobalScript from 'C:/Users/bbuxt/OneDrive/Documents/Development/Freelance/
|
|
1
|
+
{"file":"index.js","mappings":";;;AACO,MAAM,aAAa,GAAGA,IAAe;;SCD5B,MAAM,CAAC,KAAc,EAAE,MAAe,EAAE,IAAa,EAAA;AACnE,IAAA,OAAO,CAAC,KAAK,IAAI,EAAE,KAAK,MAAM,GAAG,CAAI,CAAA,EAAA,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,IAAI,GAAG,CAAI,CAAA,EAAA,IAAI,EAAE,GAAG,EAAE,CAAC;AAChF;;;;;;","names":["appGlobalScript"],"sources":["@stencil/core/internal/app-globals","src/utils/utils.ts"],"sourcesContent":["import appGlobalScript from 'C:/Users/bbuxt/OneDrive/Documents/Development/Freelance/The-Foxy-Library/src/global/app.ts';\nexport const globalScripts = appGlobalScript;\nexport const globalStyles = \"\";\n","export function format(first?: string, middle?: string, last?: string): string {\r\n return (first || '') + (middle ? ` ${middle}` : '') + (last ? ` ${last}` : '');\r\n};"],"version":3}
|
|
@@ -158,7 +158,7 @@ const IvDynamicProductsCarousel$1 = /*@__PURE__*/ proxyCustomElement(class IvDyn
|
|
|
158
158
|
emptystring = 'No products found';
|
|
159
159
|
cachettl;
|
|
160
160
|
stale = true;
|
|
161
|
-
|
|
161
|
+
exclude;
|
|
162
162
|
products = [];
|
|
163
163
|
errorMsg;
|
|
164
164
|
staleData = false;
|
|
@@ -191,12 +191,12 @@ const IvDynamicProductsCarousel$1 = /*@__PURE__*/ proxyCustomElement(class IvDyn
|
|
|
191
191
|
}
|
|
192
192
|
;
|
|
193
193
|
filterAndSliceProducts(data) {
|
|
194
|
-
if (!this.
|
|
194
|
+
if (!this.exclude)
|
|
195
195
|
return data.slice(0, this.limit);
|
|
196
196
|
if (!this.requestedfields || !this.requestedfields.includes('productType')) {
|
|
197
197
|
this.requestedfields = this.ensureProductTypeField(this.requestedfields);
|
|
198
198
|
}
|
|
199
|
-
const filtered = data.filter(p => p.productType !== this.
|
|
199
|
+
const filtered = data.filter(p => p.productType !== this.exclude);
|
|
200
200
|
return filtered.slice(0, this.limit);
|
|
201
201
|
}
|
|
202
202
|
;
|
|
@@ -276,7 +276,7 @@ const IvDynamicProductsCarousel$1 = /*@__PURE__*/ proxyCustomElement(class IvDyn
|
|
|
276
276
|
"emptystring": [1],
|
|
277
277
|
"cachettl": [2],
|
|
278
278
|
"stale": [4],
|
|
279
|
-
"
|
|
279
|
+
"exclude": [1],
|
|
280
280
|
"products": [32],
|
|
281
281
|
"errorMsg": [32],
|
|
282
282
|
"staleData": [32],
|