the-foxy-library 1.0.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.
Files changed (125) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +111 -0
  3. package/dist/components/index.d.ts +33 -0
  4. package/dist/components/iv-accordion.d.ts +11 -0
  5. package/dist/components/iv-banner.d.ts +11 -0
  6. package/dist/components/iv-button.d.ts +11 -0
  7. package/dist/components/iv-card.d.ts +11 -0
  8. package/dist/components/iv-carousel.d.ts +11 -0
  9. package/dist/components/iv-dynamic-products-carousel.d.ts +11 -0
  10. package/dist/components/iv-dynamic-products.d.ts +11 -0
  11. package/dist/components/iv-filters.d.ts +11 -0
  12. package/dist/components/iv-layout.d.ts +11 -0
  13. package/dist/components/iv-link.d.ts +11 -0
  14. package/dist/components/iv-modal.d.ts +11 -0
  15. package/dist/components/iv-predictive-search.d.ts +11 -0
  16. package/dist/components/iv-recently-viewed.d.ts +11 -0
  17. package/dist/components/iv-sidebar.d.ts +11 -0
  18. package/dist/components/iv-spinner.d.ts +11 -0
  19. package/dist/components/iv-suggest.d.ts +11 -0
  20. package/dist/components/iv-tabs.d.ts +11 -0
  21. package/dist/components/iv-toast-container.d.ts +11 -0
  22. package/dist/components/iv-toast.d.ts +11 -0
  23. package/dist/components/iv-wishlist-view.d.ts +11 -0
  24. package/dist/components/iv-wishlist.d.ts +11 -0
  25. package/dist/components/sw-in-grid-content.d.ts +11 -0
  26. package/dist/components/sw-size-guide.d.ts +11 -0
  27. package/dist/intravenous/factory-1QinX-o0.js +275 -0
  28. package/dist/intravenous/factory-1QinX-o0.js.map +1 -0
  29. package/dist/intravenous/factory-JClanx-E.js +596 -0
  30. package/dist/intravenous/factory-JClanx-E.js.map +1 -0
  31. package/dist/intravenous/factory-mrqy6XUM.js +36 -0
  32. package/dist/intravenous/factory-mrqy6XUM.js.map +1 -0
  33. package/dist/intravenous/index-Py50VI8u.js +4761 -0
  34. package/dist/intravenous/index-Py50VI8u.js.map +1 -0
  35. package/dist/intravenous/index.esm.js +17 -0
  36. package/dist/intravenous/index.esm.js.map +1 -0
  37. package/dist/intravenous/intravenous.esm.js +48 -0
  38. package/dist/intravenous/intravenous.esm.js.map +1 -0
  39. package/dist/intravenous/iv-accordion.entry.esm.js.map +1 -0
  40. package/dist/intravenous/iv-accordion.entry.js +35 -0
  41. package/dist/intravenous/iv-banner.entry.esm.js.map +1 -0
  42. package/dist/intravenous/iv-banner.entry.js +28 -0
  43. package/dist/intravenous/iv-button.entry.esm.js.map +1 -0
  44. package/dist/intravenous/iv-button.entry.js +40 -0
  45. package/dist/intravenous/iv-card.entry.esm.js.map +1 -0
  46. package/dist/intravenous/iv-card.entry.js +82 -0
  47. package/dist/intravenous/iv-carousel.entry.esm.js.map +1 -0
  48. package/dist/intravenous/iv-carousel.entry.js +16 -0
  49. package/dist/intravenous/iv-dynamic-products-carousel.entry.esm.js.map +1 -0
  50. package/dist/intravenous/iv-dynamic-products-carousel.entry.js +114 -0
  51. package/dist/intravenous/iv-dynamic-products.entry.esm.js.map +1 -0
  52. package/dist/intravenous/iv-dynamic-products.entry.js +97 -0
  53. package/dist/intravenous/iv-filters.entry.esm.js.map +1 -0
  54. package/dist/intravenous/iv-filters.entry.js +19 -0
  55. package/dist/intravenous/iv-layout.entry.esm.js.map +1 -0
  56. package/dist/intravenous/iv-layout.entry.js +60 -0
  57. package/dist/intravenous/iv-link.entry.esm.js.map +1 -0
  58. package/dist/intravenous/iv-link.entry.js +25 -0
  59. package/dist/intravenous/iv-modal.entry.esm.js.map +1 -0
  60. package/dist/intravenous/iv-modal.entry.js +19 -0
  61. package/dist/intravenous/iv-predictive-search.entry.esm.js.map +1 -0
  62. package/dist/intravenous/iv-predictive-search.entry.js +311 -0
  63. package/dist/intravenous/iv-recently-viewed.entry.esm.js.map +1 -0
  64. package/dist/intravenous/iv-recently-viewed.entry.js +101 -0
  65. package/dist/intravenous/iv-sidebar.entry.esm.js.map +1 -0
  66. package/dist/intravenous/iv-sidebar.entry.js +24 -0
  67. package/dist/intravenous/iv-spinner.entry.esm.js.map +1 -0
  68. package/dist/intravenous/iv-spinner.entry.js +19 -0
  69. package/dist/intravenous/iv-suggest.entry.esm.js.map +1 -0
  70. package/dist/intravenous/iv-suggest.entry.js +72 -0
  71. package/dist/intravenous/iv-tabs.entry.esm.js.map +1 -0
  72. package/dist/intravenous/iv-tabs.entry.js +22 -0
  73. package/dist/intravenous/iv-toast-container.entry.esm.js.map +1 -0
  74. package/dist/intravenous/iv-toast-container.entry.js +44 -0
  75. package/dist/intravenous/iv-toast.entry.esm.js.map +1 -0
  76. package/dist/intravenous/iv-toast.entry.js +23 -0
  77. package/dist/intravenous/iv-wishlist-view.entry.esm.js.map +1 -0
  78. package/dist/intravenous/iv-wishlist-view.entry.js +21 -0
  79. package/dist/intravenous/iv-wishlist.entry.esm.js.map +1 -0
  80. package/dist/intravenous/iv-wishlist.entry.js +73 -0
  81. package/dist/intravenous/loader.esm.js.map +1 -0
  82. package/dist/intravenous/sw-in-grid-content.entry.esm.js.map +1 -0
  83. package/dist/intravenous/sw-in-grid-content.entry.js +18 -0
  84. package/dist/intravenous/sw-size-guide.entry.esm.js.map +1 -0
  85. package/dist/intravenous/sw-size-guide.entry.js +111 -0
  86. package/dist/types/components/iv-accordion/iv-accordion.d.ts +12 -0
  87. package/dist/types/components/iv-banner/iv-banner.d.ts +7 -0
  88. package/dist/types/components/iv-button/iv-button.d.ts +12 -0
  89. package/dist/types/components/iv-card/iv-card.d.ts +15 -0
  90. package/dist/types/components/iv-carousel/iv-carousel.d.ts +3 -0
  91. package/dist/types/components/iv-dynamic-products/iv-dynamic-products.d.ts +26 -0
  92. package/dist/types/components/iv-dynamic-products-carousel/iv-dynamic-products-carousel.d.ts +29 -0
  93. package/dist/types/components/iv-filters/iv-filters.d.ts +3 -0
  94. package/dist/types/components/iv-layout/iv-layout.d.ts +12 -0
  95. package/dist/types/components/iv-link/iv-link.d.ts +9 -0
  96. package/dist/types/components/iv-modal/iv-modal.d.ts +3 -0
  97. package/dist/types/components/iv-predictive-search/iv-predictive-search.d.ts +44 -0
  98. package/dist/types/components/iv-recently-viewed/iv-recently-viewed.d.ts +17 -0
  99. package/dist/types/components/iv-sidebar/iv-sidebar.d.ts +5 -0
  100. package/dist/types/components/iv-spinner/iv-spinner.d.ts +4 -0
  101. package/dist/types/components/iv-suggest/iv-suggest.d.ts +21 -0
  102. package/dist/types/components/iv-tabs/iv-tabs.d.ts +7 -0
  103. package/dist/types/components/iv-toast/iv-toast.d.ts +7 -0
  104. package/dist/types/components/iv-toast-container/iv-toast-container.d.ts +8 -0
  105. package/dist/types/components/iv-wishlist/iv-wishlist.d.ts +16 -0
  106. package/dist/types/components/iv-wishlist-view/iv-wishlist-view.d.ts +3 -0
  107. package/dist/types/components/sw-in-grid-content/sw-in-grid-content.d.ts +3 -0
  108. package/dist/types/components/sw-size-guide/sw-size-guide.d.ts +14 -0
  109. package/dist/types/components.d.ts +943 -0
  110. package/dist/types/global/app.d.ts +1 -0
  111. package/dist/types/index.d.ts +11 -0
  112. package/dist/types/stencil-public-runtime.d.ts +1746 -0
  113. package/dist/types/utils/caching/factory.d.ts +72 -0
  114. package/dist/types/utils/config/factory.d.ts +2 -0
  115. package/dist/types/utils/error_handling/factory.d.ts +58 -0
  116. package/dist/types/utils/helpers/factory.d.ts +6 -0
  117. package/dist/types/utils/store/store.d.ts +21 -0
  118. package/dist/types/utils/storefront_api/factory.d.ts +22 -0
  119. package/dist/types/utils/utils.d.ts +1 -0
  120. package/loader/cdn.js +1 -0
  121. package/loader/index.cjs.js +1 -0
  122. package/loader/index.d.ts +24 -0
  123. package/loader/index.es2017.js +1 -0
  124. package/loader/index.js +2 -0
  125. package/package.json +54 -0
