spoko-design-system 0.9.6 → 1.0.0

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 (176) hide show
  1. package/.astro/content.d.ts +1 -1
  2. package/.astro/settings.json +4 -4
  3. package/.astro/types.d.ts +2 -1
  4. package/.github/dependabot.yml +11 -11
  5. package/.github/todo.yml +3 -3
  6. package/.github/workflows/deploy.yml +39 -39
  7. package/.github/workflows/release.yml +64 -0
  8. package/.releaserc.json +93 -0
  9. package/.stackblitzrc +5 -5
  10. package/.vscode/extensions.json +5 -5
  11. package/.vscode/launch.json +11 -11
  12. package/.vscode/settings.json +5 -5
  13. package/CHANGELOG.md +12 -0
  14. package/CONTRIBUTING.md +183 -0
  15. package/LICENSE +21 -21
  16. package/README.md +116 -116
  17. package/astro-i18next.config.mjs +17 -17
  18. package/astro-i18next.config.ts +10 -10
  19. package/astro.config.mjs +86 -86
  20. package/dev-dist/sw.js +91 -91
  21. package/dev-dist/workbox-c676b6d3.js +3391 -3391
  22. package/icon.config.ts +310 -310
  23. package/index.ts +70 -70
  24. package/package.json +13 -3
  25. package/public/arrow-bottom.svg +7 -7
  26. package/public/fonts/lg.svg +53 -53
  27. package/public/fonts/vwhead-bold-demo.html +549 -549
  28. package/public/fonts/vwhead-regular-demo.html +549 -549
  29. package/public/fonts/vwtext-bold-demo.html +549 -549
  30. package/public/fonts/vwtext-regular-demo.html +549 -549
  31. package/public/github.svg +3 -3
  32. package/public/grid_dot.svg +4 -4
  33. package/public/linkedin.svg +44 -44
  34. package/public/locales/en/translation.json +12 -12
  35. package/public/locales/pl/translation.json +12 -12
  36. package/public/make-scrollable-code-focusable.js +3 -3
  37. package/public/pagefind.yml +3 -3
  38. package/public/polo.blue.svg +29 -29
  39. package/public/spoko.space.svg +71 -71
  40. package/public/twitter.svg +46 -46
  41. package/renovate.json +6 -6
  42. package/sandbox.config.json +11 -11
  43. package/src/MyComponent.astro +8 -8
  44. package/src/components/Badge.vue +19 -19
  45. package/src/components/Badges.vue +21 -21
  46. package/src/components/Breadcrumbs.vue +94 -94
  47. package/src/components/Button.vue +101 -101
  48. package/src/components/ButtonCopy.astro +183 -183
  49. package/src/components/ButtonCopy.vue +36 -36
  50. package/src/components/Card.astro +27 -27
  51. package/src/components/Carousel.astro +26 -26
  52. package/src/components/Category/CategoriesCarousel.astro +101 -101
  53. package/src/components/Category/CategoryDetails.astro +169 -169
  54. package/src/components/Category/CategoryLink.vue +28 -28
  55. package/src/components/Category/CategorySidebarToggler.vue +9 -9
  56. package/src/components/Category/CategoryTile.astro +37 -37
  57. package/src/components/Category/CategoryViewToggler.astro +89 -89
  58. package/src/components/Category/SubCategoryLink.vue +19 -19
  59. package/src/components/Copyright.astro +12 -12
  60. package/src/components/Date.astro +7 -7
  61. package/src/components/Faq.astro +33 -33
  62. package/src/components/FaqItem.astro +80 -80
  63. package/src/components/FeaturesList.vue +37 -37
  64. package/src/components/FuckRussia.vue +62 -62
  65. package/src/components/HandDrive.astro +55 -29
  66. package/src/components/Header/Header.astro +210 -210
  67. package/src/components/Header/SkipToContent.astro +1 -1
  68. package/src/components/Headline.vue +87 -87
  69. package/src/components/Image.astro +30 -30
  70. package/src/components/LeftSidebar.astro +53 -53
  71. package/src/components/MainColors.vue +22 -22
  72. package/src/components/MainInput.vue +15 -15
  73. package/src/components/Modal.astro +27 -27
  74. package/src/components/PageContent.astro +5 -5
  75. package/src/components/PartNumber.vue +27 -27
  76. package/src/components/Post/PostCategories.astro +41 -41
  77. package/src/components/Post/PostCategories.vue +30 -30
  78. package/src/components/PostHeader.astro +103 -103
  79. package/src/components/PrCode.vue +141 -141
  80. package/src/components/Product/ProductButton.vue +18 -18
  81. package/src/components/Product/ProductCarousel.astro +35 -35
  82. package/src/components/Product/ProductEngineType.vue +42 -42
  83. package/src/components/Product/ProductImage.astro +40 -40
  84. package/src/components/Product/ProductLink.astro +101 -101
  85. package/src/components/Product/ProductLink.vue +59 -59
  86. package/src/components/Product/ProductLinkInfo.astro +37 -37
  87. package/src/components/Product/ProductNumber.astro +60 -60
  88. package/src/components/ProductCarousel.astro +38 -38
  89. package/src/components/ProductCodes.vue +39 -39
  90. package/src/components/ProductDetailName.vue +52 -52
  91. package/src/components/ProductDetailsList.vue +216 -216
  92. package/src/components/ProductTile.astro +48 -48
  93. package/src/components/Quote.vue +23 -23
  94. package/src/components/ReloadPrompt.astro +50 -50
  95. package/src/components/SlimBanner.vue +72 -72
  96. package/src/components/Table.vue +32 -32
  97. package/src/components/TableOfContents.astro +15 -15
  98. package/src/components/Translations.vue +23 -23
  99. package/src/components/flags/FlagPL.vue +3 -3
  100. package/src/components/flags/FlagUA.vue +2 -2
  101. package/src/components/{Layout → layout}/CallToAction.astro +52 -52
  102. package/src/components/{Layout → layout}/Container.astro +7 -7
  103. package/src/components/{Layout → layout}/Header.astro +80 -80
  104. package/src/config.ts +56 -56
  105. package/src/design.config.ts +98 -98
  106. package/src/env.d.ts +6 -6
  107. package/src/layouts/Layout.astro +61 -61
  108. package/src/layouts/MainLayout.astro +81 -81
  109. package/src/layouts/partials/FooterCommon.astro +4 -4
  110. package/src/layouts/partials/HeadCommon.astro +44 -44
  111. package/src/layouts/partials/HeadSEO.astro +41 -41
  112. package/src/pages/components/badges.mdx +57 -57
  113. package/src/pages/components/breadcrumbs.mdx +139 -139
  114. package/src/pages/components/buttons.mdx +360 -360
  115. package/src/pages/components/card.mdx +294 -294
  116. package/src/pages/components/carousel.mdx +62 -62
  117. package/src/pages/components/copyright.mdx +42 -42
  118. package/src/pages/components/details-list.mdx +115 -115
  119. package/src/pages/components/features-list.mdx +37 -37
  120. package/src/pages/components/flags.mdx +49 -49
  121. package/src/pages/components/fuck-russia.mdx +39 -39
  122. package/src/pages/components/hand-drive.mdx +105 -38
  123. package/src/pages/components/headline.mdx +137 -137
  124. package/src/pages/components/icons.astro +135 -135
  125. package/src/pages/components/image.mdx +513 -513
  126. package/src/pages/components/input.mdx +367 -367
  127. package/src/pages/components/jumbotron.mdx +359 -359
  128. package/src/pages/components/modal.mdx +64 -64
  129. package/src/pages/components/post-header.mdx +64 -64
  130. package/src/pages/components/pr-code.mdx +65 -65
  131. package/src/pages/components/product-number.mdx +58 -58
  132. package/src/pages/components/product-tile.mdx +51 -51
  133. package/src/pages/components/quote.mdx +33 -33
  134. package/src/pages/components/slimbanner.mdx +35 -35
  135. package/src/pages/components/table.mdx +108 -108
  136. package/src/pages/core/colors.mdx +10 -10
  137. package/src/pages/core/grid.mdx +89 -89
  138. package/src/pages/core/introduction.mdx +77 -77
  139. package/src/pages/core/shadows.astro +20 -20
  140. package/src/pages/core/typography.astro +49 -49
  141. package/src/pages/index.astro +133 -133
  142. package/src/pages/patterns/introduction.mdx +60 -60
  143. package/src/pwa.ts +12 -12
  144. package/src/styles/_variables.scss +70 -70
  145. package/src/styles/base/base.css +184 -184
  146. package/src/styles/base/grid.css +92 -92
  147. package/src/styles/base/typography.css +70 -70
  148. package/src/styles/content.css +73 -73
  149. package/src/styles/main.css +7 -7
  150. package/src/types/Product.ts +31 -31
  151. package/src/types/astro.d.ts +3 -3
  152. package/src/utils/product/getPriceFormatted.ts +15 -15
  153. package/src/utils/product/getProductChecklist.ts +17 -17
  154. package/src/utils/product/useFormatProductNumber.ts +41 -41
  155. package/src/utils/seo/getShorterDescription.ts +14 -14
  156. package/src/utils/text/formatDate.ts +5 -5
  157. package/src/utils/text/formatLocaleNumber.ts +6 -6
  158. package/src/utils/text/formatPad.ts +12 -12
  159. package/src/utils/text/getNumberFormatted.ts +33 -33
  160. package/src/utils/text/getTranslatedLink.ts +5 -5
  161. package/src/utils/text.ts +19 -19
  162. package/tailwind.config.cjs +8 -8
  163. package/tsconfig.json +28 -28
  164. package/uno-config/index.ts +268 -268
  165. package/uno-config/theme/breakpoints.ts +9 -9
  166. package/uno-config/theme/colors.ts +64 -64
  167. package/uno-config/theme/dimensions.ts +17 -17
  168. package/uno-config/theme/effects.ts +14 -14
  169. package/uno-config/theme/grid.ts +10 -10
  170. package/uno-config/theme/index.ts +28 -28
  171. package/uno-config/theme/shortcuts/buttons.ts +53 -53
  172. package/uno-config/theme/shortcuts/components.ts +123 -123
  173. package/uno-config/theme/shortcuts/index.ts +20 -20
  174. package/uno-config/theme/shortcuts/layout.ts +74 -74
  175. package/uno-config/theme/typography.ts +29 -29
  176. package/uno.config.ts +2 -2
