spoko-design-system 0.2.87 → 0.2.89

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/.astro/content.d.ts +167 -0
  2. package/.astro/settings.json +4 -4
  3. package/.github/dependabot.yml +11 -11
  4. package/.github/todo.yml +3 -3
  5. package/.github/workflows/deploy.yml +39 -39
  6. package/.stackblitzrc +5 -5
  7. package/.vscode/extensions.json +5 -5
  8. package/.vscode/launch.json +11 -11
  9. package/.vscode/settings.json +5 -5
  10. package/LICENSE +21 -21
  11. package/README.md +114 -113
  12. package/astro-i18next.config.mjs +17 -17
  13. package/astro-i18next.config.ts +10 -10
  14. package/astro.config.mjs +83 -83
  15. package/dev-dist/sw.js +91 -91
  16. package/dev-dist/workbox-c676b6d3.js +3391 -3391
  17. package/icon.config.ts +224 -224
  18. package/index.ts +62 -62
  19. package/package.json +3 -3
  20. package/public/fonts/lg.svg +53 -53
  21. package/public/fonts/vwhead-bold-demo.html +549 -549
  22. package/public/fonts/vwhead-regular-demo.html +549 -549
  23. package/public/fonts/vwtext-bold-demo.html +549 -549
  24. package/public/fonts/vwtext-regular-demo.html +549 -549
  25. package/public/github.svg +3 -3
  26. package/public/grid_dot.svg +4 -4
  27. package/public/linkedin.svg +44 -44
  28. package/public/locales/en/translation.json +8 -8
  29. package/public/locales/pl/translation.json +8 -8
  30. package/public/make-scrollable-code-focusable.js +3 -3
  31. package/public/pagefind.yml +3 -3
  32. package/public/polo.blue.svg +29 -29
  33. package/public/spoko.space.svg +71 -71
  34. package/public/twitter.svg +46 -46
  35. package/renovate.json +6 -6
  36. package/sandbox.config.json +11 -11
  37. package/src/MyComponent.astro +8 -8
  38. package/src/components/Badge.vue +19 -19
  39. package/src/components/Badges.vue +21 -21
  40. package/src/components/Breadcrumbs.vue +107 -107
  41. package/src/components/Button.vue +63 -63
  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 +135 -137
  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 +49 -49
  50. package/src/components/Category/CategoryViewToggler.astro +107 -107
  51. package/src/components/Category/SubCategoryLink.vue +29 -29
  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/Jumbatron.vue +40 -40
  65. package/src/components/LeftSidebar.astro +53 -53
  66. package/src/components/MainColors.vue +23 -23
  67. package/src/components/MainInput.vue +15 -15
  68. package/src/components/Modal.astro +27 -27
  69. package/src/components/PageContent.astro +5 -5
  70. package/src/components/PartNumber.vue +27 -27
  71. package/src/components/PostHeader.astro +103 -103
  72. package/src/components/PrCode.vue +141 -141
  73. package/src/components/Product/ProductButton.vue +18 -18
  74. package/src/components/Product/ProductCarousel.astro +35 -35
  75. package/src/components/Product/ProductCodes.vue +174 -174
  76. package/src/components/Product/ProductEngineType.vue +42 -42
  77. package/src/components/Product/ProductImage.astro +40 -40
  78. package/src/components/Product/ProductLink.astro +101 -101
  79. package/src/components/Product/ProductLink.vue +59 -59
  80. package/src/components/Product/ProductLinkInfo.astro +37 -37
  81. package/src/components/Product/ProductNumber.astro +61 -61
  82. package/src/components/ProductCarousel.astro +38 -38
  83. package/src/components/ProductCodes.vue +39 -39
  84. package/src/components/ProductDetailName.vue +52 -52
  85. package/src/components/ProductDetailsList.vue +65 -65
  86. package/src/components/ProductTile.astro +48 -48
  87. package/src/components/Quote.vue +23 -23
  88. package/src/components/ReloadPrompt.astro +50 -50
  89. package/src/components/SlimBanner.vue +72 -72
  90. package/src/components/Table.vue +32 -32
  91. package/src/components/TableOfContents.astro +15 -15
  92. package/src/components/Translations.vue +23 -23
  93. package/src/components/flags/FlagPL.vue +3 -3
  94. package/src/components/flags/FlagUA.vue +2 -2
  95. package/src/components/layout/Container.astro +7 -7
  96. package/src/components/layout/Header.astro +80 -80
  97. package/src/config.ts +56 -56
  98. package/src/design.config.ts +98 -98
  99. package/src/env.d.ts +6 -6
  100. package/src/layouts/Layout.astro +60 -60
  101. package/src/layouts/MainLayout.astro +81 -81
  102. package/src/layouts/partials/FooterCommon.astro +4 -4
  103. package/src/layouts/partials/HeadCommon.astro +44 -44
  104. package/src/layouts/partials/HeadSEO.astro +41 -41
  105. package/src/pages/components/badges.mdx +57 -57
  106. package/src/pages/components/breadcrumbs.mdx +139 -139
  107. package/src/pages/components/buttons.mdx +253 -253
  108. package/src/pages/components/card.mdx +294 -294
  109. package/src/pages/components/carousel.mdx +62 -62
  110. package/src/pages/components/copyright.mdx +42 -42
  111. package/src/pages/components/details-list.mdx +115 -115
  112. package/src/pages/components/features-list.mdx +37 -37
  113. package/src/pages/components/flags.mdx +49 -49
  114. package/src/pages/components/fuck-russia.mdx +39 -39
  115. package/src/pages/components/hand-drive.mdx +38 -38
  116. package/src/pages/components/headline.mdx +152 -152
  117. package/src/pages/components/icons.astro +135 -135
  118. package/src/pages/components/image.mdx +513 -513
  119. package/src/pages/components/input.mdx +45 -45
  120. package/src/pages/components/jumbatron.mdx +95 -95
  121. package/src/pages/components/modal.mdx +64 -64
  122. package/src/pages/components/post-header.mdx +60 -60
  123. package/src/pages/components/pr-code.mdx +65 -65
  124. package/src/pages/components/product-number.mdx +58 -58
  125. package/src/pages/components/product-tile.mdx +51 -51
  126. package/src/pages/components/quote.mdx +33 -33
  127. package/src/pages/components/slimbanner.mdx +35 -35
  128. package/src/pages/components/table.mdx +108 -108
  129. package/src/pages/core/colors.mdx +10 -10
  130. package/src/pages/core/grid.mdx +89 -89
  131. package/src/pages/core/introduction.mdx +77 -77
  132. package/src/pages/core/shadows.astro +20 -20
  133. package/src/pages/core/typography.astro +47 -47
  134. package/src/pages/index.astro +126 -126
  135. package/src/pages/patterns/introduction.mdx +60 -60
  136. package/src/pwa.ts +12 -12
  137. package/src/styles/_variables.scss +70 -70
  138. package/src/styles/base/base.css +184 -184
  139. package/src/styles/base/grid.css +92 -92
  140. package/src/styles/base/typography.css +70 -70
  141. package/src/styles/content.css +73 -73
  142. package/src/styles/main.css +7 -7
  143. package/src/types/Product.ts +31 -31
  144. package/src/types/astro.d.ts +3 -3
  145. package/src/utils/product/getPriceFormatted.ts +15 -15
  146. package/src/utils/product/getProductChecklist.ts +17 -17
  147. package/src/utils/product/useFormatProductNumber.ts +41 -41
  148. package/src/utils/seo/getShorterDescription.ts +14 -14
  149. package/src/utils/text/formatDate.ts +5 -5
  150. package/src/utils/text/formatLocaleNumber.ts +6 -6
  151. package/src/utils/text/formatPad.ts +12 -12
  152. package/src/utils/text/getNumberFormatted.ts +33 -33
  153. package/src/utils/text/getTranslatedLink.ts +5 -5
  154. package/src/utils/text.ts +19 -19
  155. package/tailwind.config.cjs +8 -8
  156. package/tsconfig.json +28 -28
  157. package/{src/uno-config → uno-config}/index.ts +58 -58
  158. package/{src/uno-config → uno-config}/theme/breakpoints.ts +9 -9
  159. package/{src/uno-config → uno-config}/theme/colors.ts +66 -66
  160. package/{src/uno-config → uno-config}/theme/dimensions.ts +17 -17
  161. package/{src/uno-config → uno-config}/theme/effects.ts +14 -14
  162. package/{src/uno-config → uno-config}/theme/grid.ts +10 -10
  163. package/{src/uno-config → uno-config}/theme/index.ts +25 -25
  164. package/{src/uno-config → uno-config}/theme/shortcuts/buttons.ts +38 -35
  165. package/{src/uno-config → uno-config}/theme/shortcuts/components.ts +80 -61
  166. package/uno-config/theme/shortcuts/constants.ts +3 -0
  167. package/{src/uno-config → uno-config}/theme/shortcuts/index.ts +16 -14
  168. package/{src/uno-config → uno-config}/theme/shortcuts/layout.ts +58 -54
  169. package/uno-config/theme/shortcuts/product.ts +6 -0
  170. package/{src/uno-config → uno-config}/theme/typography.ts +29 -29
  171. package/uno.config.ts +2 -3
