cloudcommerce 0.39.0 → 0.40.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 (205) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/ecomplus-stores/barra-doce/functions/many/package.json +3 -3
  3. package/ecomplus-stores/barra-doce/functions/ssr/package.json +6 -6
  4. package/ecomplus-stores/barra-doce/functions/with-apps/package.json +3 -3
  5. package/ecomplus-stores/barra-doce/package.json +2 -2
  6. package/package.json +6 -6
  7. package/packages/api/lib/api.d.ts +2 -2
  8. package/packages/api/package.json +1 -1
  9. package/packages/api/types/applications.d.ts +15 -0
  10. package/packages/api/types/authentications.d.ts +14 -0
  11. package/packages/api/types/brands.d.ts +17 -0
  12. package/packages/api/types/carts.d.ts +12 -0
  13. package/packages/api/types/categories.d.ts +17 -0
  14. package/packages/api/types/collections.d.ts +15 -0
  15. package/packages/api/types/customers.d.ts +12 -0
  16. package/packages/api/types/grids.d.ts +15 -0
  17. package/packages/api/types/orders.d.ts +15 -0
  18. package/packages/api/types/products.d.ts +17 -0
  19. package/packages/api/types/stores.d.ts +15 -0
  20. package/packages/api/types.d.ts +34 -8
  21. package/packages/apps/affilate-program/package.json +1 -1
  22. package/packages/apps/correios/package.json +2 -2
  23. package/packages/apps/custom-payment/package.json +1 -1
  24. package/packages/apps/custom-shipping/package.json +1 -1
  25. package/packages/apps/datafrete/package.json +2 -2
  26. package/packages/apps/discounts/package.json +2 -2
  27. package/packages/apps/emails/package.json +1 -1
  28. package/packages/apps/fb-conversions/package.json +1 -1
  29. package/packages/apps/flash-courier/package.json +1 -1
  30. package/packages/apps/frenet/package.json +1 -1
  31. package/packages/apps/galaxpay/package.json +1 -1
  32. package/packages/apps/google-analytics/package.json +1 -1
  33. package/packages/apps/jadlog/package.json +1 -1
  34. package/packages/apps/loyalty-points/package.json +2 -2
  35. package/packages/apps/mandae/package.json +2 -2
  36. package/packages/apps/melhor-envio/package.json +1 -1
  37. package/packages/apps/mercadopago/package.json +1 -1
  38. package/packages/apps/pagarme/package.json +1 -1
  39. package/packages/apps/pagarme-v5/package.json +2 -2
  40. package/packages/apps/paghiper/package.json +1 -1
  41. package/packages/apps/pix/package.json +1 -1
  42. package/packages/apps/tiny-erp/package.json +2 -2
  43. package/packages/apps/webhooks/package.json +1 -1
  44. package/packages/cli/config/firebase.json +1 -1
  45. package/packages/cli/package.json +1 -1
  46. package/packages/config/package.json +1 -1
  47. package/packages/emails/package.json +1 -1
  48. package/packages/eslint/package.json +5 -5
  49. package/packages/eslint/storefront.eslintrc.cjs +1 -0
  50. package/packages/events/package.json +1 -1
  51. package/packages/feeds/package.json +1 -1
  52. package/packages/firebase/package.json +2 -2
  53. package/packages/i18n/lib/en_us/i19anyPrice.txt +1 -0
  54. package/packages/i18n/lib/en_us/i19filterOut.txt +1 -0
  55. package/packages/i18n/lib/en_us/i19loadMoreProducts.txt +1 -0
  56. package/packages/i18n/lib/en_us/i19noProductsFound.txt +1 -0
  57. package/packages/i18n/lib/en_us/i19noProductsFoundFor$1.txt +1 -0
  58. package/packages/i18n/lib/en_us/i19noProductsInBrandMsg.txt +1 -0
  59. package/packages/i18n/lib/en_us/i19noProductsInCategoryMsg.txt +1 -0
  60. package/packages/i18n/lib/en_us.d.ts +8 -3
  61. package/packages/i18n/lib/en_us.js +8 -3
  62. package/packages/i18n/lib/en_us.js.map +1 -1
  63. package/packages/i18n/lib/pt_br/i19anyPrice.txt +1 -0
  64. package/packages/i18n/lib/pt_br/i19filterOut.txt +1 -0
  65. package/packages/i18n/lib/pt_br/i19loadMoreProducts.txt +1 -0
  66. package/packages/i18n/lib/pt_br/i19noItemSelected.txt +1 -1
  67. package/packages/i18n/lib/pt_br/i19noProductsFoundFor$1.txt +1 -0
  68. package/packages/i18n/lib/pt_br/i19noProductsInBrandMsg.txt +1 -0
  69. package/packages/i18n/lib/pt_br/i19noProductsInCategoryMsg.txt +1 -0
  70. package/packages/i18n/lib/pt_br.d.ts +9 -4
  71. package/packages/i18n/lib/pt_br.js +9 -4
  72. package/packages/i18n/lib/pt_br.js.map +1 -1
  73. package/packages/i18n/package.json +1 -1
  74. package/packages/i18n/src/en_us.ts +8 -3
  75. package/packages/i18n/src/pt_br.ts +9 -4
  76. package/packages/modules/package.json +2 -2
  77. package/packages/passport/package.json +1 -1
  78. package/packages/ssr/events.js +0 -0
  79. package/packages/ssr/package.json +6 -6
  80. package/packages/storefront/dist/client/_astro/AccountPage.Osc6ffV0.js +1 -0
  81. package/packages/storefront/dist/client/_astro/{CartSidebar.1kUFk9Xn.js → CartSidebar.LrfpXG2B.js} +1 -1
  82. package/packages/storefront/dist/client/_astro/HeroSlider.Zf6kCaqD.js +1 -0
  83. package/packages/storefront/dist/client/_astro/PitchBar.N4d9fV8H.js +1 -0
  84. package/packages/storefront/dist/client/_astro/{Prices.PuQc6C7F.js → Prices.eQ9Vd255.js} +1 -1
  85. package/packages/storefront/dist/client/_astro/ProductDetails.Ln_jf57U.js +7 -0
  86. package/packages/storefront/dist/client/_astro/ProductShelf.X389bv9S.js +1 -0
  87. package/packages/storefront/dist/client/_astro/ProductShelf.vj6lVDCr.js +1 -0
  88. package/packages/storefront/dist/client/_astro/{QuantitySelector.YNmWjN8y.js → QuantitySelector.qSJQlvTe.js} +1 -1
  89. package/packages/storefront/dist/client/_astro/SearchModal.BrVoDBvg.js +1 -0
  90. package/packages/storefront/dist/client/_astro/SearchShowcase.KAz3nwco.js +1 -0
  91. package/packages/storefront/dist/client/_astro/ShopHeader.mFKGzhIu.js +7 -0
  92. package/packages/storefront/dist/client/_astro/_plugin-vue_export-helper._suIQ7WC.js +1 -0
  93. package/packages/storefront/dist/client/_astro/_slug_.cfRx-rdA.css +1 -0
  94. package/packages/storefront/dist/client/_astro/client.PdegUP6S.js +1 -0
  95. package/packages/storefront/dist/client/_astro/{customer-session._VkzXnXT.js → customer-session.KkTHFOXl.js} +1 -1
  96. package/packages/storefront/dist/client/_astro/ecom-icon_12falx.png +0 -0
  97. package/packages/storefront/dist/client/_astro/ecom-icon_15pqnO.png +0 -0
  98. package/packages/storefront/dist/client/_astro/ecom-icon_t3guw.png +0 -0
  99. package/packages/storefront/dist/client/_astro/ecom-utils.Ld2zf-Ve.js +1 -0
  100. package/packages/storefront/dist/client/_astro/{format-money.FMQXgKHB.js → format-money.Axn0YFLJ.js} +1 -1
  101. package/packages/storefront/dist/client/_astro/grid-title.GntHOijE.js +1 -0
  102. package/packages/storefront/dist/client/_astro/headphone_T2Jjc.avif +0 -0
  103. package/packages/storefront/dist/client/_astro/headphone_Z1CG18r.webp +0 -0
  104. package/packages/storefront/dist/client/_astro/{hoisted._FbzheVm.js → hoisted.3ec9NcvP.js} +1 -1
  105. package/packages/storefront/dist/client/_astro/{hoisted.B6fKrLPR.js → hoisted.UnTlypMd.js} +1 -1
  106. package/packages/storefront/dist/client/_astro/{i18n.m7SpISxy.js → i18n.3-NUtxYq.js} +1 -1
  107. package/packages/storefront/dist/client/_astro/{img.zh-Drf-O.js → img.pozlYdd3.js} +1 -1
  108. package/packages/storefront/dist/client/_astro/{index.XrHFaN2F.js → index.TkCbiY_p.js} +1 -1
  109. package/packages/storefront/dist/client/_astro/{index.5PN-EYMS.js → index.m6fK0JXC.js} +1 -1
  110. package/packages/storefront/dist/client/_astro/logo_1UBsBq.webp +0 -0
  111. package/packages/storefront/dist/client/_astro/logo_Z1K5PE9.png +0 -0
  112. package/packages/storefront/dist/client/_astro/logo_Z1KIIl1.avif +0 -0
  113. package/packages/storefront/dist/client/_astro/{modules-info.sD0tdb2b.js → modules-info.mmwB1qIJ.js} +1 -1
  114. package/packages/storefront/dist/client/_astro/name.49dZlpDx.js +1 -0
  115. package/packages/storefront/dist/client/_astro/passion_LHbe9.webp +0 -0
  116. package/packages/storefront/dist/client/_astro/passion_Z23MeUb.avif +0 -0
  117. package/packages/storefront/dist/client/_astro/rect8589_1TtOHY.png +0 -0
  118. package/packages/storefront/dist/client/_astro/rect8589_1f5opX.webp +0 -0
  119. package/packages/storefront/dist/client/_astro/rect8589_IUskt.webp +0 -0
  120. package/packages/storefront/dist/client/_astro/rect8589_Uxfdf.png +0 -0
  121. package/packages/storefront/dist/client/_astro/rect8589_Z15uApA.png +0 -0
  122. package/packages/storefront/dist/client/_astro/rect8589_Z1Ap1Im.avif +0 -0
  123. package/packages/storefront/dist/client/_astro/rect8589_Z1JT1HB.webp +0 -0
  124. package/packages/storefront/dist/client/_astro/rect8589_ZY9mtN.avif +0 -0
  125. package/packages/storefront/dist/client/_astro/rect8589_tMFW0.avif +0 -0
  126. package/packages/storefront/dist/client/_astro/rect859_1TgQXS.avif +0 -0
  127. package/packages/storefront/dist/client/_astro/rect859_2Nm1z.avif +0 -0
  128. package/packages/storefront/dist/client/_astro/rect859_DIqwR.png +0 -0
  129. package/packages/storefront/dist/client/_astro/rect859_Z1IKDb2.png +0 -0
  130. package/packages/storefront/dist/client/_astro/rect859_Z29FI4V.webp +0 -0
  131. package/packages/storefront/dist/client/_astro/rect859_Z2kFHGk.avif +0 -0
  132. package/packages/storefront/dist/client/_astro/rect859_ZkpPFI.webp +0 -0
  133. package/packages/storefront/dist/client/_astro/rect859_jXzBi.png +0 -0
  134. package/packages/storefront/dist/client/_astro/rect859_x1l16.webp +0 -0
  135. package/packages/storefront/dist/client/_astro/rect89_1TSfW7.avif +0 -0
  136. package/packages/storefront/dist/client/_astro/rect89_Z1re32x.webp +0 -0
  137. package/packages/storefront/dist/client/_astro/sf-utils.yjuG8NjM.js +1 -0
  138. package/packages/storefront/dist/client/_astro/{shopping-cart.A-1jhlKi.js → shopping-cart.Ean2uW2R.js} +1 -1
  139. package/packages/storefront/dist/client/_astro/use-analytics.Y7amTmnr.js +1 -0
  140. package/packages/storefront/dist/client/_astro/{use-product-card.erbOV6Fv.js → use-product-card.zB4z32bC.js} +1 -1
  141. package/packages/storefront/dist/client/_astro/use-text-value.f9pDzruv.js +4 -0
  142. package/packages/storefront/dist/client/app/account/index.html +56 -0
  143. package/packages/storefront/dist/client/app/index.html +96 -0
  144. package/packages/storefront/dist/client/headset-gamer-corsair-hs40-raptor-ca-9011122-naap-vinho/index.html +107 -0
  145. package/packages/storefront/dist/client/index.html +120 -0
  146. package/packages/storefront/dist/client/macbook-apple-pro-15.4-intel-core-i7-2.6ghz-ram-16gb-ssd-512gb-mr972ll/a-prata/index.html +107 -0
  147. package/packages/storefront/dist/client/mouse-gamer-corsair-optico-harpoon-rgb-ch-9301011-na/index.html +107 -0
  148. package/packages/storefront/dist/client/teclado-gamer-fortrek-mecanico-k5-rgb-outemu-blue-preto/index.html +107 -0
  149. package/packages/storefront/dist/client/~fallback/index.html +74 -0
  150. package/packages/storefront/dist/server/chunks/{CartSidebar_hAgJQJgm.mjs → CartSidebar_gCUGFy65.mjs} +1 -1
  151. package/packages/storefront/dist/server/chunks/{SearchModal_eWb5SdQM.mjs → SearchModal_2uYZ9tHy.mjs} +4 -5
  152. package/packages/storefront/dist/server/chunks/{_.._S7DDBn_b.mjs → _.._FnNLvTNv.mjs} +1 -1
  153. package/packages/storefront/dist/server/chunks/{account_3ySmGzMc.mjs → account_iZ2QmK5E.mjs} +1 -1
  154. package/packages/storefront/dist/server/chunks/astro/{assets-service_QlOZG8ov.mjs → assets-service_TpUb271h.mjs} +58 -136
  155. package/packages/storefront/dist/server/chunks/{astro_zcC1GStV.mjs → astro_PpArQAsY.mjs} +4 -4
  156. package/packages/storefront/dist/server/chunks/{index_nIwq11oA.mjs → index_1q5IpD39.mjs} +1 -1
  157. package/packages/storefront/dist/server/chunks/{index_uAR5ZV4d.mjs → index_JEU6B2DI.mjs} +1 -1
  158. package/packages/storefront/dist/server/chunks/{node_2VvC7trl.mjs → node_wOa5hJmt.mjs} +1 -1
  159. package/packages/storefront/dist/server/chunks/pages/{__MSibDuuV.mjs → __cEcxuEWe.mjs} +1674 -422
  160. package/packages/storefront/dist/server/chunks/pages/{account_iG-YqJ5q.mjs → account_WliDuQOB.mjs} +2 -2
  161. package/packages/storefront/dist/server/chunks/pages/{index_BtDyKPh_.mjs → index_2bQLkQf-.mjs} +3 -3
  162. package/packages/storefront/dist/server/chunks/pages/{node_bKqL47eZ.mjs → node_ZaY4t9qW.mjs} +21 -2
  163. package/packages/storefront/dist/server/chunks/pages/{~fallback_73R5VA6j.mjs → ~fallback_TL5hPXF_.mjs} +2 -2
  164. package/packages/storefront/dist/server/chunks/{~fallback_7q1dqY4e.mjs → ~fallback_wxuqpDXG.mjs} +1 -1
  165. package/packages/storefront/dist/server/entry.mjs +34 -16
  166. package/packages/storefront/dist/server/{manifest_dSwvaOdW.mjs → manifest_YgAgEwvF.mjs} +17 -16
  167. package/packages/storefront/dist/server/renderers.mjs +14 -3
  168. package/packages/storefront/package.json +12 -12
  169. package/packages/storefront/src/helpers/sf-utils.ts +11 -0
  170. package/packages/storefront/src/lib/$storefront.d.ts +7 -1
  171. package/packages/storefront/src/lib/components/Drawer.vue +13 -8
  172. package/packages/storefront/src/lib/components/globals/ALink.vue +1 -1
  173. package/packages/storefront/src/lib/composables/use-pagination.ts +61 -0
  174. package/packages/storefront/src/lib/composables/use-product-shelf.ts +29 -19
  175. package/packages/storefront/src/lib/composables/use-search-filters.ts +271 -0
  176. package/packages/storefront/src/lib/composables/use-search-modal.ts +2 -11
  177. package/packages/storefront/src/lib/composables/use-search-showcase.ts +168 -22
  178. package/packages/storefront/src/lib/composables/use-sku-selector.ts +3 -8
  179. package/packages/storefront/src/lib/layouts/use-page-main.ts +20 -8
  180. package/packages/storefront/src/lib/state/search-engine.ts +19 -6
  181. package/packages/storefront/tsconfig.json +1 -1
  182. package/packages/test-base/package.json +1 -1
  183. package/packages/types/package.json +1 -1
  184. package/packages/i18n/lib/en_us/i19noProduct.txt +0 -1
  185. package/packages/i18n/lib/en_us/i19noResultsFor.txt +0 -1
  186. package/packages/i18n/lib/pt_br/i19noResultsFor.txt +0 -1
  187. package/packages/storefront/dist/client/_astro/AccountPage.j0C5JBLY.js +0 -1
  188. package/packages/storefront/dist/client/_astro/HeroSlider.tR1dVXyu.js +0 -1
  189. package/packages/storefront/dist/client/_astro/PitchBar.FelC04wE.js +0 -1
  190. package/packages/storefront/dist/client/_astro/ProductCard.ephJafAE.js +0 -1
  191. package/packages/storefront/dist/client/_astro/ProductDetails.B6Ih5MGf.js +0 -7
  192. package/packages/storefront/dist/client/_astro/ProductShelf.GESxuPZ_.js +0 -1
  193. package/packages/storefront/dist/client/_astro/SearchContainer.BzixfU3R.js +0 -1
  194. package/packages/storefront/dist/client/_astro/SearchModal.F7vbwxIv.js +0 -1
  195. package/packages/storefront/dist/client/_astro/ShopHeader.5vR1LgSW.js +0 -10
  196. package/packages/storefront/dist/client/_astro/_plugin-vue_export-helper.sk5AFsEV.js +0 -1
  197. package/packages/storefront/dist/client/_astro/_slug_.r8QHNfdw.css +0 -1
  198. package/packages/storefront/dist/client/_astro/client.RF8UxjZd.js +0 -1
  199. package/packages/storefront/dist/client/_astro/ecom-utils.gJYgRPRz.js +0 -1
  200. package/packages/storefront/dist/client/_astro/name.HU5l7TJo.js +0 -1
  201. package/packages/storefront/dist/client/_astro/sf-utils.5t7r9A2G.js +0 -1
  202. package/packages/storefront/dist/client/_astro/use-analytics.1EVxbrS7.js +0 -1
  203. /package/packages/i18n/lib/en_us/{i19relatedProduct.txt → i19relatedProducts.txt} +0 -0
  204. /package/packages/i18n/lib/pt_br/{i19noProduct.txt → i19noProductsFound.txt} +0 -0
  205. /package/packages/i18n/lib/pt_br/{i19relatedProduct.txt → i19relatedProducts.txt} +0 -0
