cloudcommerce 0.26.7 → 0.28.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 (248) hide show
  1. package/.github/workflows/test-apps.yml +2 -2
  2. package/.gitmodules +0 -3
  3. package/.vscode/settings.json +3 -1
  4. package/CHANGELOG.md +51 -0
  5. package/action.yml +2 -2
  6. package/ecomplus-stores/barra-doce/functions/many/package.json +3 -3
  7. package/ecomplus-stores/barra-doce/functions/ssr/content/layout.json +13 -13
  8. package/ecomplus-stores/barra-doce/functions/ssr/content/pages/home.json +10 -10
  9. package/ecomplus-stores/barra-doce/functions/ssr/content/pages/products.json +17 -0
  10. package/ecomplus-stores/barra-doce/functions/ssr/content/settings.json +8 -8
  11. package/ecomplus-stores/barra-doce/functions/ssr/package.json +6 -6
  12. package/ecomplus-stores/barra-doce/functions/ssr/src/components/AccountMenu.vue +11 -11
  13. package/ecomplus-stores/barra-doce/functions/ssr/src/components/ShopFooter.vue +24 -24
  14. package/ecomplus-stores/barra-doce/functions/ssr/src/layouts/PageFooter.astro +4 -4
  15. package/ecomplus-stores/barra-doce/functions/with-apps/package.json +3 -3
  16. package/ecomplus-stores/barra-doce/package.json +2 -2
  17. package/ecomplus-stores/monocard/functions/many/package.json +3 -3
  18. package/ecomplus-stores/monocard/functions/ssr/content/layout.json +11 -11
  19. package/ecomplus-stores/monocard/functions/ssr/content/pages/home.json +16 -16
  20. package/ecomplus-stores/monocard/functions/ssr/content/pages/products.json +2 -4
  21. package/ecomplus-stores/monocard/functions/ssr/content/settings.json +11 -11
  22. package/ecomplus-stores/monocard/functions/ssr/package.json +6 -6
  23. package/ecomplus-stores/monocard/functions/ssr/src/components/AccountMenu.vue +1 -1
  24. package/ecomplus-stores/monocard/functions/ssr/src/components/DocDescription.vue +33 -0
  25. package/ecomplus-stores/monocard/functions/ssr/src/components/FeatureTabs.vue +3 -3
  26. package/ecomplus-stores/monocard/functions/ssr/src/components/ShopFooter.vue +3 -3
  27. package/ecomplus-stores/monocard/functions/ssr/src/components/ShopHeader.vue +5 -13
  28. package/ecomplus-stores/monocard/functions/ssr/src/layouts/PageFooter.astro +2 -2
  29. package/ecomplus-stores/monocard/functions/ssr/src/main/Home.astro +1 -1
  30. package/ecomplus-stores/monocard/functions/ssr/src/main/Sections.astro +1 -1
  31. package/ecomplus-stores/monocard/functions/with-apps/package.json +3 -3
  32. package/ecomplus-stores/monocard/package.json +2 -2
  33. package/package.json +6 -6
  34. package/packages/api/package.json +1 -1
  35. package/packages/apps/affilate-program/package.json +2 -2
  36. package/packages/apps/correios/package.json +3 -4
  37. package/packages/apps/custom-payment/package.json +1 -1
  38. package/packages/apps/custom-shipping/package.json +1 -1
  39. package/packages/apps/datafrete/package.json +3 -3
  40. package/packages/apps/discounts/package.json +1 -1
  41. package/packages/apps/emails/lib/functios-lib/utils.js +1 -1
  42. package/packages/apps/emails/lib/functios-lib/utils.js.map +1 -1
  43. package/packages/apps/emails/package.json +2 -2
  44. package/packages/apps/emails/src/functios-lib/utils.ts +1 -1
  45. package/packages/apps/fb-conversions/package.json +3 -3
  46. package/packages/apps/flash-courier/package.json +2 -2
  47. package/packages/apps/frenet/package.json +3 -3
  48. package/packages/apps/galaxpay/package.json +3 -3
  49. package/packages/apps/google-analytics/package.json +3 -3
  50. package/packages/apps/jadlog/package.json +2 -2
  51. package/packages/apps/loyalty-points/lib/functions-lib/cron-add-points.d.ts +2 -0
  52. package/packages/apps/loyalty-points/lib/functions-lib/cron-add-points.js +98 -0
  53. package/packages/apps/loyalty-points/lib/functions-lib/cron-add-points.js.map +1 -0
  54. package/packages/apps/loyalty-points/lib/functions-lib/handle-loyalty-points-event.js +59 -23
  55. package/packages/apps/loyalty-points/lib/functions-lib/handle-loyalty-points-event.js.map +1 -1
  56. package/packages/apps/loyalty-points/lib/loyalty-create-transaction.js +9 -4
  57. package/packages/apps/loyalty-points/lib/loyalty-create-transaction.js.map +1 -1
  58. package/packages/apps/loyalty-points/lib/loyalty-list-payments.js +7 -2
  59. package/packages/apps/loyalty-points/lib/loyalty-list-payments.js.map +1 -1
  60. package/packages/apps/loyalty-points/lib/loyalty-points-events.d.ts +3 -1
  61. package/packages/apps/loyalty-points/lib/loyalty-points-events.js +9 -0
  62. package/packages/apps/loyalty-points/lib/loyalty-points-events.js.map +1 -1
  63. package/packages/apps/loyalty-points/package.json +3 -2
  64. package/packages/apps/loyalty-points/src/functions-lib/cron-add-points.ts +104 -0
  65. package/packages/apps/loyalty-points/src/functions-lib/handle-loyalty-points-event.ts +67 -25
  66. package/packages/apps/loyalty-points/src/loyalty-create-transaction.ts +11 -4
  67. package/packages/apps/loyalty-points/src/loyalty-list-payments.ts +9 -2
  68. package/packages/apps/loyalty-points/src/loyalty-points-events.ts +12 -1
  69. package/packages/apps/melhor-envio/package.json +3 -3
  70. package/packages/apps/mercadopago/assets/onload-expression.js +5 -1
  71. package/packages/apps/mercadopago/assets/onload-expression.min.js +1 -1
  72. package/packages/apps/mercadopago/lib/mp-create-transaction.js +16 -6
  73. package/packages/apps/mercadopago/lib/mp-create-transaction.js.map +1 -1
  74. package/packages/apps/mercadopago/package.json +3 -3
  75. package/packages/apps/mercadopago/src/mp-create-transaction.ts +19 -7
  76. package/packages/apps/pagarme/package.json +3 -3
  77. package/packages/apps/paghiper/package.json +3 -3
  78. package/packages/apps/pix/package.json +3 -3
  79. package/packages/apps/tiny-erp/lib/integration/export-order-to-tiny.js +22 -0
  80. package/packages/apps/tiny-erp/lib/integration/export-order-to-tiny.js.map +1 -1
  81. package/packages/apps/tiny-erp/lib/integration/helpers/format-tiny-date.js +2 -2
  82. package/packages/apps/tiny-erp/lib/integration/helpers/format-tiny-date.js.map +1 -1
  83. package/packages/apps/tiny-erp/lib/integration/import-order-from-tiny.js +7 -1
  84. package/packages/apps/tiny-erp/lib/integration/import-order-from-tiny.js.map +1 -1
  85. package/packages/apps/tiny-erp/lib/integration/import-product-from-tiny.js +14 -5
  86. package/packages/apps/tiny-erp/lib/integration/import-product-from-tiny.js.map +1 -1
  87. package/packages/apps/tiny-erp/lib/integration/parsers/order-from-tiny.js +9 -1
  88. package/packages/apps/tiny-erp/lib/integration/parsers/order-from-tiny.js.map +1 -1
  89. package/packages/apps/tiny-erp/lib/integration/parsers/order-to-tiny.js +8 -6
  90. package/packages/apps/tiny-erp/lib/integration/parsers/order-to-tiny.js.map +1 -1
  91. package/packages/apps/tiny-erp/lib/integration/parsers/product-from-tiny.js +118 -38
  92. package/packages/apps/tiny-erp/lib/integration/parsers/product-from-tiny.js.map +1 -1
  93. package/packages/apps/tiny-erp/lib/integration/parsers/product-to-tiny.js +8 -0
  94. package/packages/apps/tiny-erp/lib/integration/parsers/product-to-tiny.js.map +1 -1
  95. package/packages/apps/tiny-erp/package.json +3 -3
  96. package/packages/apps/tiny-erp/src/integration/export-order-to-tiny.ts +24 -0
  97. package/packages/apps/tiny-erp/src/integration/helpers/format-tiny-date.ts +2 -2
  98. package/packages/apps/tiny-erp/src/integration/import-order-from-tiny.ts +8 -1
  99. package/packages/apps/tiny-erp/src/integration/import-product-from-tiny.ts +17 -5
  100. package/packages/apps/tiny-erp/src/integration/parsers/order-from-tiny.ts +13 -1
  101. package/packages/apps/tiny-erp/src/integration/parsers/order-to-tiny.ts +11 -6
  102. package/packages/apps/tiny-erp/src/integration/parsers/product-from-tiny.ts +144 -41
  103. package/packages/apps/tiny-erp/src/integration/parsers/product-to-tiny.ts +10 -0
  104. package/packages/apps/webhooks/package.json +3 -3
  105. package/packages/cli/package.json +1 -1
  106. package/packages/config/lib/config.js +2 -2
  107. package/packages/config/lib/config.js.map +1 -1
  108. package/packages/config/package.json +1 -1
  109. package/packages/config/src/config.ts +2 -2
  110. package/packages/emails/package.json +4 -4
  111. package/packages/eslint/base.eslintrc.cjs +3 -0
  112. package/packages/eslint/package.json +5 -4
  113. package/packages/eslint/storefront.eslintrc.cjs +8 -1
  114. package/packages/events/package.json +2 -2
  115. package/packages/feeds/package.json +1 -1
  116. package/packages/firebase/package.json +2 -2
  117. package/packages/i18n/package.json +1 -1
  118. package/packages/modules/package.json +3 -3
  119. package/packages/passport/package.json +2 -2
  120. package/packages/ssr/package.json +3 -3
  121. package/packages/storefront/.auto-imports.d.ts +65 -0
  122. package/packages/storefront/astro.config.mjs +24 -1
  123. package/packages/storefront/client.d.ts +1 -0
  124. package/packages/storefront/config/astro/context-directive.mjs +21 -0
  125. package/packages/storefront/config/astro/index.d.ts +8 -0
  126. package/packages/storefront/config/storefront.cms.js +2 -2
  127. package/packages/storefront/config/storefront.tailwind.cjs +0 -1
  128. package/packages/storefront/package.json +4 -3
  129. package/packages/storefront/server.d.ts +1 -1
  130. package/packages/storefront/src/lib/$storefront.d.ts +8 -8
  131. package/packages/storefront/src/lib/assets/base.css +5 -0
  132. package/packages/storefront/src/lib/components/Carousel.vue +93 -72
  133. package/packages/storefront/src/lib/components/CarouselControl.vue +13 -7
  134. package/packages/storefront/src/lib/components/ContentClearfix.vue +17 -0
  135. package/packages/storefront/src/lib/components/Drawer.vue +2 -2
  136. package/packages/storefront/src/lib/components/PaymentMethodFlag.vue +2 -2
  137. package/packages/storefront/src/lib/components/QuantitySelector.vue +4 -4
  138. package/packages/storefront/src/lib/components/QuantitySelectorControl.vue +2 -2
  139. package/packages/storefront/src/lib/components/ViewTransitions.astro +409 -0
  140. package/packages/storefront/src/lib/components/globals/AImg.vue +2 -1
  141. package/packages/storefront/src/lib/composables/use-pitch-bar.ts +2 -2
  142. package/packages/storefront/src/lib/content.d.ts +5 -5
  143. package/packages/storefront/src/lib/layouts/Base.astro +4 -4
  144. package/packages/storefront/src/lib/layouts/BaseBody.astro +0 -2
  145. package/packages/storefront/src/lib/layouts/BaseHead.astro +32 -14
  146. package/packages/storefront/src/lib/layouts/use-page-header.ts +9 -4
  147. package/packages/storefront/src/lib/layouts/use-page-main.ts +13 -33
  148. package/packages/test-base/package.json +1 -1
  149. package/packages/types/index.ts +14 -14
  150. package/packages/types/package.json +1 -1
  151. package/ecomplus-stores/iluminim/.devcontainer/devcontainer.json +0 -30
  152. package/ecomplus-stores/iluminim/.editorconfig +0 -13
  153. package/ecomplus-stores/iluminim/.eslintrc.cjs +0 -3
  154. package/ecomplus-stores/iluminim/.firebaserc +0 -5
  155. package/ecomplus-stores/iluminim/.github/renovate.json +0 -5
  156. package/ecomplus-stores/iluminim/.github/workflows/build-and-deploy.yml +0 -36
  157. package/ecomplus-stores/iluminim/.github/workflows/calibreapp-image-actions.yml +0 -23
  158. package/ecomplus-stores/iluminim/.gitpod.yml +0 -12
  159. package/ecomplus-stores/iluminim/.idx/dev.nix +0 -24
  160. package/ecomplus-stores/iluminim/.nvmrc +0 -1
  161. package/ecomplus-stores/iluminim/.vscode/extensions.json +0 -8
  162. package/ecomplus-stores/iluminim/.vscode/launch.json +0 -11
  163. package/ecomplus-stores/iluminim/.vscode/settings.json +0 -10
  164. package/ecomplus-stores/iluminim/README.md +0 -31
  165. package/ecomplus-stores/iluminim/SETUP.md +0 -117
  166. package/ecomplus-stores/iluminim/SETUP.pt-BR.md +0 -117
  167. package/ecomplus-stores/iluminim/functions/config.json +0 -3
  168. package/ecomplus-stores/iluminim/functions/example.env +0 -10
  169. package/ecomplus-stores/iluminim/functions/many/index.js +0 -14
  170. package/ecomplus-stores/iluminim/functions/many/package.json +0 -22
  171. package/ecomplus-stores/iluminim/functions/ssr/.eslintrc.cjs +0 -6
  172. package/ecomplus-stores/iluminim/functions/ssr/astro.config.mjs +0 -4
  173. package/ecomplus-stores/iluminim/functions/ssr/content/blog/.gitkeep +0 -0
  174. package/ecomplus-stores/iluminim/functions/ssr/content/extra-pages/contato.json +0 -11
  175. package/ecomplus-stores/iluminim/functions/ssr/content/extra-pages/terms.json +0 -11
  176. package/ecomplus-stores/iluminim/functions/ssr/content/extra-pages/trocas.json +0 -11
  177. package/ecomplus-stores/iluminim/functions/ssr/content/layout.json +0 -57
  178. package/ecomplus-stores/iluminim/functions/ssr/content/pages/home.json +0 -70
  179. package/ecomplus-stores/iluminim/functions/ssr/content/settings.json +0 -65
  180. package/ecomplus-stores/iluminim/functions/ssr/index.js +0 -18
  181. package/ecomplus-stores/iluminim/functions/ssr/package.json +0 -31
  182. package/ecomplus-stores/iluminim/functions/ssr/public/admin/.gitkeep +0 -2
  183. package/ecomplus-stores/iluminim/functions/ssr/public/assets/cms-preview.css +0 -274
  184. package/ecomplus-stores/iluminim/functions/ssr/public/assets/cms.css +0 -114
  185. package/ecomplus-stores/iluminim/functions/ssr/public/assets/cvv.png +0 -0
  186. package/ecomplus-stores/iluminim/functions/ssr/public/assets/img-placeholder.png +0 -0
  187. package/ecomplus-stores/iluminim/functions/ssr/public/assets/payments.png +0 -0
  188. package/ecomplus-stores/iluminim/functions/ssr/public/assets/ssl-safe.png +0 -0
  189. package/ecomplus-stores/iluminim/functions/ssr/public/img/icon.png +0 -0
  190. package/ecomplus-stores/iluminim/functions/ssr/public/img/large-icon.png +0 -0
  191. package/ecomplus-stores/iluminim/functions/ssr/public/img/uploads/banner-chamada-desktop-9x81zmd91q.webp +0 -0
  192. package/ecomplus-stores/iluminim/functions/ssr/public/img/uploads/banner2.webp +0 -0
  193. package/ecomplus-stores/iluminim/functions/ssr/public/img/uploads/chamada-mobile-q1c6om6jx4.webp +0 -0
  194. package/ecomplus-stores/iluminim/functions/ssr/public/img/uploads/ecom-icon.png +0 -0
  195. package/ecomplus-stores/iluminim/functions/ssr/public/img/uploads/headphone.webp +0 -0
  196. package/ecomplus-stores/iluminim/functions/ssr/public/img/uploads/logo.webp +0 -0
  197. package/ecomplus-stores/iluminim/functions/ssr/public/img/uploads/og-image.png +0 -0
  198. package/ecomplus-stores/iluminim/functions/ssr/public/img/uploads/passion.webp +0 -0
  199. package/ecomplus-stores/iluminim/functions/ssr/public/img/uploads/rect8589.png +0 -0
  200. package/ecomplus-stores/iluminim/functions/ssr/public/img/uploads/rect859.png +0 -0
  201. package/ecomplus-stores/iluminim/functions/ssr/public/img/uploads/rect89.webp +0 -0
  202. package/ecomplus-stores/iluminim/functions/ssr/public/robots.txt +0 -6
  203. package/ecomplus-stores/iluminim/functions/ssr/scripts/build.sh +0 -14
  204. package/ecomplus-stores/iluminim/functions/ssr/src/assets/style.css +0 -65
  205. package/ecomplus-stores/iluminim/functions/ssr/src/components/AccountMenu.vue +0 -95
  206. package/ecomplus-stores/iluminim/functions/ssr/src/components/Banner.vue +0 -57
  207. package/ecomplus-stores/iluminim/functions/ssr/src/components/BannersGrid.astro +0 -25
  208. package/ecomplus-stores/iluminim/functions/ssr/src/components/CartItem.vue +0 -64
  209. package/ecomplus-stores/iluminim/functions/ssr/src/components/CartSidebar.vue +0 -66
  210. package/ecomplus-stores/iluminim/functions/ssr/src/components/Countdown.vue +0 -79
  211. package/ecomplus-stores/iluminim/functions/ssr/src/components/HeroSlider.vue +0 -52
  212. package/ecomplus-stores/iluminim/functions/ssr/src/components/PitchBar.vue +0 -56
  213. package/ecomplus-stores/iluminim/functions/ssr/src/components/Prices.vue +0 -95
  214. package/ecomplus-stores/iluminim/functions/ssr/src/components/ProductCard.vue +0 -117
  215. package/ecomplus-stores/iluminim/functions/ssr/src/components/ProductShelf.vue +0 -57
  216. package/ecomplus-stores/iluminim/functions/ssr/src/components/ProductsCountdown.vue +0 -20
  217. package/ecomplus-stores/iluminim/functions/ssr/src/components/SearchModal.vue +0 -6
  218. package/ecomplus-stores/iluminim/functions/ssr/src/components/ShopFooter.vue +0 -149
  219. package/ecomplus-stores/iluminim/functions/ssr/src/components/ShopHeader.vue +0 -158
  220. package/ecomplus-stores/iluminim/functions/ssr/src/components/ShopHeaderMenu.vue +0 -58
  221. package/ecomplus-stores/iluminim/functions/ssr/src/components/ShopHeaderSubmenu.vue +0 -88
  222. package/ecomplus-stores/iluminim/functions/ssr/src/components/ShopSidenav.vue +0 -61
  223. package/ecomplus-stores/iluminim/functions/ssr/src/components/ShopSidenavCategory.vue +0 -80
  224. package/ecomplus-stores/iluminim/functions/ssr/src/env.d.ts +0 -13
  225. package/ecomplus-stores/iluminim/functions/ssr/src/layouts/Base.astro +0 -16
  226. package/ecomplus-stores/iluminim/functions/ssr/src/layouts/Checkout.astro +0 -0
  227. package/ecomplus-stores/iluminim/functions/ssr/src/layouts/PageFooter.astro +0 -68
  228. package/ecomplus-stores/iluminim/functions/ssr/src/layouts/PageHeader.astro +0 -42
  229. package/ecomplus-stores/iluminim/functions/ssr/src/main/Fallback.astro +0 -10
  230. package/ecomplus-stores/iluminim/functions/ssr/src/main/Home.astro +0 -49
  231. package/ecomplus-stores/iluminim/functions/ssr/src/main/Sections.astro +0 -42
  232. package/ecomplus-stores/iluminim/functions/ssr/src/main/Wildcard.astro +0 -18
  233. package/ecomplus-stores/iluminim/functions/ssr/src/pages/[...slug].astro +0 -40
  234. package/ecomplus-stores/iluminim/functions/ssr/src/pages/_vue.ts +0 -3
  235. package/ecomplus-stores/iluminim/functions/ssr/src/pages/app/account.astro +0 -0
  236. package/ecomplus-stores/iluminim/functions/ssr/src/pages/app/index.astro +0 -0
  237. package/ecomplus-stores/iluminim/functions/ssr/src/pages/index.astro +0 -37
  238. package/ecomplus-stores/iluminim/functions/ssr/src/pages/~fallback.astro +0 -25
  239. package/ecomplus-stores/iluminim/functions/ssr/src/scripts/InlineScripts.astro +0 -10
  240. package/ecomplus-stores/iluminim/functions/ssr/tailwind.config.cjs +0 -13
  241. package/ecomplus-stores/iluminim/functions/ssr/tsconfig.json +0 -12
  242. package/ecomplus-stores/iluminim/functions/ssr/uno.config.cjs +0 -5
  243. package/ecomplus-stores/iluminim/functions/with-apps/index.js +0 -12
  244. package/ecomplus-stores/iluminim/functions/with-apps/package.json +0 -22
  245. package/ecomplus-stores/iluminim/package.json +0 -31
  246. package/ecomplus-stores/iluminim/scripts/install.sh +0 -24
  247. package/ecomplus-stores/monocard/functions/ssr/src/components/DocDescription.astro +0 -30
  248. package/packages/storefront/src/lib/components/ContentClearfix.astro +0 -15