@@ -1,107 +1,107 @@
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
- }
12
-
13
- const {
14
- showText,
15
- listText,
16
- gridText,
17
- listAriaLabel,
18
- gridAriaLabel,
19
- showViewToggler
20
- } = Astro.props;
21
- ---
22
-
23
- {
24
- showViewToggler &&
25
- <div class="flex items-center gap-2 ml-auto">
26
- <span class="text-slate-default text-sm">{showText}</span>
27
- <div class="flex border rounded">
28
- <button
29
- data-view="list"
30
- class="view-toggle flex items-center gap-1 px-3 py-1.5 transition-colors"
31
- aria-label={listAriaLabel}
32
- >
33
- <Icon name="ant-design:bars-outlined" class="w-4 h-4" />
34
- <span class="text-sm">{listText}</span>
35
- </button>
36
- <button
37
- data-view="grid"
38
- class="view-toggle flex items-center gap-1 px-3 py-1.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
-
48
- <script define:vars={{ showViewToggler }}>
49
-
50
- // Initialize view state
51
- function initializeView() {
52
- const savedView = localStorage.getItem('categoryView') || 'list';
53
- const buttons = document.querySelectorAll('.view-toggle');
54
- const productsContainer = document.querySelector('.products-container');
55
-
56
- // Set initial active state
57
- buttons.forEach(button => {
58
- if (button instanceof HTMLElement) {
59
- const isActive = button.dataset.view === savedView;
60
- button.classList.toggle('bg-neutral-lightest', isActive);
61
- }
62
- });
63
-
64
- // Set initial view on products container
65
- if (productsContainer) {
66
- productsContainer.classList.remove('view-grid', 'view-list');
67
- productsContainer.classList.add(`view-${savedView}`);
68
- }
69
- }
70
-
71
- // Handle view changes
72
- function setupViewToggle() {
73
- const buttons = document.querySelectorAll('.view-toggle');
74
-
75
- buttons.forEach(button => {
76
- button.addEventListener('click', (e) => {
77
- const clickedButton = e.currentTarget;
78
- if (!(clickedButton instanceof HTMLElement)) return;
79
-
80
- const view = clickedButton.dataset.view;
81
- if (!view) return;
82
-
83
- // Update localStorage
84
- localStorage.setItem('categoryView', view);
85
-
86
- // Update button states
87
- buttons.forEach(btn => btn.classList.remove('bg-neutral-lightest'));
88
- clickedButton.classList.add('bg-neutral-lightest');
89
-
90
- // Update products container
91
- const productsContainer = document.querySelector('.products-container');
92
- if (productsContainer) {
93
- productsContainer.classList.remove('view-grid', 'view-list');
94
- productsContainer.classList.add(`view-${view}`);
95
- }
96
- });
97
- });
98
- }
99
-
100
- // Setup on page load
101
- document.addEventListener('astro:page-load', () => {
102
- if (showViewToggler) {
103
- initializeView();
104
- setupViewToggle();
105
- }
106
- });
107
- </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
+ }
12
+
13
+ const {
14
+ showText,
15
+ listText,
16
+ gridText,
17
+ listAriaLabel,
18
+ gridAriaLabel,
19
+ showViewToggler
20
+ } = Astro.props;
21
+ ---
22
+
23
+ {
24
+ showViewToggler &&
25
+ <div class="flex items-center gap-2 ml-auto">
26
+ <span class="text-slate-default text-sm">{showText}</span>
27
+ <div class="flex border rounded">
28
+ <button
29
+ data-view="list"
30
+ class="view-toggle flex items-center gap-1 px-3 py-1.5 transition-colors"
31
+ aria-label={listAriaLabel}
32
+ >
33
+ <Icon name="ant-design:bars-outlined" class="w-4 h-4" />
34
+ <span class="text-sm">{listText}</span>
35
+ </button>
36
+ <button
37
+ data-view="grid"
38
+ class="view-toggle flex items-center gap-1 px-3 py-1.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
+
48
+ <script define:vars={{ showViewToggler }}>
49
+
50
+ // Initialize view state
51
+ function initializeView() {
52
+ const savedView = localStorage.getItem('categoryView') || 'list';
53
+ const buttons = document.querySelectorAll('.view-toggle');
54
+ const productsContainer = document.querySelector('.products-container');
55
+
56
+ // Set initial active state
57
+ buttons.forEach(button => {
58
+ if (button instanceof HTMLElement) {
59
+ const isActive = button.dataset.view === savedView;
60
+ button.classList.toggle('bg-neutral-lightest', isActive);
61
+ }
62
+ });
63
+
64
+ // Set initial view on products container
65
+ if (productsContainer) {
66
+ productsContainer.classList.remove('view-grid', 'view-list');
67
+ productsContainer.classList.add(`view-${savedView}`);
68
+ }
69
+ }
70
+
71
+ // Handle view changes
72
+ function setupViewToggle() {
73
+ const buttons = document.querySelectorAll('.view-toggle');
74
+
75
+ buttons.forEach(button => {
76
+ button.addEventListener('click', (e) => {
77
+ const clickedButton = e.currentTarget;
78
+ if (!(clickedButton instanceof HTMLElement)) return;
79
+
80
+ const view = clickedButton.dataset.view;
81
+ if (!view) return;
82
+
83
+ // Update localStorage
84
+ localStorage.setItem('categoryView', view);
85
+
86
+ // Update button states
87
+ buttons.forEach(btn => btn.classList.remove('bg-neutral-lightest'));
88
+ clickedButton.classList.add('bg-neutral-lightest');
89
+
90
+ // Update products container
91
+ const productsContainer = document.querySelector('.products-container');
92
+ if (productsContainer) {
93
+ productsContainer.classList.remove('view-grid', 'view-list');
94
+ productsContainer.classList.add(`view-${view}`);
95
+ }
96
+ });
97
+ });
98
+ }
99
+
100
+ // Setup on page load
101
+ document.addEventListener('astro:page-load', () => {
102
+ if (showViewToggler) {
103
+ initializeView();
104
+ setupViewToggle();
105
+ }
106
+ });
107
+ </script>
@@ -1,29 +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
+ <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>
@@ -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>