@@ -1,38 +1,38 @@
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
- const prefix = locale === 'en' ? '' : `${locale}/`;
22
- const href = `/${prefix}${CategoryObject.slug}/`;
23
- ---
24
-
25
- <a href={href} class="carousel-item" data-astro-prefetch>
26
- <Image
27
- src={CategoryObject.photo}
28
- alt={CategoryObject.alt}
29
- height={height}
30
- width={width}
31
- format="avif"
32
- loading="eager"
33
- onerror="this.style.display='none';"
34
- class="cats-img"
35
- />
36
- <div class="swiper-lazy-preloader" />
37
- <div class="cat-name" itemprop="name">{CategoryObject.name}</div>
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
+ const prefix = locale === 'en' ? '' : `${locale}/`;
22
+ const href = `/${prefix}${CategoryObject.slug}/`;
23
+ ---
24
+
25
+ <a href={href} class="carousel-item" data-astro-prefetch>
26
+ <Image
27
+ src={CategoryObject.photo}
28
+ alt={CategoryObject.alt}
29
+ height={height}
30
+ width={width}
31
+ format="avif"
32
+ loading="eager"
33
+ onerror="this.style.display='none';"
34
+ class="cats-img"
35
+ />
36
+ <div class="swiper-lazy-preloader" />
37
+ <div class="cat-name" itemprop="name">{CategoryObject.name}</div>
38
38
  </a>