@@ -1,6 +1,6 @@
1
1
  import { fileURLToPath } from 'node:url';
2
2
  import { lstatSync, readFileSync } from 'node:fs';
3
- import { join as joinPath } from 'node:path';
3
+ import { join as joinPath, relative as relativePath } from 'node:path';
4
4
  import * as dotenv from 'dotenv';
5
5
  import { defineConfig } from 'astro/config';
6
6
  import node from '@astrojs/node';
@@ -8,6 +8,7 @@ import vue from '@astrojs/vue';
8
8
  import image from '@astrojs/image';
9
9
  import UnoCSS from 'unocss/astro';
10
10
  import AstroPWA from '@vite-pwa/astro';
11
+ import AutoImport from 'unplugin-auto-import/astro';
11
12
  import dictionaryDir from '@cloudcommerce/i18n/lib/dirname';
12
13
  import getConfig from './config/storefront.config.mjs';
13
14
 
@@ -18,6 +19,7 @@ const isSSG = process.env.BUILD_OUTPUT === 'static';
18
19
  const outDir = process.env.BUILD_OUT_DIR || (isSSG ? './dist/client' : './dist');
19
20
  const isToServerless = !isSSG && process.env.DEPLOY_RUNTIME === 'serverless';
20
21
  const deployRand = process.env.DEPLOY_RAND || '_';
