spoko-design-system 0.2.91 → 0.2.93
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/.astro/settings.json +4 -4
- 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 +114 -114
- package/astro-i18next.config.mjs +17 -17
- package/astro-i18next.config.ts +10 -10
- package/astro.config.mjs +83 -83
- package/dev-dist/sw.js +91 -91
- package/dev-dist/workbox-c676b6d3.js +3391 -3391
- package/icon.config.ts +224 -224
- package/index.ts +62 -62
- package/package.json +116 -116
- 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 +63 -63
- 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/CategoryDetails.astro +134 -134
- package/src/components/Category/CategoryLink.vue +23 -23
- package/src/components/Category/CategorySidebarToggler.vue +9 -9
- package/src/components/Category/CategoryTile.astro +49 -49
- package/src/components/Category/CategoryViewToggler.astro +107 -107
- 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 +98 -98
- package/src/env.d.ts +6 -6
- 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 +253 -253
- 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 +135 -135
- 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 +19 -19
- package/tailwind.config.cjs +8 -8
- package/tsconfig.json +28 -28
- package/uno-config/index.ts +61 -61
- package/uno-config/theme/breakpoints.ts +9 -9
- package/uno-config/theme/colors.ts +66 -66
- package/uno-config/theme/dimensions.ts +17 -17
- package/uno-config/theme/effects.ts +14 -14
- package/uno-config/theme/grid.ts +10 -10
- package/uno-config/theme/index.ts +25 -25
- package/uno-config/theme/shortcuts/buttons.ts +38 -38
- package/uno-config/theme/shortcuts/components.ts +82 -82
- package/uno-config/theme/shortcuts/index.ts +16 -16
- package/uno-config/theme/shortcuts/layout.ts +58 -58
- package/uno-config/theme/typography.ts +29 -29
- package/uno.config.ts +2 -2
|
@@ -1,101 +1,101 @@
|
|
|
1
|
-
---
|
|
2
|
-
const { activeCategorySlug, locale, class: className } = Astro.props;
|
|
3
|
-
|
|
4
|
-
import { getTranslatedLink } from "@utils/text/getTranslatedLink"
|
|
5
|
-
import { getMainCategoryList } from "@utils/category/getMainCategoryList"
|
|
6
|
-
import { Image } from 'astro:assets'
|
|
7
|
-
|
|
8
|
-
import i18next, { t } from "i18next";
|
|
9
|
-
const categories = await getMainCategoryList()
|
|
10
|
-
const imgDomain = 'https://api.polo.blue/img/';
|
|
11
|
-
|
|
12
|
-
const activeIndex = activeCategorySlug && categories ? categories.map(a => a.slug).findIndex(e => e === activeCategorySlug) : 0
|
|
13
|
-
---
|
|
14
|
-
<!-- <div class={`cat-menu ${className ? className : ''}`}
|
|
15
|
-
data-pagefind-ignore
|
|
16
|
-
itemscope itemtype="https://schema.org/SiteNavigationElement"
|
|
17
|
-
transition:persist={`catcarousel${activeIndex}`}
|
|
18
|
-
transition:animate="none"
|
|
19
|
-
> -->
|
|
20
|
-
<swiper-container
|
|
21
|
-
class={`categories-carousel flex pb-1 sm:pb-0 bg-white cat-menu ${className ? className : ''}`}
|
|
22
|
-
data-pagefind-ignore
|
|
23
|
-
itemscope itemtype="https://schema.org/SiteNavigationElement"
|
|
24
|
-
transition:persist={`catcarousel${activeIndex}`}
|
|
25
|
-
transition:animate="none"
|
|
26
|
-
data-active={activeIndex}
|
|
27
|
-
initial-slide={activeIndex}
|
|
28
|
-
space-between="0"
|
|
29
|
-
slides-per-view="auto"
|
|
30
|
-
scrollbar="true"
|
|
31
|
-
draggable="true"
|
|
32
|
-
keyboard
|
|
33
|
-
free-mode
|
|
34
|
-
data-off-observer
|
|
35
|
-
run-callbacks-on-init="false"
|
|
36
|
-
>
|
|
37
|
-
{
|
|
38
|
-
categories.map((category, index) => (
|
|
39
|
-
<swiper-slide itemprop="hasPart" role="presentation"
|
|
40
|
-
class={`swiper-slide cats-slide group ${category.slug === activeCategorySlug ? 'active': ''}`}
|
|
41
|
-
>
|
|
42
|
-
<a href={getTranslatedLink(`/${category.slug}/`)}
|
|
43
|
-
class="carousel-item"
|
|
44
|
-
>
|
|
45
|
-
{
|
|
46
|
-
// itemprop="url"
|
|
47
|
-
// role="menuitem"
|
|
48
|
-
// aria-label={ t(`cat.${category.slug}.name`) }
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
<Image
|
|
52
|
-
src={`${imgDomain}${category.photo}`}
|
|
53
|
-
alt={t(`cat.${category.slug}.desc`).split('. ', 1)[0]}
|
|
54
|
-
height="70"
|
|
55
|
-
width="70"
|
|
56
|
-
format="avif"
|
|
57
|
-
loading="eager"
|
|
58
|
-
onerror="this.style.display='none';"
|
|
59
|
-
class="cats-img"
|
|
60
|
-
/>
|
|
61
|
-
<div class="swiper-lazy-preloader"></div>
|
|
62
|
-
|
|
63
|
-
<div class="cat-name"
|
|
64
|
-
// itemprop="name"
|
|
65
|
-
>
|
|
66
|
-
{ t(`cat.${category.slug}.name`) }
|
|
67
|
-
</div>
|
|
68
|
-
</a>
|
|
69
|
-
</swiper-slide>
|
|
70
|
-
))
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
</swiper-container>
|
|
74
|
-
<!-- </div> -->
|
|
75
|
-
|
|
76
|
-
<style >
|
|
77
|
-
.active {
|
|
78
|
-
@apply bg-blue-darker text-white bg-opacity-100;
|
|
79
|
-
|
|
80
|
-
&:not(:hover) .cats-img {
|
|
81
|
-
filter: invert(100%);
|
|
82
|
-
/* // @apply filter-invert; */
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
.categories-carousel {
|
|
88
|
-
@apply overflow-hidden;
|
|
89
|
-
|
|
90
|
-
&.swiper-initialized {
|
|
91
|
-
.img-preloader {
|
|
92
|
-
display: none;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
.swiper-slide {
|
|
98
|
-
@apply transition w-[calc(100%/3.55)] min-w-[calc(100%/3.55)] sm:w-35 sm:min-w-35 3xl:min-w-[calc(100%/12.5-4px)];
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
</style>
|
|
1
|
+
---
|
|
2
|
+
const { activeCategorySlug, locale, class: className } = Astro.props;
|
|
3
|
+
|
|
4
|
+
import { getTranslatedLink } from "@utils/text/getTranslatedLink"
|
|
5
|
+
import { getMainCategoryList } from "@utils/category/getMainCategoryList"
|
|
6
|
+
import { Image } from 'astro:assets'
|
|
7
|
+
|
|
8
|
+
import i18next, { t } from "i18next";
|
|
9
|
+
const categories = await getMainCategoryList()
|
|
10
|
+
const imgDomain = 'https://api.polo.blue/img/';
|
|
11
|
+
|
|
12
|
+
const activeIndex = activeCategorySlug && categories ? categories.map(a => a.slug).findIndex(e => e === activeCategorySlug) : 0
|
|
13
|
+
---
|
|
14
|
+
<!-- <div class={`cat-menu ${className ? className : ''}`}
|
|
15
|
+
data-pagefind-ignore
|
|
16
|
+
itemscope itemtype="https://schema.org/SiteNavigationElement"
|
|
17
|
+
transition:persist={`catcarousel${activeIndex}`}
|
|
18
|
+
transition:animate="none"
|
|
19
|
+
> -->
|
|
20
|
+
<swiper-container
|
|
21
|
+
class={`categories-carousel flex pb-1 sm:pb-0 bg-white cat-menu ${className ? className : ''}`}
|
|
22
|
+
data-pagefind-ignore
|
|
23
|
+
itemscope itemtype="https://schema.org/SiteNavigationElement"
|
|
24
|
+
transition:persist={`catcarousel${activeIndex}`}
|
|
25
|
+
transition:animate="none"
|
|
26
|
+
data-active={activeIndex}
|
|
27
|
+
initial-slide={activeIndex}
|
|
28
|
+
space-between="0"
|
|
29
|
+
slides-per-view="auto"
|
|
30
|
+
scrollbar="true"
|
|
31
|
+
draggable="true"
|
|
32
|
+
keyboard
|
|
33
|
+
free-mode
|
|
34
|
+
data-off-observer
|
|
35
|
+
run-callbacks-on-init="false"
|
|
36
|
+
>
|
|
37
|
+
{
|
|
38
|
+
categories.map((category, index) => (
|
|
39
|
+
<swiper-slide itemprop="hasPart" role="presentation"
|
|
40
|
+
class={`swiper-slide cats-slide group ${category.slug === activeCategorySlug ? 'active': ''}`}
|
|
41
|
+
>
|
|
42
|
+
<a href={getTranslatedLink(`/${category.slug}/`)}
|
|
43
|
+
class="carousel-item"
|
|
44
|
+
>
|
|
45
|
+
{
|
|
46
|
+
// itemprop="url"
|
|
47
|
+
// role="menuitem"
|
|
48
|
+
// aria-label={ t(`cat.${category.slug}.name`) }
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
<Image
|
|
52
|
+
src={`${imgDomain}${category.photo}`}
|
|
53
|
+
alt={t(`cat.${category.slug}.desc`).split('. ', 1)[0]}
|
|
54
|
+
height="70"
|
|
55
|
+
width="70"
|
|
56
|
+
format="avif"
|
|
57
|
+
loading="eager"
|
|
58
|
+
onerror="this.style.display='none';"
|
|
59
|
+
class="cats-img"
|
|
60
|
+
/>
|
|
61
|
+
<div class="swiper-lazy-preloader"></div>
|
|
62
|
+
|
|
63
|
+
<div class="cat-name"
|
|
64
|
+
// itemprop="name"
|
|
65
|
+
>
|
|
66
|
+
{ t(`cat.${category.slug}.name`) }
|
|
67
|
+
</div>
|
|
68
|
+
</a>
|
|
69
|
+
</swiper-slide>
|
|
70
|
+
))
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
</swiper-container>
|
|
74
|
+
<!-- </div> -->
|
|
75
|
+
|
|
76
|
+
<style >
|
|
77
|
+
.active {
|
|
78
|
+
@apply bg-blue-darker text-white bg-opacity-100;
|
|
79
|
+
|
|
80
|
+
&:not(:hover) .cats-img {
|
|
81
|
+
filter: invert(100%);
|
|
82
|
+
/* // @apply filter-invert; */
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.categories-carousel {
|
|
88
|
+
@apply overflow-hidden;
|
|
89
|
+
|
|
90
|
+
&.swiper-initialized {
|
|
91
|
+
.img-preloader {
|
|
92
|
+
display: none;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.swiper-slide {
|
|
98
|
+
@apply transition w-[calc(100%/3.55)] min-w-[calc(100%/3.55)] sm:w-35 sm:min-w-35 3xl:min-w-[calc(100%/12.5-4px)];
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
</style>
|
|
@@ -1,135 +1,135 @@
|
|
|
1
|
-
---
|
|
2
|
-
import CategorySidebarToggler from './CategorySidebarToggler.vue';
|
|
3
|
-
import CategoryViewToggler from './CategoryViewToggler.astro';
|
|
4
|
-
import { Icon } from 'astro-icon/components';
|
|
5
|
-
import { t } from "i18next";
|
|
6
|
-
|
|
7
|
-
const { category, subcategory, subtitle, subsubtitle, titleSmall, locale, showViewToggler, viewerLabels } = Astro.props;
|
|
8
|
-
|
|
9
|
-
// Compute base URL for localization
|
|
10
|
-
const baseURL = locale === 'en' ? '' : `/${locale}`;
|
|
11
|
-
|
|
12
|
-
---
|
|
13
|
-
|
|
14
|
-
<div
|
|
15
|
-
ref="el"
|
|
16
|
-
class="flex flex-nowrap items-center pr-3 sm:pb-3 sm:pt-4 md:pl-4 relative z-10-off bg-neutral-lightest md:bg-white"
|
|
17
|
-
transition:name="category-details"
|
|
18
|
-
transition:animate="fade"
|
|
19
|
-
>
|
|
20
|
-
<CategorySidebarToggler onclick="toggleSidebar()" client:load>
|
|
21
|
-
<!-- First icon - visible only on desktop when sidebar is expanded -->
|
|
22
|
-
<Icon
|
|
23
|
-
name="ant-design:menu-fold-outlined"
|
|
24
|
-
class="toggler-btn hidden md:[&:not(.hidden)]:block"
|
|
25
|
-
aria-hidden="true"
|
|
26
|
-
/>
|
|
27
|
-
<!-- Second icon - visible only on desktop when sidebar is collapsed -->
|
|
28
|
-
<Icon
|
|
29
|
-
name="ant-design:menu-unfold-outlined"
|
|
30
|
-
class="toggler-btn hidden md:[&:not(.hidden)]:block"
|
|
31
|
-
aria-hidden="true"
|
|
32
|
-
/>
|
|
33
|
-
<!-- Mobile icon -->
|
|
34
|
-
<Icon
|
|
35
|
-
name="ant-design:menu-outlined"
|
|
36
|
-
class="toggler-btn block md:hidden"
|
|
37
|
-
aria-hidden="true"
|
|
38
|
-
/>
|
|
39
|
-
</CategorySidebarToggler>
|
|
40
|
-
|
|
41
|
-
<div class="overflow-x-auto overflow-y-hidden flex max-w-full items-center">
|
|
42
|
-
{subtitle ? (
|
|
43
|
-
<>
|
|
44
|
-
<a class="text-lg font-vw-headregular whitespace-nowrap block" href={`${baseURL}/${category.slug}/`}>
|
|
45
|
-
{category.name}
|
|
46
|
-
{titleSmall && <small>{titleSmall}</small>}
|
|
47
|
-
</a>
|
|
48
|
-
<span class="text-neutral-lighter text-lg inline-block px-1 font-headlight">/</span>
|
|
49
|
-
{!subsubtitle ? (
|
|
50
|
-
<h1 class="text-lg py-2.5 sm:py-0 whitespace-nowrap underline underline-offset-6 decoration-blue-300 decoration-0.5">
|
|
51
|
-
{subtitle} <span class="sr-only"> {t('catalog.extra-short')}</span>
|
|
52
|
-
</h1>
|
|
53
|
-
) : (
|
|
54
|
-
<>
|
|
55
|
-
<div class="text-lg py-2.5 sm:py-0 whitespace-nowrap ">
|
|
56
|
-
<a href={`${baseURL}/${category.slug}/${subcategory.slug}/`}>
|
|
57
|
-
{subtitle}
|
|
58
|
-
</a>
|
|
59
|
-
</div>
|
|
60
|
-
<span class="text-neutral-lighter text-lg inline-block px-1 font-headlight">/</span>
|
|
61
|
-
<h1 class="text-lg py-2.5 sm:py-0 whitespace-nowrap underline underline-offset-6 decoration-blue-300 decoration-0.5">
|
|
62
|
-
{subsubtitle} <span class="sr-only"> {t('catalog.extra-short')}</span>
|
|
63
|
-
</h1>
|
|
64
|
-
</>
|
|
65
|
-
)}
|
|
66
|
-
</>
|
|
67
|
-
) : (
|
|
68
|
-
<h1 class="text-lg py-2.5 sm:py-0 whitespace-nowrap">
|
|
69
|
-
{category.name}
|
|
70
|
-
{titleSmall && <small>{titleSmall}</small>}
|
|
71
|
-
<span class="sr-only"> {t('catalog.extra-short')}</span>
|
|
72
|
-
</h1>
|
|
73
|
-
)}
|
|
74
|
-
</div>
|
|
75
|
-
|
|
76
|
-
<CategoryViewToggler {...viewerLabels} showViewToggler={showViewToggler} />
|
|
77
|
-
</div>
|
|
78
|
-
|
|
79
|
-
<script is:inline>
|
|
80
|
-
function toggleSidebar() {
|
|
81
|
-
const sidebar = document.getElementById('sidebar');
|
|
82
|
-
const togglers = document.querySelectorAll('.toggler-btn');
|
|
83
|
-
const isMobile = window.matchMedia("(max-width: 768px)").matches;
|
|
84
|
-
|
|
85
|
-
if (sidebar) {
|
|
86
|
-
if (isMobile) {
|
|
87
|
-
// On mobile just toggle classes without localStorage
|
|
88
|
-
document.body.classList.toggle('overflow-hidden');
|
|
89
|
-
sidebar.classList.toggle('show');
|
|
90
|
-
} else {
|
|
91
|
-
// On desktop save the state
|
|
92
|
-
document.body.classList.remove('overflow-hidden');
|
|
93
|
-
sidebar.classList.toggle('collapsed');
|
|
94
|
-
localStorage.setItem('sidebarState', sidebar.classList.contains('collapsed') ? 'closed' : 'open');
|
|
95
|
-
|
|
96
|
-
// Toggle visibility of buttons on desktop
|
|
97
|
-
togglers.forEach(btn => btn.classList.toggle('hidden'));
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
function handlePageLoad() {
|
|
103
|
-
const sidebar = document.getElementById('sidebar');
|
|
104
|
-
const togglers = document.querySelectorAll('.toggler-btn');
|
|
105
|
-
const isMobile = window.matchMedia("(max-width: 768px)").matches;
|
|
106
|
-
|
|
107
|
-
if (sidebar && !isMobile) {
|
|
108
|
-
const savedState = localStorage.getItem('sidebarState');
|
|
109
|
-
|
|
110
|
-
if (savedState === 'open') {
|
|
111
|
-
sidebar.classList.remove('collapsed');
|
|
112
|
-
// Show correct button on desktop
|
|
113
|
-
if (togglers.length >= 2) {
|
|
114
|
-
togglers[0].classList.remove('hidden'); // menu-fold
|
|
115
|
-
togglers[1].classList.add('hidden'); // menu-unfold
|
|
116
|
-
}
|
|
117
|
-
} else if (savedState === 'closed') {
|
|
118
|
-
sidebar.classList.add('collapsed');
|
|
119
|
-
// Show correct button on desktop
|
|
120
|
-
if (togglers.length >= 2) {
|
|
121
|
-
togglers[0].classList.add('hidden'); // menu-fold
|
|
122
|
-
togglers[1].classList.remove('hidden'); // menu-unfold
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
// Remove previous listener if exists
|
|
129
|
-
document.removeEventListener('astro:page-load', handlePageLoad);
|
|
130
|
-
// Add new listener
|
|
131
|
-
document.addEventListener('astro:page-load', handlePageLoad);
|
|
132
|
-
|
|
133
|
-
// Initial call to set up the initial state
|
|
134
|
-
handlePageLoad();
|
|
1
|
+
---
|
|
2
|
+
import CategorySidebarToggler from './CategorySidebarToggler.vue';
|
|
3
|
+
import CategoryViewToggler from './CategoryViewToggler.astro';
|
|
4
|
+
import { Icon } from 'astro-icon/components';
|
|
5
|
+
import { t } from "i18next";
|
|
6
|
+
|
|
7
|
+
const { category, subcategory, subtitle, subsubtitle, titleSmall, locale, showViewToggler, viewerLabels } = Astro.props;
|
|
8
|
+
|
|
9
|
+
// Compute base URL for localization
|
|
10
|
+
const baseURL = locale === 'en' ? '' : `/${locale}`;
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
<div
|
|
15
|
+
ref="el"
|
|
16
|
+
class="flex flex-nowrap items-center pr-3 sm:pb-3 sm:pt-4 md:pl-4 relative z-10-off bg-neutral-lightest md:bg-white"
|
|
17
|
+
transition:name="category-details"
|
|
18
|
+
transition:animate="fade"
|
|
19
|
+
>
|
|
20
|
+
<CategorySidebarToggler onclick="toggleSidebar()" client:load>
|
|
21
|
+
<!-- First icon - visible only on desktop when sidebar is expanded -->
|
|
22
|
+
<Icon
|
|
23
|
+
name="ant-design:menu-fold-outlined"
|
|
24
|
+
class="toggler-btn hidden md:[&:not(.hidden)]:block"
|
|
25
|
+
aria-hidden="true"
|
|
26
|
+
/>
|
|
27
|
+
<!-- Second icon - visible only on desktop when sidebar is collapsed -->
|
|
28
|
+
<Icon
|
|
29
|
+
name="ant-design:menu-unfold-outlined"
|
|
30
|
+
class="toggler-btn hidden md:[&:not(.hidden)]:block"
|
|
31
|
+
aria-hidden="true"
|
|
32
|
+
/>
|
|
33
|
+
<!-- Mobile icon -->
|
|
34
|
+
<Icon
|
|
35
|
+
name="ant-design:menu-outlined"
|
|
36
|
+
class="toggler-btn block md:hidden"
|
|
37
|
+
aria-hidden="true"
|
|
38
|
+
/>
|
|
39
|
+
</CategorySidebarToggler>
|
|
40
|
+
|
|
41
|
+
<div class="overflow-x-auto overflow-y-hidden flex max-w-full items-center">
|
|
42
|
+
{subtitle ? (
|
|
43
|
+
<>
|
|
44
|
+
<a class="text-lg font-vw-headregular whitespace-nowrap block" href={`${baseURL}/${category.slug}/`}>
|
|
45
|
+
{category.name}
|
|
46
|
+
{titleSmall && <small>{titleSmall}</small>}
|
|
47
|
+
</a>
|
|
48
|
+
<span class="text-neutral-lighter text-lg inline-block px-1 font-headlight">/</span>
|
|
49
|
+
{!subsubtitle ? (
|
|
50
|
+
<h1 class="text-lg py-2.5 sm:py-0 whitespace-nowrap underline underline-offset-6 decoration-blue-300 decoration-0.5">
|
|
51
|
+
{subtitle} <span class="sr-only"> {t('catalog.extra-short')}</span>
|
|
52
|
+
</h1>
|
|
53
|
+
) : (
|
|
54
|
+
<>
|
|
55
|
+
<div class="text-lg py-2.5 sm:py-0 whitespace-nowrap ">
|
|
56
|
+
<a href={`${baseURL}/${category.slug}/${subcategory.slug}/`}>
|
|
57
|
+
{subtitle}
|
|
58
|
+
</a>
|
|
59
|
+
</div>
|
|
60
|
+
<span class="text-neutral-lighter text-lg inline-block px-1 font-headlight">/</span>
|
|
61
|
+
<h1 class="text-lg py-2.5 sm:py-0 whitespace-nowrap underline underline-offset-6 decoration-blue-300 decoration-0.5">
|
|
62
|
+
{subsubtitle} <span class="sr-only"> {t('catalog.extra-short')}</span>
|
|
63
|
+
</h1>
|
|
64
|
+
</>
|
|
65
|
+
)}
|
|
66
|
+
</>
|
|
67
|
+
) : (
|
|
68
|
+
<h1 class="text-lg py-2.5 sm:py-0 whitespace-nowrap">
|
|
69
|
+
{category.name}
|
|
70
|
+
{titleSmall && <small>{titleSmall}</small>}
|
|
71
|
+
<span class="sr-only"> {t('catalog.extra-short')}</span>
|
|
72
|
+
</h1>
|
|
73
|
+
)}
|
|
74
|
+
</div>
|
|
75
|
+
|
|
76
|
+
<CategoryViewToggler {...viewerLabels} showViewToggler={showViewToggler} class="hidden md-block" />
|
|
77
|
+
</div>
|
|
78
|
+
|
|
79
|
+
<script is:inline>
|
|
80
|
+
function toggleSidebar() {
|
|
81
|
+
const sidebar = document.getElementById('sidebar');
|
|
82
|
+
const togglers = document.querySelectorAll('.toggler-btn');
|
|
83
|
+
const isMobile = window.matchMedia("(max-width: 768px)").matches;
|
|
84
|
+
|
|
85
|
+
if (sidebar) {
|
|
86
|
+
if (isMobile) {
|
|
87
|
+
// On mobile just toggle classes without localStorage
|
|
88
|
+
document.body.classList.toggle('overflow-hidden');
|
|
89
|
+
sidebar.classList.toggle('show');
|
|
90
|
+
} else {
|
|
91
|
+
// On desktop save the state
|
|
92
|
+
document.body.classList.remove('overflow-hidden');
|
|
93
|
+
sidebar.classList.toggle('collapsed');
|
|
94
|
+
localStorage.setItem('sidebarState', sidebar.classList.contains('collapsed') ? 'closed' : 'open');
|
|
95
|
+
|
|
96
|
+
// Toggle visibility of buttons on desktop
|
|
97
|
+
togglers.forEach(btn => btn.classList.toggle('hidden'));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function handlePageLoad() {
|
|
103
|
+
const sidebar = document.getElementById('sidebar');
|
|
104
|
+
const togglers = document.querySelectorAll('.toggler-btn');
|
|
105
|
+
const isMobile = window.matchMedia("(max-width: 768px)").matches;
|
|
106
|
+
|
|
107
|
+
if (sidebar && !isMobile) {
|
|
108
|
+
const savedState = localStorage.getItem('sidebarState');
|
|
109
|
+
|
|
110
|
+
if (savedState === 'open') {
|
|
111
|
+
sidebar.classList.remove('collapsed');
|
|
112
|
+
// Show correct button on desktop
|
|
113
|
+
if (togglers.length >= 2) {
|
|
114
|
+
togglers[0].classList.remove('hidden'); // menu-fold
|
|
115
|
+
togglers[1].classList.add('hidden'); // menu-unfold
|
|
116
|
+
}
|
|
117
|
+
} else if (savedState === 'closed') {
|
|
118
|
+
sidebar.classList.add('collapsed');
|
|
119
|
+
// Show correct button on desktop
|
|
120
|
+
if (togglers.length >= 2) {
|
|
121
|
+
togglers[0].classList.add('hidden'); // menu-fold
|
|
122
|
+
togglers[1].classList.remove('hidden'); // menu-unfold
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Remove previous listener if exists
|
|
129
|
+
document.removeEventListener('astro:page-load', handlePageLoad);
|
|
130
|
+
// Add new listener
|
|
131
|
+
document.addEventListener('astro:page-load', handlePageLoad);
|
|
132
|
+
|
|
133
|
+
// Initial call to set up the initial state
|
|
134
|
+
handlePageLoad();
|
|
135
135
|
</script>
|
|
@@ -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,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>
|