spoko-design-system 0.2.88 → 0.2.89

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/.astro/settings.json +4 -4
  2. package/.github/dependabot.yml +11 -11
  3. package/.github/todo.yml +3 -3
  4. package/.github/workflows/deploy.yml +39 -39
  5. package/.stackblitzrc +5 -5
  6. package/.vscode/extensions.json +5 -5
  7. package/.vscode/launch.json +11 -11
  8. package/.vscode/settings.json +5 -5
  9. package/LICENSE +21 -21
  10. package/README.md +114 -113
  11. package/astro-i18next.config.mjs +17 -17
  12. package/astro-i18next.config.ts +10 -10
  13. package/astro.config.mjs +83 -83
  14. package/dev-dist/sw.js +91 -91
  15. package/dev-dist/workbox-c676b6d3.js +3391 -3391
  16. package/icon.config.ts +224 -224
  17. package/index.ts +62 -62
  18. package/package.json +3 -3
  19. package/public/fonts/lg.svg +53 -53
  20. package/public/fonts/vwhead-bold-demo.html +549 -549
  21. package/public/fonts/vwhead-regular-demo.html +549 -549
  22. package/public/fonts/vwtext-bold-demo.html +549 -549
  23. package/public/fonts/vwtext-regular-demo.html +549 -549
  24. package/public/github.svg +3 -3
  25. package/public/grid_dot.svg +4 -4
  26. package/public/linkedin.svg +44 -44
  27. package/public/locales/en/translation.json +8 -8
  28. package/public/locales/pl/translation.json +8 -8
  29. package/public/make-scrollable-code-focusable.js +3 -3
  30. package/public/pagefind.yml +3 -3
  31. package/public/polo.blue.svg +29 -29
  32. package/public/spoko.space.svg +71 -71
  33. package/public/twitter.svg +46 -46
  34. package/renovate.json +6 -6
  35. package/sandbox.config.json +11 -11
  36. package/src/MyComponent.astro +8 -8
  37. package/src/components/Badge.vue +19 -19
  38. package/src/components/Badges.vue +21 -21
  39. package/src/components/Breadcrumbs.vue +107 -107
  40. package/src/components/Button.vue +63 -63
  41. package/src/components/ButtonCopy.vue +36 -36
  42. package/src/components/Card.astro +27 -27
  43. package/src/components/Carousel.astro +26 -26
  44. package/src/components/Category/CategoriesCarousel.astro +101 -101
  45. package/src/components/Category/CategoryDetails.astro +135 -137
  46. package/src/components/Category/CategoryLink.vue +23 -23
  47. package/src/components/Category/CategorySidebarToggler.vue +9 -9
  48. package/src/components/Category/CategoryTile.astro +49 -49
  49. package/src/components/Category/CategoryViewToggler.astro +107 -107
  50. package/src/components/Category/SubCategoryLink.vue +29 -29
  51. package/src/components/CategoryLink.astro +18 -18
  52. package/src/components/Copyright.astro +12 -12
  53. package/src/components/Date.astro +7 -7
  54. package/src/components/Faq.astro +33 -33
  55. package/src/components/FaqItem.astro +96 -96
  56. package/src/components/FeaturesList.vue +41 -41
  57. package/src/components/FuckRussia.vue +62 -62
  58. package/src/components/HandDrive.astro +29 -29
  59. package/src/components/Header/Header.astro +210 -210
  60. package/src/components/Header/SkipToContent.astro +1 -1
  61. package/src/components/Headline.vue +48 -48
  62. package/src/components/Image.astro +30 -30
  63. package/src/components/Jumbatron.vue +40 -40
  64. package/src/components/LeftSidebar.astro +53 -53
  65. package/src/components/MainColors.vue +23 -23
  66. package/src/components/MainInput.vue +15 -15
  67. package/src/components/Modal.astro +27 -27
  68. package/src/components/PageContent.astro +5 -5
  69. package/src/components/PartNumber.vue +27 -27
  70. package/src/components/PostHeader.astro +103 -103
  71. package/src/components/PrCode.vue +141 -141
  72. package/src/components/Product/ProductButton.vue +18 -18
  73. package/src/components/Product/ProductCarousel.astro +35 -35
  74. package/src/components/Product/ProductCodes.vue +174 -174
  75. package/src/components/Product/ProductEngineType.vue +42 -42
  76. package/src/components/Product/ProductImage.astro +40 -40
  77. package/src/components/Product/ProductLink.astro +101 -101
  78. package/src/components/Product/ProductLink.vue +59 -59
  79. package/src/components/Product/ProductLinkInfo.astro +37 -37
  80. package/src/components/Product/ProductNumber.astro +61 -61
  81. package/src/components/ProductCarousel.astro +38 -38
  82. package/src/components/ProductCodes.vue +39 -39
  83. package/src/components/ProductDetailName.vue +52 -52
  84. package/src/components/ProductDetailsList.vue +65 -65
  85. package/src/components/ProductTile.astro +48 -48
  86. package/src/components/Quote.vue +23 -23
  87. package/src/components/ReloadPrompt.astro +50 -50
  88. package/src/components/SlimBanner.vue +72 -72
  89. package/src/components/Table.vue +32 -32
  90. package/src/components/TableOfContents.astro +15 -15
  91. package/src/components/Translations.vue +23 -23
  92. package/src/components/flags/FlagPL.vue +3 -3
  93. package/src/components/flags/FlagUA.vue +2 -2
  94. package/src/components/layout/Container.astro +7 -7
  95. package/src/components/layout/Header.astro +80 -80
  96. package/src/config.ts +56 -56
  97. package/src/design.config.ts +98 -98
  98. package/src/env.d.ts +6 -6
  99. package/src/layouts/Layout.astro +60 -60
  100. package/src/layouts/MainLayout.astro +81 -81
  101. package/src/layouts/partials/FooterCommon.astro +4 -4
  102. package/src/layouts/partials/HeadCommon.astro +44 -44
  103. package/src/layouts/partials/HeadSEO.astro +41 -41
  104. package/src/pages/components/badges.mdx +57 -57
  105. package/src/pages/components/breadcrumbs.mdx +139 -139
  106. package/src/pages/components/buttons.mdx +253 -253
  107. package/src/pages/components/card.mdx +294 -294
  108. package/src/pages/components/carousel.mdx +62 -62
  109. package/src/pages/components/copyright.mdx +42 -42
  110. package/src/pages/components/details-list.mdx +115 -115
  111. package/src/pages/components/features-list.mdx +37 -37
  112. package/src/pages/components/flags.mdx +49 -49
  113. package/src/pages/components/fuck-russia.mdx +39 -39
  114. package/src/pages/components/hand-drive.mdx +38 -38
  115. package/src/pages/components/headline.mdx +152 -152
  116. package/src/pages/components/icons.astro +135 -135
  117. package/src/pages/components/image.mdx +513 -513
  118. package/src/pages/components/input.mdx +45 -45
  119. package/src/pages/components/jumbatron.mdx +95 -95
  120. package/src/pages/components/modal.mdx +64 -64
  121. package/src/pages/components/post-header.mdx +60 -60
  122. package/src/pages/components/pr-code.mdx +65 -65
  123. package/src/pages/components/product-number.mdx +58 -58
  124. package/src/pages/components/product-tile.mdx +51 -51
  125. package/src/pages/components/quote.mdx +33 -33
  126. package/src/pages/components/slimbanner.mdx +35 -35
  127. package/src/pages/components/table.mdx +108 -108
  128. package/src/pages/core/colors.mdx +10 -10
  129. package/src/pages/core/grid.mdx +89 -89
  130. package/src/pages/core/introduction.mdx +77 -77
  131. package/src/pages/core/shadows.astro +20 -20
  132. package/src/pages/core/typography.astro +47 -47
  133. package/src/pages/index.astro +126 -126
  134. package/src/pages/patterns/introduction.mdx +60 -60
  135. package/src/pwa.ts +12 -12
  136. package/src/styles/_variables.scss +70 -70
  137. package/src/styles/base/base.css +184 -184
  138. package/src/styles/base/grid.css +92 -92
  139. package/src/styles/base/typography.css +70 -70
  140. package/src/styles/content.css +73 -73
  141. package/src/styles/main.css +7 -7
  142. package/src/types/Product.ts +31 -31
  143. package/src/types/astro.d.ts +3 -3
  144. package/src/utils/product/getPriceFormatted.ts +15 -15
  145. package/src/utils/product/getProductChecklist.ts +17 -17
  146. package/src/utils/product/useFormatProductNumber.ts +41 -41
  147. package/src/utils/seo/getShorterDescription.ts +14 -14
  148. package/src/utils/text/formatDate.ts +5 -5
  149. package/src/utils/text/formatLocaleNumber.ts +6 -6
  150. package/src/utils/text/formatPad.ts +12 -12
  151. package/src/utils/text/getNumberFormatted.ts +33 -33
  152. package/src/utils/text/getTranslatedLink.ts +5 -5
  153. package/src/utils/text.ts +19 -19
  154. package/tailwind.config.cjs +8 -8
  155. package/tsconfig.json +28 -28
  156. package/uno-config/index.ts +58 -58
  157. package/uno-config/theme/breakpoints.ts +9 -9
  158. package/uno-config/theme/colors.ts +66 -66
  159. package/uno-config/theme/dimensions.ts +17 -17
  160. package/uno-config/theme/effects.ts +14 -14
  161. package/uno-config/theme/grid.ts +10 -10
  162. package/uno-config/theme/index.ts +25 -25
  163. package/uno-config/theme/shortcuts/buttons.ts +38 -35
  164. package/uno-config/theme/shortcuts/components.ts +80 -61
  165. package/uno-config/theme/shortcuts/constants.ts +3 -0
  166. package/uno-config/theme/shortcuts/index.ts +16 -14
  167. package/uno-config/theme/shortcuts/layout.ts +58 -54
  168. package/uno-config/theme/shortcuts/product.ts +6 -0
  169. package/uno-config/theme/typography.ts +29 -29
  170. 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,137 +1,135 @@