@@ -0,0 +1,17 @@
1
+ function format(first, middle, last) {
2
+ return (first || '') + (middle ? ` ${middle}` : '') + (last ? ` ${last}` : '');
3
+ }
4
+ ;
5
+
6
+ /**
7
+ * @fileoverview entry point for your component library
8
+ *
9
+ * This is the entry point for your component library. Use this file to export utilities,
10
+ * constants or data structure that accompany your components.
11
+ *
12
+ * DO NOT use this file to export your components. Instead, use the recommended approaches
13
+ * to consume components of this package as outlined in the `README.md`.
14
+ */
15
+
16
+ export { format };
17
+ //# sourceMappingURL=index.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.esm.js","sources":["src/utils/utils.ts","src/index.ts"],"sourcesContent":["export function format(first?: string, middle?: string, last?: string): string {\n return (first || '') + (middle ? ` ${middle}` : '') + (last ? ` ${last}` : '');\n};","/**\n * @fileoverview entry point for your component library\n *\n * This is the entry point for your component library. Use this file to export utilities,\n * constants or data structure that accompany your components.\n *\n * DO NOT use this file to export your components. Instead, use the recommended approaches\n * to consume components of this package as outlined in the `README.md`.\n */\nexport { format } from './utils/utils';\nexport type * from './components.d.ts';"],"names":[],"mappings":"SAAgB,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;AAAC;;ACFD;;;;;;;;AAQG;;;;"}
@@ -0,0 +1,48 @@
1
+ import { B as BUILD, c as consoleDevInfo, H, w as win, N as NAMESPACE, p as promiseResolve, g as globalScripts, b as bootstrapLazy } from './index-Py50VI8u.js';
2
+ export { s as setNonce } from './index-Py50VI8u.js';
3
+
4
+ /*
5
+ Stencil Client Patch Browser v4.38.0 | MIT Licensed | https://stenciljs.com
6
+ */
7
+
8
+ var patchBrowser = () => {
9
+ if (BUILD.isDev && !BUILD.isTesting) {
10
+ consoleDevInfo("Running in development mode.");
11
+ }
12
+ if (BUILD.cloneNodeFix) {
13
+ patchCloneNodeFix(H.prototype);
14
+ }
15
+ const scriptElm = BUILD.scriptDataOpts ? win.document && Array.from(win.document.querySelectorAll("script")).find(
16
+ (s) => new RegExp(`/${NAMESPACE}(\\.esm)?\\.js($|\\?|#)`).test(s.src) || s.getAttribute("data-stencil-namespace") === NAMESPACE
17
+ ) : null;
18
+ const importMeta = import.meta.url;
19
+ const opts = BUILD.scriptDataOpts ? (scriptElm || {})["data-opts"] || {} : {};
20
+ if (importMeta !== "") {
21
+ opts.resourcesUrl = new URL(".", importMeta).href;
22
+ }
23
+ return promiseResolve(opts);
24
+ };
25
+ var patchCloneNodeFix = (HTMLElementPrototype) => {
26
+ const nativeCloneNodeFn = HTMLElementPrototype.cloneNode;
27
+ HTMLElementPrototype.cloneNode = function(deep) {
28
+ if (this.nodeName === "TEMPLATE") {
29
+ return nativeCloneNodeFn.call(this, deep);
30
+ }
31
+ const clonedNode = nativeCloneNodeFn.call(this, false);
32
+ const srcChildNodes = this.childNodes;
33
+ if (deep) {
34
+ for (let i = 0; i < srcChildNodes.length; i++) {
35
+ if (srcChildNodes[i].nodeType !== 2) {
36
+ clonedNode.appendChild(srcChildNodes[i].cloneNode(true));
37
+ }
38
+ }
39
+ }
40
+ return clonedNode;
41
+ };
42
+ };
43
+
44
+ patchBrowser().then(async (options) => {
45
+ await globalScripts();
46
+ return bootstrapLazy([["iv-dynamic-products",[[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",[[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",[[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],"products":[32],"errorMsg":[32],"staleData":[32],"page":[32]},null,{"type":["handlePropChange"],"limit":["handlePropChange"],"collectionhandle":["handlePropChange"],"requestedfields":["handlePropChange"]}]]],["iv-predictive-search",[[256,"iv-predictive-search",{"searchlabel":[1],"labelposition":[1],"action":[1],"method":[1],"placeholder":[1],"minchars":[2],"debounce":[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",[[256,"iv-recently-viewed",{"componenttitle":[1],"titletag":[1],"numbertoshow":[2],"noviewhistory":[1],"requestedfields":[1],"items":[32]}]]],["iv-modal",[[257,"iv-modal"]]],["iv-sidebar",[[260,"iv-sidebar",{"closeicon":[1]},[[8,"openPullout","handleOpenPullout"]]]]],["iv-toast-container",[[256,"iv-toast-container",{"_bump":[32]}]]],["iv-wishlist",[[256,"iv-wishlist",{"buttonaddvalue":[1],"buttonremovevalue":[1],"wishlistempty":[1],"buttonaddtocartvalue":[1],"viewwishlistvalue":[1],"productdata":[1],"usefields":[1],"previewtype":[1]}]]],["iv-accordion",[[260,"iv-accordion",{"classmodifier":[1],"accordiontype":[1],"accordionlabels":[1],"showmultiple":[4],"showfirst":[4],"startingpanel":[2],"layout":[1],"activePanel":[32]}]]],["iv-carousel",[[257,"iv-carousel"]]],["iv-filters",[[256,"iv-filters"]]],["sw-in-grid-content",[[260,"sw-in-grid-content"]]],["sw-size-guide",[[260,"sw-size-guide",{"sizeUnits":[32]}]]],["iv-banner",[[260,"iv-banner",{"classmodifier":[1],"bannerurl":[1],"bannerbuttontext":[1],"bannertype":[1]}]]],["iv-tabs",[[260,"iv-tabs",{"labels":[16],"classModifier":[1,"class-modifier"],"tabLayout":[1,"tab-layout"],"activeTab":[32]}]]],["iv-toast",[[256,"iv-toast",{"message":[1],"toastId":[2,"toast-id"],"duration":[2],"type":[1]}]]],["iv-button",[[260,"iv-button",{"type":[1],"classmodifier":[1],"eventname":[1],"eventdetail":[1],"buttonClick":[16]}]]],["iv-wishlist-view",[[256,"iv-wishlist-view"]]],["iv-spinner",[[256,"iv-spinner",{"show":[4]}]]],["iv-link",[[260,"iv-link",{"classmodifier":[1],"linktype":[1],"linkhref":[1],"linktarget":[1],"linkrel":[1],"linkariaLabel":[1,"linkaria-label"]}]]],["iv-card",[[256,"iv-card",{"data":[16],"fields":[1],"cardtype":[1],"classmodifier":[1],"buttontext":[1],"calltoaction":[4],"addtocarttext":[1]}]]],["iv-layout",[[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"]}]]]], options);
47
+ });
48
+ //# sourceMappingURL=intravenous.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intravenous.esm.js","sources":["node_modules/@stencil/core/internal/client/patch-browser.js","@lazy-browser-entrypoint?app-data=conditional"],"sourcesContent":["/*\n Stencil Client Patch Browser v4.38.0 | MIT Licensed | https://stenciljs.com\n */\n\n// src/client/client-patch-browser.ts\nimport { BUILD, NAMESPACE } from \"@stencil/core/internal/app-data\";\nimport { consoleDevInfo, H, promiseResolve, win } from \"@stencil/core\";\nvar patchBrowser = () => {\n if (BUILD.isDev && !BUILD.isTesting) {\n consoleDevInfo(\"Running in development mode.\");\n }\n if (BUILD.cloneNodeFix) {\n patchCloneNodeFix(H.prototype);\n }\n const scriptElm = BUILD.scriptDataOpts ? win.document && Array.from(win.document.querySelectorAll(\"script\")).find(\n (s) => new RegExp(`/${NAMESPACE}(\\\\.esm)?\\\\.js($|\\\\?|#)`).test(s.src) || s.getAttribute(\"data-stencil-namespace\") === NAMESPACE\n ) : null;\n const importMeta = import.meta.url;\n const opts = BUILD.scriptDataOpts ? (scriptElm || {})[\"data-opts\"] || {} : {};\n if (importMeta !== \"\") {\n opts.resourcesUrl = new URL(\".\", importMeta).href;\n }\n return promiseResolve(opts);\n};\nvar patchCloneNodeFix = (HTMLElementPrototype) => {\n const nativeCloneNodeFn = HTMLElementPrototype.cloneNode;\n HTMLElementPrototype.cloneNode = function(deep) {\n if (this.nodeName === \"TEMPLATE\") {\n return nativeCloneNodeFn.call(this, deep);\n }\n const clonedNode = nativeCloneNodeFn.call(this, false);\n const srcChildNodes = this.childNodes;\n if (deep) {\n for (let i = 0; i < srcChildNodes.length; i++) {\n if (srcChildNodes[i].nodeType !== 2) {\n clonedNode.appendChild(srcChildNodes[i].cloneNode(true));\n }\n }\n }\n return clonedNode;\n };\n};\nexport {\n patchBrowser\n};\n","export { setNonce } from '@stencil/core';\nimport { bootstrapLazy } from '@stencil/core';\nimport { patchBrowser } from '@stencil/core/internal/client/patch-browser';\nimport { globalScripts } from '@stencil/core/internal/app-globals';\npatchBrowser().then(async (options) => {\n await globalScripts();\n return bootstrapLazy([/*!__STENCIL_LAZY_DATA__*/], options);\n});\n"],"names":[],"mappings":";;;AAAA;AACA;AACA;;AAKA,IAAI,YAAY,GAAG,MAAM;AACzB,EAAE,IAAI,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;AACvC,IAAI,cAAc,CAAC,8BAA8B,CAAC;AAClD;AACA,EAAE,IAAI,KAAK,CAAC,YAAY,EAAE;AAC1B,IAAI,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC;AAClC;AACA,EAAE,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,GAAG,GAAG,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI;AACnH,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,uBAAuB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,wBAAwB,CAAC,KAAK;AAC1H,GAAG,GAAG,IAAI;AACV,EAAE,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG;AACpC,EAAE,MAAM,IAAI,GAAG,KAAK,CAAC,cAAc,GAAG,CAAC,SAAS,IAAI,EAAE,EAAE,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE;AAC/E,EAAE,IAAI,UAAU,KAAK,EAAE,EAAE;AACzB,IAAI,IAAI,CAAC,YAAY,GAAG,IAAI,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC,IAAI;AACrD;AACA,EAAE,OAAO,cAAc,CAAC,IAAI,CAAC;AAC7B,CAAC;AACD,IAAI,iBAAiB,GAAG,CAAC,oBAAoB,KAAK;AAClD,EAAE,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,SAAS;AAC1D,EAAE,oBAAoB,CAAC,SAAS,GAAG,SAAS,IAAI,EAAE;AAClD,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,UAAU,EAAE;AACtC,MAAM,OAAO,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;AAC/C;AACA,IAAI,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC;AAC1D,IAAI,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU;AACzC,IAAI,IAAI,IAAI,EAAE;AACd,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrD,QAAQ,IAAI,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,EAAE;AAC7C,UAAU,UAAU,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAClE;AACA;AACA;AACA,IAAI,OAAO,UAAU;AACrB,GAAG;AACH,CAAC;;ACrCD,YAAY,EAAE,CAAC,IAAI,CAAC,OAAO,OAAO,KAAK;AACvC,EAAE,MAAM,aAAa,EAAE;AACvB,EAAE,OAAO,aAAa,CAAC,4BAA4B,EAAE,OAAO,CAAC;AAC7D,CAAC,CAAC","x_google_ignoreList":[0]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iv-accordion.entry.esm.js","sources":["src/components/iv-accordion/iv-accordion.scss?tag=iv-accordion","src/components/iv-accordion/iv-accordion.tsx"],"sourcesContent":[":host {\n display: block;\n}\n","import { Component, h, Prop, State } from '@stencil/core';\n\nconst BLOCK = 'iv-accordion'\n\n@Component({\n tag: 'iv-accordion',\n styleUrl: 'iv-accordion.scss',\n shadow: false\n})\n\nexport class IvAccordion {\n\n @Prop() classmodifier?: string;\n @Prop() accordiontype: 'div' | 'section' | 'article' = 'div';\n @Prop() accordionlabels: string;\n @Prop() showmultiple: boolean = false;\n @Prop() showfirst: boolean = false;\n @Prop() startingpanel: number = 0;\n @Prop() layout: 'vertical' | 'horizontal' = 'horizontal';\n\n @State() activePanel: string;\n\n private interimLabels(): string [] {\n let labelsArray = [];\n this.accordionlabels.split(',').forEach(label => {\n labelsArray.push(label.trim());\n });\n return labelsArray;\n };\n\n render() {\n\n return (\n <div class={BLOCK}>\n\n <div class={`${BLOCK}-labels`}>\n {this.accordionlabels && this.interimLabels().map((label: string, index: number) => (\n <button\n onClick={() => this.activePanel = `panel-${index}`}>\n {label}\n </button>\n ))}\n </div>\n\n <div class={`${BLOCK}-content-panel`}>\n <slot name={this.activePanel}></slot>\n </div>\n\n </div>\n );\n\n };\n\n};"],"names":[],"mappings":";;AAAA,MAAM,cAAc,GAAG,sBAAsB;;ACE7C,MAAM,KAAK,GAAG,cAAc;MAQf,WAAW,GAAA,MAAA;;;;AAEd,IAAA,aAAa;IACb,aAAa,GAAkC,KAAK;AACpD,IAAA,eAAe;IACf,YAAY,GAAY,KAAK;IAC7B,SAAS,GAAY,KAAK;IAC1B,aAAa,GAAW,CAAC;IACzB,MAAM,GAA8B,YAAY;AAE/C,IAAA,WAAW;IAEZ,aAAa,GAAA;QACnB,IAAI,WAAW,GAAG,EAAE;AACpB,QAAA,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,IAAG;YAC9C,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;AAChC,SAAC,CAAC;AACF,QAAA,OAAO,WAAW;;;IAGpB,MAAM,GAAA;QAEJ,QACE,CAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAK,KAAK,EAAE,KAAK,EAAA,EAEf,CAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAK,KAAK,EAAE,GAAG,KAAK,CAAA,OAAA,CAAS,EAAA,EAC1B,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,KAAa,EAAE,KAAa,MAC7E,CACE,CAAA,QAAA,EAAA,EAAA,OAAO,EAAE,MAAM,IAAI,CAAC,WAAW,GAAG,CAAA,MAAA,EAAS,KAAK,CAAA,CAAE,EAAA,EACjD,KAAK,CACC,CACV,CAAC,CACE,EAEN,CAAA,CAAA,KAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAK,KAAK,EAAE,CAAG,EAAA,KAAK,CAAgB,cAAA,CAAA,EAAA,EAClC,CAAM,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,IAAI,EAAE,IAAI,CAAC,WAAW,EAAS,CAAA,CACjC,CAEF;;;;AAKX;;;;;"}
@@ -0,0 +1,35 @@
1
+ import { r as registerInstance, h } from './index-Py50VI8u.js';
2
+
3
+ const ivAccordionCss = ":host{display:block}";
4
+
5
+ const BLOCK = 'iv-accordion';
6
+ const IvAccordion = class {
7
+ constructor(hostRef) {
8
+ registerInstance(this, hostRef);
9
+ }
10
+ classmodifier;
11
+ accordiontype = 'div';
12
+ accordionlabels;
13
+ showmultiple = false;
14
+ showfirst = false;
15
+ startingpanel = 0;
16
+ layout = 'horizontal';
17
+ activePanel;
18
+ interimLabels() {
19
+ let labelsArray = [];
20
+ this.accordionlabels.split(',').forEach(label => {
21
+ labelsArray.push(label.trim());
22
+ });
23
+ return labelsArray;
24
+ }
25
+ ;
26
+ render() {
27
+ return (h("div", { key: 'e660f11e46822dad819e694958211cd2d0c32536', class: BLOCK }, h("div", { key: 'c754e1adede2f06bd3840b9789a02bc7787b8b32', class: `${BLOCK}-labels` }, this.accordionlabels && this.interimLabels().map((label, index) => (h("button", { onClick: () => this.activePanel = `panel-${index}` }, label)))), h("div", { key: '057d28a451d736bb5e6e7f9f01694f101a9e7940', class: `${BLOCK}-content-panel` }, h("slot", { key: '721e462339324eaca5427138042089e9b11bf702', name: this.activePanel }))));
28
+ }
29
+ ;
30
+ };
31
+ ;
32
+ IvAccordion.style = ivAccordionCss;
33
+
34
+ export { IvAccordion as iv_accordion };
35
+ //# sourceMappingURL=iv-accordion.entry.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iv-banner.entry.esm.js","sources":["src/components/iv-banner/iv-banner.scss?tag=iv-banner","src/components/iv-banner/iv-banner.tsx"],"sourcesContent":[":host {\n display: block;\n}\n","import { Component, Prop, h } from '@stencil/core';\n\n@Component({\n tag: 'iv-banner',\n styleUrl: 'iv-banner.scss',\n shadow: false\n})\n\nexport class IvBanner {\n\n @Prop() classmodifier?: string;\n @Prop() bannerurl?: string;\n @Prop() bannerbuttontext?: string;\n @Prop() bannertype: 'div' | 'section' | 'article' = 'div';\n\n render() {\n\n const Tag = this.bannertype as any;\n\n const content = [\n <slot name=\"bannerimage\" />,\n <slot name=\"bannertitle\" />,\n <slot name=\"bannerbutton\" />\n ];\n\n return (\n <Tag class={`iv-banner ${this.classmodifier || ''}`}>\n {this.bannerurl && !this.bannerbuttontext ? (\n <a href={this.bannerurl} class=\"iv-banner-link\" aria-label=\"Banner link\">\n {content}\n </a>\n ) : (\n content\n )}\n </Tag>\n );\n\n };\n\n};"],"names":[],"mappings":";;AAAA,MAAM,WAAW,GAAG,sBAAsB;;MCQ7B,QAAQ,GAAA,MAAA;;;;AAEX,IAAA,aAAa;AACb,IAAA,SAAS;AACT,IAAA,gBAAgB;IAChB,UAAU,GAAkC,KAAK;IAEzD,MAAM,GAAA;AAEJ,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAiB;AAElC,QAAA,MAAM,OAAO,GAAG;AACd,YAAA,CAAM,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,IAAI,EAAC,aAAa,EAAG,CAAA;AAC3B,YAAA,CAAM,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,IAAI,EAAC,aAAa,EAAG,CAAA;AAC3B,YAAA,CAAM,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,IAAI,EAAC,cAAc,EAAG;SAC7B;AAED,QAAA,QACE,EAAC,GAAG,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAC,KAAK,EAAE,aAAa,IAAI,CAAC,aAAa,IAAI,EAAE,CAAA,CAAE,EAAA,EAChD,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,gBAAgB,IACvC,CAAG,CAAA,GAAA,EAAA,EAAA,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,KAAK,EAAC,gBAAgB,EAAY,YAAA,EAAA,aAAa,IACrE,OAAO,CACN,KAEJ,OAAO,CACR,CACG;;;;AAKX;;;;;"}
@@ -0,0 +1,28 @@
1
+ import { r as registerInstance, h } from './index-Py50VI8u.js';
2
+
3
+ const ivBannerCss = ":host{display:block}";
4
+
5
+ const IvBanner = class {
6
+ constructor(hostRef) {
7
+ registerInstance(this, hostRef);
8
+ }
9
+ classmodifier;
10
+ bannerurl;
11
+ bannerbuttontext;
12
+ bannertype = 'div';
13
+ render() {
14
+ const Tag = this.bannertype;
15
+ const content = [
16
+ h("slot", { key: 'caf315916ed88ee12ad07e03a21cc84aab88e5b1', name: "bannerimage" }),
17
+ h("slot", { key: 'b24467aa6ee516ad7029b8777535955261dac0ff', name: "bannertitle" }),
18
+ h("slot", { key: '11d0c5f98fb178999dd74f7526a9c99aa29b24d8', name: "bannerbutton" })
19
+ ];
20
+ return (h(Tag, { key: 'bdd6984ed9cce06da86742c903bec00c791d0076', class: `iv-banner ${this.classmodifier || ''}` }, this.bannerurl && !this.bannerbuttontext ? (h("a", { href: this.bannerurl, class: "iv-banner-link", "aria-label": "Banner link" }, content)) : (content)));
21
+ }
22
+ ;
23
+ };
24
+ ;
25
+ IvBanner.style = ivBannerCss;
26
+
27
+ export { IvBanner as iv_banner };
28
+ //# sourceMappingURL=iv-banner.entry.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iv-button.entry.esm.js","sources":["src/components/iv-button/iv-button.scss?tag=iv-button","src/components/iv-button/iv-button.tsx"],"sourcesContent":["// Base iv-button styles with theming tokens. Override --iv-button-* in theme scopes.\n// Keep defaults minimal so designers can layer brand styling later.\n\n.iv-button {\n display: var(--iv-button-display, inline-flex);\n align-items: var(--iv-button-align, center);\n justify-content: var(--iv-button-justify, center);\n gap: var(--iv-button-gap, 0.5rem);\n box-sizing: border-box;\n padding: var(--iv-button-padding, 0.75rem 1rem);\n background: var(--iv-button-bg, transparent);\n color: var(--iv-button-color, inherit);\n border: var(--iv-button-border, none);\n border-radius: var(--iv-button-radius, 0);\n font: inherit;\n font-size: var(--iv-button-font-size, inherit);\n font-weight: var(--iv-button-font-weight, 500);\n line-height: var(--iv-button-line-height, 1.2);\n text-decoration: none;\n cursor: pointer;\n position: relative;\n min-width: var(--iv-button-min-width, unset);\n min-height: var(--iv-button-min-height, 2.5rem);\n box-shadow: var(--iv-button-shadow, none);\n transition: var(--iv-button-transition, background-color .2s ease, color .2s ease, border-color .2s ease, box-shadow .2s ease);\n -webkit-appearance: none;\n appearance: none;\n}\n\n.iv-button:hover:not(.disabled):not([disabled]),\n.iv-button:focus-visible:not(.disabled):not([disabled]) {\n background: var(--iv-button-hover-bg, var(--iv-button-bg, transparent));\n color: var(--iv-button-hover-color, var(--iv-button-color, inherit));\n border: var(--iv-button-hover-border, var(--iv-button-border, none));\n box-shadow: var(--iv-button-hover-shadow, var(--iv-button-shadow, none));\n outline: var(--iv-button-focus-outline, none);\n}\n\n.iv-button:active:not(.disabled):not([disabled]) {\n background: var(--iv-button-active-bg, var(--iv-button-hover-bg, var(--iv-button-bg, transparent)));\n color: var(--iv-button-active-color, var(--iv-button-hover-color, var(--iv-button-color, inherit)));\n border: var(--iv-button-active-border, var(--iv-button-hover-border, var(--iv-button-border, none)));\n box-shadow: var(--iv-button-active-shadow, var(--iv-button-hover-shadow, var(--iv-button-shadow, none)));\n}\n\n.iv-button.disabled,\n.iv-button[disabled] {\n cursor: not-allowed;\n opacity: var(--iv-button-disabled-opacity, 0.5);\n background: var(--iv-button-disabled-bg, var(--iv-button-bg, transparent));\n color: var(--iv-button-disabled-color, var(--iv-button-color, inherit));\n border: var(--iv-button-disabled-border, var(--iv-button-border, none));\n box-shadow: var(--iv-button-disabled-shadow, none);\n}\n\n.iv-button.variant-card,\n.iv-card-add-to-cart-btn.iv-button {\n --iv-button-bg: var(--iv-card-button-bg, transparent);\n --iv-button-border: var(--iv-card-button-border, none);\n --iv-button-color: var(--iv-card-button-color, inherit);\n --iv-button-hover-bg: var(--iv-card-button-hover-bg, var(--iv-button-bg));\n --iv-button-hover-border: var(--iv-card-button-hover-border, var(--iv-button-border));\n --iv-button-hover-color: var(--iv-card-button-hover-color, var(--iv-button-color));\n}\n\n.iv-button:focus-visible:not(.disabled):not([disabled]) {\n box-shadow: var(--iv-button-focus-ring, var(--iv-button-hover-shadow, var(--iv-button-shadow, none)));\n}\n\n.iv-button--sm { --iv-button-padding: var(--iv-button-sm-padding, 0.5rem 0.75rem); font-size: var(--iv-button-sm-font-size, 0.875rem); }\n.iv-button--lg { --iv-button-padding: var(--iv-button-lg-padding, 1rem 1.25rem); font-size: var(--iv-button-lg-font-size, 1.125rem); }\n\n.iv-button > svg, .iv-button .icon { width: var(--iv-button-icon-size, 1em); height: var(--iv-button-icon-size, 1em); flex: 0 0 auto; }\n\n@media (prefers-reduced-motion: reduce) {\n .iv-button { transition: none; }\n}","import { Component, Prop, h, Event, EventEmitter, Element } from '@stencil/core';\nimport { state } from '../../utils/store/store';\n\n@Component({\n tag: 'iv-button',\n styleUrl: 'iv-button.scss',\n shadow: false\n})\n\nexport class IvButton {\n\n @Prop() type: string = 'button';\n @Prop() classmodifier?: string;\n @Prop() eventname?: string;\n @Prop() eventdetail?: string;\n @Prop() buttonClick?: (e?: MouseEvent) => void;\n\n @Event() action: EventEmitter<any>;\n\n @Element() el: HTMLElement;\n\n handleClick = (e: MouseEvent) => {\n if(this.buttonClick) this.buttonClick(e);\n if(this.eventname) {\n const detail = this.eventdetail || undefined;\n this.el.dispatchEvent(new CustomEvent(this.eventname, {\n bubbles: true,\n detail,\n composed: true\n }));\n this.action.emit(detail);\n };\n };\n\n render() {\n\n return (\n \n <button\n class={`iv-button ${state.loading ? 'disabled' : undefined} ${this.classmodifier || ''}`}\n type={this.type}\n disabled={state.loading}\n onClick={this.handleClick}>\n <slot></slot>\n </button>\n\n );\n\n };\n\n};"],"names":[],"mappings":";;AAAA,MAAM,WAAW,GAAG,qqGAAqqG;;MCS5qG,QAAQ,GAAA,MAAA;;;;;IAEX,IAAI,GAAW,QAAQ;AACvB,IAAA,aAAa;AACb,IAAA,SAAS;AACT,IAAA,WAAW;AACX,IAAA,WAAW;AAEV,IAAA,MAAM;;AAIf,IAAA,WAAW,GAAG,CAAC,CAAa,KAAI;QAC9B,IAAG,IAAI,CAAC,WAAW;AAAE,YAAA,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;AACxC,QAAA,IAAG,IAAI,CAAC,SAAS,EAAE;AACjB,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,IAAI,SAAS;YAC5C,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,SAAS,EAAE;AACpD,gBAAA,OAAO,EAAE,IAAI;gBACb,MAAM;AACN,gBAAA,QAAQ,EAAE;AACX,aAAA,CAAC,CAAC;AACH,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;;QACzB;AACH,KAAC;IAED,MAAM,GAAA;AAEJ,QAAA,QAEE,CACE,CAAA,QAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,KAAK,EAAE,CAAa,UAAA,EAAA,KAAK,CAAC,OAAO,GAAG,UAAU,GAAG,SAAS,CAAI,CAAA,EAAA,IAAI,CAAC,aAAa,IAAI,EAAE,CAAA,CAAE,EACxF,IAAI,EAAE,IAAI,CAAC,IAAI,EACf,QAAQ,EAAE,KAAK,CAAC,OAAO,EACvB,OAAO,EAAE,IAAI,CAAC,WAAW,EAAA,EACzB,CAAa,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,CAAA,CACN;;;;AAMd;;;;;"}
@@ -0,0 +1,40 @@
1
+ import { r as registerInstance, f as createEvent, k as getElement, h, d as state } from './index-Py50VI8u.js';
2
+
3
+ const ivButtonCss = ".iv-button{display:var(--iv-button-display, inline-flex);align-items:var(--iv-button-align, center);justify-content:var(--iv-button-justify, center);gap:var(--iv-button-gap, 0.5rem);box-sizing:border-box;padding:var(--iv-button-padding, 0.75rem 1rem);background:var(--iv-button-bg, transparent);color:var(--iv-button-color, inherit);border:var(--iv-button-border, none);border-radius:var(--iv-button-radius, 0);font:inherit;font-size:var(--iv-button-font-size, inherit);font-weight:var(--iv-button-font-weight, 500);line-height:var(--iv-button-line-height, 1.2);text-decoration:none;cursor:pointer;position:relative;min-width:var(--iv-button-min-width, unset);min-height:var(--iv-button-min-height, 2.5rem);box-shadow:var(--iv-button-shadow, none);transition:var(--iv-button-transition, background-color 0.2s ease, color 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease);-webkit-appearance:none;appearance:none}.iv-button:hover:not(.disabled):not([disabled]),.iv-button:focus-visible:not(.disabled):not([disabled]){background:var(--iv-button-hover-bg, var(--iv-button-bg, transparent));color:var(--iv-button-hover-color, var(--iv-button-color, inherit));border:var(--iv-button-hover-border, var(--iv-button-border, none));box-shadow:var(--iv-button-hover-shadow, var(--iv-button-shadow, none));outline:var(--iv-button-focus-outline, none)}.iv-button:active:not(.disabled):not([disabled]){background:var(--iv-button-active-bg, var(--iv-button-hover-bg, var(--iv-button-bg, transparent)));color:var(--iv-button-active-color, var(--iv-button-hover-color, var(--iv-button-color, inherit)));border:var(--iv-button-active-border, var(--iv-button-hover-border, var(--iv-button-border, none)));box-shadow:var(--iv-button-active-shadow, var(--iv-button-hover-shadow, var(--iv-button-shadow, none)))}.iv-button.disabled,.iv-button[disabled]{cursor:not-allowed;opacity:var(--iv-button-disabled-opacity, 0.5);background:var(--iv-button-disabled-bg, var(--iv-button-bg, transparent));color:var(--iv-button-disabled-color, var(--iv-button-color, inherit));border:var(--iv-button-disabled-border, var(--iv-button-border, none));box-shadow:var(--iv-button-disabled-shadow, none)}.iv-button.variant-card,.iv-card-add-to-cart-btn.iv-button{--iv-button-bg:var(--iv-card-button-bg, transparent);--iv-button-border:var(--iv-card-button-border, none);--iv-button-color:var(--iv-card-button-color, inherit);--iv-button-hover-bg:var(--iv-card-button-hover-bg, var(--iv-button-bg));--iv-button-hover-border:var(--iv-card-button-hover-border, var(--iv-button-border));--iv-button-hover-color:var(--iv-card-button-hover-color, var(--iv-button-color))}.iv-button:focus-visible:not(.disabled):not([disabled]){box-shadow:var(--iv-button-focus-ring, var(--iv-button-hover-shadow, var(--iv-button-shadow, none)))}.iv-button--sm{--iv-button-padding:var(--iv-button-sm-padding, 0.5rem 0.75rem);font-size:var(--iv-button-sm-font-size, 0.875rem)}.iv-button--lg{--iv-button-padding:var(--iv-button-lg-padding, 1rem 1.25rem);font-size:var(--iv-button-lg-font-size, 1.125rem)}.iv-button>svg,.iv-button .icon{width:var(--iv-button-icon-size, 1em);height:var(--iv-button-icon-size, 1em);flex:0 0 auto}@media (prefers-reduced-motion: reduce){.iv-button{transition:none}}";
4
+
5
+ const IvButton = class {
6
+ constructor(hostRef) {
7
+ registerInstance(this, hostRef);
8
+ this.action = createEvent(this, "action", 7);
9
+ }
10
+ type = 'button';
11
+ classmodifier;
12
+ eventname;
13
+ eventdetail;
14
+ buttonClick;
15
+ action;
16
+ get el() { return getElement(this); }
17
+ handleClick = (e) => {
18
+ if (this.buttonClick)
19
+ this.buttonClick(e);
20
+ if (this.eventname) {
21
+ const detail = this.eventdetail || undefined;
22
+ this.el.dispatchEvent(new CustomEvent(this.eventname, {
23
+ bubbles: true,
24
+ detail,
25
+ composed: true
26
+ }));
27
+ this.action.emit(detail);
28
+ }
29
+ ;
30
+ };
31
+ render() {
32
+ return (h("button", { key: '025647e88c8f4b4639044bda368e7edc2b6ea2d9', class: `iv-button ${state.loading ? 'disabled' : undefined} ${this.classmodifier || ''}`, type: this.type, disabled: state.loading, onClick: this.handleClick }, h("slot", { key: '245500916bb008fcf7c1dad5b785d585a105067f' })));
33
+ }
34
+ ;
35
+ };
36
+ ;
37
+ IvButton.style = ivButtonCss;
38
+
39
+ export { IvButton as iv_button };
40
+ //# sourceMappingURL=iv-button.entry.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iv-card.entry.esm.js","sources":["src/components/iv-card/iv-card.scss?tag=iv-card","src/components/iv-card/iv-card.tsx"],"sourcesContent":["// Base iv-card styles with theming tokens (CSS custom properties)\n// Designers override --iv-card-* variables in theme / scope; we keep safe fallbacks.\n\n.iv-card {\n display: var(--iv-card-display, block);\n box-sizing: border-box;\n padding: var(--iv-card-padding, 0);\n margin: var(--iv-card-margin, 0);\n background: var(--iv-card-bg, transparent);\n color: var(--iv-card-color, inherit);\n border: var(--iv-card-border, none);\n border-radius: var(--iv-card-border-radius, 0);\n box-shadow: var(--iv-card-shadow, none);\n font-size: var(--iv-card-font-size, inherit);\n line-height: var(--iv-card-line-height, 1.4);\n position: relative;\n text-decoration: none;\n transition: var(--iv-card-transition, background-color .2s ease, color .2s ease, box-shadow .2s ease, border-color .2s ease);\n gap: var(--iv-card-gap, 0.75rem);\n display: var(--iv-card-layout, flex);\n flex-direction: var(--iv-card-flex-direction, column);\n\n a, a:visited, a:hover, a:focus {\n text-decoration: var(--iv-card-link-text-decoration, none);\n color: var(--iv-card-link-color, inherit);\n }\n}\n\n.iv-card[href],\n.iv-card.is-interactive {\n cursor: pointer;\n}\n\n.iv-card[href]:hover,\n.iv-card[href]:focus-visible,\n.iv-card.is-interactive:hover,\n.iv-card.is-interactive:focus-visible {\n background: var(--iv-card-hover-bg, var(--iv-card-bg, transparent));\n border: var(--iv-card-hover-border, var(--iv-card-border, none));\n box-shadow: var(--iv-card-hover-shadow, var(--iv-card-shadow, none));\n outline: var(--iv-card-focus-outline, none);\n box-shadow: var(--iv-card-focus-ring, var(--iv-card-hover-shadow, var(--iv-card-shadow, none)));\n}\n\n// Wrapper link (when whole card is clickable) gets its own modifier class\n.iv-card-link-wrapper {\n display: var(--iv-card-link-wrapper-display, contents); // allows children to layout naturally\n text-decoration: none;\n color: inherit;\n cursor: pointer;\n}\n\n// Prevent underline / link style bleed onto data fields\n.iv-card-field {\n display: block;\n margin: 0;\n padding: 0;\n font-weight: var(--iv-card-field-font-weight, inherit);\n color: var(--iv-card-field-color, inherit);\n word-break: break-word;\n text-decoration: none;\n}\n\n// Ensure Add to Cart button remains clickable and visually distinct inside clickable card\n.iv-card .iv-card-add-to-cart-btn {\n position: relative;\n z-index: 2;\n}\n\n// Hover / focus styling only adjusts background / shadow, not text decoration\n.iv-card-link-wrapper:hover .iv-card-field,\n.iv-card-link-wrapper:focus-visible .iv-card-field {\n text-decoration: none;\n}\n\n// Optional variable-driven hover state (kept non-invasive)\n.iv-card-link-wrapper:hover,\n.iv-card-link-wrapper:focus-visible {\n background: var(--iv-card-link-hover-bg, var(--iv-card-hover-bg, transparent));\n}\n\n.iv-card-image {\n display: block;\n width: 100%;\n height: auto;\n aspect-ratio: var(--iv-card-image-aspect-ratio, auto);\n object-fit: var(--iv-card-image-object-fit, cover);\n border-radius: var(--iv-card-image-border-radius, var(--iv-card-border-radius, 0));\n background: var(--iv-card-image-bg, transparent);\n}\n\n.iv-card-title { \n font-weight: var(--iv-card-heading-font-weight, 600);\n font-size: var(--iv-card-title-font-size, 1em);\n line-height: var(--iv-card-title-line-height, 1.2);\n}\n\n.iv-card-price {\n color: var(--iv-card-price-color, inherit);\n font-weight: var(--iv-card-price-weight, 500);\n}\n\n.iv-card-controls {\n display: flex;\n flex-wrap: wrap;\n gap: var(--iv-card-control-gap, 0.5rem);\n align-items: center;\n margin-top: var(--iv-card-controls-margin-top, var(--iv-card-gap, 0.75rem));\n}\n\n.iv-card-add-to-cart-btn {\n --iv-button-variant: var(--iv-card-button-variant, primary);\n}\n\n.iv-card-inner { \n width: 100%;\n display: contents; \n}\n\n@media (prefers-reduced-motion: reduce) {\n .iv-card {\n transition: none;\n }\n}","import { Component, h, Prop } from '@stencil/core';\nimport { state } from '../../utils/store/store';\nimport { formatMoney, getProductIDFromGid, requestedFields } from '../../utils/helpers/factory';\nimport { addToCart } from '../../utils/storefront_api/factory';\n\nconst BLOCK = 'iv-card';\nconst HIDDEN_FIELDS = new Set([\n 'id',\n 'handle',\n 'url',\n 'productUrl',\n 'imageUrl',\n 'imageAlt',\n 'variantId',\n 'images'\n]);\n\n@Component({\n tag: 'iv-card',\n styleUrl: 'iv-card.scss',\n shadow: false\n})\n\nexport class IvCard {\n @Prop() data: Record<string, any>;\n @Prop() fields?: string;\n @Prop() cardtype?: string; \n @Prop() classmodifier?: string;\n @Prop() buttontext?: string;\n @Prop() calltoaction: boolean = false;\n @Prop() addtocarttext?: string;\n\n private allowedFields: string[] | null = null;\n\n componentWillLoad() {\n if(this.fields) this.allowedFields = requestedFields(this.fields);\n };\n\n private generateImage(url: string, alt: string) {\n return (<img src={url} alt={alt || 'Product image'} class={`${BLOCK}-image`}/>);\n };\n\n private appendAddToCartButton(gid: string, quantity: number){\n const id: number = getProductIDFromGid(gid);\n return (\n <iv-button \n classmodifier={`${BLOCK}-add-to-cart-btn`} \n onClick={(e: any) => { e.preventDefault(); e.stopPropagation(); addToCart({id, quantity}); }}>\n <span class=\"inner-button\" innerHTML={this.addtocarttext}></span>\n </iv-button>\n );\n };\n\n private buildProductHref(): string | null {\n const handle = this.data?.handle;\n if(!handle) return null;\n const base = this.cardtype || 'products';\n return `/${base}/${handle}`.replace(/\\\\+/g,'/');\n };\n\n render() {\n let entries: [string, any][] = this.data ? Object.entries(this.data) : [];\n if(this.allowedFields && this.allowedFields.length > 0) entries = entries.filter(([key]) => this.allowedFields.includes(key));\n const imageUrl = this.data?.imageUrl;\n const imageAlt = this.data?.imageAlt;\n const wantsImage = !this.allowedFields || this.allowedFields.includes('imageUrl') || this.allowedFields.includes('images');\n const showImage = wantsImage && !!imageUrl;\n const href = this.buildProductHref();\n const content = [\n showImage ? this.generateImage(imageUrl, imageAlt) : null,\n ...entries.map(([key, value]) => {\n if(HIDDEN_FIELDS.has(key)) return null; // suppress structural fields\n if(value === undefined || value === null || value === '') return null;\n return (\n <span key={key} class={`${BLOCK}-field ${BLOCK}-${key}`}>\n {key.includes('price') ? formatMoney(value, state.currencyCode) : value}\n </span>\n );\n })\n ];\n\n if(this.calltoaction && href) {\n return (\n <div class={`${BLOCK} ${this.classmodifier || ''}`.trim()}>\n <iv-link \n classmodifier={`${BLOCK}-link-wrapper`} \n linktype='wrapper'\n linkhref={href}>\n {content}\n </iv-link>\n <div class={`${BLOCK}-controls`}>\n {this.buttontext && (\n <iv-link \n linktype='button'\n classmodifier={`${BLOCK}-cta-btn`} \n linkhref={href}>\n {this.buttontext}\n </iv-link>\n )}\n {this.addtocarttext && this.data?.variantId && this.appendAddToCartButton(this.data.variantId, 1)}\n </div>\n </div>\n );\n }\n\n return (\n <div class={`${BLOCK} ${this.classmodifier || ''}`.trim()}>\n {content}\n <div class={`${BLOCK}-controls`}>\n {this.buttontext && href && (\n <iv-link \n linktype='button'\n classmodifier={`${BLOCK}-cta-btn`} \n linkhref={href}>\n {this.buttontext}\n </iv-link>\n )}\n {this.addtocarttext && this.data?.variantId && this.appendAddToCartButton(this.data.variantId, 1)}\n </div>\n </div>\n );\n\n };\n\n};"],"names":[],"mappings":"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"}
@@ -0,0 +1,82 @@
1
+ import { r as registerInstance, h, d as state } from './index-Py50VI8u.js';
2
+ import { r as requestedFields, b as getProductIDFromGid, f as formatMoney } from './factory-mrqy6XUM.js';
3
+ import { b as addToCart } from './factory-1QinX-o0.js';
4
+
5
+ const ivCardCss = ".iv-card{display:var(--iv-card-display, block);box-sizing:border-box;padding:var(--iv-card-padding, 0);margin:var(--iv-card-margin, 0);background:var(--iv-card-bg, transparent);color:var(--iv-card-color, inherit);border:var(--iv-card-border, none);border-radius:var(--iv-card-border-radius, 0);box-shadow:var(--iv-card-shadow, none);font-size:var(--iv-card-font-size, inherit);line-height:var(--iv-card-line-height, 1.4);position:relative;text-decoration:none;transition:var(--iv-card-transition, background-color 0.2s ease, color 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease);gap:var(--iv-card-gap, 0.75rem);display:var(--iv-card-layout, flex);flex-direction:var(--iv-card-flex-direction, column)}.iv-card a,.iv-card a:visited,.iv-card a:hover,.iv-card a:focus{text-decoration:var(--iv-card-link-text-decoration, none);color:var(--iv-card-link-color, inherit)}.iv-card[href],.iv-card.is-interactive{cursor:pointer}.iv-card[href]:hover,.iv-card[href]:focus-visible,.iv-card.is-interactive:hover,.iv-card.is-interactive:focus-visible{background:var(--iv-card-hover-bg, var(--iv-card-bg, transparent));border:var(--iv-card-hover-border, var(--iv-card-border, none));box-shadow:var(--iv-card-hover-shadow, var(--iv-card-shadow, none));outline:var(--iv-card-focus-outline, none);box-shadow:var(--iv-card-focus-ring, var(--iv-card-hover-shadow, var(--iv-card-shadow, none)))}.iv-card-link-wrapper{display:var(--iv-card-link-wrapper-display, contents);text-decoration:none;color:inherit;cursor:pointer}.iv-card-field{display:block;margin:0;padding:0;font-weight:var(--iv-card-field-font-weight, inherit);color:var(--iv-card-field-color, inherit);word-break:break-word;text-decoration:none}.iv-card .iv-card-add-to-cart-btn{position:relative;z-index:2}.iv-card-link-wrapper:hover .iv-card-field,.iv-card-link-wrapper:focus-visible .iv-card-field{text-decoration:none}.iv-card-link-wrapper:hover,.iv-card-link-wrapper:focus-visible{background:var(--iv-card-link-hover-bg, var(--iv-card-hover-bg, transparent))}.iv-card-image{display:block;width:100%;height:auto;aspect-ratio:var(--iv-card-image-aspect-ratio, auto);object-fit:var(--iv-card-image-object-fit, cover);border-radius:var(--iv-card-image-border-radius, var(--iv-card-border-radius, 0));background:var(--iv-card-image-bg, transparent)}.iv-card-title{font-weight:var(--iv-card-heading-font-weight, 600);font-size:var(--iv-card-title-font-size, 1em);line-height:var(--iv-card-title-line-height, 1.2)}.iv-card-price{color:var(--iv-card-price-color, inherit);font-weight:var(--iv-card-price-weight, 500)}.iv-card-controls{display:flex;flex-wrap:wrap;gap:var(--iv-card-control-gap, 0.5rem);align-items:center;margin-top:var(--iv-card-controls-margin-top, var(--iv-card-gap, 0.75rem))}.iv-card-add-to-cart-btn{--iv-button-variant:var(--iv-card-button-variant, primary)}.iv-card-inner{width:100%;display:contents}@media (prefers-reduced-motion: reduce){.iv-card{transition:none}}";
6
+
7
+ const BLOCK = 'iv-card';
8
+ const HIDDEN_FIELDS = new Set([
9
+ 'id',
10
+ 'handle',
11
+ 'url',
12
+ 'productUrl',
13
+ 'imageUrl',
14
+ 'imageAlt',
15
+ 'variantId',
16
+ 'images'
17
+ ]);
18
+ const IvCard = class {
19
+ constructor(hostRef) {
20
+ registerInstance(this, hostRef);
21
+ }
22
+ data;
23
+ fields;
24
+ cardtype;
25
+ classmodifier;
26
+ buttontext;
27
+ calltoaction = false;
28
+ addtocarttext;
29
+ allowedFields = null;
30
+ componentWillLoad() {
31
+ if (this.fields)
32
+ this.allowedFields = requestedFields(this.fields);
33
+ }
34
+ ;
35
+ generateImage(url, alt) {
36
+ return (h("img", { src: url, alt: alt || 'Product image', class: `${BLOCK}-image` }));
37
+ }
38
+ ;
39
+ appendAddToCartButton(gid, quantity) {
40
+ const id = getProductIDFromGid(gid);
41
+ return (h("iv-button", { classmodifier: `${BLOCK}-add-to-cart-btn`, onClick: (e) => { e.preventDefault(); e.stopPropagation(); addToCart({ id, quantity }); } }, h("span", { class: "inner-button", innerHTML: this.addtocarttext })));
42
+ }
43
+ ;
44
+ buildProductHref() {
45
+ const handle = this.data?.handle;
46
+ if (!handle)
47
+ return null;
48
+ const base = this.cardtype || 'products';
49
+ return `/${base}/${handle}`.replace(/\\+/g, '/');
50
+ }
51
+ ;
52
+ render() {
53
+ let entries = this.data ? Object.entries(this.data) : [];
54
+ if (this.allowedFields && this.allowedFields.length > 0)
55
+ entries = entries.filter(([key]) => this.allowedFields.includes(key));
56
+ const imageUrl = this.data?.imageUrl;
57
+ const imageAlt = this.data?.imageAlt;
58
+ const wantsImage = !this.allowedFields || this.allowedFields.includes('imageUrl') || this.allowedFields.includes('images');
59
+ const showImage = wantsImage && !!imageUrl;
60
+ const href = this.buildProductHref();
61
+ const content = [
62
+ showImage ? this.generateImage(imageUrl, imageAlt) : null,
63
+ ...entries.map(([key, value]) => {
64
+ if (HIDDEN_FIELDS.has(key))
65
+ return null; // suppress structural fields
66
+ if (value === undefined || value === null || value === '')
67
+ return null;
68
+ return (h("span", { key: key, class: `${BLOCK}-field ${BLOCK}-${key}` }, key.includes('price') ? formatMoney(value, state.currencyCode) : value));
69
+ })
70
+ ];
71
+ if (this.calltoaction && href) {
72
+ return (h("div", { class: `${BLOCK} ${this.classmodifier || ''}`.trim() }, h("iv-link", { classmodifier: `${BLOCK}-link-wrapper`, linktype: 'wrapper', linkhref: href }, content), h("div", { class: `${BLOCK}-controls` }, this.buttontext && (h("iv-link", { linktype: 'button', classmodifier: `${BLOCK}-cta-btn`, linkhref: href }, this.buttontext)), this.addtocarttext && this.data?.variantId && this.appendAddToCartButton(this.data.variantId, 1))));
73
+ }
74
+ return (h("div", { class: `${BLOCK} ${this.classmodifier || ''}`.trim() }, content, h("div", { class: `${BLOCK}-controls` }, this.buttontext && href && (h("iv-link", { linktype: 'button', classmodifier: `${BLOCK}-cta-btn`, linkhref: href }, this.buttontext)), this.addtocarttext && this.data?.variantId && this.appendAddToCartButton(this.data.variantId, 1))));
75
+ }
76
+ ;
77
+ };
78
+ ;
79
+ IvCard.style = ivCardCss;
80
+
81
+ export { IvCard as iv_card };
82
+ //# sourceMappingURL=iv-card.entry.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iv-carousel.entry.esm.js","sources":["src/components/iv-carousel/iv-carousel.scss?tag=iv-carousel&encapsulation=shadow","src/components/iv-carousel/iv-carousel.tsx"],"sourcesContent":["","import { Component, Host, h } from '@stencil/core';\n\n@Component({\n tag: 'iv-carousel',\n styleUrl: 'iv-carousel.scss',\n shadow: true,\n})\nexport class IvCarousel {\n render() {\n return (\n <Host>\n <slot></slot>\n </Host>\n );\n }\n}\n"],"names":[],"mappings":";;AAAA,MAAM,aAAa,GAAG,EAAE;;MCOX,UAAU,GAAA,MAAA;;;;IACrB,MAAM,GAAA;QACJ,QACE,EAAC,IAAI,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,EACH,CAAa,CAAA,MAAA,EAAA,EAAA,GAAA,EAAA,0CAAA,EAAA,CAAA,CACR;;;;;;;"}
@@ -0,0 +1,16 @@
1
+ import { r as registerInstance, h, a as Host } from './index-Py50VI8u.js';
2
+
3
+ const ivCarouselCss = "";
4
+
5
+ const IvCarousel = class {
6
+ constructor(hostRef) {
7
+ registerInstance(this, hostRef);
8
+ }
9
+ render() {
10
+ return (h(Host, { key: 'cb55e9d394273b1c456a982911ea4961983c742a' }, h("slot", { key: '2e8d9a625851b49d915a8ec2ddbad625d7c87f87' })));
11
+ }
12
+ };
13
+ IvCarousel.style = ivCarouselCss;
14
+
15
+ export { IvCarousel as iv_carousel };
16
+ //# sourceMappingURL=iv-carousel.entry.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iv-dynamic-products-carousel.entry.esm.js","sources":["src/components/iv-dynamic-products-carousel/iv-dynamic-products-carousel.scss?tag=iv-dynamic-products-carousel","src/components/iv-dynamic-products-carousel/iv-dynamic-products-carousel.tsx"],"sourcesContent":[":host {\n display: block;\n}\n\n.iv-dynamic-products-carousel { position:relative; }\n\n.iv-dynamic-products-carousel-carousel { position:relative; }\n\n.iv-dynamic-products-carousel-viewport { overflow:hidden; width:100%; }\n\n.iv-dynamic-products-carousel-track { display:flex; width:100%; transition: transform .55s cubic-bezier(.4,.7,.2,1); will-change:transform; }\n\n.iv-dynamic-products-carousel-slide { flex:0 0 100%; box-sizing:border-box; padding:0.25rem 0.5rem; display:grid; grid-template-columns:repeat(6, minmax(0,1fr)); gap:1rem; }\n\n@media (max-width: 1200px) { .iv-dynamic-products-carousel-slide { grid-template-columns:repeat(4, minmax(0,1fr)); } }\n@media (max-width: 900px) { .iv-dynamic-products-carousel-slide { grid-template-columns:repeat(3, minmax(0,1fr)); } }\n@media (max-width: 640px) { .iv-dynamic-products-carousel-slide { grid-template-columns:repeat(2, minmax(0,1fr)); } }\n\n.iv-dynamic-products-carousel-nav { position:absolute; top:50%; transform:translateY(-50%); background:var(--iv-carousel-nav-bg, rgba(0,0,0,.55)); color:#fff; border:none; width:2.75rem; height:2.75rem; border-radius:50%; display:flex; align-items:center; justify-content:center; cursor:pointer; backdrop-filter:blur(4px); box-shadow:0 4px 12px rgba(0,0,0,.25); transition:background .2s ease, transform .2s ease; }\n.iv-dynamic-products-carousel-nav:hover:not(:disabled){ background:var(--iv-carousel-nav-bg-hover, rgba(0,0,0,.75)); transform:translateY(-50%) scale(1.05); }\n.iv-dynamic-products-carousel-nav:disabled{ opacity:.4; cursor:default; }\n.iv-dynamic-products-carousel-nav-prev { left:0.25rem; }\n.iv-dynamic-products-carousel-nav-next { right:0.25rem; }\n\n.iv-dynamic-products-carousel-status { margin-top:0.5rem; font-size:0.875rem; text-align:center; color:var(--iv-carousel-status-color, #555); }\n\n/* Hide potential scrollbars in some environments (defensive) */\n.iv-dynamic-products-carousel-viewport::-webkit-scrollbar { display:none; }\n.iv-dynamic-products-carousel-viewport { -ms-overflow-style:none; scrollbar-width:none; }\n","import { Component, h, Prop, State, Watch } from '@stencil/core';\nimport { state } from '../../utils/store/store';\nimport { fetchProducts } from '../../utils/storefront_api/factory';\nimport { productCache } from '../../utils/caching/productCache';\nimport { createErrorHandler } from '../../utils/error_handling/factory';\n\nconst BLOCK = 'iv-dynamic-products-carousel';\n\n@Component({\n tag: 'iv-dynamic-products-carousel',\n styleUrl: 'iv-dynamic-products-carousel.scss',\n shadow: false\n})\n\nexport class IvDynamicProductsCarousel {\n @Prop() type: 'CREATED' | 'BEST_SELLING' | 'PRICE' | 'TITLE' | 'RELEVANCE' = 'CREATED'; \n @Prop() limit: number = 24;\n @Prop() reversed: boolean = false; \n @Prop() componenttitle?: string;\n @Prop() titletag: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' = 'h2';\n @Prop() collectionhandle: string = 'all';\n @Prop() requestedfields: string;\n @Prop() calltoaction: boolean = false;\n @Prop() buttontext?: string;\n @Prop() addtocarttext?: string;\n @Prop() emptystring: string = 'No products found';\n @Prop() cachettl?: number; \n @Prop() stale?: boolean = true; \n\n @State() products: any[] = [];\n @State() errorMsg: string; \n @State() staleData: boolean = false;\n @State() page: number = 0; // current slide index\n private readonly itemsPerPage = 6;\n\n private errors = createErrorHandler({ component: 'iv-dynamic-products' });\n\n @Watch('type')\n @Watch('limit')\n @Watch('collectionhandle')\n @Watch('requestedfields')\n handlePropChange() { this.loadProducts(true); }\n\n async componentWillLoad() { \n await this.loadProducts(false); \n };\n \n private buildParams() {\n return {\n handle: this.collectionhandle,\n sort: this.type,\n fields: this.requestedfields,\n limit: this.limit,\n currency: state.currencyCode,\n reversed: this.reversed\n };\n };\n\n private async loadProducts(fromWatch: boolean) {\n const params = this.buildParams();\n const ttl = this.cachettl || 1000 * 60 * 5;\n state.loading = !fromWatch; \n try {\n const data = await productCache.getOrSetData(\n params,\n async () => {\n const fresh = await fetchProducts(this.limit, this.collectionhandle, this.type, this.requestedfields, this.reversed);\n return fresh;\n },\n {\n ttl,\n staleWhileRevalidate: this.stale,\n transform: (fresh) => fresh \n }\n );\n const metaCheck = productCache.getData<typeof data>(params);\n this.staleData = metaCheck.isExpired && metaCheck.isStale;\n this.products = data || [];\n this.page = 0;\n } catch (err: any) {\n this.errorMsg = 'Failed to load products';\n this.errors.handle({\n error: err,\n scope: 'loadProducts',\n userMessage: 'Unable to load products right now.',\n devMessage: 'fetchProducts failed in iv-dynamic-products',\n severity: 'error'\n });\n } finally {\n state.loading = false;\n };\n };\n\n private pagedProducts() {\n const chunks: any[][] = [];\n for(let i=0; i < this.products.length; i += this.itemsPerPage) {\n chunks.push(this.products.slice(i, i + this.itemsPerPage));\n }\n return chunks;\n }\n\n // removed unused clampPage and resetPageOnDataChange\n\n private next = () => { const pages = this.pagedProducts().length; if(this.page < pages - 1) this.page++; };\n private prev = () => { if(this.page > 0) this.page--; };\n\n render() {\n const TAG = this.titletag as any;\n\n return (\n <div class={BLOCK} data-stale={this.staleData ? 'true' : 'false'}>\n {this.componenttitle && <TAG class={`${BLOCK}-title`}>{this.componenttitle}</TAG>}\n {state.loading ? (\n <iv-spinner></iv-spinner>\n ) : this.errorMsg ? (\n <div class={`${BLOCK}-error`}>{this.errorMsg}</div>\n ) : this.products.length === 0 ? (\n <div class={`${BLOCK}-empty`}>{this.emptystring}</div>\n ) : (\n <div class={`${BLOCK}-carousel`} aria-roledescription=\"carousel\">\n <button class={`${BLOCK}-nav ${BLOCK}-nav-prev`} onClick={this.prev} disabled={this.page===0} aria-label=\"Previous\" type=\"button\">‹</button>\n <div class={`${BLOCK}-viewport`}>\n <div class={`${BLOCK}-track`} style={{ transform: `translateX(-${this.page * 100}%)` }}>\n {this.pagedProducts().map((group, i) => (\n <div class={`${BLOCK}-slide`} role=\"group\" aria-label={`Slide ${i+1} of ${this.pagedProducts().length}`}> \n {group.map(product => (\n <iv-card\n cardtype='products'\n calltoaction={this.calltoaction}\n buttontext={this.buttontext}\n addtocarttext={this.addtocarttext}\n data={product}\n classmodifier={`${BLOCK}-card`} />\n ))}\n </div>\n ))}\n </div>\n </div>\n <button class={`${BLOCK}-nav ${BLOCK}-nav-next`} onClick={this.next} disabled={this.page===this.pagedProducts().length-1} aria-label=\"Next\" type=\"button\">›</button>\n <div class={`${BLOCK}-status`} aria-live=\"polite\">{this.pagedProducts().length > 1 ? `Slide ${this.page+1} of ${this.pagedProducts().length}` : ''}</div>\n {this.staleData && (\n <div class={`${BLOCK}-stale-indicator`} aria-live=\"polite\">Refreshing…</div>\n )}\n </div>\n )}\n </div>\n );\n };\n\n};"],"names":[],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ import { r as registerInstance, d as state, h } from './index-Py50VI8u.js';
2
+ import { f as fetchProducts } from './factory-1QinX-o0.js';
3
+ import { c as createErrorHandler, p as productCache } from './factory-JClanx-E.js';
4
+
5
+ const ivDynamicProductsCarouselCss = ":host{display:block}.iv-dynamic-products-carousel{position:relative}.iv-dynamic-products-carousel-carousel{position:relative}.iv-dynamic-products-carousel-viewport{overflow:hidden;width:100%}.iv-dynamic-products-carousel-track{display:flex;width:100%;transition:transform 0.55s cubic-bezier(0.4, 0.7, 0.2, 1);will-change:transform}.iv-dynamic-products-carousel-slide{flex:0 0 100%;box-sizing:border-box;padding:0.25rem 0.5rem;display:grid;grid-template-columns:repeat(6, minmax(0, 1fr));gap:1rem}@media (max-width: 1200px){.iv-dynamic-products-carousel-slide{grid-template-columns:repeat(4, minmax(0, 1fr))}}@media (max-width: 900px){.iv-dynamic-products-carousel-slide{grid-template-columns:repeat(3, minmax(0, 1fr))}}@media (max-width: 640px){.iv-dynamic-products-carousel-slide{grid-template-columns:repeat(2, minmax(0, 1fr))}}.iv-dynamic-products-carousel-nav{position:absolute;top:50%;transform:translateY(-50%);background:var(--iv-carousel-nav-bg, rgba(0, 0, 0, 0.55));color:#fff;border:none;width:2.75rem;height:2.75rem;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;backdrop-filter:blur(4px);box-shadow:0 4px 12px rgba(0, 0, 0, 0.25);transition:background 0.2s ease, transform 0.2s ease}.iv-dynamic-products-carousel-nav:hover:not(:disabled){background:var(--iv-carousel-nav-bg-hover, rgba(0, 0, 0, 0.75));transform:translateY(-50%) scale(1.05)}.iv-dynamic-products-carousel-nav:disabled{opacity:0.4;cursor:default}.iv-dynamic-products-carousel-nav-prev{left:0.25rem}.iv-dynamic-products-carousel-nav-next{right:0.25rem}.iv-dynamic-products-carousel-status{margin-top:0.5rem;font-size:0.875rem;text-align:center;color:var(--iv-carousel-status-color, #555)}.iv-dynamic-products-carousel-viewport::-webkit-scrollbar{display:none}.iv-dynamic-products-carousel-viewport{-ms-overflow-style:none;scrollbar-width:none}";
6
+
7
+ const BLOCK = 'iv-dynamic-products-carousel';
8
+ const IvDynamicProductsCarousel = class {
9
+ constructor(hostRef) {
10
+ registerInstance(this, hostRef);
11
+ }
12
+ type = 'CREATED';
13
+ limit = 24;
14
+ reversed = false;
15
+ componenttitle;
16
+ titletag = 'h2';
17
+ collectionhandle = 'all';
18
+ requestedfields;
19
+ calltoaction = false;
20
+ buttontext;
21
+ addtocarttext;
22
+ emptystring = 'No products found';
23
+ cachettl;
24
+ stale = true;
25
+ products = [];
26
+ errorMsg;
27
+ staleData = false;
28
+ page = 0; // current slide index
29
+ itemsPerPage = 6;
30
+ errors = createErrorHandler({ component: 'iv-dynamic-products' });
31
+ handlePropChange() { this.loadProducts(true); }
32
+ async componentWillLoad() {
33
+ await this.loadProducts(false);
34
+ }
35
+ ;
36
+ buildParams() {
37
+ return {
38
+ handle: this.collectionhandle,
39
+ sort: this.type,
40
+ fields: this.requestedfields,
41
+ limit: this.limit,
42
+ currency: state.currencyCode,
43
+ reversed: this.reversed
44
+ };
45
+ }
46
+ ;
47
+ async loadProducts(fromWatch) {
48
+ const params = this.buildParams();
49
+ const ttl = this.cachettl || 1000 * 60 * 5;
50
+ state.loading = !fromWatch;
51
+ try {
52
+ const data = await productCache.getOrSetData(params, async () => {
53
+ const fresh = await fetchProducts(this.limit, this.collectionhandle, this.type, this.requestedfields, this.reversed);
54
+ return fresh;
55
+ }, {
56
+ ttl,
57
+ staleWhileRevalidate: this.stale,
58
+ transform: (fresh) => fresh
59
+ });
60
+ const metaCheck = productCache.getData(params);
61
+ this.staleData = metaCheck.isExpired && metaCheck.isStale;
62
+ this.products = data || [];
63
+ this.page = 0;
64
+ }
65
+ catch (err) {
66
+ this.errorMsg = 'Failed to load products';
67
+ this.errors.handle({
68
+ error: err,
69
+ scope: 'loadProducts',
70
+ userMessage: 'Unable to load products right now.',
71
+ devMessage: 'fetchProducts failed in iv-dynamic-products',
72
+ severity: 'error'
73
+ });
74
+ }
75
+ finally {
76
+ state.loading = false;
77
+ }
78
+ ;
79
+ }
80
+ ;
81
+ pagedProducts() {
82
+ const chunks = [];
83
+ for (let i = 0; i < this.products.length; i += this.itemsPerPage) {
84
+ chunks.push(this.products.slice(i, i + this.itemsPerPage));
85
+ }
86
+ return chunks;
87
+ }
88
+ // removed unused clampPage and resetPageOnDataChange
89
+ next = () => {
90
+ const pages = this.pagedProducts().length;
91
+ if (this.page < pages - 1)
92
+ this.page++;
93
+ };
94
+ prev = () => {
95
+ if (this.page > 0)
96
+ this.page--;
97
+ };
98
+ render() {
99
+ const TAG = this.titletag;
100
+ return (h("div", { key: 'ca22a4b45b4cd43bfbc7ca78349ae4bc3b34b063', class: BLOCK, "data-stale": this.staleData ? 'true' : 'false' }, this.componenttitle && h(TAG, { key: '92236e39b3754af312ccb0232f18e38efc1e3306', class: `${BLOCK}-title` }, this.componenttitle), state.loading ? (h("iv-spinner", null)) : this.errorMsg ? (h("div", { class: `${BLOCK}-error` }, this.errorMsg)) : this.products.length === 0 ? (h("div", { class: `${BLOCK}-empty` }, this.emptystring)) : (h("div", { class: `${BLOCK}-carousel`, "aria-roledescription": "carousel" }, h("button", { class: `${BLOCK}-nav ${BLOCK}-nav-prev`, onClick: this.prev, disabled: this.page === 0, "aria-label": "Previous", type: "button" }, "\u2039"), h("div", { class: `${BLOCK}-viewport` }, h("div", { class: `${BLOCK}-track`, style: { transform: `translateX(-${this.page * 100}%)` } }, this.pagedProducts().map((group, i) => (h("div", { class: `${BLOCK}-slide`, role: "group", "aria-label": `Slide ${i + 1} of ${this.pagedProducts().length}` }, group.map(product => (h("iv-card", { cardtype: 'products', calltoaction: this.calltoaction, buttontext: this.buttontext, addtocarttext: this.addtocarttext, data: product, classmodifier: `${BLOCK}-card` })))))))), h("button", { class: `${BLOCK}-nav ${BLOCK}-nav-next`, onClick: this.next, disabled: this.page === this.pagedProducts().length - 1, "aria-label": "Next", type: "button" }, "\u203A"), h("div", { class: `${BLOCK}-status`, "aria-live": "polite" }, this.pagedProducts().length > 1 ? `Slide ${this.page + 1} of ${this.pagedProducts().length}` : ''), this.staleData && (h("div", { class: `${BLOCK}-stale-indicator`, "aria-live": "polite" }, "Refreshing\u2026"))))));
101
+ }
102
+ ;
103
+ static get watchers() { return {
104
+ "type": ["handlePropChange"],
105
+ "limit": ["handlePropChange"],
106
+ "collectionhandle": ["handlePropChange"],
107
+ "requestedfields": ["handlePropChange"]
108
+ }; }
109
+ };
110
+ ;
111
+ IvDynamicProductsCarousel.style = ivDynamicProductsCarouselCss;
112
+
113
+ export { IvDynamicProductsCarousel as iv_dynamic_products_carousel };
114
+ //# sourceMappingURL=iv-dynamic-products-carousel.entry.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iv-dynamic-products.entry.esm.js","sources":["src/components/iv-dynamic-products/iv-dynamic-products.scss?tag=iv-dynamic-products","src/components/iv-dynamic-products/iv-dynamic-products.tsx"],"sourcesContent":["// Base iv-dynamic-products styles with CSS variable theming.\n// Designers override --iv-dynamic-products-* tokens externally.\n\n.iv-dynamic-products {\n box-sizing: border-box;\n width: var(--iv-dynamic-products-width, 100%);\n max-width: var(--iv-dynamic-products-max-width, 100%);\n margin: var(--iv-dynamic-products-margin, 0);\n padding: var(--iv-dynamic-products-padding, 0);\n background: var(--iv-dynamic-products-bg, transparent);\n border: var(--iv-dynamic-products-border, none);\n border-radius: var(--iv-dynamic-products-radius, 0);\n box-shadow: var(--iv-dynamic-products-shadow, none);\n color: var(--iv-dynamic-products-color, inherit);\n --iv-layout-gap: var(--iv-dynamic-products-gap, 1.5rem); \n}\n\n.iv-dynamic-products-title {\n margin: var(--iv-dynamic-products-title-margin, 0 0 1rem 0);\n font-size: var(--iv-dynamic-products-title-font-size, clamp(1.125rem, 1vw + 1rem, 1.75rem));\n font-weight: var(--iv-dynamic-products-title-font-weight, 600);\n line-height: var(--iv-dynamic-products-title-line-height, 1.2);\n letter-spacing: var(--iv-dynamic-products-title-letter-spacing, normal);\n}\n\n/* State blocks */\n.iv-dynamic-products-error,\n.iv-dynamic-products-empty {\n padding: var(--iv-dynamic-products-state-padding, 1rem);\n border: var(--iv-dynamic-products-state-border, none);\n background: var(--iv-dynamic-products-state-bg, transparent);\n color: var(--iv-dynamic-products-state-color, inherit);\n font-size: var(--iv-dynamic-products-state-font-size, 0.875rem);\n text-align: var(--iv-dynamic-products-state-text-align, center);\n}\n\n.iv-dynamic-products-products {\n width: 100%;\n margin: var(--iv-dynamic-products-products-margin, 0);\n padding: var(--iv-dynamic-products-products-padding, 0);\n}\n\n/* Bridge styling into layout variant */\n.iv-layout--iv-dynamic-products-layout {\n --iv-layout-gap: var(--iv-dynamic-products-grid-gap, var(--iv-dynamic-products-gap, 1.5rem));\n align-items: var(--iv-dynamic-products-grid-align, stretch);\n justify-content: var(--iv-dynamic-products-grid-justify, flex-start);\n}\n\n.iv-dynamic-products .iv-card {\n margin: var(--iv-dynamic-products-card-margin, 0);\n --iv-card-padding: var(--iv-dynamic-products-card-padding, var(--iv-card-padding, 0));\n}\n\n@media (min-width: 40rem) {\n .iv-dynamic-products { --iv-dynamic-products-gap: var(--iv-dynamic-products-gap-md, var(--iv-dynamic-products-gap, 1.5rem)); }\n}\n@media (min-width: 64rem) {\n .iv-dynamic-products { --iv-dynamic-products-gap: var(--iv-dynamic-products-gap-lg, var(--iv-dynamic-products-gap, 1.5rem)); }\n}\n\n.iv-dynamic-products--scroll-x .iv-layout--iv-dynamic-products-layout {\n display: flex !important;\n overflow-x: auto;\n scrollbar-width: var(--iv-dynamic-products-scrollbar-width, thin);\n -webkit-overflow-scrolling: touch;\n}\n\n.iv-dynamic-products--scroll-x .iv-layout--iv-dynamic-products-layout > * {\n flex: 0 0 var(--iv-dynamic-products-scroll-item-width, 75%);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .iv-dynamic-products { scroll-behavior: auto; }\n}","import { Component, h, Prop, State, Watch } from '@stencil/core';\nimport { state } from '../../utils/store/store';\nimport { fetchProducts } from '../../utils/storefront_api/factory';\nimport { productCache } from '../../utils/caching/productCache';\nimport { createErrorHandler } from '../../utils/error_handling/factory';\n\nconst BLOCK = 'iv-dynamic-products';\n\n@Component({\n tag: 'iv-dynamic-products',\n styleUrl: 'iv-dynamic-products.scss',\n shadow: false\n})\n\nexport class IvDynamicProducts {\n\n // @Prop() type: 'CREATED_AT' | 'BEST_SELLING' | 'PRICE' | 'TITLE' | 'RELEVANCE' = 'BEST_SELLING'; \n @Prop() type: 'CREATED' | 'BEST_SELLING' | 'PRICE' | 'TITLE' | 'RELEVANCE' = 'CREATED'; \n @Prop() limit: number = 8;\n @Prop() reversed: boolean = false; \n @Prop() componenttitle?: string;\n @Prop() titletag: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' = 'h2';\n @Prop() collectionhandle: string = 'all';\n \n @Prop() carousel: boolean = false; \n \n @Prop() requestedfields: string;\n @Prop() calltoaction: boolean = false;\n @Prop() buttontext?: string;\n @Prop() addtocarttext?: string;\n @Prop() emptystring: string = 'No products found';\n @Prop() gridlayout?: string; // If this and carousel all false, default to flex\n @Prop() cachettl?: number; // override TTL (ms)\n @Prop() stale?: boolean = true; // enable stale-while-revalidate\n\n @State() products: any[] = [];\n @State() errorMsg: string; \n @State() staleData: boolean = false; // indicates we are showing stale data while refreshing\n\n private errors = createErrorHandler({ component: 'iv-dynamic-products' });\n\n @Watch('type')\n @Watch('limit')\n @Watch('collectionhandle')\n @Watch('requestedfields')\n handlePropChange() { this.loadProducts(true); }\n\n async componentWillLoad() { \n await this.loadProducts(false); \n };\n \n private buildParams() {\n return {\n handle: this.collectionhandle || 'all',\n sort: this.type,\n fields: this.requestedfields,\n limit: this.limit,\n currency: state.currencyCode,\n reversed: this.reversed\n };\n };\n\n private async loadProducts(fromWatch: boolean) {\n const params = this.buildParams();\n const ttl = this.cachettl || 1000 * 60 * 5;\n state.loading = !fromWatch; \n try {\n const data = await productCache.getOrSetData(\n params,\n async () => {\n const fresh = await fetchProducts(this.limit, this.collectionhandle, this.type, this.requestedfields, this.reversed);\n return fresh;\n },\n {\n ttl,\n staleWhileRevalidate: this.stale,\n transform: (fresh) => fresh \n }\n );\n const metaCheck = productCache.getData<typeof data>(params);\n this.staleData = metaCheck.isExpired && metaCheck.isStale;\n this.products = data || [];\n } catch (err: any) {\n this.errorMsg = 'Failed to load products';\n this.errors.handle({\n error: err,\n scope: 'loadProducts',\n userMessage: 'Unable to load products right now.',\n devMessage: 'fetchProducts failed in iv-dynamic-products',\n severity: 'error'\n });\n } finally {\n state.loading = false;\n };\n };\n\n render() {\n const TAG = this.titletag as any;\n\n return (\n <div class={BLOCK} data-stale={this.staleData ? 'true' : 'false'}>\n {this.componenttitle && <TAG class={`${BLOCK}-title`}>{this.componenttitle}</TAG>}\n {state.loading ? (\n <iv-spinner></iv-spinner>\n ) : this.errorMsg ? (\n <div class={`${BLOCK}-error`}>{this.errorMsg}</div>\n ) : this.products.length === 0 ? (\n <div class={`${BLOCK}-empty`}>{this.emptystring}</div>\n ) : (\n <div class={`${BLOCK}-products`}> \n <iv-layout\n classModifier={`${BLOCK}-layout`}\n gridTemplateAreas={this.gridlayout}>\n {this.products.map(product => (\n <iv-card\n cardtype='products'\n calltoaction={this.calltoaction}\n buttontext={this.buttontext}\n addtocarttext={this.addtocarttext}\n data={product} \n classmodifier={`${BLOCK}-card`}/>\n ))}\n </iv-layout>\n {this.staleData && (\n <div class={`${BLOCK}-stale-indicator`} aria-live=\"polite\">Refreshing…</div>\n )}\n </div>\n )}\n </div>\n );\n };\n\n};"],"names":[],"mappings":"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"}