spoko-design-system 0.2.40 → 0.2.42

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 (158) hide show
  1. package/.env.example +2 -0
  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 +113 -113
  11. package/astro-i18next.config.mjs +17 -17
  12. package/astro-i18next.config.ts +10 -10
  13. package/astro.config.mjs +147 -147
  14. package/dev-dist/sw.js +91 -91
  15. package/dev-dist/workbox-c676b6d3.js +3391 -3391
  16. package/index.ts +58 -33
  17. package/package.json +1 -1
  18. package/public/fonts/lg.svg +53 -53
  19. package/public/fonts/vwhead-bold-demo.html +549 -549
  20. package/public/fonts/vwhead-regular-demo.html +549 -549
  21. package/public/fonts/vwtext-bold-demo.html +549 -549
  22. package/public/fonts/vwtext-regular-demo.html +549 -549
  23. package/public/github.svg +3 -3
  24. package/public/grid_dot.svg +4 -4
  25. package/public/linkedin.svg +44 -44
  26. package/public/locales/en/translation.json +8 -8
  27. package/public/locales/pl/translation.json +8 -8
  28. package/public/make-scrollable-code-focusable.js +3 -3
  29. package/public/pagefind.yml +3 -3
  30. package/public/polo.blue.svg +29 -29
  31. package/public/spoko.space.svg +71 -71
  32. package/public/twitter.svg +46 -46
  33. package/renovate.json +6 -6
  34. package/sandbox.config.json +11 -11
  35. package/src/MyComponent.astro +8 -8
  36. package/src/components/Badge.vue +19 -19
  37. package/src/components/Badges.vue +21 -21
  38. package/src/components/Breadcrumbs.vue +110 -110
  39. package/src/components/Button.vue +55 -55
  40. package/src/components/ButtonCopy.vue +47 -47
  41. package/src/components/Card.astro +27 -27
  42. package/src/components/Carousel.astro +26 -26
  43. package/src/components/Category/CategoriesCarousel.astro +101 -0
  44. package/src/components/Category/CategoriesSidebar.astro +187 -0
  45. package/src/components/Category/CategoryDetails.astro +82 -0
  46. package/src/components/Category/CategoryLink.vue +23 -0
  47. package/src/components/Category/CategorySection.astro +70 -0
  48. package/src/components/Category/CategorySidebarToggler.vue +10 -0
  49. package/src/components/Category/SubCategoryLink.vue +29 -0
  50. package/src/components/CategoryLink.astro +18 -18
  51. package/src/components/Copyright.astro +12 -12
  52. package/src/components/Date.astro +7 -7
  53. package/src/components/Faq.astro +33 -33
  54. package/src/components/FaqItem.astro +96 -96
  55. package/src/components/FeaturesList.vue +41 -41
  56. package/src/components/FuckRussia.vue +80 -80
  57. package/src/components/HandDrive.astro +29 -29
  58. package/src/components/Header/Header.astro +214 -214
  59. package/src/components/Header/SkipToContent.astro +1 -1
  60. package/src/components/Headline.vue +48 -48
  61. package/src/components/Image.astro +30 -30
  62. package/src/components/Jumbatron.vue +40 -40
  63. package/src/components/LeftSidebar.astro +53 -53
  64. package/src/components/MainColors.vue +23 -23
  65. package/src/components/MainInput.vue +15 -15
  66. package/src/components/Modal.astro +27 -27
  67. package/src/components/PageContent.astro +5 -5
  68. package/src/components/PartNumber.vue +27 -27
  69. package/src/components/PostHeader.astro +103 -103
  70. package/src/components/PrCode.vue +156 -156
  71. package/src/components/Product/ProductButton.vue +18 -0
  72. package/src/components/Product/ProductCodes.vue +167 -0
  73. package/src/components/Product/ProductEngineType.vue +42 -42
  74. package/src/components/Product/ProductImage.astro +41 -41
  75. package/src/components/Product/ProductLinkInfo.astro +37 -37
  76. package/src/components/Product/ProductNumber.astro +104 -104
  77. package/src/components/ProductCarousel.astro +38 -38
  78. package/src/components/ProductCodes.vue +39 -39
  79. package/src/components/ProductDetailName.vue +52 -52
  80. package/src/components/ProductDetailsList.vue +65 -65
  81. package/src/components/ProductNumber copy.astro +116 -116
  82. package/src/components/ProductNumber.astro +104 -104
  83. package/src/components/ProductTile.astro +48 -48
  84. package/src/components/Quote.vue +23 -23
  85. package/src/components/ReloadPrompt.astro +50 -50
  86. package/src/components/SlimBanner.vue +72 -72
  87. package/src/components/Table.vue +32 -32
  88. package/src/components/TableOfContents.astro +15 -15
  89. package/src/components/Translations.vue +23 -23
  90. package/src/components/flags/FlagPL.vue +3 -3
  91. package/src/components/flags/FlagUA.vue +2 -2
  92. package/src/components/layout/Container.astro +7 -7
  93. package/src/components/layout/Header.astro +80 -80
  94. package/src/config.ts +56 -56
  95. package/src/design.config.ts +81 -81
  96. package/src/env.d.ts +1 -1
  97. package/src/layouts/Layout.astro +60 -60
  98. package/src/layouts/MainLayout.astro +81 -81
  99. package/src/layouts/partials/FooterCommon.astro +4 -4
  100. package/src/layouts/partials/HeadCommon.astro +44 -44
  101. package/src/layouts/partials/HeadSEO.astro +41 -41
  102. package/src/pages/components/badges.mdx +57 -57
  103. package/src/pages/components/breadcrumbs.mdx +139 -139
  104. package/src/pages/components/buttons.mdx +236 -236
  105. package/src/pages/components/card.mdx +294 -294
  106. package/src/pages/components/carousel.mdx +62 -62
  107. package/src/pages/components/copyright.mdx +42 -42
  108. package/src/pages/components/details-list.mdx +115 -115
  109. package/src/pages/components/features-list.mdx +37 -37
  110. package/src/pages/components/flags.mdx +49 -49
  111. package/src/pages/components/fuck-russia.mdx +39 -39
  112. package/src/pages/components/hand-drive.mdx +38 -38
  113. package/src/pages/components/headline.mdx +152 -152
  114. package/src/pages/components/icons.astro +48 -48
  115. package/src/pages/components/image.mdx +513 -513
  116. package/src/pages/components/input.mdx +45 -45
  117. package/src/pages/components/jumbatron.mdx +95 -95
  118. package/src/pages/components/modal.mdx +64 -64
  119. package/src/pages/components/post-header.mdx +60 -60
  120. package/src/pages/components/pr-code.mdx +65 -65
  121. package/src/pages/components/product-number.mdx +66 -66
  122. package/src/pages/components/product-tile.mdx +51 -51
  123. package/src/pages/components/quote.mdx +33 -33
  124. package/src/pages/components/slimbanner.mdx +35 -35
  125. package/src/pages/components/table.mdx +108 -108
  126. package/src/pages/core/colors.mdx +10 -10
  127. package/src/pages/core/grid.mdx +89 -89
  128. package/src/pages/core/introduction.mdx +77 -77
  129. package/src/pages/core/shadows.astro +20 -20
  130. package/src/pages/core/typography.astro +47 -47
  131. package/src/pages/index.astro +126 -126
  132. package/src/pages/patterns/introduction.mdx +60 -60
  133. package/src/pwa.ts +12 -12
  134. package/src/styles/_variables.scss +70 -70
  135. package/src/styles/base/base.css +184 -184
  136. package/src/styles/base/grid.css +92 -92
  137. package/src/styles/base/typography.css +70 -70
  138. package/src/styles/content.css +73 -73
  139. package/src/styles/main.css +7 -7
  140. package/src/types/Product.ts +31 -31
  141. package/src/types/astro.d.ts +4 -4
  142. package/src/types/index.ts +237 -0
  143. package/src/utils/api/getCategories.ts +3 -0
  144. package/src/utils/category/getMainCategoryList.ts +31 -0
  145. package/src/utils/category/getSortedCategories.ts +11 -0
  146. package/src/utils/getData.ts +52 -0
  147. package/src/utils/product/getPriceFormatted.ts +14 -0
  148. package/src/utils/product/getProductChecklist.ts +15 -0
  149. package/src/utils/seo/getShorterDescription.ts +12 -0
  150. package/src/utils/text/formatDate.ts +6 -0
  151. package/src/utils/text/formatLocaleNumber.ts +7 -0
  152. package/src/utils/text/formatPad.ts +12 -0
  153. package/src/utils/text/getNumberFormatted.ts +33 -0
  154. package/src/utils/text/getTranslatedLink.ts +5 -0
  155. package/src/utils/text.ts +42 -42
  156. package/tailwind.config.cjs +8 -8
  157. package/tsconfig.json +28 -11
  158. package/uno.config.ts +256 -256
