spoko-design-system 0.4.4 → 0.4.6

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 (169) 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 +86 -86
  14. package/dev-dist/sw.js +91 -91
  15. package/dev-dist/workbox-c676b6d3.js +3391 -3391
  16. package/icon.config.ts +278 -275
  17. package/index.ts +63 -63
  18. package/package.json +14 -14
  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 +87 -63
  41. package/src/components/ButtonCopy.astro +183 -183
  42. package/src/components/ButtonCopy.vue +36 -36
  43. package/src/components/Card.astro +27 -27
  44. package/src/components/Carousel.astro +26 -26
  45. package/src/components/Category/CategoriesCarousel.astro +101 -101
  46. package/src/components/Category/CategoryDetails.astro +169 -169
  47. package/src/components/Category/CategoryLink.vue +23 -23
  48. package/src/components/Category/CategorySidebarToggler.vue +9 -9
  49. package/src/components/Category/CategoryTile.astro +38 -38
  50. package/src/components/Category/CategoryViewToggler.astro +89 -89
  51. package/src/components/Category/SubCategoryLink.vue +19 -19
  52. package/src/components/CategoryLink.astro +18 -18
  53. package/src/components/Copyright.astro +12 -12
  54. package/src/components/Date.astro +7 -7
  55. package/src/components/Faq.astro +33 -33
  56. package/src/components/FaqItem.astro +96 -96
  57. package/src/components/FeaturesList.vue +41 -41
  58. package/src/components/FuckRussia.vue +62 -62
  59. package/src/components/HandDrive.astro +29 -29
  60. package/src/components/Header/Header.astro +210 -210
  61. package/src/components/Header/SkipToContent.astro +1 -1
  62. package/src/components/Headline.vue +48 -48
  63. package/src/components/Image.astro +30 -30
  64. package/src/components/LeftSidebar.astro +53 -53
  65. package/src/components/MainColors.vue +22 -22
  66. package/src/components/MainInput.vue +15 -15
  67. package/src/components/Modal.astro +27 -27
  68. package/src/components/PageContent.astro +5 -5
  69. package/src/components/PartNumber.vue +27 -27
  70. package/src/components/PostHeader.astro +103 -103
  71. package/src/components/PrCode.vue +141 -141
  72. package/src/components/Product/ProductButton.vue +18 -18
  73. package/src/components/Product/ProductCarousel.astro +35 -35
  74. package/src/components/Product/ProductCodes.vue +174 -174
  75. package/src/components/Product/ProductEngineType.vue +42 -42
  76. package/src/components/Product/ProductImage.astro +40 -40
  77. package/src/components/Product/ProductLink.astro +101 -101
  78. package/src/components/Product/ProductLink.vue +59 -59
  79. package/src/components/Product/ProductLinkInfo.astro +37 -37
  80. package/src/components/Product/ProductNumber.astro +60 -60
  81. package/src/components/ProductCarousel.astro +38 -38
  82. package/src/components/ProductCodes.vue +39 -39
  83. package/src/components/ProductDetailName.vue +52 -52
  84. package/src/components/ProductDetailsList.vue +65 -65
  85. package/src/components/ProductTile.astro +48 -48
  86. package/src/components/Quote.vue +23 -23
  87. package/src/components/ReloadPrompt.astro +50 -50
  88. package/src/components/SlimBanner.vue +72 -72
  89. package/src/components/Table.vue +32 -32
  90. package/src/components/TableOfContents.astro +15 -15
  91. package/src/components/Translations.vue +23 -23
  92. package/src/components/flags/FlagPL.vue +3 -3
  93. package/src/components/flags/FlagUA.vue +2 -2
  94. package/src/components/layout/Container.astro +7 -7
  95. package/src/components/layout/Header.astro +80 -80
  96. package/src/config.ts +56 -56
  97. package/src/design.config.ts +98 -98
  98. package/src/env.d.ts +6 -6
  99. package/src/layouts/Layout.astro +61 -61
  100. package/src/layouts/MainLayout.astro +81 -81
  101. package/src/layouts/partials/FooterCommon.astro +4 -4
  102. package/src/layouts/partials/HeadCommon.astro +44 -44
  103. package/src/layouts/partials/HeadSEO.astro +41 -41
  104. package/src/pages/components/badges.mdx +57 -57
  105. package/src/pages/components/breadcrumbs.mdx +139 -139
  106. package/src/pages/components/buttons.mdx +361 -253
  107. package/src/pages/components/card.mdx +294 -294
  108. package/src/pages/components/carousel.mdx +62 -62
  109. package/src/pages/components/copyright.mdx +42 -42
  110. package/src/pages/components/details-list.mdx +115 -115
  111. package/src/pages/components/features-list.mdx +37 -37
  112. package/src/pages/components/flags.mdx +49 -49
  113. package/src/pages/components/fuck-russia.mdx +39 -39
  114. package/src/pages/components/hand-drive.mdx +38 -38
  115. package/src/pages/components/headline.mdx +152 -152
  116. package/src/pages/components/icons.astro +135 -135
  117. package/src/pages/components/image.mdx +513 -513
  118. package/src/pages/components/input.mdx +45 -45
  119. package/src/pages/components/jumbotron.mdx +359 -359
  120. package/src/pages/components/modal.mdx +64 -64
  121. package/src/pages/components/post-header.mdx +60 -60
  122. package/src/pages/components/pr-code.mdx +65 -65
  123. package/src/pages/components/product-number.mdx +58 -58
  124. package/src/pages/components/product-tile.mdx +51 -51
  125. package/src/pages/components/quote.mdx +33 -33
  126. package/src/pages/components/slimbanner.mdx +35 -35
  127. package/src/pages/components/table.mdx +108 -108
  128. package/src/pages/core/colors.mdx +10 -10
  129. package/src/pages/core/grid.mdx +89 -89
  130. package/src/pages/core/introduction.mdx +77 -77
  131. package/src/pages/core/shadows.astro +20 -20
  132. package/src/pages/core/typography.astro +49 -49
  133. package/src/pages/index.astro +130 -130
  134. package/src/pages/patterns/introduction.mdx +60 -60
  135. package/src/pwa.ts +12 -12
  136. package/src/styles/_variables.scss +70 -70
  137. package/src/styles/base/base.css +184 -184
  138. package/src/styles/base/grid.css +92 -92
  139. package/src/styles/base/typography.css +70 -70
  140. package/src/styles/content.css +73 -73
  141. package/src/styles/main.css +7 -7
  142. package/src/types/Product.ts +31 -31
  143. package/src/types/astro.d.ts +3 -3
  144. package/src/utils/product/getPriceFormatted.ts +15 -15
  145. package/src/utils/product/getProductChecklist.ts +17 -17
  146. package/src/utils/product/useFormatProductNumber.ts +41 -41
  147. package/src/utils/seo/getShorterDescription.ts +14 -14
  148. package/src/utils/text/formatDate.ts +5 -5
  149. package/src/utils/text/formatLocaleNumber.ts +6 -6
  150. package/src/utils/text/formatPad.ts +12 -12
  151. package/src/utils/text/getNumberFormatted.ts +33 -33
  152. package/src/utils/text/getTranslatedLink.ts +5 -5
  153. package/src/utils/text.ts +19 -19
  154. package/tailwind.config.cjs +8 -8
  155. package/tsconfig.json +28 -28
  156. package/uno-config/index.ts +61 -61
  157. package/uno-config/theme/breakpoints.ts +9 -9
  158. package/uno-config/theme/colors.ts +64 -64
  159. package/uno-config/theme/dimensions.ts +17 -17
  160. package/uno-config/theme/effects.ts +14 -14
  161. package/uno-config/theme/grid.ts +10 -10
  162. package/uno-config/theme/index.ts +28 -28
  163. package/uno-config/theme/shortcuts/buttons.ts +42 -41
  164. package/uno-config/theme/shortcuts/components.ts +92 -92
  165. package/uno-config/theme/shortcuts/constants.ts +10 -10
  166. package/uno-config/theme/shortcuts/index.ts +18 -18
  167. package/uno-config/theme/shortcuts/layout.ts +64 -64
  168. package/uno-config/theme/typography.ts +29 -29
  169. package/uno.config.ts +2 -2
@@ -1,39 +1,39 @@
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>
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
39
  </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-300'
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-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>
@@ -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>