@@ -1,6 +1,6 @@
1
- import { e as createAstro, f as createComponent, r as renderTemplate, h as addAttribute, i as renderComponent, m as maybeRenderHead } from '../astro_zcC1GStV.mjs';
1
+ import { e as createAstro, f as createComponent, r as renderTemplate, h as addAttribute, i as renderComponent, m as maybeRenderHead } from '../astro_PpArQAsY.mjs';
2
2
  import 'kleur/colors';
3
- import { l as loadRouteContext, $ as $$BaseHead, a as $$Picture, b as $$Base } from './__MSibDuuV.mjs';
3
+ import { l as loadRouteContext, $ as $$BaseHead, a as $$Picture, b as $$Base } from './__cEcxuEWe.mjs';
4
4
 
5
5
  const $$Astro = createAstro("https://demo.ecomplus.app");
6
6
  const $$Account = createComponent(async ($$result, $$props, $$slots) => {
@@ -1,6 +1,6 @@
1
- import { e as createAstro, f as createComponent, r as renderTemplate, m as maybeRenderHead, i as renderComponent, h as addAttribute, u as unescapeHTML, F as Fragment$1 } from '../astro_zcC1GStV.mjs';
1
+ import { e as createAstro, f as createComponent, r as renderTemplate, m as maybeRenderHead, i as renderComponent, h as addAttribute, u as unescapeHTML, F as Fragment$1 } from '../astro_PpArQAsY.mjs';
2
2
  import 'kleur/colors';
3
- import { _ as _export_sfc, B as Banner, u as usePageHero, c as $$BannerPictures, d as $$Sections, l as loadRouteContext, $ as $$BaseHead, e as $$PageHeader, f as $$PageFooter, b as $$Base, F as FooterStamps, a as $$Picture } from './__MSibDuuV.mjs';
3
+ import { _ as _export_sfc, B as Banner, u as usePageHero, c as $$BannerPictures, d as $$Sections, l as loadRouteContext, $ as $$BaseHead, e as $$PageHeader, f as $$PageFooter, b as $$Base, F as FooterStamps, a as $$Picture } from './__cEcxuEWe.mjs';
4
4
  import 'clsx';
5
5
  import { useSSRContext, defineComponent, ref, onMounted, resolveComponent, mergeProps, withCtx, createVNode, withDirectives, vShow, renderSlot, openBlock, createBlock, Fragment, renderList, createTextVNode, toDisplayString } from 'vue';
6
6
  import { ssrRenderAttrs, ssrRenderComponent, ssrRenderStyle, ssrRenderClass, ssrRenderList, ssrRenderSlot, ssrInterpolate } from 'vue/server-renderer';
@@ -25,7 +25,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
25
25
  function _sfc_ssrRender$1(_ctx, _push, _parent, _attrs, $props, $setup, $data, $options) {
26
26
  const _component_Carousel = resolveComponent("Carousel");
27
27
  const _component_CarouselControl = resolveComponent("CarouselControl");
28
- _push(`<section${ssrRenderAttrs(mergeProps({ class: "relative mx-auto" }, _attrs))}>`);
28
+ _push(`<section${ssrRenderAttrs(mergeProps({ class: "relative mx-auto mb-9 md:mb-12" }, _attrs))}>`);
29
29
  _push(ssrRenderComponent(_component_Carousel, {
30
30
  autoplay: $props.autoplay,
31
31
  class: "secondary [&>*]:items-center"
@@ -2,8 +2,26 @@ import { isRemotePath } from '@astrojs/internal-helpers/path';
2
2
  import { readFile } from 'fs/promises';
3
3
  import mime from 'mime/lite.js';
4
4
  import 'os';
5
- import { a as getConfiguredImageService, b as isRemoteAllowed } from '../astro/assets-service_QlOZG8ov.mjs';
6
- import { i as imageConfig, g as assetsDir } from './__MSibDuuV.mjs';
5
+ import { A as AstroError, I as InvalidImageService, c as isRemoteAllowed } from '../astro/assets-service_TpUb271h.mjs';
6
+ import { i as imageConfig, g as assetsDir } from './__cEcxuEWe.mjs';
7
+
8
+ async function getConfiguredImageService() {
9
+ if (!globalThis?.astroAsset?.imageService) {
10
+ const { default: service } = await import(
11
+ // @ts-expect-error
12
+ '../astro/assets-service_TpUb271h.mjs'
13
+ ).then(n => n.s).catch((e) => {
14
+ const error = new AstroError(InvalidImageService);
15
+ error.cause = e;
16
+ throw error;
17
+ });
18
+ if (!globalThis.astroAsset)
19
+ globalThis.astroAsset = {};
20
+ globalThis.astroAsset.imageService = service;
21
+ return service;
22
+ }
23
+ return globalThis.astroAsset.imageService;
24
+ }
7
25
 
8
26
  const fnv1a52 = (str) => {
9
27
  const len = str.length;
@@ -86,6 +104,7 @@ const GET = async ({ request }) => {
86
104
  }
87
105
  });
88
106
  } catch (err) {
107
+ console.error("Could not process image request:", err);
89
108
  return new Response(`Server Error: ${err}`, { status: 500 });
90
109
  }
91
110
  };
@@ -1,6 +1,6 @@
1
- import { e as createAstro, f as createComponent, r as renderTemplate, m as maybeRenderHead, h as addAttribute, i as renderComponent } from '../astro_zcC1GStV.mjs';
1
+ import { e as createAstro, f as createComponent, r as renderTemplate, m as maybeRenderHead, h as addAttribute, i as renderComponent } from '../astro_PpArQAsY.mjs';
2
2
  import 'kleur/colors';
3
- import { l as loadRouteContext, $ as $$BaseHead, e as $$PageHeader, b as $$Base } from './__MSibDuuV.mjs';
3
+ import { l as loadRouteContext, $ as $$BaseHead, e as $$PageHeader, b as $$Base } from './__cEcxuEWe.mjs';
4
4
  import 'clsx';
5
5
 
6
6
  const $$Astro$1 = createAstro("https://demo.ecomplus.app");
@@ -1,6 +1,6 @@
1
1
  export { renderers } from '../renderers.mjs';
2
2
  export { onRequest } from '../_empty-middleware.mjs';
3
3
 
4
- const page = () => import('./pages/~fallback_73R5VA6j.mjs');
4
+ const page = () => import('./pages/~fallback_TL5hPXF_.mjs');
5
5
 
6
6
  export { page };
@@ -3,9 +3,9 @@ import http from 'node:http';
3
3
  import { TLSSocket } from 'node:tls';
4
4
  import { appendForwardSlash as appendForwardSlash$1, joinPaths, trimSlashes, slash, prependForwardSlash, removeTrailingForwardSlash, collapseDuplicateSlashes } from '@astrojs/internal-helpers/path';
5
5
  import { serialize, parse } from 'cookie';
6
- import { l as levels, g as getEventPrefix, L as Logger, A as AstroIntegrationLogger, manifest } from './manifest_dSwvaOdW.mjs';
6
+ import { l as levels, g as getEventPrefix, L as Logger, A as AstroIntegrationLogger, manifest } from './manifest_YgAgEwvF.mjs';
7
7
  import 'kleur/colors';
8
- import { A as AstroError, R as ResponseSentError, o as MiddlewareNoDataOrNextCalled, p as MiddlewareNotAResponse, G as GetStaticPathsRequired, q as InvalidGetStaticPathsReturn, t as InvalidGetStaticPathsEntry, v as GetStaticPathsExpectedParams, w as GetStaticPathsInvalidRouteParam, P as PageNumberParamNotFound, N as NoMatchingStaticPathFound, x as PrerenderDynamicEndpointPathCollide, y as LocalsNotAnObject, z as ASTRO_VERSION, C as ClientAddressNotAvailable, S as StaticClientAddressNotAvailable, B as renderEndpoint, D as ReservedSlotName, k as renderSlotToString, H as renderJSX, J as chunkToString, K as CantRenderPage, O as renderPage$1 } from './chunks/astro_zcC1GStV.mjs';
8
+ import { A as AstroError, R as ResponseSentError, o as MiddlewareNoDataOrNextCalled, p as MiddlewareNotAResponse, G as GetStaticPathsRequired, q as InvalidGetStaticPathsReturn, t as InvalidGetStaticPathsEntry, v as GetStaticPathsExpectedParams, w as GetStaticPathsInvalidRouteParam, P as PageNumberParamNotFound, N as NoMatchingStaticPathFound, x as PrerenderDynamicEndpointPathCollide, y as LocalsNotAnObject, z as ASTRO_VERSION, C as ClientAddressNotAvailable, S as StaticClientAddressNotAvailable, B as renderEndpoint, D as ReservedSlotName, k as renderSlotToString, H as renderJSX, J as chunkToString, K as CantRenderPage, O as renderPage$1 } from './chunks/astro_PpArQAsY.mjs';
9
9
  import 'clsx';
10
10
  import buffer from 'node:buffer';
11
11
  import crypto from 'node:crypto';
@@ -396,7 +396,13 @@ function redirectRouteGenerate(redirectRoute, data) {
396
396
  if (typeof routeData !== "undefined") {
397
397
  return routeData?.generate(data) || routeData?.pathname || "/";
398
398
  } else if (typeof route === "string") {
399
- return route;
399
+ let target = route;
400
+ for (const param of Object.keys(data)) {
401
+ const paramValue = data[param];
402
+ target = target.replace(`[${param}]`, paramValue);
403
+ target = target.replace(`[...${param}]`, paramValue);
404
+ }
405
+ return target;
400
406
  } else if (typeof route === "undefined") {
401
407
  return "/";
402
408
  }
@@ -1733,7 +1739,8 @@ class App {
1733
1739
  * This also handles pre-rendered /404 or /500 routes
1734
1740
  */
1735
1741
  async #renderError(request, { status, response: originalResponse, skipMiddleware = false }) {
1736
- const errorRouteData = matchRoute("/" + status, this.#manifestData);
1742
+ const errorRoutePath = `/${status}${this.#manifest.trailingSlash === "always" ? "/" : ""}`;
1743
+ const errorRouteData = matchRoute(errorRoutePath, this.#manifestData);
1737
1744
  const url = new URL(request.url);
1738
1745
  if (errorRouteData) {
1739
1746
  if (errorRouteData.prerender) {
@@ -1778,8 +1785,8 @@ class App {
1778
1785
  Reflect.set(response, responseSentSymbol, true);
1779
1786
  return response;
1780
1787
  }
1781
- #mergeResponses(newResponse, oldResponse, override) {
1782
- if (!oldResponse) {
1788
+ #mergeResponses(newResponse, originalResponse, override) {
1789
+ if (!originalResponse) {
1783
1790
  if (override !== void 0) {
1784
1791
  return new Response(newResponse.body, {
1785
1792
  status: override.status,
@@ -1789,12 +1796,23 @@ class App {
1789
1796
  }
1790
1797
  return newResponse;
1791
1798
  }
1792
- const { statusText, headers } = oldResponse;
1793
- const status = override?.status ? override.status : oldResponse.status === 200 ? newResponse.status : oldResponse.status;
1799
+ const status = override?.status ? override.status : originalResponse.status === 200 ? newResponse.status : originalResponse.status;
1800
+ try {
1801
+ originalResponse.headers.delete("Content-type");
1802
+ } catch {
1803
+ }
1794
1804
  return new Response(newResponse.body, {
1795
1805
  status,
1796
- statusText: status === 200 ? newResponse.statusText : statusText,
1797
- headers: new Headers(Array.from(headers))
1806
+ statusText: status === 200 ? newResponse.statusText : originalResponse.statusText,
1807
+ // If you're looking at here for possible bugs, it means that it's not a bug.
1808
+ // With the middleware, users can meddle with headers, and we should pass to the 404/500.
1809
+ // If users see something weird, it's because they are setting some headers they should not.
1810
+ //
1811
+ // Although, we don't want it to replace the content-type, because the error page must return `text/html`
1812
+ headers: new Headers([
1813
+ ...Array.from(newResponse.headers),
1814
+ ...Array.from(originalResponse.headers)
1815
+ ])
1798
1816
  });
1799
1817
  }
1800
1818
  #getDefaultStatusCode(routeData, pathname) {
@@ -2236,12 +2254,12 @@ const adapter = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({
2236
2254
  start
2237
2255
  }, Symbol.toStringTag, { value: 'Module' }));
2238
2256
 
2239
- const _page0 = () => import('./chunks/node_2VvC7trl.mjs');
2240
- const _page1 = () => import('./chunks/index_nIwq11oA.mjs');
2241
- const _page2 = () => import('./chunks/~fallback_7q1dqY4e.mjs');
2242
- const _page3 = () => import('./chunks/index_uAR5ZV4d.mjs');
2243
- const _page4 = () => import('./chunks/account_3ySmGzMc.mjs');
2244
- const _page5 = () => import('./chunks/_.._S7DDBn_b.mjs');const pageMap = new Map([["../../node_modules/.pnpm/astro@4.0.4_@types+node@18.19.3_typescript@5.2.2/node_modules/astro/dist/assets/endpoint/node.js", _page0],["src/pages/index.astro", _page1],["src/pages/~fallback.astro", _page2],["src/pages/app/index.astro", _page3],["src/pages/app/account.astro", _page4],["src/pages/[...slug].astro", _page5]]);
2257
+ const _page0 = () => import('./chunks/node_wOa5hJmt.mjs');
2258
+ const _page1 = () => import('./chunks/index_1q5IpD39.mjs');
2259
+ const _page2 = () => import('./chunks/~fallback_wxuqpDXG.mjs');
2260
+ const _page3 = () => import('./chunks/index_JEU6B2DI.mjs');
2261
+ const _page4 = () => import('./chunks/account_iZ2QmK5E.mjs');
2262
+ const _page5 = () => import('./chunks/_.._FnNLvTNv.mjs');const pageMap = new Map([["../../node_modules/.pnpm/astro@4.0.7_@types+node@18.19.3_typescript@5.2.2/node_modules/astro/dist/assets/endpoint/node.js", _page0],["src/pages/index.astro", _page1],["src/pages/~fallback.astro", _page2],["src/pages/app/index.astro", _page3],["src/pages/app/account.astro", _page4],["src/pages/[...slug].astro", _page5]]);
2245
2263
  const _manifest = Object.assign(manifest, {
2246
2264
  pageMap,
2247
2265
  renderers,
@@ -2,7 +2,7 @@ import '@astrojs/internal-helpers/path';
2
2
  import 'cookie';
3
3
  import { bold, red, yellow, dim, blue } from 'kleur/colors';
4
4
  import 'string-width';
5
- import './chunks/astro_zcC1GStV.mjs';
5
+ import './chunks/astro_PpArQAsY.mjs';
6
6
  import 'clsx';
7
7
  import { compile } from 'path-to-regexp';
8
8
 
@@ -19,13 +19,14 @@ const levels = {
19
19
  error: 50,
20
20
  silent: 90
21
21
  };
22
- function log(opts, level, label, message) {
22
+ function log(opts, level, label, message, newLine = true) {
23
23
  const logLevel = opts.level;
24
24
  const dest = opts.dest;
25
25
  const event = {
26
26
  label,
27
27
  level,
28
- message
28
+ message,
29
+ newLine
29
30
  };
30
31
  if (!isLogLevelEnabled(logLevel, level)) {
31
32
  return;
@@ -35,14 +36,14 @@ function log(opts, level, label, message) {
35
36
  function isLogLevelEnabled(configuredLogLevel, level) {
36
37
  return levels[configuredLogLevel] <= levels[level];
37
38
  }
38
- function info(opts, label, message) {
39
- return log(opts, "info", label, message);
39
+ function info(opts, label, message, newLine = true) {
40
+ return log(opts, "info", label, message, newLine);
40
41
  }
41
- function warn(opts, label, message) {
42
- return log(opts, "warn", label, message);
42
+ function warn(opts, label, message, newLine = true) {
43
+ return log(opts, "warn", label, message, newLine);
43
44
  }
44
- function error(opts, label, message) {
45
- return log(opts, "error", label, message);
45
+ function error(opts, label, message, newLine = true) {
46
+ return log(opts, "error", label, message, newLine);
46
47
  }
47
48
  function debug(...args) {
48
49
  if ("_astroGlobalDebug" in globalThis) {
@@ -83,14 +84,14 @@ class Logger {
83
84
  constructor(options) {
84
85
  this.options = options;
85
86
  }
86
- info(label, message) {
87
- info(this.options, label, message);
87
+ info(label, message, newLine = true) {
88
+ info(this.options, label, message, newLine);
88
89
  }
89
- warn(label, message) {
90
- warn(this.options, label, message);
90
+ warn(label, message, newLine = true) {
91
+ warn(this.options, label, message, newLine);
91
92
  }
92
- error(label, message) {
93
- error(this.options, label, message);
93
+ error(label, message, newLine = true) {
94
+ error(this.options, label, message, newLine);
94
95
  }
95
96
  debug(label, ...messages) {
96
97
  debug(label, ...messages);
@@ -190,6 +191,6 @@ function deserializeManifest(serializedManifest) {
190
191
  };
191
192
  }
192
193
 
193
- const manifest = deserializeManifest({"adapterName":"@astrojs/node","routes":[{"file":"","links":[],"scripts":[],"styles":[],"routeData":{"type":"endpoint","route":"/_image","pattern":"^\\/_image$","segments":[[{"content":"_image","dynamic":false,"spread":false}]],"params":[],"component":"../../node_modules/.pnpm/astro@4.0.4_@types+node@18.19.3_typescript@5.2.2/node_modules/astro/dist/assets/endpoint/node.js","pathname":"/_image","prerender":false,"fallbackRoutes":[],"_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[{"type":"external","value":"/_astro/hoisted._FbzheVm.js"}],"styles":[{"type":"external","src":"/_astro/_slug_.r8QHNfdw.css"}],"routeData":{"route":"/","type":"page","pattern":"^\\/$","segments":[],"params":[],"component":"src/pages/index.astro","pathname":"/","prerender":false,"fallbackRoutes":[],"_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[{"type":"external","value":"/_astro/hoisted._FbzheVm.js"}],"styles":[{"type":"external","src":"/_astro/_slug_.r8QHNfdw.css"}],"routeData":{"route":"/~fallback","type":"page","pattern":"^\\/~fallback\\/?$","segments":[[{"content":"~fallback","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/~fallback.astro","pathname":"/~fallback","prerender":false,"fallbackRoutes":[],"_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[{"type":"external","value":"/_astro/hoisted.B6fKrLPR.js"}],"styles":[{"type":"external","src":"/_astro/_slug_.r8QHNfdw.css"}],"routeData":{"route":"/app","type":"page","pattern":"^\\/app\\/?$","segments":[[{"content":"app","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/app/index.astro","pathname":"/app","prerender":false,"fallbackRoutes":[],"_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[{"type":"external","value":"/_astro/hoisted._FbzheVm.js"}],"styles":[{"type":"external","src":"/_astro/_slug_.r8QHNfdw.css"}],"routeData":{"route":"/app/account","type":"page","pattern":"^\\/app\\/account\\/?$","segments":[[{"content":"app","dynamic":false,"spread":false}],[{"content":"account","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/app/account.astro","pathname":"/app/account","prerender":false,"fallbackRoutes":[],"_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[{"type":"external","value":"/_astro/hoisted._FbzheVm.js"}],"styles":[{"type":"external","src":"/_astro/_slug_.r8QHNfdw.css"}],"routeData":{"route":"/[...slug]","type":"page","pattern":"^(?:\\/(.*?))?\\/?$","segments":[[{"content":"...slug","dynamic":true,"spread":true}]],"params":["...slug"],"component":"src/pages/[...slug].astro","prerender":false,"fallbackRoutes":[],"_meta":{"trailingSlash":"ignore"}}}],"site":"https://demo.ecomplus.app","base":"/","trailingSlash":"ignore","compressHTML":false,"componentMetadata":[["/home/leo/code/ecomplus/cloud-commerce/packages/storefront/src/lib/layouts/BaseHead.astro",{"propagation":"in-tree","containsHead":false}],["/home/leo/code/ecomplus/cloud-commerce/packages/storefront/src/pages/[...slug].astro",{"propagation":"in-tree","containsHead":false}],["\u0000@astro-page:src/pages/[...slug]@_@astro",{"propagation":"in-tree","containsHead":false}],["\u0000@astrojs-ssr-virtual-entry",{"propagation":"in-tree","containsHead":false}],["/home/leo/code/ecomplus/cloud-commerce/packages/storefront/src/pages/app/account.astro",{"propagation":"in-tree","containsHead":false}],["\u0000@astro-page:src/pages/app/account@_@astro",{"propagation":"in-tree","containsHead":false}],["/home/leo/code/ecomplus/cloud-commerce/packages/storefront/src/pages/app/index.astro",{"propagation":"in-tree","containsHead":false}],["\u0000@astro-page:src/pages/app/index@_@astro",{"propagation":"in-tree","containsHead":false}],["/home/leo/code/ecomplus/cloud-commerce/packages/storefront/src/pages/index.astro",{"propagation":"in-tree","containsHead":false}],["\u0000@astro-page:src/pages/index@_@astro",{"propagation":"in-tree","containsHead":false}],["/home/leo/code/ecomplus/cloud-commerce/packages/storefront/src/pages/~fallback.astro",{"propagation":"in-tree","containsHead":false}],["\u0000@astro-page:src/pages/~fallback@_@astro",{"propagation":"in-tree","containsHead":false}]],"renderers":[],"clientDirectives":[["idle","(()=>{var i=t=>{let e=async()=>{await(await t())()};\"requestIdleCallback\"in window?window.requestIdleCallback(e):setTimeout(e,200)};(self.Astro||(self.Astro={})).idle=i;window.dispatchEvent(new Event(\"astro:idle\"));})();"],["load","(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).load=e;window.dispatchEvent(new Event(\"astro:load\"));})();"],["media","(()=>{var s=(i,t)=>{let a=async()=>{await(await i())()};if(t.value){let e=matchMedia(t.value);e.matches?a():e.addEventListener(\"change\",a,{once:!0})}};(self.Astro||(self.Astro={})).media=s;window.dispatchEvent(new Event(\"astro:media\"));})();"],["only","(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).only=e;window.dispatchEvent(new Event(\"astro:only\"));})();"],["visible","(()=>{var r=(i,c,s)=>{let n=async()=>{await(await i())()},t=new IntersectionObserver(e=>{for(let o of e)if(o.isIntersecting){t.disconnect(),n();break}});for(let e of s.children)t.observe(e)};(self.Astro||(self.Astro={})).visible=r;window.dispatchEvent(new Event(\"astro:visible\"));})();"],["context","(()=>{var n=(d,i)=>{let t=async()=>{await(await d())()},e=()=>{if(i.value===\"idle\"){if(typeof window.requestIdleCallback==\"function\"){setTimeout(()=>window.requestIdleCallback(t),9);return}setTimeout(t,200);return}t()},o=window.$storefront?.apiContext?.doc._id||null;if(window._firstLoadContextId===o&&window._emitedContextId===o){console.log(\"[ctx] first load\"),e(),document.addEventListener(\"astro:beforeload\",()=>{delete window._firstLoadContextId},{once:!0});return}window.addEventListener(\"storefront:apiContext\",e,{once:!0})};(self.Astro||(self.Astro={})).context=n;window.dispatchEvent(new Event(\"astro:context\"));})();\n"]],"entryModules":{"\u0000@astrojs-ssr-virtual-entry":"entry.mjs","\u0000@astro-renderers":"renderers.mjs","\u0000empty-middleware":"_empty-middleware.mjs","/src/pages/app/account.astro":"chunks/pages/account_iG-YqJ5q.mjs","/../../node_modules/.pnpm/astro@4.0.4_@types+node@18.19.3_typescript@5.2.2/node_modules/astro/dist/assets/endpoint/node.js":"chunks/pages/node_bKqL47eZ.mjs","/src/pages/~fallback.astro":"chunks/pages/~fallback_73R5VA6j.mjs","\u0000@astrojs-manifest":"manifest_dSwvaOdW.mjs","\u0000@astro-page:../../node_modules/.pnpm/astro@4.0.4_@types+node@18.19.3_typescript@5.2.2/node_modules/astro/dist/assets/endpoint/node@_@js":"chunks/node_2VvC7trl.mjs","\u0000@astro-page:src/pages/index@_@astro":"chunks/index_nIwq11oA.mjs","\u0000@astro-page:src/pages/~fallback@_@astro":"chunks/~fallback_7q1dqY4e.mjs","\u0000@astro-page:src/pages/app/index@_@astro":"chunks/index_uAR5ZV4d.mjs","\u0000@astro-page:src/pages/app/account@_@astro":"chunks/account_3ySmGzMc.mjs","\u0000@astro-page:src/pages/[...slug]@_@astro":"chunks/_.._S7DDBn_b.mjs","/home/leo/code/ecomplus/cloud-commerce/packages/storefront/src/components/SearchModal.vue":"_astro/SearchModal.F7vbwxIv.js","/home/leo/code/ecomplus/cloud-commerce/packages/storefront/src/components/CartSidebar.vue":"_astro/CartSidebar.1kUFk9Xn.js","/home/leo/code/ecomplus/cloud-commerce/node_modules/photoswipe/dist/photoswipe.css?inline":"_astro/photoswipe.0V7m2jWu.js","/home/leo/code/ecomplus/cloud-commerce/node_modules/photoswipe/dist/photoswipe-lightbox.esm.js":"_astro/photoswipe-lightbox.esm.dZBqKD9u.js","/home/leo/code/ecomplus/cloud-commerce/packages/storefront/src/lib/scripts/firebase-app.ts":"_astro/firebase-app.cPMfoOsn.js","~/components/PitchBar.vue":"_astro/PitchBar.FelC04wE.js","~/components/SearchContainer.vue":"_astro/SearchContainer.BzixfU3R.js","~/components/AccountPage.vue":"_astro/AccountPage.j0C5JBLY.js","~/components/HeroSlider.vue":"_astro/HeroSlider.tR1dVXyu.js","/astro/hoisted.js?q=0":"_astro/hoisted.B6fKrLPR.js","~/components/ProductDetails.vue":"_astro/ProductDetails.B6Ih5MGf.js","~/components/ProductShelf.vue":"_astro/ProductShelf.GESxuPZ_.js","@astrojs/vue/client.js":"_astro/client.RF8UxjZd.js","/astro/hoisted.js?q=1":"_astro/hoisted._FbzheVm.js","/home/leo/code/ecomplus/cloud-commerce/node_modules/photoswipe/dist/photoswipe.esm.js":"_astro/photoswipe.esm.Ylh9TGkz.js","~/components/ShopHeader.vue":"_astro/ShopHeader.5vR1LgSW.js","astro:scripts/before-hydration.js":""},"assets":["/_astro/_slug_.r8QHNfdw.css","/robots.txt","/_astro/AccountPage.j0C5JBLY.js","/_astro/CartSidebar.1kUFk9Xn.js","/_astro/HeroSlider.tR1dVXyu.js","/_astro/PitchBar.FelC04wE.js","/_astro/Prices.PuQc6C7F.js","/_astro/ProductCard.ephJafAE.js","/_astro/ProductDetails.B6Ih5MGf.js","/_astro/ProductShelf.GESxuPZ_.js","/_astro/QuantitySelector.YNmWjN8y.js","/_astro/SearchContainer.BzixfU3R.js","/_astro/SearchModal.F7vbwxIv.js","/_astro/ShopHeader.5vR1LgSW.js","/_astro/_plugin-vue_export-helper.sk5AFsEV.js","/_astro/afetch.5c8VmT0-.js","/_astro/client.RF8UxjZd.js","/_astro/customer-session._VkzXnXT.js","/_astro/ecom-utils.gJYgRPRz.js","/_astro/firebase-app.cPMfoOsn.js","/_astro/format-money.FMQXgKHB.js","/_astro/hoisted.B6fKrLPR.js","/_astro/hoisted._FbzheVm.js","/_astro/i18n.m7SpISxy.js","/_astro/img-sizes.gxAI9JNh.js","/_astro/img.zh-Drf-O.js","/_astro/index-dd468b12.D5s8VdAL.js","/_astro/index.5PN-EYMS.js","/_astro/index.XrHFaN2F.js","/_astro/modules-info.sD0tdb2b.js","/_astro/name.HU5l7TJo.js","/_astro/photoswipe-lightbox.esm.dZBqKD9u.js","/_astro/photoswipe.0V7m2jWu.js","/_astro/photoswipe.esm.Ylh9TGkz.js","/_astro/price.Easct8WC.js","/_astro/sf-utils.5t7r9A2G.js","/_astro/shopping-cart.A-1jhlKi.js","/_astro/use-analytics.1EVxbrS7.js","/_astro/use-product-card.erbOV6Fv.js","/img/icon.png","/img/large-icon.png","/img/uploads/banner2.webp","/img/uploads/ecom-icon.png","/img/uploads/headphone.webp","/img/uploads/logo.png","/img/uploads/og-image.png","/img/uploads/passion.webp","/img/uploads/rect8589.png","/img/uploads/rect859.png","/img/uploads/rect89.webp"]});
194
+ const manifest = deserializeManifest({"adapterName":"@astrojs/node","routes":[{"file":"","links":[],"scripts":[],"styles":[],"routeData":{"type":"endpoint","route":"/_image","pattern":"^\\/_image$","segments":[[{"content":"_image","dynamic":false,"spread":false}]],"params":[],"component":"../../node_modules/.pnpm/astro@4.0.7_@types+node@18.19.3_typescript@5.2.2/node_modules/astro/dist/assets/endpoint/node.js","pathname":"/_image","prerender":false,"fallbackRoutes":[],"_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[{"type":"external","value":"/_astro/hoisted.3ec9NcvP.js"}],"styles":[{"type":"external","src":"/_astro/_slug_.cfRx-rdA.css"}],"routeData":{"route":"/","type":"page","pattern":"^\\/$","segments":[],"params":[],"component":"src/pages/index.astro","pathname":"/","prerender":false,"fallbackRoutes":[],"_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[{"type":"external","value":"/_astro/hoisted.3ec9NcvP.js"}],"styles":[{"type":"external","src":"/_astro/_slug_.cfRx-rdA.css"}],"routeData":{"route":"/~fallback","type":"page","pattern":"^\\/~fallback\\/?$","segments":[[{"content":"~fallback","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/~fallback.astro","pathname":"/~fallback","prerender":false,"fallbackRoutes":[],"_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[{"type":"external","value":"/_astro/hoisted.UnTlypMd.js"}],"styles":[{"type":"external","src":"/_astro/_slug_.cfRx-rdA.css"}],"routeData":{"route":"/app","type":"page","pattern":"^\\/app\\/?$","segments":[[{"content":"app","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/app/index.astro","pathname":"/app","prerender":false,"fallbackRoutes":[],"_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[{"type":"external","value":"/_astro/hoisted.3ec9NcvP.js"}],"styles":[{"type":"external","src":"/_astro/_slug_.cfRx-rdA.css"}],"routeData":{"route":"/app/account","type":"page","pattern":"^\\/app\\/account\\/?$","segments":[[{"content":"app","dynamic":false,"spread":false}],[{"content":"account","dynamic":false,"spread":false}]],"params":[],"component":"src/pages/app/account.astro","pathname":"/app/account","prerender":false,"fallbackRoutes":[],"_meta":{"trailingSlash":"ignore"}}},{"file":"","links":[],"scripts":[{"type":"external","value":"/_astro/hoisted.3ec9NcvP.js"}],"styles":[{"type":"external","src":"/_astro/_slug_.cfRx-rdA.css"}],"routeData":{"route":"/[...slug]","type":"page","pattern":"^(?:\\/(.*?))?\\/?$","segments":[[{"content":"...slug","dynamic":true,"spread":true}]],"params":["...slug"],"component":"src/pages/[...slug].astro","prerender":false,"fallbackRoutes":[],"_meta":{"trailingSlash":"ignore"}}}],"site":"https://demo.ecomplus.app","base":"/","trailingSlash":"ignore","compressHTML":false,"componentMetadata":[["/home/leo/code/ecomplus/cloud-commerce/packages/storefront/src/lib/layouts/BaseHead.astro",{"propagation":"in-tree","containsHead":false}],["/home/leo/code/ecomplus/cloud-commerce/packages/storefront/src/pages/[...slug].astro",{"propagation":"in-tree","containsHead":false}],["\u0000@astro-page:src/pages/[...slug]@_@astro",{"propagation":"in-tree","containsHead":false}],["\u0000@astrojs-ssr-virtual-entry",{"propagation":"in-tree","containsHead":false}],["/home/leo/code/ecomplus/cloud-commerce/packages/storefront/src/pages/app/account.astro",{"propagation":"in-tree","containsHead":false}],["\u0000@astro-page:src/pages/app/account@_@astro",{"propagation":"in-tree","containsHead":false}],["/home/leo/code/ecomplus/cloud-commerce/packages/storefront/src/pages/app/index.astro",{"propagation":"in-tree","containsHead":false}],["\u0000@astro-page:src/pages/app/index@_@astro",{"propagation":"in-tree","containsHead":false}],["/home/leo/code/ecomplus/cloud-commerce/packages/storefront/src/pages/index.astro",{"propagation":"in-tree","containsHead":false}],["\u0000@astro-page:src/pages/index@_@astro",{"propagation":"in-tree","containsHead":false}],["/home/leo/code/ecomplus/cloud-commerce/packages/storefront/src/pages/~fallback.astro",{"propagation":"in-tree","containsHead":false}],["\u0000@astro-page:src/pages/~fallback@_@astro",{"propagation":"in-tree","containsHead":false}]],"renderers":[],"clientDirectives":[["idle","(()=>{var i=t=>{let e=async()=>{await(await t())()};\"requestIdleCallback\"in window?window.requestIdleCallback(e):setTimeout(e,200)};(self.Astro||(self.Astro={})).idle=i;window.dispatchEvent(new Event(\"astro:idle\"));})();"],["load","(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).load=e;window.dispatchEvent(new Event(\"astro:load\"));})();"],["media","(()=>{var s=(i,t)=>{let a=async()=>{await(await i())()};if(t.value){let e=matchMedia(t.value);e.matches?a():e.addEventListener(\"change\",a,{once:!0})}};(self.Astro||(self.Astro={})).media=s;window.dispatchEvent(new Event(\"astro:media\"));})();"],["only","(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).only=e;window.dispatchEvent(new Event(\"astro:only\"));})();"],["visible","(()=>{var r=(i,c,s)=>{let n=async()=>{await(await i())()},t=new IntersectionObserver(e=>{for(let o of e)if(o.isIntersecting){t.disconnect(),n();break}});for(let e of s.children)t.observe(e)};(self.Astro||(self.Astro={})).visible=r;window.dispatchEvent(new Event(\"astro:visible\"));})();"],["context","(()=>{var n=(d,i)=>{let t=async()=>{await(await d())()},e=()=>{if(i.value===\"idle\"){if(typeof window.requestIdleCallback==\"function\"){setTimeout(()=>window.requestIdleCallback(t),9);return}setTimeout(t,200);return}t()},o=window.$storefront?.apiContext?.doc._id||null;if(window._firstLoadContextId===o&&window._emitedContextId===o){console.log(\"[ctx] first load\"),e(),document.addEventListener(\"astro:beforeload\",()=>{delete window._firstLoadContextId},{once:!0});return}window.addEventListener(\"storefront:apiContext\",e,{once:!0})};(self.Astro||(self.Astro={})).context=n;window.dispatchEvent(new Event(\"astro:context\"));})();\n"]],"entryModules":{"\u0000@astrojs-ssr-virtual-entry":"entry.mjs","\u0000@astro-renderers":"renderers.mjs","\u0000empty-middleware":"_empty-middleware.mjs","/src/pages/app/account.astro":"chunks/pages/account_WliDuQOB.mjs","/../../node_modules/.pnpm/astro@4.0.7_@types+node@18.19.3_typescript@5.2.2/node_modules/astro/dist/assets/endpoint/node.js":"chunks/pages/node_ZaY4t9qW.mjs","/src/pages/~fallback.astro":"chunks/pages/~fallback_TL5hPXF_.mjs","\u0000@astrojs-manifest":"manifest_YgAgEwvF.mjs","\u0000@astro-page:../../node_modules/.pnpm/astro@4.0.7_@types+node@18.19.3_typescript@5.2.2/node_modules/astro/dist/assets/endpoint/node@_@js":"chunks/node_wOa5hJmt.mjs","\u0000@astro-page:src/pages/index@_@astro":"chunks/index_1q5IpD39.mjs","\u0000@astro-page:src/pages/~fallback@_@astro":"chunks/~fallback_wxuqpDXG.mjs","\u0000@astro-page:src/pages/app/index@_@astro":"chunks/index_JEU6B2DI.mjs","\u0000@astro-page:src/pages/app/account@_@astro":"chunks/account_iZ2QmK5E.mjs","\u0000@astro-page:src/pages/[...slug]@_@astro":"chunks/_.._FnNLvTNv.mjs","/home/leo/code/ecomplus/cloud-commerce/packages/storefront/src/components/SearchModal.vue":"_astro/SearchModal.BrVoDBvg.js","/home/leo/code/ecomplus/cloud-commerce/packages/storefront/src/components/CartSidebar.vue":"_astro/CartSidebar.LrfpXG2B.js","/home/leo/code/ecomplus/cloud-commerce/node_modules/photoswipe/dist/photoswipe.css?inline":"_astro/photoswipe.0V7m2jWu.js","~/components/AccountPage.vue":"_astro/AccountPage.Osc6ffV0.js","~/components/ProductDetails.vue":"_astro/ProductDetails.Ln_jf57U.js","/home/leo/code/ecomplus/cloud-commerce/node_modules/photoswipe/dist/photoswipe-lightbox.esm.js":"_astro/photoswipe-lightbox.esm.dZBqKD9u.js","/home/leo/code/ecomplus/cloud-commerce/packages/storefront/src/lib/scripts/firebase-app.ts":"_astro/firebase-app.cPMfoOsn.js","~/components/PitchBar.vue":"_astro/PitchBar.N4d9fV8H.js","/home/leo/code/ecomplus/cloud-commerce/node_modules/photoswipe/dist/photoswipe.esm.js":"_astro/photoswipe.esm.Ylh9TGkz.js","/astro/hoisted.js?q=0":"_astro/hoisted.UnTlypMd.js","@astrojs/vue/client.js":"_astro/client.PdegUP6S.js","~/components/ProductShelf.vue":"_astro/ProductShelf.X389bv9S.js","~/components/HeroSlider.vue":"_astro/HeroSlider.Zf6kCaqD.js","/astro/hoisted.js?q=1":"_astro/hoisted.3ec9NcvP.js","~/components/SearchShowcase.vue":"_astro/SearchShowcase.KAz3nwco.js","~/components/ShopHeader.vue":"_astro/ShopHeader.mFKGzhIu.js","astro:scripts/before-hydration.js":""},"assets":["/_astro/_slug_.cfRx-rdA.css","/robots.txt","/_astro/AccountPage.Osc6ffV0.js","/_astro/CartSidebar.LrfpXG2B.js","/_astro/HeroSlider.Zf6kCaqD.js","/_astro/PitchBar.N4d9fV8H.js","/_astro/Prices.eQ9Vd255.js","/_astro/ProductDetails.Ln_jf57U.js","/_astro/ProductShelf.X389bv9S.js","/_astro/ProductShelf.vj6lVDCr.js","/_astro/QuantitySelector.qSJQlvTe.js","/_astro/SearchModal.BrVoDBvg.js","/_astro/SearchShowcase.KAz3nwco.js","/_astro/ShopHeader.mFKGzhIu.js","/_astro/_plugin-vue_export-helper._suIQ7WC.js","/_astro/afetch.5c8VmT0-.js","/_astro/client.PdegUP6S.js","/_astro/customer-session.KkTHFOXl.js","/_astro/ecom-utils.Ld2zf-Ve.js","/_astro/firebase-app.cPMfoOsn.js","/_astro/format-money.Axn0YFLJ.js","/_astro/grid-title.GntHOijE.js","/_astro/hoisted.3ec9NcvP.js","/_astro/hoisted.UnTlypMd.js","/_astro/i18n.3-NUtxYq.js","/_astro/img-sizes.gxAI9JNh.js","/_astro/img.pozlYdd3.js","/_astro/index-dd468b12.D5s8VdAL.js","/_astro/index.TkCbiY_p.js","/_astro/index.m6fK0JXC.js","/_astro/modules-info.mmwB1qIJ.js","/_astro/name.49dZlpDx.js","/_astro/photoswipe-lightbox.esm.dZBqKD9u.js","/_astro/photoswipe.0V7m2jWu.js","/_astro/photoswipe.esm.Ylh9TGkz.js","/_astro/price.Easct8WC.js","/_astro/sf-utils.yjuG8NjM.js","/_astro/shopping-cart.Ean2uW2R.js","/_astro/use-analytics.Y7amTmnr.js","/_astro/use-product-card.zB4z32bC.js","/_astro/use-text-value.f9pDzruv.js","/img/icon.png","/img/large-icon.png","/img/uploads/banner2.webp","/img/uploads/ecom-icon.png","/img/uploads/headphone.webp","/img/uploads/logo.png","/img/uploads/og-image.png","/img/uploads/passion.webp","/img/uploads/rect8589.png","/img/uploads/rect859.png","/img/uploads/rect89.webp"]});
194
195
 
195
196
  export { AstroIntegrationLogger as A, Logger as L, getEventPrefix as g, levels as l, manifest };
@@ -1,7 +1,7 @@
1
1
  import { useSSRContext, defineComponent, computed, createVNode, resolveDynamicComponent, mergeProps, withCtx, renderSlot, inject, ref, watch, toRef, onMounted, onBeforeUnmount, provide, h, createSSRApp } from 'vue';
2
2
  import { ssrRenderSlotInner, ssrRenderVNode, ssrRenderSlot, ssrRenderAttrs, ssrRenderClass, ssrRenderComponent, renderToString } from 'vue/server-renderer';
3
3
  import { img, imgSizes, i18n, formatMoney } from '@ecomplus/utils';
4
- import { _ as _export_sfc } from './chunks/pages/__MSibDuuV.mjs';
4
+ import { _ as _export_sfc } from './chunks/pages/__cEcxuEWe.mjs';
5
5
  import { useScroll, useElementHover, useDebounceFn } from '@vueuse/core';
6
6
 
7
7
  const _sfc_main$5 = /* @__PURE__ */ defineComponent({
@@ -169,7 +169,7 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
169
169
  if (props.href.startsWith(`https://${domain}`))
170
170
  return void 0;
171
171
  }
172
- return props.href.charAt(0) === "/" ? void 0 : "_blank";
172
+ return void 0;
173
173
  });
174
174
  const __returned__ = { props, linkTarget };
175
175
  Object.defineProperty(__returned__, "__isScriptSetup", { enumerable: false, value: true });
@@ -604,6 +604,17 @@ const createApp = (app) => {
604
604
  app.component("CarouselControl", CarouselControl);
605
605
  };
606
606
 
607
+ const mod = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({
608
+ __proto__: null,
609
+ default: createApp
610
+ }, Symbol.toStringTag, { value: 'Module' }));
611
+
612
+ const setup = (app) => {
613
+ if ('default' in mod) {
614
+ createApp(app);
615
+ }
616
+ };
617
+
607
618
  /**
608
619
  * Astro passes `children` as a string of HTML, so we need
609
620
  * a wrapper `div` to render that content as VNodes.
@@ -644,7 +655,7 @@ async function renderToStaticMarkup(Component, inputProps, slotted, metadata) {
644
655
  });
645
656
  }
646
657
  const app = createSSRApp({ render: () => h(Component, props, slots) });
647
- await createApp(app);
658
+ await setup(app);
648
659
  const html = await renderToString(app);
649
660
  return { html };
650
661
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/storefront",
3
3
  "type": "module",
4
- "version": "0.39.0",
4
+ "version": "0.40.0",
5
5
  "description": "E-Com Plus Cloud Commerce storefront with Astro",
6
6
  "bin": {
7
7
  "storefront": "./scripts/build-prod.sh"
@@ -29,20 +29,20 @@
29
29
  "prepare-monorepo": "bash scripts/prepare-monorepo.sh"
30
30
  },
31
31
  "dependencies": {
32
- "@astrojs/node": "7.0.1",
33
- "@astrojs/vue": "4.0.3",
32
+ "@astrojs/node": "7.0.2",
33
+ "@astrojs/vue": "4.0.5",
34
34
  "@cloudcommerce/api": "workspace:*",
35
35
  "@cloudcommerce/config": "workspace:*",
36
36
  "@cloudcommerce/i18n": "workspace:*",
37
- "@ecomplus/utils": "1.5.0-rc.5",
37
+ "@ecomplus/utils": "1.5.0-rc.6",
38
38
  "@fastify/deepmerge": "^1.3.0",
39
- "@iconify-json/fa6-brands": "^1.1.17",
40
- "@iconify-json/heroicons": "^1.1.15",
41
- "@iconify-json/logos": "^1.1.40",
39
+ "@iconify-json/fa6-brands": "^1.1.18",
40
+ "@iconify-json/heroicons": "^1.1.19",
41
+ "@iconify-json/logos": "^1.1.41",
42
42
  "@types/gtag.js": "^0.0.18",
43
43
  "@vite-pwa/astro": "^0.2.0",
44
44
  "@vueuse/core": "10.7.0",
45
- "astro": "4.0.4",
45
+ "astro": "4.0.7",
46
46
  "astro-capo": "^0.0.1",
47
47
  "chroma-js": "^2.4.2",
48
48
  "dotenv": "^16.3.1",
@@ -52,12 +52,12 @@
52
52
  "mitt": "^3.0.1",
53
53
  "semver": "^7.5.4",
54
54
  "sharp": "^0.32.6",
55
- "tailwindcss": "^3.3.6",
56
- "unocss": "^0.57.7",
55
+ "tailwindcss": "^3.4.0",
56
+ "unocss": "^0.58.0",
57
57
  "unplugin-auto-import": "^0.17.2",
58
- "vite": "^5.0.8",
58
+ "vite": "^5.0.10",
59
59
  "vite-plugin-pwa": "^0.17.4",
60
- "vue": "3.3.11",
60
+ "vue": "3.3.13",
61
61
  "wade": "0.3.3"
62
62
  },
63
63
  "devDependencies": {
@@ -56,3 +56,14 @@ export const termify = (str: string) => {
56
56
  export const getSearchUrl = (term: string, baseUrl = '/s/') => {
57
57
  return `${baseUrl}${encodeURIComponent(termify(term))}`;
58
58
  };
59
+
60
+ export const scrollToEl = (el: HTMLElement, top = 0) => {
61
+ while (el.offsetParent) {
62
+ top += el.offsetTop;
63
+ el = el.offsetParent as HTMLElement;
64
+ }
65
+ return window.scroll({
66
+ top,
67
+ behavior: 'smooth',
68
+ });
69
+ };
@@ -3,6 +3,7 @@ import type {
3
3
  Categories,
4
4
  Brands,
5
5
  Collections,
6
+ Grids,
6
7
  } from '@cloudcommerce/api/types';
7
8
  import type { SettingsContent } from '@@sf/content';
8
9
 
@@ -25,5 +26,10 @@ export type $Storefront = {
25
26
  doc: Collections,
26
27
  timestamp: number,
27
28
  },
28
- data: Record<string, any>,
29
+ data: Record<string, any> & {
30
+ categories?: Array<Partial<Categories>>,
31
+ brands?: Array<Partial<Brands>>,
32
+ collections?: Array<Partial<Collections>>,
33
+ grids?: Array<Partial<Grids>>,
34
+ },
29
35
  };
@@ -16,6 +16,7 @@ export interface Props {
16
16
  hasCloseButton?: boolean;
17
17
  anchorEl?: HTMLElement | null;
18
18
  backdropTarget?: string | null;
19
+ canLockScroll?: boolean;
19
20
  maxWidth?: string;
20
21
  class?: string | string[] | Record<string, string | null> | null;
21
22
  }
@@ -27,8 +28,8 @@ const props = withDefaults(defineProps<Props>(), {
27
28
  position: 'fixed',
28
29
  animation: 'slide',
29
30
  hasCloseButton: true,
30
- hasBackdrop: true,
31
31
  backdropTarget: '#teleported-top',
32
+ canLockScroll: true,
32
33
  });
33
34
  const emit = defineEmits<{
34
35
  'update:modelValue': [value: boolean]
@@ -49,16 +50,20 @@ const escClickListener = (ev: KeyboardEvent) => {
49
50
  const scrollbarWidth = ref(0);
50
51
  watch(toRef(props, 'modelValue'), async (isOpen) => {
51
52
  if (isOpen) {
52
- scrollbarWidth.value = window.innerWidth - document.documentElement.clientWidth;
53
- document.body.style.overflow = 'hidden';
54
- document.body.style.paddingRight = `${scrollbarWidth.value}px`;
53
+ if (props.canLockScroll) {
54
+ scrollbarWidth.value = window.innerWidth - document.documentElement.clientWidth;
55
+ document.body.style.overflow = 'hidden';
56
+ document.body.style.paddingRight = `${scrollbarWidth.value}px`;
57
+ }
55
58
  setTimeout(() => {
56
59
  document.addEventListener('click', outsideClickListener, { passive: true });
57
60
  document.addEventListener('keydown', escClickListener, { passive: true });
58
61
  }, 500);
59
62
  } else {
60
- document.body.style.overflow = '';
61
- document.body.style.paddingRight = '';
63
+ if (props.canLockScroll) {
64
+ document.body.style.overflow = '';
65
+ document.body.style.paddingRight = '';
66
+ }
62
67
  document.removeEventListener('click', outsideClickListener);
63
68
  document.removeEventListener('keydown', escClickListener);
64
69
  }
@@ -133,12 +138,12 @@ const isPlacementX = computed(() => {
133
138
  type="button"
134
139
  :aria-label="$t.i19close"
135
140
  @click.prevent="close"
136
- class="absolute top-2 z-30"
141
+ class="absolute top-2 z-30 rounded"
137
142
  :class="placement === 'end' ? 'left-2' : 'right-2'"
138
143
  data-drawer-close
139
144
  >
140
145
  <slot name="close">
141
- <i class="i-close text-base-400 hover:text-base-600 text-3xl"></i>
146
+ <i class="i-close text-base-400 hover:text-base-600 m-0 text-3xl"></i>
142
147
  </slot>
143
148
  </button>
144
149
  <slot />
@@ -14,7 +14,7 @@ const linkTarget = computed(() => {
14
14
  const domain = globalThis.$storefront.settings.domain || window.location.host;
15
15
  if (props.href.startsWith(`https://${domain}`)) return undefined;
16
16
  }
17
- return props.href.charAt(0) === '/' ? undefined : '_blank';
17
+ return undefined;
18
18
  });
19
19
  </script>
20
20
 
@@ -0,0 +1,61 @@
1
+ /* REFERENCE: https://jasonwatmore.com/post/2018/08/07/javascript-pure-pagination-logic-in-vanilla-js-typescript */
2
+ import { computed } from 'vue';
3
+
4
+ export interface Props {
5
+ totalItems?: number,
6
+ totalPages?: number,
7
+ page?: number,
8
+ pageSize?: number,
9
+ maxPages?: number,
10
+ }
11
+
12
+ const usePagination = (props: Props) => {
13
+ const totalPages = computed(() => {
14
+ if (props.totalPages) return props.totalPages;
15
+ if (props.totalItems && props.pageSize) {
16
+ return Math.ceil(props.totalItems / props.pageSize);
17
+ }
18
+ return 1;
19
+ });
20
+ const pageNumber = computed(() => {
21
+ const currentPage = props.page || 1;
22
+ if (currentPage < 1) return 1;
23
+ if (currentPage > totalPages.value) return totalPages.value;
24
+ return currentPage;
25
+ });
26
+ const maxPages = computed(() => props.maxPages || 10);
27
+ const startPage = computed(() => {
28
+ if (totalPages.value <= maxPages.value) return 1;
29
+ const maxPagesBeforeCurrent = Math.floor(maxPages.value / 2);
30
+ const maxPagesAfterCurrent = Math.ceil(maxPages.value / 2) - 1;
31
+ if (pageNumber.value <= maxPagesBeforeCurrent) return 1;
32
+ if (pageNumber.value + maxPagesAfterCurrent >= totalPages.value) {
33
+ return totalPages.value - maxPages.value + 1;
34
+ }
35
+ return pageNumber.value - maxPagesBeforeCurrent;
36
+ });
37
+ const endPage = computed(() => {
38
+ if (totalPages.value <= maxPages.value) return totalPages.value;
39
+ const maxPagesBeforeCurrent = Math.floor(maxPages.value / 2);
40
+ const maxPagesAfterCurrent = Math.ceil(maxPages.value / 2) - 1;
41
+ if (pageNumber.value <= maxPagesBeforeCurrent) return maxPages.value;
42
+ if (pageNumber.value + maxPagesAfterCurrent >= totalPages.value) {
43
+ return totalPages.value;
44
+ }
45
+ return pageNumber.value + maxPagesAfterCurrent;
46
+ });
47
+ const pages = computed(() => {
48
+ return Array.from(Array((endPage.value + 1) - startPage.value).keys())
49
+ .map((i) => startPage.value + i);
50
+ });
51
+ return {
52
+ totalPages,
53
+ startPage,
54
+ endPage,
55
+ pages,
56
+ };
57
+ };
58
+
59
+ export default usePagination;
60
+
61
+ export { usePagination };