@@ -0,0 +1,187 @@
1
+ ---
2
+ // import { Category } from 'types/index';
3
+ import CategoryLink from "@components/Category/CategoryLink.vue"
4
+ import SubCategoryLink from "@components/Category/SubCategoryLink.vue"
5
+
6
+
7
+ // import { useTranslation } from "i18next-vue";
8
+ // const { i18next, t } = useTranslation();
9
+
10
+ import i18next, { t } from 'i18next';
11
+ import { Icon } from 'astro-icon/components';
12
+ import { isSidebarOpen } from '../../stores/info.js';
13
+ import { useStore } from '@nanostores/vue';
14
+ import { getCategoryList } from "@utils/category/getCategoryList"
15
+
16
+
17
+ import { createSubCatLink, createSubSubCatLink} from "@utils/db"
18
+ // import type { SubCategory } from 'types/index'
19
+
20
+
21
+ // read the store value with the `useStore` hook
22
+ const $isSidebarOpen = useStore(isSidebarOpen);
23
+ const { catParameters, activeSubCategorySlug, activeSubSubCategorySlug, locale } = Astro.props;
24
+
25
+
26
+
27
+ const isActiveSubCategory = (subCategorySlug: string) => {
28
+ getCategoryList(i18next.language) // hack to create translations
29
+ return categories.activeSubCategory !== null && categories.activeSubCategory === subCategorySlug
30
+ }
31
+
32
+ // const hideSidebar = () => {
33
+ // sidebar.setMode(false)
34
+ // }
35
+
36
+ // const isActiveSubCategory = null
37
+
38
+ // const sidebar = reactive({
39
+ // isShow: true
40
+ // })
41
+
42
+ const categories = {
43
+ activeCategory: catParameters.category,
44
+ activeSubCategory: activeSubCategorySlug ? activeSubCategorySlug : catParameters.category.children ? catParameters.category.children[0] : null,
45
+ activeSubSubCategory: null
46
+ }
47
+
48
+ const info = {
49
+ isMobile: false,
50
+ }
51
+
52
+ const isShowCatMobileMenu = false
53
+
54
+ ---
55
+
56
+ <div data-pagefind-ignore id="sidebar" transition:name="sidebar" transition:animate="fade"
57
+
58
+ class="
59
+ sidebar mb-4 fixed top-0 ease delay-100 flex-col ml-0 overflow-hidden z-40 sm:z-0 md:(relative transition-all w-1/4 max-w-64 min-w-56 overflow-visible)" >
60
+ <!-- :class="showSidebar ? 'w-screen h-full-mobile md:h-auto' : 'h-0 w-0 fixed md:(h-auto -ml-64 static)'" -->
61
+ { categories.activeSubCategory !== null && categories.activeCategory && categories.activeCategory.children && (
62
+ <div
63
+ class="subcat-menu bg-white sm:border box-border sm:border-gray-200 dark:sm:border-gray-500 sm:border-l-0 md:sticky md:top-14 bg-white dark:bg-blue-901 z-10 sm:mb-2 h-full md:h-auto pb-3 h-sidebar max-h-sidebar sm:h-auto sm:max-h-auto"
64
+ >
65
+ <div class={`subcategories flex-col pb-3 ${categories.activeSubSubCategory !== null ? 'additional-subcategories' : ''}`} >
66
+ <div class="sidebar-title">
67
+ <span>{ t('heading.subcategories') }</span>
68
+ <br>
69
+ </div>
70
+ <ul>
71
+ {
72
+ categories.activeCategory.children.map((subcategory) => (
73
+ <li class="border-b-1 border-gray-100 sm:border-none">
74
+ <CategoryLink
75
+ active={isActiveSubCategory(subcategory.slug)}
76
+ text={t(`cat.${categories.activeCategory.slug}.${subcategory.slug}.name`)}
77
+ href={createSubCatLink(locale, catParameters.category.slug, subcategory.slug)}
78
+ />
79
+ {
80
+ isActiveSubCategory(subcategory.slug) && (
81
+ <div>
82
+ { catParameters.category && catParameters.subcategory && catParameters.subcategory && catParameters.subcategory && catParameters.subcategory.children && (
83
+ <ul
84
+ class="subcategories sm:pb-2"
85
+ >
86
+ {
87
+ catParameters.subcategory.children.map((subsubcategory) => (
88
+ <li
89
+ class="border-t-1 border-gray-100 sm:border-none"
90
+ >
91
+ <SubCategoryLink
92
+ active={catParameters.subcategory && activeSubSubCategorySlug === subsubcategory.slug}
93
+ text={subsubcategory.name || `missing subsubcat name ${subsubcategory.slug}`}
94
+ href={createSubSubCatLink(locale, catParameters.category.slug, subcategory.slug, subsubcategory.slug)}
95
+ />
96
+ </li>
97
+ ))
98
+ }
99
+
100
+ </ul>
101
+ )
102
+ }
103
+ </div>
104
+ )
105
+ }
106
+ </li>
107
+ ))
108
+ }
109
+ </ul>
110
+ </div>
111
+
112
+
113
+ <button
114
+ class="absolute top-2.5 left-2 text-3xl w-9 h-9 hidden md:hidden"
115
+ onclick="toggleCatMenu()"
116
+ aria-label="Menu"
117
+ >
118
+ <Icon name="octicon:chevron-left-24" class="" />
119
+ </button>
120
+ <button
121
+ class="absolute top-2.5 right-2 text-3xl w-9 h-9 md:hidden"
122
+ onclick="hideSidebar()"
123
+ aria-label="X"
124
+ >
125
+ <Icon name="octicon:x-24" class="" />
126
+ </button>
127
+
128
+ </div>
129
+ )
130
+ }
131
+
132
+
133
+
134
+
135
+ <div id="ga-sidebar"></div>
136
+ </div>
137
+
138
+ <style lang="scss" scoped>
139
+
140
+ .sidebar {
141
+
142
+ @media (max-width: 768px) {
143
+ &.show {
144
+ @apply w-screen h-full-mobile md:h-auto;
145
+ }
146
+
147
+ &:not(.show){
148
+ @apply h-0 w-0 fixed md:(h-auto -ml-64 static);
149
+ }
150
+ }
151
+
152
+ &.collapsed {
153
+ @apply md:max-w-0 md:min-w-0;
154
+ }
155
+
156
+ }
157
+
158
+ .subcategories {
159
+
160
+ .active {
161
+ // @apply bg-blue-700 text-white;
162
+ @apply bg-gray-200 sm:bg-white dark:(bg-blue-901 text-white) text-blue-600 font-600;
163
+
164
+ a {
165
+ color: inherit;
166
+ }
167
+ }
168
+
169
+ .s-active {
170
+ @apply bg-gray-100 sm:bg-white dark:(bg-blue-901 text-white) text-blue-600 border-gray-400;
171
+ }
172
+ }
173
+
174
+ .form-check-input {
175
+ @apply appearance-none h-4 w-4 border border-gray-300 bg-white checked:bg-lightBlue-500 checked:border-lightBlue-500 focus:outline-none transition duration-200 mt-1 align-top bg-no-repeat bg-center bg-contain float-left mr-2 cursor-pointer;
176
+ }
177
+
178
+ .form-check-input:checked[type=checkbox] {
179
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e");
180
+ }
181
+ </style>
182
+ <script is:inline>
183
+ function hideSidebar() {
184
+ document.getElementById('sidebar').classList.remove("show");
185
+ document.body.classList.remove('overflow-hidden')
186
+ }
187
+ </script>
@@ -0,0 +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>
@@ -0,0 +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>
@@ -0,0 +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
+
70
+ </style>
@@ -0,0 +1,10 @@
1
+
2
+ <template>
3
+ <button
4
+ class="category-toggler"
5
+ type="button"
6
+ aria-label="toggle menu"
7
+ >
8
+ <slot />
9
+ </button>
10
+ </template>
@@ -0,0 +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,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>
@@ -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>