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.
- 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 +135 -134
- package/src/components/Category/CategoryLink.vue +23 -23
- package/src/components/Category/CategorySidebarToggler.vue +9 -9
- package/src/components/Category/CategoryTile.astro +39 -49
- package/src/components/Category/CategoryViewToggler.astro +81 -109
- package/src/components/Category/SubCategoryLink.vue +19 -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/LanguageSuggestion.astro +69 -0
- 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 +49 -48
- 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 +41 -38
- package/uno-config/theme/shortcuts/components.ts +91 -82
- package/uno-config/theme/shortcuts/constants.ts +152 -3
- package/uno-config/theme/shortcuts/index.ts +16 -16
- package/uno-config/theme/shortcuts/layout.ts +64 -59
- package/uno-config/theme/shortcuts/product.ts +12 -3
- package/uno-config/theme/typography.ts +29 -29
- package/uno.config.ts +2 -2
|
@@ -1,109 +1,81 @@
|
|
|
1
|
-
---
|
|
2
|
-
import { Icon } from 'astro-icon/components';
|
|
3
|
-
|
|
4
|
-
interface Props {
|
|
5
|
-
showText: string; // "Show:"
|
|
6
|
-
listText: string; // "List"
|
|
7
|
-
gridText: string; // "Grid"
|
|
8
|
-
listAriaLabel: string; // "List view"
|
|
9
|
-
gridAriaLabel: string; // "Grid view"
|
|
10
|
-
showViewToggler: boolean;
|
|
11
|
-
class?: string;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
const {
|
|
15
|
-
showText,
|
|
16
|
-
listText,
|
|
17
|
-
gridText,
|
|
18
|
-
listAriaLabel,
|
|
19
|
-
gridAriaLabel,
|
|
20
|
-
showViewToggler,
|
|
21
|
-
class: className
|
|
22
|
-
} = Astro.props;
|
|
23
|
-
---
|
|
24
|
-
|
|
25
|
-
{
|
|
26
|
-
showViewToggler &&
|
|
27
|
-
<div class:list={[ className ]}>
|
|
28
|
-
<span class="text-slate-default text-sm">{showText}</span>
|
|
29
|
-
<div class="flex border rounded">
|
|
30
|
-
<button
|
|
31
|
-
data-view="list"
|
|
32
|
-
class="view-toggle flex items-center gap-1 px-3 py-1.5 transition-colors"
|
|
33
|
-
aria-label={listAriaLabel}
|
|
34
|
-
>
|
|
35
|
-
<Icon name="ant-design:bars-outlined" class="w-4 h-4" />
|
|
36
|
-
<span class="text-sm">{listText}</span>
|
|
37
|
-
</button>
|
|
38
|
-
<button
|
|
39
|
-
data-view="grid"
|
|
40
|
-
class="view-toggle flex items-center gap-1 px-3 py-1.5 transition-colors"
|
|
41
|
-
aria-label={gridAriaLabel}
|
|
42
|
-
>
|
|
43
|
-
<Icon name="ant-design:appstore-outlined" class="w-4 h-4" />
|
|
44
|
-
<span class="text-sm">{gridText}</span>
|
|
45
|
-
</button>
|
|
46
|
-
</div>
|
|
47
|
-
</div>
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
<script define:vars={{ showViewToggler }}>
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
productsContainer.classList.
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
const view = clickedButton.dataset.view;
|
|
83
|
-
if (!view) return;
|
|
84
|
-
|
|
85
|
-
// Update localStorage
|
|
86
|
-
localStorage.setItem('categoryView', view);
|
|
87
|
-
|
|
88
|
-
// Update button states
|
|
89
|
-
buttons.forEach(btn => btn.classList.remove('bg-neutral-lightest'));
|
|
90
|
-
clickedButton.classList.add('bg-neutral-lightest');
|
|
91
|
-
|
|
92
|
-
// Update products container
|
|
93
|
-
const productsContainer = document.querySelector('.products-container');
|
|
94
|
-
if (productsContainer) {
|
|
95
|
-
productsContainer.classList.remove('view-grid', 'view-list');
|
|
96
|
-
productsContainer.classList.add(`view-${view}`);
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
// Setup on page load
|
|
103
|
-
document.addEventListener('astro:page-load', () => {
|
|
104
|
-
if (showViewToggler) {
|
|
105
|
-
initializeView();
|
|
106
|
-
setupViewToggle();
|
|
107
|
-
}
|
|
108
|
-
});
|
|
109
|
-
</script>
|
|
1
|
+
---
|
|
2
|
+
import { Icon } from 'astro-icon/components';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
showText: string; // "Show:"
|
|
6
|
+
listText: string; // "List"
|
|
7
|
+
gridText: string; // "Grid"
|
|
8
|
+
listAriaLabel: string; // "List view"
|
|
9
|
+
gridAriaLabel: string; // "Grid view"
|
|
10
|
+
showViewToggler: boolean;
|
|
11
|
+
class?: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const {
|
|
15
|
+
showText,
|
|
16
|
+
listText,
|
|
17
|
+
gridText,
|
|
18
|
+
listAriaLabel,
|
|
19
|
+
gridAriaLabel,
|
|
20
|
+
showViewToggler,
|
|
21
|
+
class: className
|
|
22
|
+
} = Astro.props;
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
{
|
|
26
|
+
showViewToggler &&
|
|
27
|
+
<div class:list={[ className ]}>
|
|
28
|
+
<span class="text-slate-default text-sm">{showText}</span>
|
|
29
|
+
<div class="flex border rounded">
|
|
30
|
+
<button
|
|
31
|
+
data-view="list"
|
|
32
|
+
class="view-toggle flex items-center gap-1 px-3 py-1.5 transition-colors"
|
|
33
|
+
aria-label={listAriaLabel}
|
|
34
|
+
>
|
|
35
|
+
<Icon name="ant-design:bars-outlined" class="w-4 h-4" />
|
|
36
|
+
<span class="text-sm">{listText}</span>
|
|
37
|
+
</button>
|
|
38
|
+
<button
|
|
39
|
+
data-view="grid"
|
|
40
|
+
class="view-toggle flex items-center gap-1 px-3 py-1.5 transition-colors"
|
|
41
|
+
aria-label={gridAriaLabel}
|
|
42
|
+
>
|
|
43
|
+
<Icon name="ant-design:appstore-outlined" class="w-4 h-4" />
|
|
44
|
+
<span class="text-sm">{gridText}</span>
|
|
45
|
+
</button>
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
<script define:vars={{ showViewToggler }}>
|
|
51
|
+
function handleViewToggle(e) {
|
|
52
|
+
const button = e.currentTarget;
|
|
53
|
+
if (!(button instanceof HTMLElement)) return;
|
|
54
|
+
|
|
55
|
+
const view = button.dataset.view;
|
|
56
|
+
if (!view) return;
|
|
57
|
+
|
|
58
|
+
localStorage.setItem('categoryView', view);
|
|
59
|
+
updateUI(view);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function updateUI(view) {
|
|
63
|
+
document.querySelectorAll('.view-toggle')
|
|
64
|
+
.forEach(btn => btn.classList.toggle('bg-neutral-lightest',
|
|
65
|
+
btn.dataset.view === view));
|
|
66
|
+
|
|
67
|
+
const productsContainer = document.querySelector('.products-container');
|
|
68
|
+
if (productsContainer) {
|
|
69
|
+
productsContainer.classList.remove('view-grid', 'view-list');
|
|
70
|
+
productsContainer.classList.add(`view-${view}`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
document.addEventListener('astro:page-load', () => {
|
|
75
|
+
if (!showViewToggler) return;
|
|
76
|
+
|
|
77
|
+
updateUI(localStorage.getItem('categoryView') || 'list');
|
|
78
|
+
document.querySelectorAll('.view-toggle')
|
|
79
|
+
.forEach(btn => btn.addEventListener('click', handleViewToggle));
|
|
80
|
+
}, { once: true });
|
|
81
|
+
</script>
|
|
@@ -1,29 +1,19 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
>
|
|
21
|
-
{{ props.text }}
|
|
22
|
-
</a>
|
|
23
|
-
<div
|
|
24
|
-
v-else
|
|
25
|
-
class="w-full text-base hover:(bg-gray-50 sm:bg-inherit) font-medium pr-2 py-2 pl-6 sm:(w-auto pr-3 text-sm) md:(py-0.5 pr-4) s-active"
|
|
26
|
-
>
|
|
27
|
-
{{ props.text }}
|
|
28
|
-
</div>
|
|
29
|
-
</template>
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
defineProps<{
|
|
3
|
+
text: string
|
|
4
|
+
active: boolean
|
|
5
|
+
}>()
|
|
6
|
+
</script>
|
|
7
|
+
|
|
8
|
+
<template>
|
|
9
|
+
<component
|
|
10
|
+
:is="active ? 'div' : 'a'"
|
|
11
|
+
:class="[
|
|
12
|
+
'w-full text-base font-medium py-2 pl-6 pr-2 hover:(bg-gray-50 sm:bg-inherit)',
|
|
13
|
+
'sm:(w-auto text-sm pr-3) md:(py-0.5 pr-4)',
|
|
14
|
+
active ? 's-active' : 'text-gray-300'
|
|
15
|
+
]"
|
|
16
|
+
>
|
|
17
|
+
{{ text }}
|
|
18
|
+
</component>
|
|
19
|
+
</template>
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
---
|
|
2
|
-
const { categories } = Astro.props;
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
<div class="text-light-blue-400 uppercase text-base z-3 relative w-full">
|
|
6
|
-
{
|
|
7
|
-
categories
|
|
8
|
-
? categories.map((category) => (
|
|
9
|
-
<a
|
|
10
|
-
class="term-link text-sm sm:text-base not-first:(before:content-empty) before:(w-px h-2.5 bg-gray-300 mx-2.5 inline-block relative)"
|
|
11
|
-
href={category.uri}
|
|
12
|
-
>
|
|
13
|
-
{category.name}
|
|
14
|
-
</a>
|
|
15
|
-
))
|
|
16
|
-
: null
|
|
17
|
-
}
|
|
18
|
-
</div>
|
|
1
|
+
---
|
|
2
|
+
const { categories } = Astro.props;
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
<div class="text-light-blue-400 uppercase text-base z-3 relative w-full">
|
|
6
|
+
{
|
|
7
|
+
categories
|
|
8
|
+
? categories.map((category) => (
|
|
9
|
+
<a
|
|
10
|
+
class="term-link text-sm sm:text-base not-first:(before:content-empty) before:(w-px h-2.5 bg-gray-300 mx-2.5 inline-block relative)"
|
|
11
|
+
href={category.uri}
|
|
12
|
+
>
|
|
13
|
+
{category.name}
|
|
14
|
+
</a>
|
|
15
|
+
))
|
|
16
|
+
: null
|
|
17
|
+
}
|
|
18
|
+
</div>
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
---
|
|
2
|
-
const { class: className } = Astro.props;
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
<div
|
|
6
|
-
class="bg-vw h-11 flex items-center font-headlight justify-between px-4"
|
|
7
|
-
class:list={[className]}
|
|
8
|
-
>
|
|
9
|
-
<slot name="left-item" />
|
|
10
|
-
<slot name="middle-item" />
|
|
11
|
-
<slot name="right-item" />
|
|
12
|
-
</div>
|
|
1
|
+
---
|
|
2
|
+
const { class: className } = Astro.props;
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
<div
|
|
6
|
+
class="bg-vw h-11 flex items-center font-headlight justify-between px-4"
|
|
7
|
+
class:list={[className]}
|
|
8
|
+
>
|
|
9
|
+
<slot name="left-item" />
|
|
10
|
+
<slot name="middle-item" />
|
|
11
|
+
<slot name="right-item" />
|
|
12
|
+
</div>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
---
|
|
2
|
-
const { date } = Astro.props;
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
<time class="text-sm flex items-center mr-2" datetime={date}>
|
|
6
|
-
{new Date(date).toLocaleDateString()}
|
|
7
|
-
</time>
|
|
1
|
+
---
|
|
2
|
+
const { date } = Astro.props;
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
<time class="text-sm flex items-center mr-2" datetime={date}>
|
|
6
|
+
{new Date(date).toLocaleDateString()}
|
|
7
|
+
</time>
|
package/src/components/Faq.astro
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
---
|
|
2
|
-
|
|
3
|
-
/*
|
|
4
|
-
FAQ component for questons & answers with structured microdata for rich snippets
|
|
5
|
-
https://developers.google.com/search/docs/appearance/structured-data/faqpage?hl=en
|
|
6
|
-
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import {t } from "i18next"
|
|
10
|
-
import FaqItem from "../components/FaqItem.astro"
|
|
11
|
-
|
|
12
|
-
interface Props {
|
|
13
|
-
|
|
14
|
-
questions: {
|
|
15
|
-
question: string;
|
|
16
|
-
answer: string;
|
|
17
|
-
}[]
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const { questions } = Astro.props
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
<div class="flex flex-col mt-6 mb-4 w-full px-4 md:px-0" itemscope itemtype="https://schema.org/FAQPage" >
|
|
24
|
-
<div class="mb-6 text-4xl font-headbold sm:text-4xl text-blue-802 faq-heading">
|
|
25
|
-
{t('faq.title')}
|
|
26
|
-
</div>
|
|
27
|
-
<div class="flex flex-col divide-y dark:divide-gray-700">
|
|
28
|
-
{
|
|
29
|
-
questions.map((question) =>
|
|
30
|
-
<FaqItem data={question} />)
|
|
31
|
-
}
|
|
32
|
-
</div>
|
|
33
|
-
</div>
|
|
1
|
+
---
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
FAQ component for questons & answers with structured microdata for rich snippets
|
|
5
|
+
https://developers.google.com/search/docs/appearance/structured-data/faqpage?hl=en
|
|
6
|
+
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import {t } from "i18next"
|
|
10
|
+
import FaqItem from "../components/FaqItem.astro"
|
|
11
|
+
|
|
12
|
+
interface Props {
|
|
13
|
+
|
|
14
|
+
questions: {
|
|
15
|
+
question: string;
|
|
16
|
+
answer: string;
|
|
17
|
+
}[]
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const { questions } = Astro.props
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
<div class="flex flex-col mt-6 mb-4 w-full px-4 md:px-0" itemscope itemtype="https://schema.org/FAQPage" >
|
|
24
|
+
<div class="mb-6 text-4xl font-headbold sm:text-4xl text-blue-802 faq-heading">
|
|
25
|
+
{t('faq.title')}
|
|
26
|
+
</div>
|
|
27
|
+
<div class="flex flex-col divide-y dark:divide-gray-700">
|
|
28
|
+
{
|
|
29
|
+
questions.map((question) =>
|
|
30
|
+
<FaqItem data={question} />)
|
|
31
|
+
}
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
@@ -1,96 +1,96 @@
|
|
|
1
|
-
---
|
|
2
|
-
import { Markdown } from 'astro-remote';
|
|
3
|
-
|
|
4
|
-
/*
|
|
5
|
-
Question & Answer based on details & summary HTML tag
|
|
6
|
-
https://web.dev/learn/html/details
|
|
7
|
-
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/summary
|
|
8
|
-
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
interface Props {
|
|
12
|
-
data: {
|
|
13
|
-
question: string;
|
|
14
|
-
answer: string;
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
const { data } = Astro.props;
|
|
19
|
-
---
|
|
20
|
-
|
|
21
|
-
{ data.answer &&
|
|
22
|
-
<details itemscope itemprop="mainEntity" itemtype="https://schema.org/Question" class="[&_summary:after]:open:-rotate-180">
|
|
23
|
-
<summary
|
|
24
|
-
class="py-2 outline-none cursor-pointer focus:underline text-xl font-500 relative items-center flex justify-between list-none
|
|
25
|
-
after:(block duration-200 content-empty bg-contain bg-center bg-no-repeat h-3 w-4 min-w-4 my-auto ml-4 opacity-60 bg-[url(/arrow-bottom.svg)])"
|
|
26
|
-
>
|
|
27
|
-
<h2 itemprop="name" class=" font-headbold" set:html={data.question} />
|
|
28
|
-
</summary>
|
|
29
|
-
<div
|
|
30
|
-
itemscope
|
|
31
|
-
itemprop="acceptedAnswer"
|
|
32
|
-
itemtype="https://schema.org/Answer"
|
|
33
|
-
>
|
|
34
|
-
<div itemprop="text" class="px-0 pb-4">
|
|
35
|
-
<Markdown content={data.answer} />
|
|
36
|
-
</div>
|
|
37
|
-
</div>
|
|
38
|
-
</details>
|
|
39
|
-
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
<style is:global>
|
|
44
|
-
|
|
45
|
-
details {
|
|
46
|
-
|
|
47
|
-
&[open] {
|
|
48
|
-
h2 {
|
|
49
|
-
color: var(--clr-primary-450);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
ul {
|
|
55
|
-
@apply list-disc pl-5;
|
|
56
|
-
|
|
57
|
-
&+p {
|
|
58
|
-
@apply mt-2;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
ol {
|
|
63
|
-
@apply list-decimal pl-5;
|
|
64
|
-
&+p {
|
|
65
|
-
@apply mt-2;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
h2 {
|
|
70
|
-
color: var(--clr-primary-700);
|
|
71
|
-
/* font-size: clamp(1.5rem, 1.29rem + 0.59vw, 2rem);
|
|
72
|
-
line-height: 120%;
|
|
73
|
-
letter-spacing: calc(-0.02em + 0.02rem); */
|
|
74
|
-
&:hover {
|
|
75
|
-
color: var(--clr-primary-450);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
h3 {
|
|
80
|
-
@apply mt-2;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/* table {
|
|
84
|
-
@apply table-auto;
|
|
85
|
-
} */
|
|
86
|
-
|
|
87
|
-
td, th {
|
|
88
|
-
@apply border-b text-left py-2 pr-4;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
a {
|
|
92
|
-
@apply underline decoration-light-blue-400 underline-offset-2;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
</style>
|
|
1
|
+
---
|
|
2
|
+
import { Markdown } from 'astro-remote';
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
Question & Answer based on details & summary HTML tag
|
|
6
|
+
https://web.dev/learn/html/details
|
|
7
|
+
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/summary
|
|
8
|
+
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
interface Props {
|
|
12
|
+
data: {
|
|
13
|
+
question: string;
|
|
14
|
+
answer: string;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const { data } = Astro.props;
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
{ data.answer &&
|
|
22
|
+
<details itemscope itemprop="mainEntity" itemtype="https://schema.org/Question" class="[&_summary:after]:open:-rotate-180">
|
|
23
|
+
<summary
|
|
24
|
+
class="py-2 outline-none cursor-pointer focus:underline text-xl font-500 relative items-center flex justify-between list-none
|
|
25
|
+
after:(block duration-200 content-empty bg-contain bg-center bg-no-repeat h-3 w-4 min-w-4 my-auto ml-4 opacity-60 bg-[url(/arrow-bottom.svg)])"
|
|
26
|
+
>
|
|
27
|
+
<h2 itemprop="name" class=" font-headbold" set:html={data.question} />
|
|
28
|
+
</summary>
|
|
29
|
+
<div
|
|
30
|
+
itemscope
|
|
31
|
+
itemprop="acceptedAnswer"
|
|
32
|
+
itemtype="https://schema.org/Answer"
|
|
33
|
+
>
|
|
34
|
+
<div itemprop="text" class="px-0 pb-4">
|
|
35
|
+
<Markdown content={data.answer} />
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
</details>
|
|
39
|
+
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
<style is:global>
|
|
44
|
+
|
|
45
|
+
details {
|
|
46
|
+
|
|
47
|
+
&[open] {
|
|
48
|
+
h2 {
|
|
49
|
+
color: var(--clr-primary-450);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
ul {
|
|
55
|
+
@apply list-disc pl-5;
|
|
56
|
+
|
|
57
|
+
&+p {
|
|
58
|
+
@apply mt-2;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
ol {
|
|
63
|
+
@apply list-decimal pl-5;
|
|
64
|
+
&+p {
|
|
65
|
+
@apply mt-2;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
h2 {
|
|
70
|
+
color: var(--clr-primary-700);
|
|
71
|
+
/* font-size: clamp(1.5rem, 1.29rem + 0.59vw, 2rem);
|
|
72
|
+
line-height: 120%;
|
|
73
|
+
letter-spacing: calc(-0.02em + 0.02rem); */
|
|
74
|
+
&:hover {
|
|
75
|
+
color: var(--clr-primary-450);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
h3 {
|
|
80
|
+
@apply mt-2;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/* table {
|
|
84
|
+
@apply table-auto;
|
|
85
|
+
} */
|
|
86
|
+
|
|
87
|
+
td, th {
|
|
88
|
+
@apply border-b text-left py-2 pr-4;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
a {
|
|
92
|
+
@apply underline decoration-light-blue-400 underline-offset-2;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
</style>
|
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
|
|
2
|
-
<script lang="ts" setup>
|
|
3
|
-
import { PropType } from 'vue';
|
|
4
|
-
|
|
5
|
-
const props = defineProps({
|
|
6
|
-
items: {
|
|
7
|
-
type: Object as PropType<String[] | null>,
|
|
8
|
-
default: null,
|
|
9
|
-
required: true,
|
|
10
|
-
},
|
|
11
|
-
caption: {
|
|
12
|
-
type: Object as PropType<String | null>,
|
|
13
|
-
default: null,
|
|
14
|
-
required: false,
|
|
15
|
-
}
|
|
16
|
-
})
|
|
17
|
-
</script>
|
|
18
|
-
|
|
19
|
-
<template>
|
|
20
|
-
<h2 class="mb-2 colon-after text-xl font-textbold block leading-none" v-if="props.caption">{{ props.caption }}</h2>
|
|
21
|
-
<ul class="mb-6">
|
|
22
|
-
<li v-for="item in props.items" class="leading-5">
|
|
23
|
-
{{ item }}
|
|
24
|
-
</li>
|
|
25
|
-
</ul>
|
|
26
|
-
</template>
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
<style scoped>
|
|
30
|
-
ul {
|
|
31
|
-
@apply list-square pl-5;
|
|
32
|
-
|
|
33
|
-
li {
|
|
34
|
-
@apply relative mb-2;
|
|
35
|
-
|
|
36
|
-
&::marker {
|
|
37
|
-
@apply text-blue-400;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
</style>
|
|
1
|
+
|
|
2
|
+
<script lang="ts" setup>
|
|
3
|
+
import { PropType } from 'vue';
|
|
4
|
+
|
|
5
|
+
const props = defineProps({
|
|
6
|
+
items: {
|
|
7
|
+
type: Object as PropType<String[] | null>,
|
|
8
|
+
default: null,
|
|
9
|
+
required: true,
|
|
10
|
+
},
|
|
11
|
+
caption: {
|
|
12
|
+
type: Object as PropType<String | null>,
|
|
13
|
+
default: null,
|
|
14
|
+
required: false,
|
|
15
|
+
}
|
|
16
|
+
})
|
|
17
|
+
</script>
|
|
18
|
+
|
|
19
|
+
<template>
|
|
20
|
+
<h2 class="mb-2 colon-after text-xl font-textbold block leading-none" v-if="props.caption">{{ props.caption }}</h2>
|
|
21
|
+
<ul class="mb-6">
|
|
22
|
+
<li v-for="item in props.items" class="leading-5">
|
|
23
|
+
{{ item }}
|
|
24
|
+
</li>
|
|
25
|
+
</ul>
|
|
26
|
+
</template>
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
<style scoped>
|
|
30
|
+
ul {
|
|
31
|
+
@apply list-square pl-5;
|
|
32
|
+
|
|
33
|
+
li {
|
|
34
|
+
@apply relative mb-2;
|
|
35
|
+
|
|
36
|
+
&::marker {
|
|
37
|
+
@apply text-blue-400;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
</style>
|