cloudcommerce 0.36.2 → 0.37.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/test-apps.yml +2 -2
- package/.gitmodules +0 -3
- package/.vscode/settings.json +0 -1
- package/CHANGELOG.md +38 -0
- package/action.yml +2 -2
- package/ecomplus-stores/barra-doce/functions/many/package.json +3 -3
- package/ecomplus-stores/barra-doce/functions/ssr/package.json +6 -6
- package/ecomplus-stores/barra-doce/functions/with-apps/package.json +3 -3
- package/ecomplus-stores/barra-doce/package.json +2 -2
- package/package.json +5 -5
- package/packages/api/package.json +1 -1
- package/packages/apps/affilate-program/package.json +1 -1
- package/packages/apps/correios/package.json +1 -1
- package/packages/apps/custom-payment/package.json +1 -1
- package/packages/apps/custom-shipping/package.json +1 -1
- package/packages/apps/datafrete/package.json +1 -1
- package/packages/apps/discounts/package.json +1 -1
- package/packages/apps/emails/package.json +1 -1
- package/packages/apps/fb-conversions/package.json +2 -2
- package/packages/apps/flash-courier/package.json +1 -1
- package/packages/apps/frenet/package.json +1 -1
- package/packages/apps/galaxpay/package.json +1 -1
- package/packages/apps/google-analytics/package.json +1 -1
- package/packages/apps/jadlog/package.json +1 -1
- package/packages/apps/loyalty-points/package.json +1 -1
- package/packages/apps/mandae/package.json +1 -1
- package/packages/apps/melhor-envio/package.json +1 -1
- package/packages/apps/mercadopago/package.json +1 -1
- package/packages/apps/pagarme/package.json +1 -1
- package/packages/apps/pagarme-v5/package.json +1 -1
- package/packages/apps/paghiper/package.json +1 -1
- package/packages/apps/pix/package.json +1 -1
- package/packages/apps/tiny-erp/package.json +1 -1
- package/packages/apps/webhooks/package.json +1 -1
- package/packages/cli/package.json +1 -1
- package/packages/config/package.json +1 -1
- package/packages/emails/package.json +1 -1
- package/packages/eslint/package.json +5 -5
- package/packages/events/package.json +1 -1
- package/packages/feeds/package.json +1 -1
- package/packages/firebase/package.json +1 -1
- package/packages/i18n/package.json +1 -1
- package/packages/modules/package.json +1 -1
- package/packages/passport/package.json +1 -1
- package/packages/ssr/package.json +4 -4
- package/packages/storefront/package.json +11 -10
- package/packages/storefront/src/helpers/sf-utils.ts +8 -5
- package/packages/storefront/src/lib/components/CarouselControl.vue +1 -1
- package/packages/storefront/src/lib/composables/use-search-modal.ts +90 -0
- package/packages/storefront/src/lib/composables/use-shop-header.ts +69 -1
- package/packages/storefront/src/lib/state/search-engine.ts +39 -13
- package/packages/storefront/src/lib/state/shopping-cart.ts +2 -1
- package/packages/storefront/src/lib/state/use-analytics.ts +27 -11
- package/packages/test-base/package.json +1 -1
- package/packages/types/package.json +1 -1
- package/ecomplus-stores/monocard/.devcontainer/devcontainer.json +0 -30
- package/ecomplus-stores/monocard/.editorconfig +0 -13
- package/ecomplus-stores/monocard/.eslintrc.cjs +0 -3
- package/ecomplus-stores/monocard/.firebaserc +0 -5
- package/ecomplus-stores/monocard/.github/build-and-deploy +0 -1
- package/ecomplus-stores/monocard/.github/renovate.json +0 -5
- package/ecomplus-stores/monocard/.github/workflows/build-and-deploy.yml +0 -37
- package/ecomplus-stores/monocard/.github/workflows/calibreapp-image-actions.yml +0 -23
- package/ecomplus-stores/monocard/.gitpod.yml +0 -12
- package/ecomplus-stores/monocard/.idx/dev.nix +0 -24
- package/ecomplus-stores/monocard/.nvmrc +0 -1
- package/ecomplus-stores/monocard/.vscode/extensions.json +0 -8
- package/ecomplus-stores/monocard/.vscode/launch.json +0 -11
- package/ecomplus-stores/monocard/.vscode/settings.json +0 -13
- package/ecomplus-stores/monocard/LICENSE.md +0 -230
- package/ecomplus-stores/monocard/README.md +0 -31
- package/ecomplus-stores/monocard/SETUP.md +0 -129
- package/ecomplus-stores/monocard/SETUP.pt-BR.md +0 -129
- package/ecomplus-stores/monocard/functions/config.json +0 -3
- package/ecomplus-stores/monocard/functions/example.env +0 -10
- package/ecomplus-stores/monocard/functions/many/index.js +0 -14
- package/ecomplus-stores/monocard/functions/many/package.json +0 -22
- package/ecomplus-stores/monocard/functions/ssr/.eslintrc.cjs +0 -6
- package/ecomplus-stores/monocard/functions/ssr/astro.config.mjs +0 -4
- package/ecomplus-stores/monocard/functions/ssr/content/blog/.gitkeep +0 -0
- package/ecomplus-stores/monocard/functions/ssr/content/extra-pages/terms.json +0 -11
- package/ecomplus-stores/monocard/functions/ssr/content/extra-pages/trocas.json +0 -11
- package/ecomplus-stores/monocard/functions/ssr/content/layout.json +0 -52
- package/ecomplus-stores/monocard/functions/ssr/content/pages/home.json +0 -20
- package/ecomplus-stores/monocard/functions/ssr/content/pages/products.json +0 -18
- package/ecomplus-stores/monocard/functions/ssr/content/settings.json +0 -78
- package/ecomplus-stores/monocard/functions/ssr/index.js +0 -18
- package/ecomplus-stores/monocard/functions/ssr/package.json +0 -36
- package/ecomplus-stores/monocard/functions/ssr/public/admin/.gitkeep +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/assets/lotties/img_1.png +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/assets/lotties/img_1.webp +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/assets/lotties/phone-nfc.json +0 -1
- package/ecomplus-stores/monocard/functions/ssr/public/img/icon.png +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/large-icon.png +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/card-phone.png +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/devices.jpg +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/ecom-icon.png +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/edit-suit.jpg +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/favicon.png +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/icon.png +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/large-icon.png +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/logo-arcelor-mittal.webp +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/logo-azul.webp +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/logo-banco-pan.webp +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/logo-brinks.webp +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/logo-mastercard.webp +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/logo-pfizer.webp +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/logo-prudential.webp +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/logo-unimed.webp +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/logo.webp +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/mockup-editar.png +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/og-image.png +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/padronagem-tilada.png +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/qrcode-camera.png +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/img/uploads/sua-logo-aqui.png +0 -0
- package/ecomplus-stores/monocard/functions/ssr/public/robots.txt +0 -6
- package/ecomplus-stores/monocard/functions/ssr/scripts/build.sh +0 -14
- package/ecomplus-stores/monocard/functions/ssr/src/assets/card.css +0 -99
- package/ecomplus-stores/monocard/functions/ssr/src/assets/style.css +0 -79
- package/ecomplus-stores/monocard/functions/ssr/src/components/AccountMenu.vue +0 -97
- package/ecomplus-stores/monocard/functions/ssr/src/components/AccountPage.vue +0 -62
- package/ecomplus-stores/monocard/functions/ssr/src/components/Banner.vue +0 -59
- package/ecomplus-stores/monocard/functions/ssr/src/components/BannersGrid.astro +0 -25
- package/ecomplus-stores/monocard/functions/ssr/src/components/Breadcrumbs.astro +0 -44
- package/ecomplus-stores/monocard/functions/ssr/src/components/CartItem.vue +0 -64
- package/ecomplus-stores/monocard/functions/ssr/src/components/CartSidebar.vue +0 -69
- package/ecomplus-stores/monocard/functions/ssr/src/components/CasesGrid.astro +0 -49
- package/ecomplus-stores/monocard/functions/ssr/src/components/CheckoutPage.vue +0 -33
- package/ecomplus-stores/monocard/functions/ssr/src/components/Collapse.vue +0 -19
- package/ecomplus-stores/monocard/functions/ssr/src/components/DemoVideo.vue +0 -10
- package/ecomplus-stores/monocard/functions/ssr/src/components/DocDescription.vue +0 -28
- package/ecomplus-stores/monocard/functions/ssr/src/components/FeatureTabs.vue +0 -286
- package/ecomplus-stores/monocard/functions/ssr/src/components/FeaturesSection.astro +0 -28
- package/ecomplus-stores/monocard/functions/ssr/src/components/FooterStamps.vue +0 -63
- package/ecomplus-stores/monocard/functions/ssr/src/components/ImagesGallery.vue +0 -154
- package/ecomplus-stores/monocard/functions/ssr/src/components/LoginForm.vue +0 -107
- package/ecomplus-stores/monocard/functions/ssr/src/components/LottiePhoneNFC.vue +0 -20
- package/ecomplus-stores/monocard/functions/ssr/src/components/MonocardCustomizer.vue +0 -261
- package/ecomplus-stores/monocard/functions/ssr/src/components/PitchBar.vue +0 -61
- package/ecomplus-stores/monocard/functions/ssr/src/components/Prices.vue +0 -95
- package/ecomplus-stores/monocard/functions/ssr/src/components/ProductCard.vue +0 -117
- package/ecomplus-stores/monocard/functions/ssr/src/components/ProductDetails.vue +0 -122
- package/ecomplus-stores/monocard/functions/ssr/src/components/ProductShelf.vue +0 -57
- package/ecomplus-stores/monocard/functions/ssr/src/components/ProductSpecifications.vue +0 -42
- package/ecomplus-stores/monocard/functions/ssr/src/components/SearchModal.vue +0 -6
- package/ecomplus-stores/monocard/functions/ssr/src/components/ShopFooter.vue +0 -71
- package/ecomplus-stores/monocard/functions/ssr/src/components/ShopHeader.vue +0 -137
- package/ecomplus-stores/monocard/functions/ssr/src/components/ShopHeaderMenu.vue +0 -92
- package/ecomplus-stores/monocard/functions/ssr/src/components/ShopSidenav.vue +0 -64
- package/ecomplus-stores/monocard/functions/ssr/src/components/ShopSidenavCategory.vue +0 -77
- package/ecomplus-stores/monocard/functions/ssr/src/components/SkuSelector.vue +0 -58
- package/ecomplus-stores/monocard/functions/ssr/src/env.d.ts +0 -13
- package/ecomplus-stores/monocard/functions/ssr/src/layouts/Base.astro +0 -15
- package/ecomplus-stores/monocard/functions/ssr/src/layouts/PageFooter.astro +0 -53
- package/ecomplus-stores/monocard/functions/ssr/src/layouts/PageHeader.astro +0 -35
- package/ecomplus-stores/monocard/functions/ssr/src/main/Fallback.astro +0 -10
- package/ecomplus-stores/monocard/functions/ssr/src/main/Home.astro +0 -95
- package/ecomplus-stores/monocard/functions/ssr/src/main/Sections.astro +0 -52
- package/ecomplus-stores/monocard/functions/ssr/src/main/Wildcard.astro +0 -18
- package/ecomplus-stores/monocard/functions/ssr/src/pages/[...slug].astro +0 -42
- package/ecomplus-stores/monocard/functions/ssr/src/pages/_vue.ts +0 -10
- package/ecomplus-stores/monocard/functions/ssr/src/pages/app/account.astro +0 -34
- package/ecomplus-stores/monocard/functions/ssr/src/pages/app/index.astro +0 -62
- package/ecomplus-stores/monocard/functions/ssr/src/pages/comprar/index.astro +0 -52
- package/ecomplus-stores/monocard/functions/ssr/src/pages/index.astro +0 -32
- package/ecomplus-stores/monocard/functions/ssr/src/pages/~fallback.astro +0 -23
- package/ecomplus-stores/monocard/functions/ssr/src/scripts/InlineScripts.astro +0 -10
- package/ecomplus-stores/monocard/functions/ssr/tailwind.config.cjs +0 -18
- package/ecomplus-stores/monocard/functions/ssr/tsconfig.json +0 -12
- package/ecomplus-stores/monocard/functions/ssr/uno.config.cjs +0 -5
- package/ecomplus-stores/monocard/functions/with-apps/index.js +0 -12
- package/ecomplus-stores/monocard/functions/with-apps/package.json +0 -22
- package/ecomplus-stores/monocard/package.json +0 -31
- package/ecomplus-stores/monocard/scripts/install.sh +0 -24
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<section class="ui-section">
|
|
3
|
-
<div v-if="title" class="mx-auto mb-2 max-w-prose text-center">
|
|
4
|
-
<h2 class="ui-text-brand text-3xl">
|
|
5
|
-
<ALink :href="titleLink" :class="titleLink ? 'ui-link' : 'text-base-700'">
|
|
6
|
-
{{ title }}
|
|
7
|
-
</ALink>
|
|
8
|
-
</h2>
|
|
9
|
-
</div>
|
|
10
|
-
<Carousel class="group/shelf [&>ul]:justify-center">
|
|
11
|
-
<li
|
|
12
|
-
v-for="product in products"
|
|
13
|
-
:key="product._id"
|
|
14
|
-
class="shrink-0 basis-1/2 lg:basis-1/3"
|
|
15
|
-
>
|
|
16
|
-
<ProductCard :product="product" />
|
|
17
|
-
</li>
|
|
18
|
-
<template #controls>
|
|
19
|
-
<div
|
|
20
|
-
v-show="products.length > 2"
|
|
21
|
-
class="text-primary text-3xl leading-none transition-opacity
|
|
22
|
-
group-hover/shelf:opacity-90 lg:text-2xl lg:opacity-0"
|
|
23
|
-
>
|
|
24
|
-
<CarouselControl class="lg:hover:bg-primary-300/60 !-left-4 !top-1/2 h-12
|
|
25
|
-
w-12 rounded-full bg-transparent ring-black/5
|
|
26
|
-
lg:bg-white/80 lg:shadow-sm lg:ring-1" is-prev />
|
|
27
|
-
<CarouselControl class="lg:hover:bg-primary-300/60 !-right-4 !top-1/2 h-12
|
|
28
|
-
w-12 rounded-full bg-transparent ring-black/5
|
|
29
|
-
lg:bg-white/80 lg:shadow-sm lg:ring-1" />
|
|
30
|
-
</div>
|
|
31
|
-
</template>
|
|
32
|
-
</Carousel>
|
|
33
|
-
</section>
|
|
34
|
-
</template>
|
|
35
|
-
|
|
36
|
-
<script setup lang="ts">
|
|
37
|
-
import {
|
|
38
|
-
type Props as UseProductShelfProps,
|
|
39
|
-
useProductShelf,
|
|
40
|
-
} from '@@sf/composables/use-product-shelf';
|
|
41
|
-
import Carousel from '@@sf/components/Carousel.vue';
|
|
42
|
-
import CarouselControl from '@@sf/components/CarouselControl.vue';
|
|
43
|
-
import ProductCard from '~/components/ProductCard.vue';
|
|
44
|
-
|
|
45
|
-
export interface Props extends UseProductShelfProps {}
|
|
46
|
-
|
|
47
|
-
const props = defineProps<Props>();
|
|
48
|
-
const {
|
|
49
|
-
title,
|
|
50
|
-
titleLink,
|
|
51
|
-
fetching,
|
|
52
|
-
products,
|
|
53
|
-
} = useProductShelf(props);
|
|
54
|
-
if (import.meta.env.SSR) {
|
|
55
|
-
await fetching;
|
|
56
|
-
}
|
|
57
|
-
</script>
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<section v-if="hasSpecs" class="ui-section">
|
|
3
|
-
<Collapse :title="title || $t.i19specifications">
|
|
4
|
-
<ul>
|
|
5
|
-
<li
|
|
6
|
-
v-for="(grid, gridId) in specifications"
|
|
7
|
-
:key="gridId"
|
|
8
|
-
class="border-base-200 grid grid-cols-2
|
|
9
|
-
border-dashed py-2 sm:grid-cols-3 [&:not(:last-child)]:border-b"
|
|
10
|
-
>
|
|
11
|
-
<span class="text-base-700">
|
|
12
|
-
{{ getGridTitle(`${gridId}`, grids) }}
|
|
13
|
-
</span>
|
|
14
|
-
<strong class="font-semibold sm:col-span-2">
|
|
15
|
-
{{ getSpecTextValue(product, `${gridId}`, grids) }}
|
|
16
|
-
</strong>
|
|
17
|
-
</li>
|
|
18
|
-
</ul>
|
|
19
|
-
</Collapse>
|
|
20
|
-
</section>
|
|
21
|
-
</template>
|
|
22
|
-
|
|
23
|
-
<script setup lang="ts">
|
|
24
|
-
import type { Products } from '@cloudcommerce/api/types';
|
|
25
|
-
import {
|
|
26
|
-
gridTitle as getGridTitle,
|
|
27
|
-
specTextValue as getSpecTextValue,
|
|
28
|
-
} from '@ecomplus/utils';
|
|
29
|
-
import Collapse from '~/components/Collapse.vue';
|
|
30
|
-
|
|
31
|
-
export interface Props {
|
|
32
|
-
product?: Products;
|
|
33
|
-
title?: string;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const props = withDefaults(defineProps<Props>(), {
|
|
37
|
-
product: () => globalThis.$storefront.apiContext?.doc as Products,
|
|
38
|
-
});
|
|
39
|
-
const specifications = computed(() => props.product.specifications || {});
|
|
40
|
-
const hasSpecs = computed(() => Object.keys(specifications.value).length);
|
|
41
|
-
const { grids } = globalThis.$storefront.data;
|
|
42
|
-
</script>
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<footer class="text-base-300 border-base-100 w-screen border-t bg-black py-2">
|
|
3
|
-
<div class="ui-section">
|
|
4
|
-
<div class="border-base-200 flex flex-wrap
|
|
5
|
-
justify-between gap-y-5 border-b pb-7 sm:gap-x-10 lg:flex-nowrap">
|
|
6
|
-
<div class="shrink">
|
|
7
|
-
<slot name="logo" />
|
|
8
|
-
<div v-if="$settings.description" class="prose prose-invert">
|
|
9
|
-
<p>{{ $settings.description }}</p>
|
|
10
|
-
</div>
|
|
11
|
-
<div class="text-base-400 flex gap-2">
|
|
12
|
-
<span v-for="(href, network) in socialNetworks" :key="network">
|
|
13
|
-
<SocialNetworkLink :network="network" class="hover:text-primary p-1">
|
|
14
|
-
<template v-if="network === 'whatsapp'" #append>
|
|
15
|
-
<span class="text-base-300 ml-1 text-sm">
|
|
16
|
-
{{ $settings.whatsapp }}
|
|
17
|
-
</span>
|
|
18
|
-
</template>
|
|
19
|
-
</SocialNetworkLink>
|
|
20
|
-
</span>
|
|
21
|
-
</div>
|
|
22
|
-
<div v-if="$settings.phone" class="text-base-200 mt-3">
|
|
23
|
-
<ALink
|
|
24
|
-
v-if="$settings.phone"
|
|
25
|
-
:href="`tel:${$settings.phone.replace(/\D/g, '')}`"
|
|
26
|
-
class="hover:text-primary"
|
|
27
|
-
>
|
|
28
|
-
<i class="i-phone mr-0.5"></i>
|
|
29
|
-
{{ $settings.phone }}
|
|
30
|
-
</ALink>
|
|
31
|
-
</div>
|
|
32
|
-
</div>
|
|
33
|
-
<div v-if="pageLinks?.length" class="basis-1/2 sm:basis-auto">
|
|
34
|
-
<div class="mb-2.5 text-lg font-medium">
|
|
35
|
-
{{ pagesColTitle || $t.i19institutional }}
|
|
36
|
-
</div>
|
|
37
|
-
<ul
|
|
38
|
-
class="text-sm"
|
|
39
|
-
:class="pageLinks.length > 5
|
|
40
|
-
? 'grid md:grid-cols-2 gap-x-5 gap-y-1.5' : 'space-y-1.5'"
|
|
41
|
-
>
|
|
42
|
-
<li v-for="({ title, href }, i) in pageLinks" :key="`p-${i}`">
|
|
43
|
-
<ALink :href="href" class="ui-link text-base-50">
|
|
44
|
-
{{ title }}
|
|
45
|
-
</ALink>
|
|
46
|
-
</li>
|
|
47
|
-
</ul>
|
|
48
|
-
</div>
|
|
49
|
-
</div>
|
|
50
|
-
</div>
|
|
51
|
-
<FooterStamps :stamps="stamps" />
|
|
52
|
-
</footer>
|
|
53
|
-
</template>
|
|
54
|
-
|
|
55
|
-
<script setup lang="ts">
|
|
56
|
-
import type { LayoutContent } from '@@sf/content';
|
|
57
|
-
import { socialNetworks } from '@@sf/sf-lib';
|
|
58
|
-
import SocialNetworkLink from '@@sf/components/SocialNetworkLink.vue';
|
|
59
|
-
import FooterStamps from '~/components/FooterStamps.vue';
|
|
60
|
-
|
|
61
|
-
export interface Props {
|
|
62
|
-
stamps?: LayoutContent['footer']['stamps'];
|
|
63
|
-
pageLinks?: Array<{
|
|
64
|
-
title: string;
|
|
65
|
-
href: string;
|
|
66
|
-
}>;
|
|
67
|
-
pagesColTitle?: string;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
defineProps<Props>();
|
|
71
|
-
</script>
|
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<header
|
|
3
|
-
ref="header"
|
|
4
|
-
class="relative top-0 z-50 transition-colors"
|
|
5
|
-
:class="[
|
|
6
|
-
isSticky && !isSidenavOpen ? 'bg-black/80' : 'bg-black',
|
|
7
|
-
isSticky ? 'py-2 shadow backdrop-blur-md md:py-3' : 'py-3 sm:py-4 md:py-5',
|
|
8
|
-
]"
|
|
9
|
-
>
|
|
10
|
-
<div class="container mx-auto flex grid-flow-col
|
|
11
|
-
grid-cols-3 items-center justify-between
|
|
12
|
-
px-1 md:grid lg:max-w-4xl lg:auto-cols-max lg:grid-cols-none lg:pl-3
|
|
13
|
-
xl:max-w-6xl 2xl:max-w-7xl">
|
|
14
|
-
<div class="basis-1/4 lg:hidden">
|
|
15
|
-
<button
|
|
16
|
-
class="my-1 px-2"
|
|
17
|
-
:aria-label="$t.i19toggleMenu"
|
|
18
|
-
@click="isSidenavOpen = !isSidenavOpen"
|
|
19
|
-
>
|
|
20
|
-
<i
|
|
21
|
-
class="text-3xl transition-colors"
|
|
22
|
-
:class="[
|
|
23
|
-
isSidenavOpen ? 'i-close' : 'i-menu-3-line',
|
|
24
|
-
isMounted ? 'text-base-100' : 'text-base-300 animate-pulse',
|
|
25
|
-
]"
|
|
26
|
-
></i>
|
|
27
|
-
</button>
|
|
28
|
-
</div>
|
|
29
|
-
<slot name="logo" />
|
|
30
|
-
<ShopHeaderMenu
|
|
31
|
-
class="hidden lg:block"
|
|
32
|
-
v-bind="{ isSticky, ...headerNavLinks }"
|
|
33
|
-
/>
|
|
34
|
-
<div class="flex basis-1/4 items-center justify-end gap-3 px-2 lg:gap-4">
|
|
35
|
-
<AccountMenu class="hidden sm:block">
|
|
36
|
-
<template #button="{ open }">
|
|
37
|
-
<i
|
|
38
|
-
class="i-account-pin-circle-line hover:text-primary h-7
|
|
39
|
-
w-7 hover:scale-110 active:scale-125"
|
|
40
|
-
:class="open ? 'text-white scale-110' : 'text-base-200'"
|
|
41
|
-
></i>
|
|
42
|
-
</template>
|
|
43
|
-
</AccountMenu>
|
|
44
|
-
<a
|
|
45
|
-
:href="$settings.cartUrl || '/app/'"
|
|
46
|
-
:aria-label="$t.i19openCart"
|
|
47
|
-
@click.prevent="isCartOpen = !isCartOpen"
|
|
48
|
-
class="group relative"
|
|
49
|
-
role="button"
|
|
50
|
-
>
|
|
51
|
-
<i class="i-shopping-bag-3-line text-base-200 hover:text-primary
|
|
52
|
-
h-7 w-7 hover:scale-110 active:scale-125"></i>
|
|
53
|
-
<span
|
|
54
|
-
v-if="delayedTotalItems"
|
|
55
|
-
class="ui-badge-pill-sm absolute -right-1.5 -top-1"
|
|
56
|
-
>
|
|
57
|
-
{{ delayedTotalItems }}
|
|
58
|
-
</span>
|
|
59
|
-
</a>
|
|
60
|
-
</div>
|
|
61
|
-
</div>
|
|
62
|
-
<Drawer
|
|
63
|
-
v-model="isSidenavOpen"
|
|
64
|
-
:has-close-button="false"
|
|
65
|
-
position="absolute"
|
|
66
|
-
:class="isSticky ? 'mt-2 md:mt-3' : 'mt-3 sm:mt-4 md:mt-5'"
|
|
67
|
-
:style="{
|
|
68
|
-
height: `calc(100vh - ${positionY}px + .5rem)`,
|
|
69
|
-
maxHeight: `calc(100dvh - ${positionY}px + .5rem)`,
|
|
70
|
-
}"
|
|
71
|
-
>
|
|
72
|
-
<ShopSidenav class="bg-white pt-6" />
|
|
73
|
-
</Drawer>
|
|
74
|
-
<Teleport v-if="isMounted" to="#teleported-overlap">
|
|
75
|
-
<Drawer
|
|
76
|
-
v-model="isCartOpen"
|
|
77
|
-
placement="end"
|
|
78
|
-
backdrop-target="#teleported-overlap"
|
|
79
|
-
>
|
|
80
|
-
<Suspense>
|
|
81
|
-
<CartSidebar v-if="isCartOpenOnce" @close="isCartOpen = false" />
|
|
82
|
-
<template #fallback>
|
|
83
|
-
<Skeleton class="px-6 pt-16" is-bold />
|
|
84
|
-
</template>
|
|
85
|
-
</Suspense>
|
|
86
|
-
</Drawer>
|
|
87
|
-
</Teleport>
|
|
88
|
-
</header>
|
|
89
|
-
</template>
|
|
90
|
-
|
|
91
|
-
<script setup lang="ts">
|
|
92
|
-
import { watchOnce } from '@vueuse/core';
|
|
93
|
-
import { totalItems } from '@@sf/state/shopping-cart';
|
|
94
|
-
import {
|
|
95
|
-
type Props as UseShopHeaderProps,
|
|
96
|
-
useShopHeader,
|
|
97
|
-
} from '@@sf/composables/use-shop-header';
|
|
98
|
-
import Drawer from '@@sf/components/Drawer.vue';
|
|
99
|
-
import ShopSidenav from '~/components/ShopSidenav.vue';
|
|
100
|
-
import ShopHeaderMenu from '~/components/ShopHeaderMenu.vue';
|
|
101
|
-
import AccountMenu from '~/components/AccountMenu.vue';
|
|
102
|
-
|
|
103
|
-
export interface Props extends Omit<UseShopHeaderProps, 'header'> {}
|
|
104
|
-
|
|
105
|
-
const CartSidebar = defineAsyncComponent(() => import('~/components/CartSidebar.vue'));
|
|
106
|
-
const props = defineProps<Props>();
|
|
107
|
-
const header = ref<HTMLElement | null>(null);
|
|
108
|
-
const { isSticky, positionY } = useShopHeader({ ...props, header });
|
|
109
|
-
const isSidenavOpen = ref(false);
|
|
110
|
-
const isCartOpen = ref(false);
|
|
111
|
-
const isCartOpenOnce = ref(false);
|
|
112
|
-
watchOnce(isCartOpen, () => {
|
|
113
|
-
isCartOpenOnce.value = true;
|
|
114
|
-
});
|
|
115
|
-
const isMounted = ref(false);
|
|
116
|
-
const delayedTotalItems = ref(0);
|
|
117
|
-
onMounted(() => {
|
|
118
|
-
isMounted.value = true;
|
|
119
|
-
watch(totalItems, (newTotalItems, prevTotalItems) => {
|
|
120
|
-
if (typeof prevTotalItems === 'number') {
|
|
121
|
-
if (prevTotalItems < newTotalItems) {
|
|
122
|
-
isCartOpen.value = true;
|
|
123
|
-
} else if (prevTotalItems && !newTotalItems) {
|
|
124
|
-
isCartOpen.value = false;
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
delayedTotalItems.value = newTotalItems;
|
|
128
|
-
}, { immediate: true });
|
|
129
|
-
});
|
|
130
|
-
const headerNavLinks = {
|
|
131
|
-
supportUrl: '',
|
|
132
|
-
businessLpUrl: '',
|
|
133
|
-
monocardSlug: '',
|
|
134
|
-
monodotSlug: '',
|
|
135
|
-
...globalThis.$storefront.settings.metafields,
|
|
136
|
-
};
|
|
137
|
-
</script>
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<nav class="font-brand text-base-100 text-lg lowercase">
|
|
3
|
-
<ul class="flex items-center gap-6 xl:gap-7">
|
|
4
|
-
<li>
|
|
5
|
-
<ALink
|
|
6
|
-
:href="supportUrl"
|
|
7
|
-
class="decoration-2 underline-offset-4 hover:text-white hover:underline"
|
|
8
|
-
>
|
|
9
|
-
{{ $t.i19help }}
|
|
10
|
-
</ALink>
|
|
11
|
-
</li>
|
|
12
|
-
<li>
|
|
13
|
-
<a
|
|
14
|
-
:href="businessLpUrl"
|
|
15
|
-
class="hover:text-primary decoration-primary text-white
|
|
16
|
-
underline decoration-2 underline-offset-4"
|
|
17
|
-
>
|
|
18
|
-
<i class="i-stack-line mr-1.5 opacity-50"></i>
|
|
19
|
-
<h4 class="inline">Para empresas e times</h4>
|
|
20
|
-
</a>
|
|
21
|
-
</li>
|
|
22
|
-
<li>
|
|
23
|
-
<Menu as="div" v-slot="{ open }" class="relative z-50">
|
|
24
|
-
<MenuButton
|
|
25
|
-
class="group rounded-full py-1 pl-4 pr-3 lowercase"
|
|
26
|
-
:class="isSticky
|
|
27
|
-
? 'bg-primary/20 text-primary hover:primary'
|
|
28
|
-
: 'primary hover:bg-primary-50'"
|
|
29
|
-
>
|
|
30
|
-
<span>{{ $t.i19buy }}</span>
|
|
31
|
-
<i
|
|
32
|
-
class="i-arrow-down-s-line ml-1 transition-transform"
|
|
33
|
-
:class="open ? 'rotate-180' : 'opacity-50'"
|
|
34
|
-
></i>
|
|
35
|
-
</MenuButton>
|
|
36
|
-
<Fade>
|
|
37
|
-
<MenuItems
|
|
38
|
-
as="ul"
|
|
39
|
-
class="absolute -left-7 mt-3 w-48 overflow-hidden rounded-b-md
|
|
40
|
-
bg-black/80 text-white shadow backdrop-blur-md"
|
|
41
|
-
>
|
|
42
|
-
<MenuItem as="li">
|
|
43
|
-
<a
|
|
44
|
-
:href="`/${monocardSlug}`"
|
|
45
|
-
class="flex gap-3 px-5 py-2.5 hover:bg-black"
|
|
46
|
-
>
|
|
47
|
-
<h4 class="basis-4/6 text-right">
|
|
48
|
-
<span class="opacity-70">Mono</span>card
|
|
49
|
-
</h4>
|
|
50
|
-
<span class="basis-2/6 opacity-80">
|
|
51
|
-
<i class="i-qr-code-line"></i>
|
|
52
|
-
<i class="i-signal-tower-fill ml-1.5"></i>
|
|
53
|
-
</span>
|
|
54
|
-
</a>
|
|
55
|
-
<a
|
|
56
|
-
:href="`${monodotSlug}`"
|
|
57
|
-
class="flex gap-3 px-5 py-2.5 hover:bg-black"
|
|
58
|
-
>
|
|
59
|
-
<h4 class="basis-4/6 text-right">
|
|
60
|
-
<span class="opacity-70">Mono</span>dot
|
|
61
|
-
</h4>
|
|
62
|
-
<span class="basis-2/6 opacity-80">
|
|
63
|
-
<i class="i-qr-code-line"></i>
|
|
64
|
-
</span>
|
|
65
|
-
</a>
|
|
66
|
-
</MenuItem>
|
|
67
|
-
</MenuItems>
|
|
68
|
-
</Fade>
|
|
69
|
-
</Menu>
|
|
70
|
-
</li>
|
|
71
|
-
</ul>
|
|
72
|
-
</nav>
|
|
73
|
-
</template>
|
|
74
|
-
|
|
75
|
-
<script setup lang="ts">
|
|
76
|
-
import {
|
|
77
|
-
Menu,
|
|
78
|
-
MenuButton,
|
|
79
|
-
MenuItems,
|
|
80
|
-
MenuItem,
|
|
81
|
-
} from '@headlessui/vue';
|
|
82
|
-
|
|
83
|
-
export interface Props {
|
|
84
|
-
isSticky?: boolean;
|
|
85
|
-
monocardSlug: string;
|
|
86
|
-
monodotSlug: string;
|
|
87
|
-
supportUrl: string;
|
|
88
|
-
businessLpUrl: string;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
defineProps<Props>();
|
|
92
|
-
</script>
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<aside class="flex h-full flex-col">
|
|
3
|
-
<nav class="grow py-4">
|
|
4
|
-
<ul class="relative h-full">
|
|
5
|
-
<ShopSidenavCategory
|
|
6
|
-
v-for="categoryTree in categoryTrees"
|
|
7
|
-
:key="categoryTree._id"
|
|
8
|
-
:category-tree="categoryTree"
|
|
9
|
-
/>
|
|
10
|
-
</ul>
|
|
11
|
-
</nav>
|
|
12
|
-
<footer class="text-base">
|
|
13
|
-
<div class="bg-base-100 flex items-center px-2 py-4">
|
|
14
|
-
<AccountLink class="flex grow items-center gap-3 p-2">
|
|
15
|
-
<i class="i-account-pin-circle-line text-base-500 m-0 text-4xl"></i>
|
|
16
|
-
<span class="leading-tight">
|
|
17
|
-
{{ `${$t.i19hello} ${customerName || $t.i19visitor}` }}
|
|
18
|
-
<small class="text-primary block font-semibold lowercase">
|
|
19
|
-
{{ $t.i19myOrders }}, {{ $t.i19myAccount }}
|
|
20
|
-
</small>
|
|
21
|
-
</span>
|
|
22
|
-
</AccountLink>
|
|
23
|
-
<button
|
|
24
|
-
v-if="isLogged"
|
|
25
|
-
@click="logout"
|
|
26
|
-
class="text-base-800 p-2 text-right"
|
|
27
|
-
>
|
|
28
|
-
<span class="text-base-600">{{ $t.i19logout }}</span>
|
|
29
|
-
<i class="i-logout-circle-r-line ml-1 text-lg"></i>
|
|
30
|
-
</button>
|
|
31
|
-
</div>
|
|
32
|
-
<ul class="bg-base-200 text-base-700 flex gap-3 p-4 text-xl">
|
|
33
|
-
<li v-for="(href, network) in socialNetworks" :key="network">
|
|
34
|
-
<SocialNetworkLink :network="network" class="active:text-primary p-1" />
|
|
35
|
-
</li>
|
|
36
|
-
</ul>
|
|
37
|
-
</footer>
|
|
38
|
-
</aside>
|
|
39
|
-
</template>
|
|
40
|
-
|
|
41
|
-
<script setup lang="ts">
|
|
42
|
-
import type { CategoryTree } from '@@sf/composables/use-shop-header';
|
|
43
|
-
import {
|
|
44
|
-
customerName,
|
|
45
|
-
initializeFirebaseAuth,
|
|
46
|
-
isLogged,
|
|
47
|
-
logout,
|
|
48
|
-
} from '@@sf/state/customer-session';
|
|
49
|
-
import { socialNetworks } from '@@sf/sf-lib';
|
|
50
|
-
import AccountLink from '@@sf/components/AccountLink.vue';
|
|
51
|
-
import SocialNetworkLink from '@@sf/components/SocialNetworkLink.vue';
|
|
52
|
-
import ShopSidenavCategory from '~/components/ShopSidenavCategory.vue';
|
|
53
|
-
|
|
54
|
-
export interface Props {
|
|
55
|
-
categoryTrees?: CategoryTree[];
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
withDefaults(defineProps<Props>(), {
|
|
59
|
-
categoryTrees() {
|
|
60
|
-
return [];
|
|
61
|
-
},
|
|
62
|
-
});
|
|
63
|
-
onMounted(() => initializeFirebaseAuth());
|
|
64
|
-
</script>
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<li class="text-base-800 text-lg">
|
|
3
|
-
<details
|
|
4
|
-
v-if="categoryTree.subcategories.length"
|
|
5
|
-
class="z-10 overflow-y-auto overflow-x-hidden bg-white
|
|
6
|
-
open:absolute open:left-0 open:top-0 open:h-full open:w-full"
|
|
7
|
-
@toggle="isOpen = !isOpen"
|
|
8
|
-
>
|
|
9
|
-
<summary
|
|
10
|
-
class="active:bg-base-100 cursor-pointer list-none px-6 py-3 transition-colors"
|
|
11
|
-
:class="isOpen ? 'bg-base-100' : null"
|
|
12
|
-
>
|
|
13
|
-
<i :class="!isOpen
|
|
14
|
-
? 'i-arrow-right-line float-right mb-0 mt-1 text-xl text-base-500'
|
|
15
|
-
: 'i-arrow-right-line text-lg rotate-180'"></i>
|
|
16
|
-
<AImg
|
|
17
|
-
v-if="!isOpen && categoryTree.icon"
|
|
18
|
-
:picture="categoryTree.icon"
|
|
19
|
-
class="mr-3 inline h-5 w-auto"
|
|
20
|
-
/>
|
|
21
|
-
<h3 class="inline" :class="isOpen ? 'ml-4 text-base' : null">
|
|
22
|
-
{{ categoryTree.name }}
|
|
23
|
-
</h3>
|
|
24
|
-
</summary>
|
|
25
|
-
<ul
|
|
26
|
-
class="mt-2 transition-opacity"
|
|
27
|
-
:class="isFaded ? 'opacity-20' : 'opacity-100'"
|
|
28
|
-
tabindex="-1"
|
|
29
|
-
>
|
|
30
|
-
<ShopSidenavCategory
|
|
31
|
-
v-for="subcategoryTree in categoryTree.subcategories"
|
|
32
|
-
:key="subcategoryTree._id"
|
|
33
|
-
:category-tree="subcategoryTree"
|
|
34
|
-
/>
|
|
35
|
-
<li>
|
|
36
|
-
<a
|
|
37
|
-
:href="`/${categoryTree.slug}`"
|
|
38
|
-
class="active:bg-base-200 block px-6 py-3 text-base underline"
|
|
39
|
-
>
|
|
40
|
-
{{ $t.i19seeAll$1Category.replace('$1', categoryTree.name) }}
|
|
41
|
-
</a>
|
|
42
|
-
</li>
|
|
43
|
-
</ul>
|
|
44
|
-
</details>
|
|
45
|
-
<a
|
|
46
|
-
v-else
|
|
47
|
-
:href="`/${categoryTree.slug}`"
|
|
48
|
-
class="active:bg-base-200 block px-6 py-3"
|
|
49
|
-
>
|
|
50
|
-
<AImg
|
|
51
|
-
v-if="!isOpen && categoryTree.icon"
|
|
52
|
-
:picture="categoryTree.icon"
|
|
53
|
-
class="mr-3 inline h-5 w-auto"
|
|
54
|
-
/>
|
|
55
|
-
<h3 class="inline">{{ categoryTree.name }}</h3>
|
|
56
|
-
</a>
|
|
57
|
-
</li>
|
|
58
|
-
</template>
|
|
59
|
-
|
|
60
|
-
<script setup lang="ts">
|
|
61
|
-
import type { CategoryTree, SubcategoryTree } from '@@sf/composables/use-shop-header';
|
|
62
|
-
|
|
63
|
-
export interface Props {
|
|
64
|
-
categoryTree: CategoryTree | SubcategoryTree;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
defineProps<Props>();
|
|
68
|
-
const isOpen = ref(false);
|
|
69
|
-
const isFaded = ref(true);
|
|
70
|
-
watch(isOpen, (_isOpen) => {
|
|
71
|
-
if (_isOpen) {
|
|
72
|
-
setTimeout(() => { isFaded.value = false; }, 25);
|
|
73
|
-
} else {
|
|
74
|
-
isFaded.value = true;
|
|
75
|
-
}
|
|
76
|
-
});
|
|
77
|
-
</script>
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div>
|
|
3
|
-
<div v-for="(options, gridId) in variationsGrids" :key="gridId">
|
|
4
|
-
<span class="text-base-700 text-sm font-medium">
|
|
5
|
-
{{ getGridTitle(gridId) }}:
|
|
6
|
-
<strong v-if="selectedOptions[gridId]" class="text-base-800">
|
|
7
|
-
{{ selectedOptions[gridId] }}
|
|
8
|
-
</strong>
|
|
9
|
-
</span>
|
|
10
|
-
<ul v-if="options.length < 7" class="mt-2 flex gap-2">
|
|
11
|
-
<li v-for="(optionText, i) in options" :key="`${gridId}-${i}`">
|
|
12
|
-
<button
|
|
13
|
-
class="ring-secondary/60 rounded border"
|
|
14
|
-
:class="[
|
|
15
|
-
selectedOptions[gridId] === optionText
|
|
16
|
-
? 'border-secondary ring-2'
|
|
17
|
-
: null,
|
|
18
|
-
gridId === 'colors'
|
|
19
|
-
? 'h-9 w-9 text-[0]'
|
|
20
|
-
: 'px-2 py-1',
|
|
21
|
-
activeVariationsGrids[gridId].includes(optionText)
|
|
22
|
-
? 'text-base-800 bg-base-100 border-base-400'
|
|
23
|
-
: 'text-base-500 bg-base-200 border-base-300'
|
|
24
|
-
]"
|
|
25
|
-
:style="gridId === 'colors' ? getColorOptionBg(optionText) : undefined"
|
|
26
|
-
@click="selectOption({ optionText, gridId, gridIndex: i })"
|
|
27
|
-
>
|
|
28
|
-
{{ optionText }}
|
|
29
|
-
</button>
|
|
30
|
-
</li>
|
|
31
|
-
</ul>
|
|
32
|
-
</div>
|
|
33
|
-
</div>
|
|
34
|
-
</template>
|
|
35
|
-
|
|
36
|
-
<script setup lang="ts">
|
|
37
|
-
import {
|
|
38
|
-
type Props as UseSkuSelector,
|
|
39
|
-
useSkuSelector,
|
|
40
|
-
} from '@@sf/composables/use-sku-selector';
|
|
41
|
-
|
|
42
|
-
export interface Props extends UseSkuSelector {}
|
|
43
|
-
|
|
44
|
-
const props = defineProps<Props>();
|
|
45
|
-
const emit = defineEmits(['update:variationId']);
|
|
46
|
-
const {
|
|
47
|
-
variationsGrids,
|
|
48
|
-
activeVariationsGrids,
|
|
49
|
-
selectOption,
|
|
50
|
-
selectedOptions,
|
|
51
|
-
variationId,
|
|
52
|
-
getGridTitle,
|
|
53
|
-
getColorOptionBg,
|
|
54
|
-
} = useSkuSelector(props);
|
|
55
|
-
watch(variationId, (_id) => {
|
|
56
|
-
emit('update:variationId', _id);
|
|
57
|
-
});
|
|
58
|
-
</script>
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/// <reference types="@astrojs/image/client" />
|
|
2
|
-
/// <reference types="vite-plugin-pwa/client" />
|
|
3
|
-
/// <reference types="vue/ref-macros" />
|
|
4
|
-
/// <reference types="@cloudcommerce/storefront/client" />
|
|
5
|
-
/// <reference types="@cloudcommerce/storefront/server" />
|
|
6
|
-
|
|
7
|
-
/* eslint-disable import/newline-after-import */
|
|
8
|
-
|
|
9
|
-
declare module '*.vue' {
|
|
10
|
-
import { type DefineComponent } from 'vue';
|
|
11
|
-
const component: DefineComponent<{}, {}, any>;
|
|
12
|
-
export default component;
|
|
13
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
import SfBase from '@@sf/layouts/Base.astro';
|
|
3
|
-
import InlineScripts from '~/scripts/InlineScripts.astro';
|
|
4
|
-
import '~/assets/style.css';
|
|
5
|
-
import 'uno.css';
|
|
6
|
-
import '@fontsource-variable/inter/index.css';
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
<SfBase>
|
|
10
|
-
<Fragment slot="base-head">
|
|
11
|
-
<slot name="base-head" />
|
|
12
|
-
</Fragment>
|
|
13
|
-
<InlineScripts slot="before-head-end" />
|
|
14
|
-
<slot />
|
|
15
|
-
</SfBase>
|