1
- ---
2
- import CategorySidebarToggler from './CategorySidebarToggler.vue';
3
- import CategoryViewToggler from './CategoryViewToggler.astro';
4
- import { Icon } from 'astro-icon/components';
5
- const { category, subcategory, subtitle, subsubtitle, titleSmall, locale, showViewToggler, viewerLabels } = Astro.props;
6
- import { t } from "i18next";
7
-
8
- // Compute base URL for localization
9
- const baseURL = locale === 'en' ? '' : `/${locale}`;
10
-
11
- // View toggler translations
12
- // const viewerLabels = {
13
- // showText: t('category.view.show'),
14
- // listText: t('category.view.list'),
15
- // gridText: t('category.view.grid'),
16
- // listAriaLabel: t('category.view.listAriaLabel'),
17
- // gridAriaLabel: t('category.view.gridAriaLabel')
18
- // };
19
- ---
20
-
21
- <div
22
- ref="el"
23
- 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"
24
- transition:name="category-details"
25
- transition:animate="fade"
26
- >
27
- <CategorySidebarToggler client:load onclick="toggleSidebar()">
28
- <Icon name="ant-design:menu-fold-outlined" class="toggler-btn hidden md:block" />
29
- <Icon name="ant-design:menu-unfold-outlined" class="toggler-btn hidden" />
30
- <Icon name="ant-design:menu-outlined" class="toggler-btn md:hidden" />
31
- </CategorySidebarToggler>
32
-
33
- <div class="overflow-x-auto overflow-y-hidden flex max-w-full items-center">
34
- {subtitle ? (
35
- <>
36
- <a class="text-lg font-vw-headregular whitespace-nowrap block" href={`${baseURL}/${category.slug}/`}>
37
- {category.name}
38
- {titleSmall && <small>{titleSmall}</small>}
39
- </a>
40
- <span class="text-neutral-lighter text-lg inline-block px-1 font-headlight">/</span>
41
- {!subsubtitle ? (
42
- <h1 class="text-lg py-2.5 sm:py-0 whitespace-nowrap underline underline-offset-6 decoration-blue-300 decoration-0.5">
43
- {subtitle} <span class="sr-only"> {t('catalog.extra-short')}</span>
44
- </h1>
45
- ) : (
46
- <>
47
- <div class="text-lg py-2.5 sm:py-0 whitespace-nowrap ">
48
- <a href={`${baseURL}/${category.slug}/${subcategory.slug}/`}>
49
- {subtitle}
50
- </a>
51
- </div>
52
- <span class="text-neutral-lighter text-lg inline-block px-1 font-headlight">/</span>
53
- <h1 class="text-lg py-2.5 sm:py-0 whitespace-nowrap underline underline-offset-6 decoration-blue-300 decoration-0.5">
54
- {subsubtitle} <span class="sr-only"> {t('catalog.extra-short')}</span>
55
- </h1>
56
- </>
57
- )}
58
- </>
59
- ) : (
60
- <h1 class="text-lg py-2.5 sm:py-0 whitespace-nowrap">
61
- {category.name}
62
- {titleSmall && <small>{titleSmall}</small>}
63
- <span class="sr-only"> {t('catalog.extra-short')}</span>
64
- </h1>
65
- )}
66
- </div>
67
-
68
- <CategoryViewToggler {...viewerLabels} showViewToggler={showViewToggler} />
69
- </div>
70
-
71
- <script is:inline>
72
- function toggleSidebar() {
73
- const sidebar = document.getElementById('sidebar');
74
- const togglers = document.querySelectorAll('.toggler-btn');
75
- const isMobile = window.matchMedia("(max-width: 768px)").matches;
76
-
77
- if (sidebar) {
78
- if (isMobile) {
79
- document.body.classList.toggle('overflow-hidden');
80
- sidebar.classList.toggle('show');
81
- localStorage.setItem('sidebarState', sidebar.classList.contains('show') ? 'open' : 'closed');
82
- } else {
83
- document.body.classList.remove('overflow-hidden');
84
- sidebar.classList.toggle('collapsed');
85
- localStorage.setItem('sidebarState', sidebar.classList.contains('collapsed') ? 'closed' : 'open');
86
-
87
- // Toggle visibility of buttons on desktop
88
- togglers.forEach(btn => btn.classList.toggle('hidden'));
89
- }
90
- }
91
- }
92
-
93
- // Read status from localStorage on page load
94
- document.addEventListener('astro:page-load', () => {
95
- const sidebar = document.getElementById('sidebar');
96
- const togglers = document.querySelectorAll('.toggler-btn');
97
- const isMobile = window.matchMedia("(max-width: 768px)").matches;
98
- const savedState = localStorage.getItem('sidebarState');
99
-
100
- if (sidebar) {
101
- if (savedState === 'open') {
102
- if (isMobile) {
103
- sidebar.classList.add('show');
104
- } else {
105
- sidebar.classList.remove('collapsed');
106
- // Show correct button on desktop
107
- if (togglers.length >= 2) {
108
- togglers[0].classList.remove('hidden'); // menu-fold
109
- togglers[1].classList.add('hidden'); // menu-unfold
110
- }
111
- }
112
- } else if (savedState === 'closed') {
113
- if (isMobile) {
114
- sidebar.classList.remove('show');
115
- } else {
116
- sidebar.classList.add('collapsed');
117
- // Show correct button on desktop
118
- if (togglers.length >= 2) {
119
- togglers[0].classList.add('hidden'); // menu-fold
120
- togglers[1].classList.remove('hidden'); // menu-unfold
121
- }
122
- }
123
- }
124
- }
125
- });
126
- </script>
127
-
128
- <style>
129
- /* View toggle styles */
130
- .view-grid {
131
- @apply grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4;
132
- }
133
-
134
- .view-list {
135
- @apply flex flex-col gap-4;
136
- }
137
- </style>
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();
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>