spoko-design-system 0.2.95 → 0.2.97

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 (171) 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 -114
  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 +116 -116
  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 -134
  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 +39 -49
  49. package/src/components/Category/CategoryViewToggler.astro +81 -109
  50. package/src/components/Category/SubCategoryLink.vue +19 -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/LanguageSuggestion.astro +69 -0
  65. package/src/components/LeftSidebar.astro +53 -53
  66. package/src/components/MainColors.vue +23 -23
  67. package/src/components/MainInput.vue +15 -15
  68. package/src/components/Modal.astro +27 -27
  69. package/src/components/PageContent.astro +5 -5
  70. package/src/components/PartNumber.vue +27 -27
  71. package/src/components/PostHeader.astro +103 -103
  72. package/src/components/PrCode.vue +141 -141
  73. package/src/components/Product/ProductButton.vue +18 -18
  74. package/src/components/Product/ProductCarousel.astro +35 -35
  75. package/src/components/Product/ProductCodes.vue +174 -174
  76. package/src/components/Product/ProductEngineType.vue +42 -42
  77. package/src/components/Product/ProductImage.astro +40 -40
  78. package/src/components/Product/ProductLink.astro +101 -101
  79. package/src/components/Product/ProductLink.vue +59 -59
  80. package/src/components/Product/ProductLinkInfo.astro +37 -37
  81. package/src/components/Product/ProductNumber.astro +61 -61
  82. package/src/components/ProductCarousel.astro +38 -38
  83. package/src/components/ProductCodes.vue +39 -39
  84. package/src/components/ProductDetailName.vue +52 -52
  85. package/src/components/ProductDetailsList.vue +65 -65
  86. package/src/components/ProductTile.astro +48 -48
  87. package/src/components/Quote.vue +23 -23
  88. package/src/components/ReloadPrompt.astro +50 -50
  89. package/src/components/SlimBanner.vue +72 -72
  90. package/src/components/Table.vue +32 -32
  91. package/src/components/TableOfContents.astro +15 -15
  92. package/src/components/Translations.vue +23 -23
  93. package/src/components/flags/FlagPL.vue +3 -3
  94. package/src/components/flags/FlagUA.vue +2 -2
  95. package/src/components/layout/Container.astro +7 -7
  96. package/src/components/layout/Header.astro +80 -80
  97. package/src/config.ts +56 -56
  98. package/src/design.config.ts +98 -98
  99. package/src/env.d.ts +6 -6
  100. package/src/layouts/Layout.astro +60 -60
  101. package/src/layouts/MainLayout.astro +81 -81
  102. package/src/layouts/partials/FooterCommon.astro +4 -4
  103. package/src/layouts/partials/HeadCommon.astro +44 -44
  104. package/src/layouts/partials/HeadSEO.astro +41 -41
  105. package/src/pages/components/badges.mdx +57 -57
  106. package/src/pages/components/breadcrumbs.mdx +139 -139
  107. package/src/pages/components/buttons.mdx +253 -253
  108. package/src/pages/components/card.mdx +294 -294
  109. package/src/pages/components/carousel.mdx +62 -62
  110. package/src/pages/components/copyright.mdx +42 -42
  111. package/src/pages/components/details-list.mdx +115 -115
  112. package/src/pages/components/features-list.mdx +37 -37
  113. package/src/pages/components/flags.mdx +49 -49
  114. package/src/pages/components/fuck-russia.mdx +39 -39
  115. package/src/pages/components/hand-drive.mdx +38 -38
  116. package/src/pages/components/headline.mdx +152 -152
  117. package/src/pages/components/icons.astro +135 -135
  118. package/src/pages/components/image.mdx +513 -513
  119. package/src/pages/components/input.mdx +45 -45
  120. package/src/pages/components/jumbatron.mdx +95 -95
  121. package/src/pages/components/modal.mdx +64 -64
  122. package/src/pages/components/post-header.mdx +60 -60
  123. package/src/pages/components/pr-code.mdx +65 -65
  124. package/src/pages/components/product-number.mdx +58 -58
  125. package/src/pages/components/product-tile.mdx +51 -51
  126. package/src/pages/components/quote.mdx +33 -33
  127. package/src/pages/components/slimbanner.mdx +35 -35
  128. package/src/pages/components/table.mdx +108 -108
  129. package/src/pages/core/colors.mdx +10 -10
  130. package/src/pages/core/grid.mdx +89 -89
  131. package/src/pages/core/introduction.mdx +77 -77
  132. package/src/pages/core/shadows.astro +20 -20
  133. package/src/pages/core/typography.astro +49 -48
  134. package/src/pages/index.astro +126 -126
  135. package/src/pages/patterns/introduction.mdx +60 -60
  136. package/src/pwa.ts +12 -12
  137. package/src/styles/_variables.scss +70 -70
  138. package/src/styles/base/base.css +184 -184
  139. package/src/styles/base/grid.css +92 -92
  140. package/src/styles/base/typography.css +70 -70
  141. package/src/styles/content.css +73 -73
  142. package/src/styles/main.css +7 -7
  143. package/src/types/Product.ts +31 -31
  144. package/src/types/astro.d.ts +3 -3
  145. package/src/utils/product/getPriceFormatted.ts +15 -15
  146. package/src/utils/product/getProductChecklist.ts +17 -17
  147. package/src/utils/product/useFormatProductNumber.ts +41 -41
  148. package/src/utils/seo/getShorterDescription.ts +14 -14
  149. package/src/utils/text/formatDate.ts +5 -5
  150. package/src/utils/text/formatLocaleNumber.ts +6 -6
  151. package/src/utils/text/formatPad.ts +12 -12
  152. package/src/utils/text/getNumberFormatted.ts +33 -33
  153. package/src/utils/text/getTranslatedLink.ts +5 -5
  154. package/src/utils/text.ts +19 -19
  155. package/tailwind.config.cjs +8 -8
  156. package/tsconfig.json +28 -28
  157. package/uno-config/index.ts +61 -61
  158. package/uno-config/theme/breakpoints.ts +9 -9
  159. package/uno-config/theme/colors.ts +66 -66
  160. package/uno-config/theme/dimensions.ts +17 -17
  161. package/uno-config/theme/effects.ts +14 -14
  162. package/uno-config/theme/grid.ts +10 -10
  163. package/uno-config/theme/index.ts +25 -25
  164. package/uno-config/theme/shortcuts/buttons.ts +41 -38
  165. package/uno-config/theme/shortcuts/components.ts +91 -82
  166. package/uno-config/theme/shortcuts/constants.ts +152 -3
  167. package/uno-config/theme/shortcuts/index.ts +16 -16
  168. package/uno-config/theme/shortcuts/layout.ts +64 -59
  169. package/uno-config/theme/shortcuts/product.ts +12 -3
  170. package/uno-config/theme/typography.ts +29 -29
  171. 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,136 @@
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:flex items-center gap-2 ml-auto" />
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 lg:flex items-center gap-2 ml-auto" />
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
+ document.addEventListener('astro:page-load', handlePageLoad, { once: true });
133
+
134
+ // Initial call to set up the initial state
135
+ handlePageLoad();
135
136
  </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,39 @@
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
+ import { Image } from "astro:assets";
3
+
4
+ interface Props {
5
+ CategoryObject: {
6
+ photo: string;
7
+ desc: string;
8
+ alt: string;
9
+ name: string;
10
+ slug: string;
11
+ height?: number;
12
+ width?: number;
13
+ class?: string;
14
+ };
15
+ locale?: string;
16
+ }
17
+
18
+ const { CategoryObject, locale = 'en' } = Astro.props;
19
+ const { height = 70, width = 70 } = CategoryObject;
20
+ ---
21
+
22
+ <a
23
+ href={`/${CategoryObject.slug}/`}
24
+ class="carousel-item"
25
+ data-astro-prefetch
26
+ >
27
+ <Image
28
+ src={CategoryObject.photo}
29
+ alt={CategoryObject.alt}
30
+ {height}
31
+ {width}
32
+ format="avif"
33
+ loading="eager"
34
+ onerror="this.style.display='none';"
35
+ class="cats-img"
36
+ />
37
+ <div class="swiper-lazy-preloader" />
38
+ <div class="cat-name" itemprop="name">{CategoryObject.name}</div>
39
+ </a>