@@ -1,90 +1,90 @@
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
- class?: string;
11
- }
12
-
13
- const {
14
- showText,
15
- listText,
16
- gridText,
17
- listAriaLabel,
18
- gridAriaLabel,
19
- class: className
20
- } = Astro.props;
21
- ---
22
-
23
- <div class:list={[ className ]}>
24
- <span class="text-slate-default text-sm">{showText}</span>
25
- <div class="flex border rounded">
26
- <button
27
- data-view="list"
28
- data-view-toggle
29
- class="view-toggle flex items-center gap-1 px-3 py-0.5 transition-colors"
30
- aria-label={listAriaLabel}
31
- >
32
- <Icon name="ant-design:bars-outlined" class="w-4 h-4" />
33
- <span class="text-sm">{listText}</span>
34
- </button>
35
- <button
36
- data-view="grid"
37
- data-view-toggle
38
- class="view-toggle flex items-center gap-1 px-3 py-0.5 transition-colors"
39
- aria-label={gridAriaLabel}
40
- >
41
- <Icon name="ant-design:appstore-outlined" class="w-4 h-4" />
42
- <span class="text-sm">{gridText}</span>
43
- </button>
44
- </div>
45
- </div>
46
-
47
- <script>
48
- function initializeView() {
49
- const savedView = localStorage.getItem('categoryView') || 'list';
50
- updateUI(savedView);
51
-
52
- // Clean up existing listeners to prevent duplicates
53
- document.querySelectorAll('[data-view-toggle]').forEach(btn => {
54
- btn.removeEventListener('click', handleViewToggle);
55
- btn.addEventListener('click', handleViewToggle);
56
- });
57
- }
58
-
59
- function handleViewToggle(e: Event) {
60
- const button = e.currentTarget as HTMLElement;
61
- if (!button?.dataset.view) return;
62
-
63
- const view = button.dataset.view;
64
- localStorage.setItem('categoryView', view);
65
- updateUI(view);
66
-
67
- // Push to dataLayer directly
68
- if (window.dataLayer) {
69
- window.dataLayer.push({
70
- event: 'view_style_change',
71
- viewType: view,
72
- category: window.location.pathname
73
- });
74
- }
75
- }
76
-
77
- function updateUI(view: string) {
78
- document.querySelectorAll('.view-toggle').forEach(btn => {
79
- btn.classList.toggle('bg-neutral-lightest', btn.dataset.view === view);
80
- });
81
-
82
- const productsContainer = document.querySelector('.products-container');
83
- if (productsContainer) {
84
- productsContainer.classList.remove('view-grid', 'view-list');
85
- productsContainer.classList.add(`view-${view}`);
86
- }
87
- }
88
-
89
- document.addEventListener('astro:page-load', initializeView);
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
+ class?: string;
11
+ }
12
+
13
+ const {
14
+ showText,
15
+ listText,
16
+ gridText,
17
+ listAriaLabel,
18
+ gridAriaLabel,
19
+ class: className
20
+ } = Astro.props;
21
+ ---
22
+
23
+ <div class:list={[ className ]}>
24
+ <span class="text-slate-default text-sm">{showText}</span>
25
+ <div class="flex border rounded">
26
+ <button
27
+ data-view="list"
28
+ data-view-toggle
29
+ class="view-toggle flex items-center gap-1 px-3 py-0.5 transition-colors"
30
+ aria-label={listAriaLabel}
31
+ >
32
+ <Icon name="ant-design:bars-outlined" class="w-4 h-4" />
33
+ <span class="text-sm">{listText}</span>
34
+ </button>
35
+ <button
36
+ data-view="grid"
37
+ data-view-toggle
38
+ class="view-toggle flex items-center gap-1 px-3 py-0.5 transition-colors"
39
+ aria-label={gridAriaLabel}
40
+ >
41
+ <Icon name="ant-design:appstore-outlined" class="w-4 h-4" />
42
+ <span class="text-sm">{gridText}</span>
43
+ </button>
44
+ </div>
45
+ </div>
46
+
47
+ <script>
48
+ function initializeView() {
49
+ const savedView = localStorage.getItem('categoryView') || 'list';
50
+ updateUI(savedView);
51
+
52
+ // Clean up existing listeners to prevent duplicates
53
+ document.querySelectorAll('[data-view-toggle]').forEach(btn => {
54
+ btn.removeEventListener('click', handleViewToggle);
55
+ btn.addEventListener('click', handleViewToggle);
56
+ });
57
+ }
58
+
59
+ function handleViewToggle(e: Event) {
60
+ const button = e.currentTarget as HTMLElement;
61
+ if (!button?.dataset.view) return;
62
+
63
+ const view = button.dataset.view;
64
+ localStorage.setItem('categoryView', view);
65
+ updateUI(view);
66
+
67
+ // Push to dataLayer directly
68
+ if (window.dataLayer) {
69
+ window.dataLayer.push({
70
+ event: 'view_style_change',
71
+ viewType: view,
72
+ category: window.location.pathname
73
+ });
74
+ }
75
+ }
76
+
77
+ function updateUI(view: string) {
78
+ document.querySelectorAll('.view-toggle').forEach(btn => {
79
+ btn.classList.toggle('bg-neutral-lightest', btn.dataset.view === view);
80
+ });
81
+
82
+ const productsContainer = document.querySelector('.products-container');
83
+ if (productsContainer) {
84
+ productsContainer.classList.remove('view-grid', 'view-list');
85
+ productsContainer.classList.add(`view-${view}`);
86
+ }
87
+ }
88
+
89
+ document.addEventListener('astro:page-load', initializeView);
90
90
  </script>