22
+ const isLibDev = !(relativePath(__dirname, process.cwd()));
21
23
 
22
24
  const {
23
25
  lang,
@@ -179,6 +181,27 @@ const genAstroConfig = ({
179
181
  injectEntry: false,
180
182
  }),
181
183
  AstroPWA(vitePWAOptions),
184
+ AutoImport({
185
+ include: [
186
+ /\.[tj]sx?$/, // .ts, .tsx, .js, .jsx
187
+ /\.vue$/, /\.vue\?vue/, // .vue
188
+ /\.mdx?$/, // .md, .mdx
189
+ /\.astro$/,
190
+ ],
191
+ imports: ['vue'],
192
+ dts: isLibDev ? '.auto-imports.d.ts' : false,
193
+ }),
194
+ {
195
+ name: 'client:context',
196
+ hooks: {
197
+ 'astro:config:setup': ({ addClientDirective }) => {
198
+ addClientDirective({
199
+ name: 'context',
200
+ entrypoint: joinPath(__dirname, 'config/astro/context-directive.mjs'),
201
+ });
202
+ },
203
+ },
204
+ },
182
205
  ];
183
206
  if (!isToServerless) {
184
207
  integrations.push(image({
@@ -1,4 +1,5 @@
1
1
  /// <reference types="./src/vue-globals" />
2
+ /// <reference types="./.auto-imports" />
2
3
 
3
4
  type DocCleanupFields = 'body_html'
4
5
  | 'body_text'
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Hydrate on context script executed (`$storefront.apiContext` ready)
3
+ * Check event emits at BaseHead.astro
4
+ * @type {import('astro').ClientDirective}
5
+ */
6
+ export default (load) => {
7
+ const hy = async () => {
8
+ const hydrate = await load();
9
+ await hydrate();
10
+ };
11
+ const id = window.$storefront?.apiContext?.doc._id || null;
12
+ if (window._firstLoadContextId === id && window._emitedContextId === id) {
13
+ console.log('[ctx] first load');
14
+ hy();
15
+ setTimeout(() => {
16
+ delete window._firstLoadContextId;
17
+ }, 49);
18
+ return;
19
+ }
20
+ window.addEventListener('storefront:apiContext', hy, { once: true });
21
+ };
@@ -0,0 +1,8 @@
1
+ /* eslint-disable */
2
+ import 'astro';
3
+
4
+ declare module 'astro' {
5
+ interface AstroClientDirectives {
6
+ 'client:context'?: boolean
7
+ }
8
+ }
@@ -62,8 +62,8 @@ global.__storefrontCMS = (fs, resolvePath) => {
62
62
  settings = {};
63
63
  }
64
64
  const { domain } = settings;
65
- const primaryColor = settings.primary_color || '#137c5c';
66
- const secondaryColor = settings.secondary_color || primaryColor;
65
+ const primaryColor = settings.primaryColor || '#137c5c';
66
+ const secondaryColor = settings.secondaryColor || primaryColor;
67
67
 
68
68
  return {
69
69
  domain,
@@ -44,7 +44,6 @@ let defaultThemeOptions = {
44
44
  iconAliases: {
45
45
  close: 'x-mark',
46
46
  'chevron-right': 'chevron-right',
47
- 'chevron-left': 'chevron-left',
48
47
  },
49
48
  };
50
49
  if (globalThis.$storefrontThemeOptions) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@cloudcommerce/storefront",
3
3
  "type": "module",
4
- "version": "0.26.7",
4
+ "version": "0.28.0",
5
5
  "description": "E-Com Plus Cloud Commerce storefront with Astro",
6
6
  "bin": {
7
7
  "storefront": "./scripts/build-prod.sh"
@@ -51,9 +51,10 @@
51
51
  "image-size": "^1.0.2",
52
52
  "mime": "^3.0.0",
53
53
  "semver": "^7.5.4",
54
- "sharp": "^0.32.5",
54
+ "sharp": "^0.32.6",
55
55
  "tailwindcss": "^3.3.3",
56
- "unocss": "^0.55.7",
56
+ "unocss": "^0.56.4",
57
+ "unplugin-auto-import": "^0.16.6",
57
58
  "vite": "^4.4.9",
58
59
  "vite-plugin-pwa": "^0.16.5",
59
60
  "vue": "^3.3.4"
@@ -1,4 +1,5 @@
1
1
  /* eslint-disable vars-on-top, no-var */
2
+ /// <reference types="./config/astro/index.d.ts" />
2
3
 
3
4
  import type { ApiEndpoint } from '@cloudcommerce/api';
4
5
  import type { RouteContext } from '@@sf/ssr-context';
@@ -8,7 +9,6 @@ declare global {
8
9
  namespace App {
9
10
  interface Locals {
10
11
  routeContext: RouteContext,
11
- contextInlineClientJS?: string,
12
12
  }
13
13
  }
14
14
 
@@ -1,8 +1,8 @@
1
1
  import type {
2
- ProductSet,
3
- CategorySet,
4
- BrandSet,
5
- CollectionSet,
2
+ Products,
3
+ Categories,
4
+ Brands,
5
+ Collections,
6
6
  } from '@cloudcommerce/api/types';
7
7
  import type { SettingsContent } from '@@sf/content';
8
8
 
@@ -10,19 +10,19 @@ export type $Storefront = {
10
10
  settings: Partial<SettingsContent>,
11
11
  apiContext?: {
12
12
  resource: 'products',
13
- doc: ProductSet,
13
+ doc: Products,
14
14
  timestamp: number,
15
15
  } | {
16
16
  resource: 'categories',
17
- doc: CategorySet,
17
+ doc: Categories,
18
18
  timestamp: number,
19
19
  } | {
20
20
  resource: 'brands',
21
- doc: BrandSet,
21
+ doc: Brands,
22
22
  timestamp: number,
23
23
  } | {
24
24
  resource: 'collections',
25
- doc: CollectionSet,
25
+ doc: Collections,
26
26
  timestamp: number,
27
27
  },
28
28
  data: Record<string, any>,
@@ -118,3 +118,8 @@ https://stackoverflow.com/questions/37112218/css3-100vh-not-constant-in-mobile-b
118
118
  .h-screen {
119
119
  max-height: 100dvh;
120
120
  }
121
+
122
+ /* Hardfix for multiple <Teleport> backdrops with View Transitions "SPA" */
123
+ [data-drawer-backdrop] + [data-drawer-backdrop] {
124
+ display: none;
125
+ }
@@ -11,14 +11,19 @@ import {
11
11
  nextTick,
12
12
  provide,
13
13
  } from 'vue';
14
- import { useDebounceFn, useElementHover, useScroll } from '@vueuse/core';
14
+ import {
15
+ useDebounceFn,
16
+ useElementHover,
17
+ useScroll,
18
+ } from '@vueuse/core';
15
19
  import CarouselControl from '@@sf/components/CarouselControl.vue';
16
20
 
17
21
  export type CarouselInject = {
18
22
  autoplay: Ref<number | undefined>,
19
- changeSlide: (direction: number, isPageScroll?: boolean) => void,
20
- isBoundLeft: Ref<boolean>,
21
- isBoundRight: Ref<boolean>,
23
+ axis: 'x' | 'y',
24
+ changeSlide: (step: number, isPageScroll?: boolean) => void,
25
+ isBoundStart: Ref<boolean>,
26
+ isBoundEnd: Ref<boolean>,
22
27
  };
23
28
 
24
29
  export const carouselKey = Symbol('carousel') as InjectionKey<CarouselInject>;
@@ -28,78 +33,82 @@ export const carouselKey = Symbol('carousel') as InjectionKey<CarouselInject>;
28
33
  /* REFERENCE: https://github.com/bartdominiak/vue-snap */
29
34
  export interface Props {
30
35
  as?: string;
31
- modelValue?: number;
36
+ index?: number;
32
37
  autoplay?: number; // milliseconds
38
+ axis?: 'x' | 'y';
39
+ hasControls?: boolean
33
40
  }
34
41
 
35
42
  const props = withDefaults(defineProps<Props>(), {
36
43
  as: 'ul',
37
- modelValue: 1,
44
+ index: 0,
45
+ axis: 'x',
38
46
  });
39
- const emit = defineEmits([
40
- 'update:modelValue',
41
- ]);
42
- const currentIndex = ref(0);
43
- watch(toRef(props, 'modelValue'), (modelValue) => {
44
- currentIndex.value = modelValue - 1;
47
+ const emit = defineEmits(['update:index']);
48
+ const activeIndex = ref(0);
49
+ watch(toRef(props, 'index'), (index) => {
50
+ if (index !== activeIndex.value) {
51
+ const step = index - activeIndex.value;
52
+ changeSlide(step, false);
53
+ }
45
54
  }, { immediate: true });
46
- watch(currentIndex, (current, previous) => {
55
+ watch(activeIndex, (current, previous) => {
47
56
  if (current !== previous) {
48
- emit('update:modelValue', current + 1);
57
+ emit('update:index', current);
49
58
  }
50
59
  });
51
60
  const wrapper = ref<HTMLElement | null>(null);
52
- const { x: currentPos, isScrolling, arrivedState } = useScroll(wrapper);
53
- const isBoundLeft = computed(() => arrivedState.left);
54
- const isBoundRight = computed(() => arrivedState.right);
55
- const slidesWidth = ref<{ offsetLeft: number; width: number; }[]>([]);
56
- const wrapperScrollWidth = ref(0);
57
- const wrapperVisibleWidth = ref(0);
58
- const indexCount = ref(0);
59
- const calcWrapperWidth = () => {
61
+ const { [props.axis]: currentPos, isScrolling, arrivedState } = useScroll(wrapper);
62
+ const isX = props.axis === 'x';
63
+ const isBoundStart = computed(() => (isX ? arrivedState.left : arrivedState.top));
64
+ const isBoundEnd = computed(() => (isX ? arrivedState.right : arrivedState.bottom));
65
+ const slideSizes = ref<{ offset: number; size: number; }[]>([]);
66
+ const wrapperScrollSize = ref(0);
67
+ const wrapperVisibleSize = ref(0);
68
+ const calcWrapperSize = () => {
60
69
  if (!wrapper.value) return;
61
- wrapperScrollWidth.value = wrapper.value.scrollWidth;
62
- wrapperVisibleWidth.value = wrapper.value.offsetWidth;
70
+ if (isX) {
71
+ wrapperScrollSize.value = wrapper.value.scrollWidth;
72
+ wrapperVisibleSize.value = wrapper.value.offsetWidth;
73
+ } else {
74
+ wrapperScrollSize.value = wrapper.value.scrollHeight;
75
+ wrapperVisibleSize.value = wrapper.value.offsetHeight;
76
+ }
63
77
  };
64
- const calcSlidesWidth = () => {
78
+ const calcSlidesSize = () => {
65
79
  if (!wrapper.value) return;
66
80
  let childNodes = [...wrapper.value.children] as HTMLElement[];
67
81
  if (childNodes.length === 1 && childNodes[0].tagName.endsWith('SLOT')) {
68
82
  childNodes = [...childNodes[0].children] as HTMLElement[];
69
83
  }
70
- slidesWidth.value = childNodes.map((node) => ({
71
- offsetLeft: node.offsetLeft,
72
- width: node.offsetWidth,
84
+ slideSizes.value = childNodes.map((node) => ({
85
+ offset: isX ? node.offsetLeft : node.offsetTop,
86
+ size: isX ? node.offsetWidth : node.offsetHeight,
73
87
  }));
74
88
  };
75
- const calcNextOffsetLeft = (direction: number) => {
76
- let nextSlideIndex = currentIndex.value + direction;
77
- if (nextSlideIndex >= slidesWidth.value.length) {
89
+ const calcNextOffset = (step: number) => {
90
+ let nextSlideIndex = activeIndex.value + step;
91
+ if (nextSlideIndex >= slideSizes.value.length) {
78
92
  return 0;
79
93
  }
80
94
  if (nextSlideIndex < 0) {
81
- nextSlideIndex = slidesWidth.value.length + nextSlideIndex;
95
+ nextSlideIndex = slideSizes.value.length + nextSlideIndex;
82
96
  }
83
- const { offsetLeft, width } = slidesWidth.value[nextSlideIndex] || {};
84
- if (!width) {
97
+ const { offset, size } = slideSizes.value[nextSlideIndex] || {};
98
+ if (!size) {
85
99
  return 0;
86
100
  }
87
- return offsetLeft;
101
+ return offset;
88
102
  };
89
103
  const calcCurrentIndex = () => {
90
- const getCurrentIndex = slidesWidth.value.findIndex((slide) => {
104
+ const index = slideSizes.value.findIndex((slide) => {
91
105
  // Find the closest point, with 5px approximate.
92
- return Math.abs(slide.offsetLeft - currentPos.value) <= 5;
106
+ return Math.abs(slide.offset - currentPos.value) <= 5;
93
107
  });
94
- if (getCurrentIndex > -1) {
95
- currentIndex.value = getCurrentIndex || 0;
108
+ if (index > -1) {
109
+ activeIndex.value = index || 0;
96
110
  }
97
111
  };
98
- const calcIndexCount = () => {
99
- const maxPos = wrapperScrollWidth.value - wrapperVisibleWidth.value;
100
- indexCount.value = slidesWidth.value
101
- .findIndex(({ offsetLeft }) => (offsetLeft >= maxPos - 5));
102
- };
103
112
  let autoplayTimer: ReturnType<typeof setTimeout> | undefined;
104
113
  const restartAutoplay = () => {
105
114
  if (props.autoplay) {
@@ -110,29 +119,32 @@ const restartAutoplay = () => {
110
119
  }, props.autoplay);
111
120
  }
112
121
  };
113
- const changeSlide = (direction: number, isPageScroll: boolean = true) => {
114
- if (slidesWidth.value.length < 2) {
122
+ const changeSlide = (step: number, isPageScroll: boolean = true) => {
123
+ if (slideSizes.value.length < 2) {
115
124
  return;
116
125
  }
117
- if (isPageScroll && (direction === 1 || direction === -1)) {
126
+ if (isPageScroll && (step === 1 || step === -1)) {
118
127
  let pageStep = 0;
119
- let pageStepWidth = 0;
120
- for (let i = currentIndex.value; i < slidesWidth.value.length; i++) {
121
- const { width } = slidesWidth.value[i] || {};
122
- if (width) {
128
+ let pageStepSize = 0;
129
+ for (let i = activeIndex.value; i < slideSizes.value.length; i++) {
130
+ const { size } = slideSizes.value[i] || {};
131
+ if (size) {
123
132
  pageStep += 1;
124
- pageStepWidth += width;
125
- if (pageStepWidth >= wrapperVisibleWidth.value) {
133
+ pageStepSize += size;
134
+ if (pageStepSize >= wrapperVisibleSize.value) {
126
135
  break;
127
136
  }
128
137
  }
129
138
  }
130
139
  if (pageStep) {
131
- direction = direction > 0 ? pageStep : -pageStep;
140
+ step = step > 0 ? pageStep : -pageStep;
132
141
  }
133
142
  }
134
- const nextOffsetLeft = calcNextOffsetLeft(direction);
135
- wrapper.value?.scrollTo({ left: nextOffsetLeft, behavior: 'smooth' });
143
+ const nextOffset = calcNextOffset(step);
144
+ wrapper.value?.scrollTo({
145
+ [isX ? 'left' : 'top']: nextOffset,
146
+ behavior: 'smooth',
147
+ });
136
148
  restartAutoplay();
137
149
  };
138
150
  watch(isScrolling, (_isScrolling: boolean) => {
@@ -156,14 +168,17 @@ const calcOnInit = () => {
156
168
  if (!wrapper.value) {
157
169
  return;
158
170
  }
159
- calcWrapperWidth();
160
- calcSlidesWidth();
171
+ calcWrapperSize();
172
+ calcSlidesSize();
161
173
  calcCurrentIndex();
162
- calcIndexCount();
163
174
  };
164
175
  const onResize = useDebounceFn(() => {
165
176
  if (!wrapper.value) return;
166
- wrapper.value.scrollLeft = 0;
177
+ if (isX) {
178
+ wrapper.value.scrollLeft = 0;
179
+ } else {
180
+ wrapper.value.scrollTop = 0;
181
+ }
167
182
  calcOnInit();
168
183
  }, 400);
169
184
  onMounted(() => {
@@ -187,20 +202,27 @@ onBeforeUnmount(() => {
187
202
  });
188
203
  provide(carouselKey, {
189
204
  autoplay: toRef(props, 'autoplay'),
205
+ axis: props.axis,
190
206
  changeSlide,
191
- isBoundLeft,
192
- isBoundRight,
207
+ isBoundStart,
208
+ isBoundEnd,
193
209
  });
194
210
  </script>
195
211
 
196
212
  <template>
197
- <div ref="carousel" class="relative" data-carousel>
213
+ <div
214
+ ref="carousel"
215
+ :class="`relative ${(!isX ? 'overflow-hidden' : '')}`"
216
+ data-carousel
217
+ >
198
218
  <component
199
219
  :is="as"
200
220
  ref="wrapper"
201
- class="flex overflow-x-scroll overflow-y-hidden list-none m-0 p-0
202
- snap-x snap-mandatory scroll-smooth
203
- [&>*]:snap-start [&>*]:outline-none"
221
+ class="m-0 flex snap-mandatory list-none scroll-smooth p-0
222
+ [&>*]:snap-start [&>*]:outline-none"
223
+ :class="isX
224
+ ? 'snap-x overflow-y-hidden overflow-x-scroll'
225
+ : 'h-full flex-col snap-y overflow-x-hidden overflow-y-scroll'"
204
226
  style="
205
227
  scrollbar-width: none;
206
228
  -webkit-overflow-scrolling: touch;
@@ -214,16 +236,15 @@ provide(carouselKey, {
214
236
  name="controls"
215
237
  v-bind="{
216
238
  changeSlide,
217
- isBoundLeft,
218
- isBoundRight,
219
- currentPage: currentIndex + 1,
220
- pageCount: indexCount + 1,
239
+ isBoundStart,
240
+ isBoundEnd,
241
+ activeIndex,
221
242
  }"
222
243
  >
223
- <CarouselControl is-prev>
244
+ <CarouselControl v-if="slideSizes.length > 1 || hasControls" is-prev>
224
245
  <slot name="previous" />
225
246
  </CarouselControl>
226
- <CarouselControl>
247
+ <CarouselControl v-if="slideSizes.length > 1 || hasControls">
227
248
  <slot name="next" />
228
249
  </CarouselControl>
229
250
  </slot>
@@ -9,7 +9,8 @@ export interface Props {
9
9
  withDefaults(defineProps<Props>(), {
10
10
  isPrev: false,
11
11
  });
12
- const { changeSlide } = inject(carouselKey) as CarouselInject;
12
+ const { axis, changeSlide } = inject(carouselKey) as CarouselInject;
13
+ const isX = axis === 'x';
13
14
  </script>
14
15
 
15
16
  <template>
@@ -17,16 +18,21 @@ const { changeSlide } = inject(carouselKey) as CarouselInject;
17
18
  type="button"
18
19
  :aria-label="!isPrev ? $t.i19next : $t.i19previous"
19
20
  @click="changeSlide(!isPrev ? 1 : -1)"
20
- class="group absolute top-0 z-1"
21
- :class="!isPrev ? 'right-0' : 'left-0'"
21
+ class="z-1 group absolute"
22
+ :class="isX
23
+ ? `${(!isPrev ? 'right-0' : 'left-0')} top-0`
24
+ : `${(!isPrev ? 'bottom-0' : 'top-0')} left-0`"
22
25
  :data-carousel-control="!isPrev ? 'next' : 'previous'"
23
26
  >
24
27
  <slot>
25
28
  <i
26
- class="m-0"
27
- :class="!isPrev
28
- ? 'i-chevron-right group-active:translate-x-1'
29
- : 'i-chevron-left group-active:-translate-x-1'"
29
+ class="i-chevron-right m-0"
30
+ :class="{
31
+ 'group-active:translate-x-1': isX && !isPrev,
32
+ 'rotate-180 group-active:-translate-x-1': isX && isPrev,
33
+ 'rotate-90 group-active:translate-y-1': !isX && !isPrev,
34
+ '-rotate-90 group-active:-translate-y-1': !isX && isPrev,
35
+ }"
30
36
  ></i>
31
37
  </slot>
32
38
  </button>
@@ -0,0 +1,17 @@
1
+ <script setup lang="ts">
2
+ export interface Props {
3
+ html: string;
4
+ }
5
+
6
+ const { html } = defineProps<Props>();
7
+ const parsedHTML = html.replace(/<(img|iframe) /g, '<$1 loading="lazy" ');
8
+ </script>
9
+
10
+ <template>
11
+ <article class="prose !max-w-full overflow-x-auto" v-once>
12
+ <div
13
+ class="[&_iframe]:max-w-full [&_img]:max-w-full [&_table]:max-w-full"
14
+ v-html="parsedHTML"
15
+ ></div>
16
+ </article>
17
+ </template>
@@ -74,7 +74,7 @@ const isPlacementX = computed(() => {
74
74
  <dialog
75
75
  v-if="modelValue"
76
76
  ref="drawer"
77
- class="w-screen shadow p-0 m-0 z-50"
77
+ class="z-50 m-0 w-screen p-0 shadow"
78
78
  :class="[
79
79
  position,
80
80
  isFixed ? `top-0 ${(isPlacementX ? 'h-screen' : 'max-h-screen')}` : null,
@@ -108,7 +108,7 @@ const isPlacementX = computed(() => {
108
108
  <Fade>
109
109
  <div
110
110
  v-if="modelValue"
111
- class="fixed top-0 left-0 w-screen h-screen bg-black/50 z-40"
111
+ class="fixed left-0 top-0 z-40 h-screen w-screen bg-black/50"
112
112
  data-drawer-backdrop
113
113
  ></div>
114
114
  </Fade>
@@ -4,7 +4,7 @@ import { computed } from 'vue';
4
4
 
5
5
  export interface Props {
6
6
  as?: string;
7
- flag: Exclude<SettingsContent['payment_methods'], undefined>[number];
7
+ flag: Exclude<SettingsContent['paymentMethods'], undefined>[number];
8
8
  }
9
9
 
10
10
  const props = withDefaults(defineProps<Props>(), {
@@ -28,7 +28,7 @@ const iconClassName = computed(() => {
28
28
  <template>
29
29
  <b
30
30
  v-if="!iconClassName"
31
- class="tracking-tighter leading-none mb-1 text-black text-[57%]"
31
+ class="mb-1 text-[57%] leading-none tracking-tighter text-black"
32
32
  >
33
33
  {{ props.flag }}
34
34
  </b>
@@ -86,10 +86,10 @@ provide(quantitySelectorKey, {
86
86
  :step="step"
87
87
  :disabled="disabled"
88
88
  :readonly="readonly"
89
- class="h-12 w-14 px-2 text-lg border-transparent text-center
90
- [-moz-appearance:_textfield] [&::-webkit-outer-spin-button]:m-0
91
- [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:m-0
92
- [&::-webkit-inner-spin-button]:appearance-none"
89
+ class="h-12 w-14 border-transparent px-2 text-center text-lg
90
+ [-moz-appearance:_textfield] [&::-webkit-inner-spin-button]:m-0
91
+ [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:m-0
92
+ [&::-webkit-outer-spin-button]:appearance-none"
93
93
  />
94
94
  <slot
95
95
  name="controls"
@@ -20,8 +20,8 @@ const {
20
20
  <template>
21
21
  <button
22
22
  type="button"
23
- class="w-10 h-12 text-xl leading-12 enabled:text-primary
24
- enabled:hover:bg-primary-100/70 disabled:opacity-40"
23
+ class="leading-12 enabled:text-primary enabled:hover:bg-primary-100/70
24
+ h-12 w-10 text-xl disabled:opacity-40"
25
25
  :data-quantity-selector-control="isMinus ? 'minus' : 'plus'"
26
26
  :aria-label="isMinus ? $t.i19minus : $t.i19plus"
27
27
  :disabled="isMinus ? isBoundMin : isBoundMax"