spoko-design-system 0.2.41 → 0.2.43
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/.env.example +2 -0
- 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 +51 -58
- package/package.json +3 -2
- 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 +110 -110
- package/src/components/Button.vue +55 -55
- package/src/components/ButtonCopy.vue +47 -47
- 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/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 +80 -80
- package/src/components/HandDrive.astro +29 -29
- package/src/components/Header/Header.astro +214 -214
- 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 +156 -156
- package/src/components/Product/ProductButton.vue +18 -18
- package/src/components/Product/ProductCodes.vue +167 -167
- package/src/components/Product/ProductEngineType.vue +42 -42
- package/src/components/Product/ProductImage.astro +41 -41
- package/src/components/Product/ProductLinkInfo.astro +37 -37
- package/src/components/Product/ProductNumber.astro +104 -104
- 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/ProductNumber copy.astro +116 -116
- package/src/components/ProductNumber.astro +104 -104
- 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 +66 -66
- 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 +4 -5
- package/src/types/index.ts +237 -0
- package/src/utils/api/getCategories.ts +3 -0
- package/src/utils/category/getMainCategoryList.ts +31 -0
- package/src/utils/category/getSortedCategories.ts +11 -0
- package/src/utils/getData.ts +52 -0
- package/src/utils/product/getPriceFormatted.ts +16 -14
- package/src/utils/product/getProductChecklist.ts +17 -15
- package/src/utils/seo/getShorterDescription.ts +14 -12
- package/src/utils/text/formatDate.ts +5 -5
- package/src/utils/text/formatLocaleNumber.ts +6 -6
- package/src/utils/text/formatPad.ts +12 -11
- package/src/utils/text/getNumberFormatted.ts +33 -32
- package/src/utils/text/getTranslatedLink.ts +7 -5
- package/src/utils/text.ts +42 -42
- package/tailwind.config.cjs +8 -8
- package/tsconfig.json +28 -11
- package/uno.config.ts +256 -256
|
@@ -1,82 +1,82 @@
|
|
|
1
|
-
---
|
|
2
|
-
import CategorySidebarToggler from "@components/Category/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 "@components/Category/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 lang="scss">
|
|
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 lang="scss">
|
|
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,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>
|
package/src/components/Faq.astro
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
---
|
|
2
|
-
|
|
3
|
-
/*
|
|
4
|
-
FAQ component for questons & answers with structured microdata for rich snippets
|
|
5
|
-
https://developers.google.com/search/docs/appearance/structured-data/faqpage?hl=en
|
|
6
|
-
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import {t } from "i18next"
|
|
10
|
-
import FaqItem from "@components/FaqItem.astro"
|
|
11
|
-
|
|
12
|
-
interface Props {
|
|
13
|
-
|
|
14
|
-
questions: {
|
|
15
|
-
question: string;
|
|
16
|
-
answer: string;
|
|
17
|
-
}[]
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const { questions } = Astro.props
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
<div class="flex flex-col mt-6 mb-4 w-full px-4 md:px-0" itemscope itemtype="https://schema.org/FAQPage" >
|
|
24
|
-
<div class="mb-6 text-4xl font-headbold sm:text-4xl text-blue-802 faq-heading">
|
|
25
|
-
{t('faq.title')}
|
|
26
|
-
</div>
|
|
27
|
-
<div class="flex flex-col divide-y dark:divide-gray-700">
|
|
28
|
-
{
|
|
29
|
-
questions.map((question) =>
|
|
30
|
-
<FaqItem data={question} />)
|
|
31
|
-
}
|
|
32
|
-
</div>
|
|
33
|
-
</div>
|
|
1
|
+
---
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
FAQ component for questons & answers with structured microdata for rich snippets
|
|
5
|
+
https://developers.google.com/search/docs/appearance/structured-data/faqpage?hl=en
|
|
6
|
+
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import {t } from "i18next"
|
|
10
|
+
import FaqItem from "@components/FaqItem.astro"
|
|
11
|
+
|
|
12
|
+
interface Props {
|
|
13
|
+
|
|
14
|
+
questions: {
|
|
15
|
+
question: string;
|
|
16
|
+
answer: string;
|
|
17
|
+
}[]
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const { questions } = Astro.props
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
<div class="flex flex-col mt-6 mb-4 w-full px-4 md:px-0" itemscope itemtype="https://schema.org/FAQPage" >
|
|
24
|
+
<div class="mb-6 text-4xl font-headbold sm:text-4xl text-blue-802 faq-heading">
|
|
25
|
+
{t('faq.title')}
|
|
26
|
+
</div>
|
|
27
|
+
<div class="flex flex-col divide-y dark:divide-gray-700">
|
|
28
|
+
{
|
|
29
|
+
questions.map((question) =>
|
|
30
|
+
<FaqItem data={question} />)
|
|
31
|
+
}
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|