@@ -1,19 +1,19 @@
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 block 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-400'
15
- ]"
16
- >
17
- {{ text }}
18
- </component>
19
- </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 block 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-400'
15
+ ]"
16
+ >
17
+ {{ text }}
18
+ </component>
19
+ </template>
@@ -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>
@@ -1,81 +1,81 @@
1
- ---
2
- import { Markdown } from 'astro-remote';
3
-
4
- interface Props {
5
- data: {
6
- question: string;
7
- answer: string;
8
- };
9
- }
10
-
11
- const { data } = Astro.props;
12
- ---
13
-
14
- {data.answer && (
15
- <details
16
- itemscope
17
- itemprop="mainEntity"
18
- itemtype="https://schema.org/Question"
19
- class="faq-details [&_summary:after]:open:-rotate-180"
20
- >
21
- <summary
22
- class="py-2 outline-none cursor-pointer focus:underline text-xl font-500 relative items-center flex justify-between list-none
23
- after:(block duration-200 content-empty bg-[url(/arrow-bottom.svg)] bg-contain bg-center bg-no-repeat h-3 w-4 min-w-4 my-auto ml-4 opacity-60)"
24
- >
25
- <h2 itemprop="name" class="font-headbold" set:html={data.question} />
26
- </summary>
27
- <div
28
- itemscope
29
- itemprop="acceptedAnswer"
30
- itemtype="https://schema.org/Answer"
31
- >
32
- <div itemprop="text" class="px-0 pb-4">
33
- <Markdown content={data.answer} />
34
- </div>
35
- </div>
36
- </details>
37
- )}
38
-
39
- <style is:global>
40
- .faq-details {
41
- &[open] h2 {
42
- color: var(--clr-primary-450);
43
- }
44
-
45
- ul, ol {
46
- @apply pl-5;
47
-
48
- & + p {
49
- @apply mt-2;
50
- }
51
- }
52
-
53
- ul {
54
- @apply list-disc;
55
- }
56
-
57
- ol {
58
- @apply list-decimal;
59
- }
60
-
61
- h2 {
62
- color: var(--clr-primary-700);
63
-
64
- &:hover {
65
- color: var(--clr-primary-450);
66
- }
67
- }
68
-
69
- h3 {
70
- @apply mt-2;
71
- }
72
-
73
- td, th {
74
- @apply border-b text-left py-2 pr-4;
75
- }
76
-
77
- a {
78
- @apply underline decoration-light-blue-400 underline-offset-2;
79
- }
80
- }
1
+ ---
2
+ import { Markdown } from 'astro-remote';
3
+
4
+ interface Props {
5
+ data: {
6
+ question: string;
7
+ answer: string;
8
+ };
9
+ }
10
+
11
+ const { data } = Astro.props;
12
+ ---
13
+
14
+ {data.answer && (
15
+ <details
16
+ itemscope
17
+ itemprop="mainEntity"
18
+ itemtype="https://schema.org/Question"
19
+ class="faq-details [&_summary:after]:open:-rotate-180"
20
+ >
21
+ <summary
22
+ class="py-2 outline-none cursor-pointer focus:underline text-xl font-500 relative items-center flex justify-between list-none
23
+ after:(block duration-200 content-empty bg-[url(/arrow-bottom.svg)] bg-contain bg-center bg-no-repeat h-3 w-4 min-w-4 my-auto ml-4 opacity-60)"
24
+ >
25
+ <h2 itemprop="name" class="font-headbold" set:html={data.question} />
26
+ </summary>
27
+ <div
28
+ itemscope
29
+ itemprop="acceptedAnswer"
30
+ itemtype="https://schema.org/Answer"
31
+ >
32
+ <div itemprop="text" class="px-0 pb-4">
33
+ <Markdown content={data.answer} />
34
+ </div>
35
+ </div>
36
+ </details>
37
+ )}
38
+
39
+ <style is:global>
40
+ .faq-details {
41
+ &[open] h2 {
42
+ color: var(--clr-primary-450);
43
+ }
44
+
45
+ ul, ol {
46
+ @apply pl-5;
47
+
48
+ & + p {
49
+ @apply mt-2;
50
+ }
51
+ }
52
+
53
+ ul {
54
+ @apply list-disc;
55
+ }
56
+
57
+ ol {
58
+ @apply list-decimal;
59
+ }
60
+
61
+ h2 {
62
+ color: var(--clr-primary-700);
63
+
64
+ &:hover {
65
+ color: var(--clr-primary-450);
66
+ }
67
+ }
68
+
69
+ h3 {
70
+ @apply mt-2;
71
+ }
72
+
73
+ td, th {
74
+ @apply border-b text-left py-2 pr-4;
75
+ }
76
+
77
+ a {
78
+ @apply underline decoration-light-blue-400 underline-offset-2;
79
+ }
80
+ }
81
81
  </style>
@@ -1,37 +1,37 @@
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: String as PropType<String | null>,
13
- default: null,
14
- required: false,
15
- }
16
- })
17
- </script>
18
-
19
- <template>
20
- <h2
21
- class="features-list-caption"
22
- v-if="props.caption"
23
- >
24
- {{ props.caption }}
25
- </h2>
26
- <ul class="features-list-ul">
27
- <li
28
- v-for="item in props.items"
29
- class="features-list-item"
30
- :key="item"
31
- >
32
- {{ item }}
33
- </li>
34
- </ul>
35
- </template>
36
-
37
-
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: String as PropType<String | null>,
13
+ default: null,
14
+ required: false,
15
+ }
16
+ })
17
+ </script>
18
+
19
+ <template>
20
+ <h2
21
+ class="features-list-caption"
22
+ v-if="props.caption"
23
+ >
24
+ {{ props.caption }}
25
+ </h2>
26
+ <ul class="features-list-ul">
27
+ <li
28
+ v-for="item in props.items"
29
+ class="features-list-item"
30
+ :key="item"
31
+ >
32
+ {{ item }}
33
+ </li>
34
+ </ul>
35
+ </template>
36
+
37
+