spoko-design-system 0.2.80 → 0.2.81
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/dependabot.yml +11 -11
- package/.github/todo.yml +3 -3
- package/.github/workflows/deploy.yml +39 -39
- package/.stackblitzrc +5 -5
- package/.vscode/extensions.json +5 -5
- package/.vscode/launch.json +11 -11
- package/.vscode/settings.json +5 -5
- package/LICENSE +21 -21
- package/README.md +113 -113
- package/astro-i18next.config.mjs +17 -17
- package/astro-i18next.config.ts +10 -10
- package/astro.config.mjs +147 -147
- package/dev-dist/sw.js +91 -91
- package/dev-dist/workbox-c676b6d3.js +3391 -3391
- package/index.ts +65 -65
- package/package.json +3 -3
- package/public/fonts/lg.svg +53 -53
- package/public/fonts/vwhead-bold-demo.html +549 -549
- package/public/fonts/vwhead-regular-demo.html +549 -549
- package/public/fonts/vwtext-bold-demo.html +549 -549
- package/public/fonts/vwtext-regular-demo.html +549 -549
- package/public/github.svg +3 -3
- package/public/grid_dot.svg +4 -4
- package/public/linkedin.svg +44 -44
- package/public/locales/en/translation.json +8 -8
- package/public/locales/pl/translation.json +8 -8
- package/public/make-scrollable-code-focusable.js +3 -3
- package/public/pagefind.yml +3 -3
- package/public/polo.blue.svg +29 -29
- package/public/spoko.space.svg +71 -71
- package/public/twitter.svg +46 -46
- package/renovate.json +6 -6
- package/sandbox.config.json +11 -11
- package/src/MyComponent.astro +8 -8
- package/src/components/Badge.vue +19 -19
- package/src/components/Badges.vue +21 -21
- package/src/components/Breadcrumbs.vue +107 -107
- package/src/components/Button.vue +55 -55
- package/src/components/ButtonCopy.vue +36 -36
- package/src/components/Card.astro +27 -27
- package/src/components/Carousel.astro +26 -26
- package/src/components/Category/CategoriesCarousel.astro +101 -101
- package/src/components/Category/CategoriesSidebar.astro +186 -186
- package/src/components/Category/CategoryDetails.astro +82 -82
- package/src/components/Category/CategoryLink.vue +23 -23
- package/src/components/Category/CategorySection.astro +69 -69
- package/src/components/Category/CategorySidebarToggler.vue +9 -9
- package/src/components/Category/CategoryTile.astro +49 -49
- package/src/components/Category/SubCategoryLink.vue +29 -29
- package/src/components/CategoryLink.astro +18 -18
- package/src/components/Copyright.astro +12 -12
- package/src/components/Date.astro +7 -7
- package/src/components/Faq.astro +33 -33
- package/src/components/FaqItem.astro +96 -96
- package/src/components/FeaturesList.vue +41 -41
- package/src/components/FuckRussia.vue +62 -62
- package/src/components/HandDrive.astro +29 -29
- package/src/components/Header/Header.astro +210 -210
- package/src/components/Header/SkipToContent.astro +1 -1
- package/src/components/Headline.vue +48 -48
- package/src/components/Image.astro +30 -30
- package/src/components/Jumbatron.vue +40 -40
- package/src/components/LeftSidebar.astro +53 -53
- package/src/components/MainColors.vue +23 -23
- package/src/components/MainInput.vue +15 -15
- package/src/components/Modal.astro +27 -27
- package/src/components/PageContent.astro +5 -5
- package/src/components/PartNumber.vue +27 -27
- package/src/components/PostHeader.astro +103 -103
- package/src/components/PrCode.vue +141 -141
- package/src/components/Product/ProductButton.vue +18 -18
- package/src/components/Product/ProductCarousel.astro +35 -35
- package/src/components/Product/ProductCodes.vue +174 -174
- package/src/components/Product/ProductEngineType.vue +42 -42
- package/src/components/Product/ProductImage.astro +40 -40
- package/src/components/Product/ProductLink.astro +101 -101
- package/src/components/Product/ProductLink.vue +59 -59
- package/src/components/Product/ProductLinkInfo.astro +37 -37
- package/src/components/Product/ProductNumber.astro +61 -61
- package/src/components/ProductCarousel.astro +38 -38
- package/src/components/ProductCodes.vue +39 -39
- package/src/components/ProductDetailName.vue +52 -52
- package/src/components/ProductDetailsList.vue +65 -65
- package/src/components/ProductTile.astro +48 -48
- package/src/components/Quote.vue +23 -23
- package/src/components/ReloadPrompt.astro +50 -50
- package/src/components/SlimBanner.vue +72 -72
- package/src/components/Table.vue +32 -32
- package/src/components/TableOfContents.astro +15 -15
- package/src/components/Translations.vue +23 -23
- package/src/components/flags/FlagPL.vue +3 -3
- package/src/components/flags/FlagUA.vue +2 -2
- package/src/components/layout/Container.astro +7 -7
- package/src/components/layout/Header.astro +80 -80
- package/src/config.ts +56 -56
- package/src/design.config.ts +81 -81
- package/src/env.d.ts +1 -1
- package/src/layouts/Layout.astro +60 -60
- package/src/layouts/MainLayout.astro +81 -81
- package/src/layouts/partials/FooterCommon.astro +4 -4
- package/src/layouts/partials/HeadCommon.astro +44 -44
- package/src/layouts/partials/HeadSEO.astro +41 -41
- package/src/pages/components/badges.mdx +57 -57
- package/src/pages/components/breadcrumbs.mdx +139 -139
- package/src/pages/components/buttons.mdx +236 -236
- package/src/pages/components/card.mdx +294 -294
- package/src/pages/components/carousel.mdx +62 -62
- package/src/pages/components/copyright.mdx +42 -42
- package/src/pages/components/details-list.mdx +115 -115
- package/src/pages/components/features-list.mdx +37 -37
- package/src/pages/components/flags.mdx +49 -49
- package/src/pages/components/fuck-russia.mdx +39 -39
- package/src/pages/components/hand-drive.mdx +38 -38
- package/src/pages/components/headline.mdx +152 -152
- package/src/pages/components/icons.astro +48 -48
- package/src/pages/components/image.mdx +513 -513
- package/src/pages/components/input.mdx +45 -45
- package/src/pages/components/jumbatron.mdx +95 -95
- package/src/pages/components/modal.mdx +64 -64
- package/src/pages/components/post-header.mdx +60 -60
- package/src/pages/components/pr-code.mdx +65 -65
- package/src/pages/components/product-number.mdx +58 -58
- package/src/pages/components/product-tile.mdx +51 -51
- package/src/pages/components/quote.mdx +33 -33
- package/src/pages/components/slimbanner.mdx +35 -35
- package/src/pages/components/table.mdx +108 -108
- package/src/pages/core/colors.mdx +10 -10
- package/src/pages/core/grid.mdx +89 -89
- package/src/pages/core/introduction.mdx +77 -77
- package/src/pages/core/shadows.astro +20 -20
- package/src/pages/core/typography.astro +47 -47
- package/src/pages/index.astro +126 -126
- package/src/pages/patterns/introduction.mdx +60 -60
- package/src/pwa.ts +12 -12
- package/src/styles/_variables.scss +70 -70
- package/src/styles/base/base.css +184 -184
- package/src/styles/base/grid.css +92 -92
- package/src/styles/base/typography.css +70 -70
- package/src/styles/content.css +73 -73
- package/src/styles/main.css +7 -7
- package/src/types/Product.ts +31 -31
- package/src/types/astro.d.ts +3 -3
- package/src/utils/product/getPriceFormatted.ts +15 -15
- package/src/utils/product/getProductChecklist.ts +17 -17
- package/src/utils/product/useFormatProductNumber.ts +41 -41
- package/src/utils/seo/getShorterDescription.ts +14 -14
- package/src/utils/text/formatDate.ts +5 -5
- package/src/utils/text/formatLocaleNumber.ts +6 -6
- package/src/utils/text/formatPad.ts +12 -12
- package/src/utils/text/getNumberFormatted.ts +33 -33
- package/src/utils/text/getTranslatedLink.ts +5 -5
- package/src/utils/text.ts +28 -28
- package/tailwind.config.cjs +8 -8
- package/tsconfig.json +28 -28
- package/uno.config.ts +256 -256
|
@@ -1,82 +1,82 @@
|
|
|
1
|
-
---
|
|
2
|
-
import CategorySidebarToggler from './CategorySidebarToggler.vue';
|
|
3
|
-
import { Icon } from 'astro-icon/components';
|
|
4
|
-
const { category, subcategory, subtitle, subsubtitle, titleSmall, locale } = Astro.props;
|
|
5
|
-
import { t } from "i18next";
|
|
6
|
-
|
|
7
|
-
// Compute base URL for localization
|
|
8
|
-
const baseURL = locale === 'en' ? '' : `/${locale}`;
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
<div ref="el"
|
|
12
|
-
class="flex flex-nowrap pr-3 sm:pb-3 sm:pt-4 md:pl-4 relative z-10-off bg-gray-100 md:bg-white"
|
|
13
|
-
transition:name="category-details"
|
|
14
|
-
transition:animate="fade"
|
|
15
|
-
>
|
|
16
|
-
<CategorySidebarToggler onclick="toggleSidebar()">
|
|
17
|
-
<Icon name="ant-design:menu-fold-outlined" class="toggler-btn hidden md:block" />
|
|
18
|
-
<Icon name="ant-design:menu-unfold-outlined" class="toggler-btn hidden" />
|
|
19
|
-
<Icon name="ant-design:menu-outlined" class="toggler-btn md:hidden" />
|
|
20
|
-
</CategorySidebarToggler>
|
|
21
|
-
|
|
22
|
-
<div class="overflow-x-auto overflow-y-hidden flex max-w-full items-center">
|
|
23
|
-
{subtitle ? (
|
|
24
|
-
<>
|
|
25
|
-
<a class="text-lg font-vw-headregular whitespace-nowrap block" href={`${baseURL}/${category.slug}/`}>
|
|
26
|
-
{category.name}
|
|
27
|
-
{titleSmall && <small>{titleSmall}</small>}
|
|
28
|
-
</a>
|
|
29
|
-
<span class="text-gray-200 text-lg inline-block px-1 font-headlight">/</span>
|
|
30
|
-
{!subsubtitle ? (
|
|
31
|
-
<h1 class="text-lg py-2.5 sm:py-0 whitespace-nowrap underline underline-offset-6 decoration-blue-300 decoration-0.5">
|
|
32
|
-
{subtitle} <span class="sr-only"> {t('catalog.extra-short')}</span>
|
|
33
|
-
</h1>
|
|
34
|
-
) : (
|
|
35
|
-
<>
|
|
36
|
-
<div class="text-lg py-2.5 sm:py-0 whitespace-nowrap ">
|
|
37
|
-
<a href={`${baseURL}/${category.slug}/${subcategory.slug}/`}>
|
|
38
|
-
{subtitle}
|
|
39
|
-
</a>
|
|
40
|
-
</div>
|
|
41
|
-
<span class="text-gray-200 text-lg inline-block px-1 font-headlight">/</span>
|
|
42
|
-
<h1 class="text-lg py-2.5 sm:py-0 whitespace-nowrap underline underline-offset-6 decoration-blue-300 decoration-0.5">
|
|
43
|
-
{subsubtitle} <span class="sr-only"> {t('catalog.extra-short')}</span>
|
|
44
|
-
</h1>
|
|
45
|
-
</>
|
|
46
|
-
)}
|
|
47
|
-
</>
|
|
48
|
-
) : (
|
|
49
|
-
<h1 class="text-lg py-2.5 sm:py-0 whitespace-nowrap">
|
|
50
|
-
{category.name}
|
|
51
|
-
{titleSmall && <small>{titleSmall}</small>}
|
|
52
|
-
<span class="sr-only"> {t('catalog.extra-short')}</span>
|
|
53
|
-
</h1>
|
|
54
|
-
)}
|
|
55
|
-
</div>
|
|
56
|
-
</div>
|
|
57
|
-
|
|
58
|
-
<script is:inline>
|
|
59
|
-
function toggleSidebar() {
|
|
60
|
-
function handleToggle(x) {
|
|
61
|
-
const sidebar = document.getElementById('sidebar');
|
|
62
|
-
if (x.matches) { // Mobile view
|
|
63
|
-
document.body.classList.toggle('overflow-hidden');
|
|
64
|
-
sidebar.classList.toggle('show');
|
|
65
|
-
} else {
|
|
66
|
-
document.body.classList.remove('overflow-hidden');
|
|
67
|
-
sidebar.classList.toggle('collapsed');
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
var x = window.matchMedia("(max-width: 768px)");
|
|
72
|
-
handleToggle(x); // Call listener at runtime
|
|
73
|
-
x.addListener(handleToggle); // Attach listener for state changes
|
|
74
|
-
}
|
|
75
|
-
</script>
|
|
76
|
-
|
|
77
|
-
<style>
|
|
78
|
-
.category-toggler {
|
|
79
|
-
right: -1px;
|
|
80
|
-
bottom: -1px;
|
|
81
|
-
}
|
|
82
|
-
</style>
|
|
1
|
+
---
|
|
2
|
+
import CategorySidebarToggler from './CategorySidebarToggler.vue';
|
|
3
|
+
import { Icon } from 'astro-icon/components';
|
|
4
|
+
const { category, subcategory, subtitle, subsubtitle, titleSmall, locale } = Astro.props;
|
|
5
|
+
import { t } from "i18next";
|
|
6
|
+
|
|
7
|
+
// Compute base URL for localization
|
|
8
|
+
const baseURL = locale === 'en' ? '' : `/${locale}`;
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
<div ref="el"
|
|
12
|
+
class="flex flex-nowrap pr-3 sm:pb-3 sm:pt-4 md:pl-4 relative z-10-off bg-gray-100 md:bg-white"
|
|
13
|
+
transition:name="category-details"
|
|
14
|
+
transition:animate="fade"
|
|
15
|
+
>
|
|
16
|
+
<CategorySidebarToggler onclick="toggleSidebar()">
|
|
17
|
+
<Icon name="ant-design:menu-fold-outlined" class="toggler-btn hidden md:block" />
|
|
18
|
+
<Icon name="ant-design:menu-unfold-outlined" class="toggler-btn hidden" />
|
|
19
|
+
<Icon name="ant-design:menu-outlined" class="toggler-btn md:hidden" />
|
|
20
|
+
</CategorySidebarToggler>
|
|
21
|
+
|
|
22
|
+
<div class="overflow-x-auto overflow-y-hidden flex max-w-full items-center">
|
|
23
|
+
{subtitle ? (
|
|
24
|
+
<>
|
|
25
|
+
<a class="text-lg font-vw-headregular whitespace-nowrap block" href={`${baseURL}/${category.slug}/`}>
|
|
26
|
+
{category.name}
|
|
27
|
+
{titleSmall && <small>{titleSmall}</small>}
|
|
28
|
+
</a>
|
|
29
|
+
<span class="text-gray-200 text-lg inline-block px-1 font-headlight">/</span>
|
|
30
|
+
{!subsubtitle ? (
|
|
31
|
+
<h1 class="text-lg py-2.5 sm:py-0 whitespace-nowrap underline underline-offset-6 decoration-blue-300 decoration-0.5">
|
|
32
|
+
{subtitle} <span class="sr-only"> {t('catalog.extra-short')}</span>
|
|
33
|
+
</h1>
|
|
34
|
+
) : (
|
|
35
|
+
<>
|
|
36
|
+
<div class="text-lg py-2.5 sm:py-0 whitespace-nowrap ">
|
|
37
|
+
<a href={`${baseURL}/${category.slug}/${subcategory.slug}/`}>
|
|
38
|
+
{subtitle}
|
|
39
|
+
</a>
|
|
40
|
+
</div>
|
|
41
|
+
<span class="text-gray-200 text-lg inline-block px-1 font-headlight">/</span>
|
|
42
|
+
<h1 class="text-lg py-2.5 sm:py-0 whitespace-nowrap underline underline-offset-6 decoration-blue-300 decoration-0.5">
|
|
43
|
+
{subsubtitle} <span class="sr-only"> {t('catalog.extra-short')}</span>
|
|
44
|
+
</h1>
|
|
45
|
+
</>
|
|
46
|
+
)}
|
|
47
|
+
</>
|
|
48
|
+
) : (
|
|
49
|
+
<h1 class="text-lg py-2.5 sm:py-0 whitespace-nowrap">
|
|
50
|
+
{category.name}
|
|
51
|
+
{titleSmall && <small>{titleSmall}</small>}
|
|
52
|
+
<span class="sr-only"> {t('catalog.extra-short')}</span>
|
|
53
|
+
</h1>
|
|
54
|
+
)}
|
|
55
|
+
</div>
|
|
56
|
+
</div>
|
|
57
|
+
|
|
58
|
+
<script is:inline>
|
|
59
|
+
function toggleSidebar() {
|
|
60
|
+
function handleToggle(x) {
|
|
61
|
+
const sidebar = document.getElementById('sidebar');
|
|
62
|
+
if (x.matches) { // Mobile view
|
|
63
|
+
document.body.classList.toggle('overflow-hidden');
|
|
64
|
+
sidebar.classList.toggle('show');
|
|
65
|
+
} else {
|
|
66
|
+
document.body.classList.remove('overflow-hidden');
|
|
67
|
+
sidebar.classList.toggle('collapsed');
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
var x = window.matchMedia("(max-width: 768px)");
|
|
72
|
+
handleToggle(x); // Call listener at runtime
|
|
73
|
+
x.addListener(handleToggle); // Attach listener for state changes
|
|
74
|
+
}
|
|
75
|
+
</script>
|
|
76
|
+
|
|
77
|
+
<style>
|
|
78
|
+
.category-toggler {
|
|
79
|
+
right: -1px;
|
|
80
|
+
bottom: -1px;
|
|
81
|
+
}
|
|
82
|
+
</style>
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
const props = defineProps({
|
|
3
|
-
text: {
|
|
4
|
-
type: String,
|
|
5
|
-
default: null,
|
|
6
|
-
required: true,
|
|
7
|
-
},
|
|
8
|
-
active: {
|
|
9
|
-
type: Boolean,
|
|
10
|
-
default: false,
|
|
11
|
-
required: true,
|
|
12
|
-
},
|
|
13
|
-
})
|
|
14
|
-
</script>
|
|
15
|
-
|
|
16
|
-
<template>
|
|
17
|
-
<a
|
|
18
|
-
class="category-link"
|
|
19
|
-
:class="!props.active ? '' : 'active'"
|
|
20
|
-
>
|
|
21
|
-
{{ props.text }}
|
|
22
|
-
</a>
|
|
23
|
-
</template>
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
const props = defineProps({
|
|
3
|
+
text: {
|
|
4
|
+
type: String,
|
|
5
|
+
default: null,
|
|
6
|
+
required: true,
|
|
7
|
+
},
|
|
8
|
+
active: {
|
|
9
|
+
type: Boolean,
|
|
10
|
+
default: false,
|
|
11
|
+
required: true,
|
|
12
|
+
},
|
|
13
|
+
})
|
|
14
|
+
</script>
|
|
15
|
+
|
|
16
|
+
<template>
|
|
17
|
+
<a
|
|
18
|
+
class="category-link"
|
|
19
|
+
:class="!props.active ? '' : 'active'"
|
|
20
|
+
>
|
|
21
|
+
{{ props.text }}
|
|
22
|
+
</a>
|
|
23
|
+
</template>
|
|
@@ -1,70 +1,70 @@
|
|
|
1
|
-
---
|
|
2
|
-
const { category, subcategory, subsubcategory, locale} = Astro.props;
|
|
3
|
-
import { t } from "i18next";
|
|
4
|
-
|
|
5
|
-
import ProductLink from "@components/Product/ProductLink.astro";
|
|
6
|
-
import { Icon } from 'astro-icon/components';
|
|
7
|
-
|
|
8
|
-
import { createSubCatLink, createSubSubCatLink } from "@utils/db";
|
|
9
|
-
import { getCategoryProducts } from "@utils/category/getCategoryProducts"
|
|
10
|
-
|
|
11
|
-
const category2search = subsubcategory ? subsubcategory : (subcategory ? subcategory : category)
|
|
12
|
-
const mainItemsCount = category2search.children ? 4 : 8
|
|
13
|
-
const products = await getCategoryProducts(category2search.id, mainItemsCount);
|
|
14
|
-
|
|
15
|
-
const getArray = async () => {
|
|
16
|
-
const arr: { name: string; id: number }[] = [];
|
|
17
|
-
|
|
18
|
-
if (category2search.children) {
|
|
19
|
-
for (const childCat of category2search.children) {
|
|
20
|
-
const output = await getCategoryProducts(childCat.id, 3);
|
|
21
|
-
arr.push(output);
|
|
22
|
-
}
|
|
23
|
-
} else {
|
|
24
|
-
null
|
|
25
|
-
}
|
|
26
|
-
return arr.flat(1)
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
const childrenProducts = await getArray()
|
|
30
|
-
|
|
31
|
-
const categoryLink = subsubcategory ? createSubSubCatLink(locale, category.slug, subcategory.slug, subsubcategory.slug) : createSubCatLink(locale, category.slug, subcategory.slug);
|
|
32
|
-
---
|
|
33
|
-
<div class="category-section">
|
|
34
|
-
<div class="px-4 md:px-1.5 py-3 text-xl flex">
|
|
35
|
-
<a href={categoryLink} class="hover:underline">
|
|
36
|
-
<h2>{category2search.name}</h2>
|
|
37
|
-
</a>
|
|
38
|
-
</div>
|
|
39
|
-
<swiper-container slides-per-view="auto" space-between="0" class="flex w-full max-w-full"
|
|
40
|
-
itemscope itemtype="https://schema.org/ItemList"
|
|
41
|
-
>
|
|
42
|
-
{childrenProducts && childrenProducts.length > 0 && (
|
|
43
|
-
childrenProducts.map((product, index) => <swiper-slide class="category-tile product-link"><ProductLink class="w-full" productId={product.id} locale={locale} index={index+1} /></swiper-slide>)
|
|
44
|
-
)}
|
|
45
|
-
{products && products.length > 0 && (
|
|
46
|
-
products.map((product, index) =>
|
|
47
|
-
<swiper-slide class="category-tile product-link"><ProductLink class="w-full h-full" productId={product.id} locale={locale} index={index+1}/></swiper-slide>)
|
|
48
|
-
)}
|
|
49
|
-
<swiper-slide class="category-tile product-link pr-4 pb-4 sm:pb-1">
|
|
50
|
-
<a
|
|
51
|
-
href={categoryLink}
|
|
52
|
-
title={category2search.name}
|
|
53
|
-
class="uppercase flex items-center bg-white w-full sm:w-auto sm:h-full mt-0 p-8 aspect-ratio-[4/3] sm:aspect-auto mb-auto sm:mb-0 sm:text-sm">
|
|
54
|
-
{t("more")}
|
|
55
|
-
<Icon name="la:arrow-right" class="h-4 ml-2 text-blue-500" />
|
|
56
|
-
</a>
|
|
57
|
-
</swiper-slide>
|
|
58
|
-
</swiper-container>
|
|
59
|
-
</div>
|
|
60
|
-
|
|
61
|
-
<style >
|
|
62
|
-
.category-section {
|
|
63
|
-
content-visibility: auto;
|
|
64
|
-
|
|
65
|
-
&:hover {
|
|
66
|
-
content-visibility: visible;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
1
|
+
---
|
|
2
|
+
const { category, subcategory, subsubcategory, locale} = Astro.props;
|
|
3
|
+
import { t } from "i18next";
|
|
4
|
+
|
|
5
|
+
import ProductLink from "@components/Product/ProductLink.astro";
|
|
6
|
+
import { Icon } from 'astro-icon/components';
|
|
7
|
+
|
|
8
|
+
import { createSubCatLink, createSubSubCatLink } from "@utils/db";
|
|
9
|
+
import { getCategoryProducts } from "@utils/category/getCategoryProducts"
|
|
10
|
+
|
|
11
|
+
const category2search = subsubcategory ? subsubcategory : (subcategory ? subcategory : category)
|
|
12
|
+
const mainItemsCount = category2search.children ? 4 : 8
|
|
13
|
+
const products = await getCategoryProducts(category2search.id, mainItemsCount);
|
|
14
|
+
|
|
15
|
+
const getArray = async () => {
|
|
16
|
+
const arr: { name: string; id: number }[] = [];
|
|
17
|
+
|
|
18
|
+
if (category2search.children) {
|
|
19
|
+
for (const childCat of category2search.children) {
|
|
20
|
+
const output = await getCategoryProducts(childCat.id, 3);
|
|
21
|
+
arr.push(output);
|
|
22
|
+
}
|
|
23
|
+
} else {
|
|
24
|
+
null
|
|
25
|
+
}
|
|
26
|
+
return arr.flat(1)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const childrenProducts = await getArray()
|
|
30
|
+
|
|
31
|
+
const categoryLink = subsubcategory ? createSubSubCatLink(locale, category.slug, subcategory.slug, subsubcategory.slug) : createSubCatLink(locale, category.slug, subcategory.slug);
|
|
32
|
+
---
|
|
33
|
+
<div class="category-section">
|
|
34
|
+
<div class="px-4 md:px-1.5 py-3 text-xl flex">
|
|
35
|
+
<a href={categoryLink} class="hover:underline">
|
|
36
|
+
<h2>{category2search.name}</h2>
|
|
37
|
+
</a>
|
|
38
|
+
</div>
|
|
39
|
+
<swiper-container slides-per-view="auto" space-between="0" class="flex w-full max-w-full"
|
|
40
|
+
itemscope itemtype="https://schema.org/ItemList"
|
|
41
|
+
>
|
|
42
|
+
{childrenProducts && childrenProducts.length > 0 && (
|
|
43
|
+
childrenProducts.map((product, index) => <swiper-slide class="category-tile product-link"><ProductLink class="w-full" productId={product.id} locale={locale} index={index+1} /></swiper-slide>)
|
|
44
|
+
)}
|
|
45
|
+
{products && products.length > 0 && (
|
|
46
|
+
products.map((product, index) =>
|
|
47
|
+
<swiper-slide class="category-tile product-link"><ProductLink class="w-full h-full" productId={product.id} locale={locale} index={index+1}/></swiper-slide>)
|
|
48
|
+
)}
|
|
49
|
+
<swiper-slide class="category-tile product-link pr-4 pb-4 sm:pb-1">
|
|
50
|
+
<a
|
|
51
|
+
href={categoryLink}
|
|
52
|
+
title={category2search.name}
|
|
53
|
+
class="uppercase flex items-center bg-white w-full sm:w-auto sm:h-full mt-0 p-8 aspect-ratio-[4/3] sm:aspect-auto mb-auto sm:mb-0 sm:text-sm">
|
|
54
|
+
{t("more")}
|
|
55
|
+
<Icon name="la:arrow-right" class="h-4 ml-2 text-blue-500" />
|
|
56
|
+
</a>
|
|
57
|
+
</swiper-slide>
|
|
58
|
+
</swiper-container>
|
|
59
|
+
</div>
|
|
60
|
+
|
|
61
|
+
<style >
|
|
62
|
+
.category-section {
|
|
63
|
+
content-visibility: auto;
|
|
64
|
+
|
|
65
|
+
&:hover {
|
|
66
|
+
content-visibility: visible;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
70
|
</style>
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
<template>
|
|
3
|
-
<button
|
|
4
|
-
class="category-toggler"
|
|
5
|
-
type="button"
|
|
6
|
-
aria-label="toggle menu"
|
|
7
|
-
>
|
|
8
|
-
<slot />
|
|
9
|
-
</button>
|
|
1
|
+
|
|
2
|
+
<template>
|
|
3
|
+
<button
|
|
4
|
+
class="category-toggler"
|
|
5
|
+
type="button"
|
|
6
|
+
aria-label="toggle menu"
|
|
7
|
+
>
|
|
8
|
+
<slot />
|
|
9
|
+
</button>
|
|
10
10
|
</template>
|
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
---
|
|
2
|
-
|
|
3
|
-
import { Image } from "astro:assets";
|
|
4
|
-
import { getTranslatedLink } from "../../utils/text/getTranslatedLink"
|
|
5
|
-
|
|
6
|
-
interface CategoryObject {
|
|
7
|
-
photo: string;
|
|
8
|
-
desc: string;
|
|
9
|
-
alt: string;
|
|
10
|
-
name: string;
|
|
11
|
-
slug: string;
|
|
12
|
-
height?: number;
|
|
13
|
-
width?: number;
|
|
14
|
-
class?: string;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
let inputProps = {};
|
|
20
|
-
const { CategoryObject, locale='en' } = Astro.props as { CategoryObject: CategoryObject, locale: string };
|
|
21
|
-
CategoryObject.height = CategoryObject.height ?? 70;
|
|
22
|
-
CategoryObject.width = CategoryObject.width ?? 70;
|
|
23
|
-
|
|
24
|
-
const mainCategoryLink = getTranslatedLink(`/${CategoryObject.slug}/`, locale);
|
|
25
|
-
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
<a
|
|
29
|
-
href={mainCategoryLink}
|
|
30
|
-
class="carousel-item"
|
|
31
|
-
data-astro-prefetch
|
|
32
|
-
{...inputProps}
|
|
33
|
-
>
|
|
34
|
-
<Image
|
|
35
|
-
src={`${CategoryObject.photo}`}
|
|
36
|
-
alt={CategoryObject.alt}
|
|
37
|
-
height={CategoryObject.height}
|
|
38
|
-
width={CategoryObject.height}
|
|
39
|
-
format="avif"
|
|
40
|
-
loading="eager"
|
|
41
|
-
onerror="this.style.display='none';"
|
|
42
|
-
class="cats-img"
|
|
43
|
-
/>
|
|
44
|
-
<div class="swiper-lazy-preloader"></div>
|
|
45
|
-
|
|
46
|
-
<div class="cat-name" itemprop="name">
|
|
47
|
-
{CategoryObject.name}
|
|
48
|
-
</div>
|
|
49
|
-
</a>
|
|
1
|
+
---
|
|
2
|
+
|
|
3
|
+
import { Image } from "astro:assets";
|
|
4
|
+
import { getTranslatedLink } from "../../utils/text/getTranslatedLink"
|
|
5
|
+
|
|
6
|
+
interface CategoryObject {
|
|
7
|
+
photo: string;
|
|
8
|
+
desc: string;
|
|
9
|
+
alt: string;
|
|
10
|
+
name: string;
|
|
11
|
+
slug: string;
|
|
12
|
+
height?: number;
|
|
13
|
+
width?: number;
|
|
14
|
+
class?: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
let inputProps = {};
|
|
20
|
+
const { CategoryObject, locale='en' } = Astro.props as { CategoryObject: CategoryObject, locale: string };
|
|
21
|
+
CategoryObject.height = CategoryObject.height ?? 70;
|
|
22
|
+
CategoryObject.width = CategoryObject.width ?? 70;
|
|
23
|
+
|
|
24
|
+
const mainCategoryLink = getTranslatedLink(`/${CategoryObject.slug}/`, locale);
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
<a
|
|
29
|
+
href={mainCategoryLink}
|
|
30
|
+
class="carousel-item"
|
|
31
|
+
data-astro-prefetch
|
|
32
|
+
{...inputProps}
|
|
33
|
+
>
|
|
34
|
+
<Image
|
|
35
|
+
src={`${CategoryObject.photo}`}
|
|
36
|
+
alt={CategoryObject.alt}
|
|
37
|
+
height={CategoryObject.height}
|
|
38
|
+
width={CategoryObject.height}
|
|
39
|
+
format="avif"
|
|
40
|
+
loading="eager"
|
|
41
|
+
onerror="this.style.display='none';"
|
|
42
|
+
class="cats-img"
|
|
43
|
+
/>
|
|
44
|
+
<div class="swiper-lazy-preloader"></div>
|
|
45
|
+
|
|
46
|
+
<div class="cat-name" itemprop="name">
|
|
47
|
+
{CategoryObject.name}
|
|
48
|
+
</div>
|
|
49
|
+
</a>
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
const props = defineProps({
|
|
3
|
-
text: {
|
|
4
|
-
type: String,
|
|
5
|
-
default: null,
|
|
6
|
-
required: true,
|
|
7
|
-
},
|
|
8
|
-
active: {
|
|
9
|
-
type: Boolean,
|
|
10
|
-
default: false,
|
|
11
|
-
required: true,
|
|
12
|
-
},
|
|
13
|
-
})
|
|
14
|
-
</script>
|
|
15
|
-
|
|
16
|
-
<template>
|
|
17
|
-
<a
|
|
18
|
-
v-if="!props.active"
|
|
19
|
-
class="w-full block text-base hover:(bg-gray-50 sm:bg-inherit) font-medium text-gray-300 pr-2 py-2 text-left pl-6 sm:(pr-3 text-sm w-auto) md:(py-0.5 pr-4)"
|
|
20
|
-
>
|
|
21
|
-
{{ props.text }}
|
|
22
|
-
</a>
|
|
23
|
-
<div
|
|
24
|
-
v-else
|
|
25
|
-
class="w-full text-base hover:(bg-gray-50 sm:bg-inherit) font-medium pr-2 py-2 pl-6 sm:(w-auto pr-3 text-sm) md:(py-0.5 pr-4) s-active"
|
|
26
|
-
>
|
|
27
|
-
{{ props.text }}
|
|
28
|
-
</div>
|
|
29
|
-
</template>
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
const props = defineProps({
|
|
3
|
+
text: {
|
|
4
|
+
type: String,
|
|
5
|
+
default: null,
|
|
6
|
+
required: true,
|
|
7
|
+
},
|
|
8
|
+
active: {
|
|
9
|
+
type: Boolean,
|
|
10
|
+
default: false,
|
|
11
|
+
required: true,
|
|
12
|
+
},
|
|
13
|
+
})
|
|
14
|
+
</script>
|
|
15
|
+
|
|
16
|
+
<template>
|
|
17
|
+
<a
|
|
18
|
+
v-if="!props.active"
|
|
19
|
+
class="w-full block text-base hover:(bg-gray-50 sm:bg-inherit) font-medium text-gray-300 pr-2 py-2 text-left pl-6 sm:(pr-3 text-sm w-auto) md:(py-0.5 pr-4)"
|
|
20
|
+
>
|
|
21
|
+
{{ props.text }}
|
|
22
|
+
</a>
|
|
23
|
+
<div
|
|
24
|
+
v-else
|
|
25
|
+
class="w-full text-base hover:(bg-gray-50 sm:bg-inherit) font-medium pr-2 py-2 pl-6 sm:(w-auto pr-3 text-sm) md:(py-0.5 pr-4) s-active"
|
|
26
|
+
>
|
|
27
|
+
{{ props.text }}
|
|
28
|
+
</div>
|
|
29
|
+
</template>
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
---
|
|
2
|
-
const { categories } = Astro.props;
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
<div class="text-light-blue-400 uppercase text-base z-3 relative w-full">
|
|
6
|
-
{
|
|
7
|
-
categories
|
|
8
|
-
? categories.map((category) => (
|
|
9
|
-
<a
|
|
10
|
-
class="term-link text-sm sm:text-base not-first:(before:content-empty) before:(w-px h-2.5 bg-gray-300 mx-2.5 inline-block relative)"
|
|
11
|
-
href={category.uri}
|
|
12
|
-
>
|
|
13
|
-
{category.name}
|
|
14
|
-
</a>
|
|
15
|
-
))
|
|
16
|
-
: null
|
|
17
|
-
}
|
|
18
|
-
</div>
|
|
1
|
+
---
|
|
2
|
+
const { categories } = Astro.props;
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
<div class="text-light-blue-400 uppercase text-base z-3 relative w-full">
|
|
6
|
+
{
|
|
7
|
+
categories
|
|
8
|
+
? categories.map((category) => (
|
|
9
|
+
<a
|
|
10
|
+
class="term-link text-sm sm:text-base not-first:(before:content-empty) before:(w-px h-2.5 bg-gray-300 mx-2.5 inline-block relative)"
|
|
11
|
+
href={category.uri}
|
|
12
|
+
>
|
|
13
|
+
{category.name}
|
|
14
|
+
</a>
|
|
15
|
+
))
|
|
16
|
+
: null
|
|
17
|
+
}
|
|
18
|
+
</div>
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
---
|
|
2
|
-
const { class: className } = Astro.props;
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
<div
|
|
6
|
-
class="bg-vw h-11 flex items-center font-headlight justify-between px-4"
|
|
7
|
-
class:list={[className]}
|
|
8
|
-
>
|
|
9
|
-
<slot name="left-item" />
|
|
10
|
-
<slot name="middle-item" />
|
|
11
|
-
<slot name="right-item" />
|
|
12
|
-
</div>
|
|
1
|
+
---
|
|
2
|
+
const { class: className } = Astro.props;
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
<div
|
|
6
|
+
class="bg-vw h-11 flex items-center font-headlight justify-between px-4"
|
|
7
|
+
class:list={[className]}
|
|
8
|
+
>
|
|
9
|
+
<slot name="left-item" />
|
|
10
|
+
<slot name="middle-item" />
|
|
11
|
+
<slot name="right-item" />
|
|
12
|
+
</div>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
---
|
|
2
|
-
const { date } = Astro.props;
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
<time class="text-sm flex items-center mr-2" datetime={date}>
|
|
6
|
-
{new Date(date).toLocaleDateString()}
|
|
7
|
-
</time>
|
|
1
|
+
---
|
|
2
|
+
const { date } = Astro.props;
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
<time class="text-sm flex items-center mr-2" datetime={date}>
|
|
6
|
+
{new Date(date).toLocaleDateString()}
|
|
7
|
+
</time>
|