spoko-design-system 0.6.4 → 0.6.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 (170) hide show
  1. package/.astro/data-store.json +1 -1
  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 -114
  12. package/astro-i18next.config.mjs +17 -17
  13. package/astro-i18next.config.ts +10 -10
  14. package/astro.config.mjs +86 -86
  15. package/dev-dist/sw.js +91 -91
  16. package/dev-dist/workbox-c676b6d3.js +3391 -3391
  17. package/icon.config.ts +289 -279
  18. package/index.ts +66 -66
  19. package/package.json +25 -25
  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 +101 -101
  42. package/src/components/ButtonCopy.astro +183 -183
  43. package/src/components/ButtonCopy.vue +36 -36
  44. package/src/components/Card.astro +27 -27
  45. package/src/components/Carousel.astro +26 -26
  46. package/src/components/Category/CategoriesCarousel.astro +101 -101
  47. package/src/components/Category/CategoryDetails.astro +169 -169
  48. package/src/components/Category/CategoryLink.vue +28 -28
  49. package/src/components/Category/CategorySidebarToggler.vue +9 -9
  50. package/src/components/Category/CategoryTile.astro +38 -38
  51. package/src/components/Category/CategoryViewToggler.astro +89 -89
  52. package/src/components/Category/SubCategoryLink.vue +19 -19
  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 +80 -80
  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/Post/PostCategories.astro +37 -37
  71. package/src/components/Post/PostCategories.vue +39 -39
  72. package/src/components/PostHeader.astro +103 -103
  73. package/src/components/PrCode.vue +141 -141
  74. package/src/components/Product/ProductButton.vue +18 -18
  75. package/src/components/Product/ProductCarousel.astro +35 -35
  76. package/src/components/Product/ProductCodes.vue +174 -174
  77. package/src/components/Product/ProductEngineType.vue +42 -42
  78. package/src/components/Product/ProductImage.astro +40 -40
  79. package/src/components/Product/ProductLink.astro +101 -101
  80. package/src/components/Product/ProductLink.vue +59 -59
  81. package/src/components/Product/ProductLinkInfo.astro +37 -37
  82. package/src/components/Product/ProductNumber.astro +60 -60
  83. package/src/components/ProductCarousel.astro +38 -38
  84. package/src/components/ProductCodes.vue +39 -39
  85. package/src/components/ProductDetailName.vue +52 -52
  86. package/src/components/ProductDetailsList.vue +65 -65
  87. package/src/components/ProductTile.astro +48 -48
  88. package/src/components/Quote.vue +23 -23
  89. package/src/components/ReloadPrompt.astro +50 -50
  90. package/src/components/SlimBanner.vue +72 -72
  91. package/src/components/Table.vue +32 -32
  92. package/src/components/TableOfContents.astro +15 -15
  93. package/src/components/Translations.vue +23 -23
  94. package/src/components/flags/FlagPL.vue +3 -3
  95. package/src/components/flags/FlagUA.vue +2 -2
  96. package/src/components/layout/Container.astro +7 -7
  97. package/src/components/layout/Header.astro +80 -80
  98. package/src/config.ts +56 -56
  99. package/src/design.config.ts +98 -98
  100. package/src/env.d.ts +6 -6
  101. package/src/layouts/Layout.astro +61 -61
  102. package/src/layouts/MainLayout.astro +81 -81
  103. package/src/layouts/partials/FooterCommon.astro +4 -4
  104. package/src/layouts/partials/HeadCommon.astro +44 -44
  105. package/src/layouts/partials/HeadSEO.astro +41 -41
  106. package/src/pages/components/badges.mdx +57 -57
  107. package/src/pages/components/breadcrumbs.mdx +139 -139
  108. package/src/pages/components/buttons.mdx +360 -360
  109. package/src/pages/components/card.mdx +294 -294
  110. package/src/pages/components/carousel.mdx +62 -62
  111. package/src/pages/components/copyright.mdx +42 -42
  112. package/src/pages/components/details-list.mdx +115 -115
  113. package/src/pages/components/features-list.mdx +37 -37
  114. package/src/pages/components/flags.mdx +49 -49
  115. package/src/pages/components/fuck-russia.mdx +39 -39
  116. package/src/pages/components/hand-drive.mdx +38 -38
  117. package/src/pages/components/headline.mdx +152 -152
  118. package/src/pages/components/icons.astro +135 -135
  119. package/src/pages/components/image.mdx +513 -513
  120. package/src/pages/components/input.mdx +367 -367
  121. package/src/pages/components/jumbotron.mdx +359 -359
  122. package/src/pages/components/modal.mdx +64 -64
  123. package/src/pages/components/post-header.mdx +60 -60
  124. package/src/pages/components/pr-code.mdx +65 -65
  125. package/src/pages/components/product-number.mdx +58 -58
  126. package/src/pages/components/product-tile.mdx +51 -51
  127. package/src/pages/components/quote.mdx +33 -33
  128. package/src/pages/components/slimbanner.mdx +35 -35
  129. package/src/pages/components/table.mdx +108 -108
  130. package/src/pages/core/colors.mdx +10 -10
  131. package/src/pages/core/grid.mdx +89 -89
  132. package/src/pages/core/introduction.mdx +77 -77
  133. package/src/pages/core/shadows.astro +20 -20
  134. package/src/pages/core/typography.astro +49 -49
  135. package/src/pages/index.astro +133 -130
  136. package/src/pages/patterns/introduction.mdx +60 -60
  137. package/src/pwa.ts +12 -12
  138. package/src/styles/_variables.scss +70 -70
  139. package/src/styles/base/base.css +184 -184
  140. package/src/styles/base/grid.css +92 -92
  141. package/src/styles/base/typography.css +70 -70
  142. package/src/styles/content.css +73 -73
  143. package/src/styles/main.css +7 -7
  144. package/src/types/Product.ts +31 -31
  145. package/src/types/astro.d.ts +3 -3
  146. package/src/utils/product/getPriceFormatted.ts +15 -15
  147. package/src/utils/product/getProductChecklist.ts +17 -17
  148. package/src/utils/product/useFormatProductNumber.ts +41 -41
  149. package/src/utils/seo/getShorterDescription.ts +14 -14
  150. package/src/utils/text/formatDate.ts +5 -5
  151. package/src/utils/text/formatLocaleNumber.ts +6 -6
  152. package/src/utils/text/formatPad.ts +12 -12
  153. package/src/utils/text/getNumberFormatted.ts +33 -33
  154. package/src/utils/text/getTranslatedLink.ts +5 -5
  155. package/src/utils/text.ts +19 -19
  156. package/tailwind.config.cjs +8 -8
  157. package/tsconfig.json +28 -28
  158. package/uno-config/index.ts +232 -232
  159. package/uno-config/theme/breakpoints.ts +9 -9
  160. package/uno-config/theme/colors.ts +64 -64
  161. package/uno-config/theme/dimensions.ts +17 -17
  162. package/uno-config/theme/effects.ts +14 -14
  163. package/uno-config/theme/grid.ts +10 -10
  164. package/uno-config/theme/index.ts +28 -28
  165. package/uno-config/theme/shortcuts/buttons.ts +53 -53
  166. package/uno-config/theme/shortcuts/components.ts +92 -92
  167. package/uno-config/theme/shortcuts/index.ts +20 -20
  168. package/uno-config/theme/shortcuts/layout.ts +64 -64
  169. package/uno-config/theme/typography.ts +29 -29
  170. package/uno.config.ts +2 -2
@@ -1,48 +1,48 @@
1
- <script setup lang="ts">
2
- import type { PropType } from 'vue'
3
-
4
- const props = defineProps({
5
- as: {
6
- type: String as PropType<'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'div' | 'span'>,
7
- default: 'span',
8
- required: true,
9
- },
10
- textSize: {
11
- type: String as PropType<'xs' | 'sm' | 'base' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl' | '6xl' | '7xl' | '8xl' | '9xl'>,
12
- required: false,
13
- default: null
14
- },
15
- underline: {
16
- type: Boolean,
17
- required: false,
18
- default: false
19
- }
20
- })
21
- </script>
22
-
23
- <template>
24
- <component :is="props.as" class="mb-2.5 flex sm:block md:flex items-center leading-none"
25
- :class="`headline ${props.textSize ? `text-${props.textSize}` : 'text-xl'} ${props.underline ? 'headline--underline' : ''}`">
26
- <slot />
27
- </component>
28
- </template>
29
-
30
- <style>
31
- .headline--underline {
32
- @apply relative pb-4;
33
-
34
- &:after {
35
- @apply content-empty absolute left-0 bottom-0;
36
- height: 3px;
37
- width: 55px;
38
- background-color: var(--clr-primary-400);
39
- }
40
-
41
- &:before {
42
- @apply content-empty absolute left-0 bottom-px h-px;
43
- width: 95%;
44
- max-width: 255px;
45
- background-color: #64748b
46
- }
47
- }
48
- </style>
1
+ <script setup lang="ts">
2
+ import type { PropType } from 'vue'
3
+
4
+ const props = defineProps({
5
+ as: {
6
+ type: String as PropType<'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'div' | 'span'>,
7
+ default: 'span',
8
+ required: true,
9
+ },
10
+ textSize: {
11
+ type: String as PropType<'xs' | 'sm' | 'base' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl' | '6xl' | '7xl' | '8xl' | '9xl'>,
12
+ required: false,
13
+ default: null
14
+ },
15
+ underline: {
16
+ type: Boolean,
17
+ required: false,
18
+ default: false
19
+ }
20
+ })
21
+ </script>
22
+
23
+ <template>
24
+ <component :is="props.as" class="mb-2.5 flex sm:block md:flex items-center leading-none"
25
+ :class="`headline ${props.textSize ? `text-${props.textSize}` : 'text-xl'} ${props.underline ? 'headline--underline' : ''}`">
26
+ <slot />
27
+ </component>
28
+ </template>
29
+
30
+ <style>
31
+ .headline--underline {
32
+ @apply relative pb-4;
33
+
34
+ &:after {
35
+ @apply content-empty absolute left-0 bottom-0;
36
+ height: 3px;
37
+ width: 55px;
38
+ background-color: var(--clr-primary-400);
39
+ }
40
+
41
+ &:before {
42
+ @apply content-empty absolute left-0 bottom-px h-px;
43
+ width: 95%;
44
+ max-width: 255px;
45
+ background-color: #64748b
46
+ }
47
+ }
48
+ </style>
@@ -1,30 +1,30 @@
1
- ---
2
- import { Image } from "astro:assets";
3
-
4
- const { imageObject } = Astro.props;
5
- let inputProps = {};
6
-
7
- if (imageObject.index && imageObject.index === 1) {
8
- inputProps["data-pagefind-meta"] = "image[src], image_alt[alt]";
9
- inputProps["loading"] = "eager";
10
- }
11
-
12
- if (imageObject.srcset && imageObject.srcset.length) {
13
- inputProps["widths"] = imageObject.srcset;
14
- }
15
- ---
16
-
17
- <Image
18
- src={imageObject.src}
19
- alt={imageObject.alt}
20
- height={imageObject.height}
21
- width={imageObject.width}
22
- itemprop="image"
23
- format="avif"
24
- data-pagefind-index-attrs="alt"
25
- onerror="this.style.display='none';"
26
- class={`h-full w-full select-none pointer-none ${
27
- imageObject.class || "object-cover"
28
- }`}
29
- {...inputProps}
30
- />
1
+ ---
2
+ import { Image } from "astro:assets";
3
+
4
+ const { imageObject } = Astro.props;
5
+ let inputProps = {};
6
+
7
+ if (imageObject.index && imageObject.index === 1) {
8
+ inputProps["data-pagefind-meta"] = "image[src], image_alt[alt]";
9
+ inputProps["loading"] = "eager";
10
+ }
11
+
12
+ if (imageObject.srcset && imageObject.srcset.length) {
13
+ inputProps["widths"] = imageObject.srcset;
14
+ }
15
+ ---
16
+
17
+ <Image
18
+ src={imageObject.src}
19
+ alt={imageObject.alt}
20
+ height={imageObject.height}
21
+ width={imageObject.width}
22
+ itemprop="image"
23
+ format="avif"
24
+ data-pagefind-index-attrs="alt"
25
+ onerror="this.style.display='none';"
26
+ class={`h-full w-full select-none pointer-none ${
27
+ imageObject.class || "object-cover"
28
+ }`}
29
+ {...inputProps}
30
+ />
@@ -1,53 +1,53 @@
1
- ---
2
- import { SIDEBAR } from "../config";
3
- import { Astronav, MenuItems } from "astro-navbar";
4
- const { currentPage } = Astro.props;
5
- const currentPageMatch = currentPage.slice(1);
6
-
7
- const isCurrentPage = (item) => {
8
- if (item.link) {
9
- return item.link.includes(currentPageMatch);
10
- }
11
- return false;
12
- };
13
-
14
- const getLinkClasses = (link) => {
15
- const baseClasses =
16
- "block py-1.5 px-6 my-1 transition-colors border-l hover:border-slate-400 text-slate-500 hover:text-slate-900";
17
-
18
- if (isCurrentPage(link)) {
19
- return baseClasses + " border-slate-500 text-slate-900";
20
- } else {
21
- return baseClasses;
22
- }
23
- };
24
- ---
25
-
26
- <Astronav>
27
- <MenuItems
28
- class="hidden z-20 bg-blue-gray-100 w-64 h-full overflow-y-auto px-4 border-r pb-3 absolute lg:(relative bg-blue-lightest bg-opacity-5 flex)"
29
- >
30
- <ul class="mt-0 mb-auto">
31
- {
32
- SIDEBAR.map((item) =>
33
- item.header ? (
34
- <h2 class="mt-4 font-semibold text-slate-700">{item.text}</h2>
35
- ) : (
36
- <li class={getLinkClasses(item)}>
37
- <a href={item.link}>{item.text}</a>
38
- </li>
39
- ),
40
- )
41
- }
42
- </ul>
43
- </MenuItems>
44
- </Astronav>
45
-
46
- <script is:inline>
47
- window.addEventListener("DOMContentLoaded", (event) => {
48
- var target = document.querySelector('[aria-current="page"]');
49
- if (target && target.offsetTop > window.innerHeight - 100) {
50
- document.querySelector(".nav-groups").scrollTop = target.offsetTop;
51
- }
52
- });
53
- </script>
1
+ ---
2
+ import { SIDEBAR } from "../config";
3
+ import { Astronav, MenuItems } from "astro-navbar";
4
+ const { currentPage } = Astro.props;
5
+ const currentPageMatch = currentPage.slice(1);
6
+
7
+ const isCurrentPage = (item) => {
8
+ if (item.link) {
9
+ return item.link.includes(currentPageMatch);
10
+ }
11
+ return false;
12
+ };
13
+
14
+ const getLinkClasses = (link) => {
15
+ const baseClasses =
16
+ "block py-1.5 px-6 my-1 transition-colors border-l hover:border-slate-400 text-slate-500 hover:text-slate-900";
17
+
18
+ if (isCurrentPage(link)) {
19
+ return baseClasses + " border-slate-500 text-slate-900";
20
+ } else {
21
+ return baseClasses;
22
+ }
23
+ };
24
+ ---
25
+
26
+ <Astronav>
27
+ <MenuItems
28
+ class="hidden z-20 bg-blue-gray-100 w-64 h-full overflow-y-auto px-4 border-r pb-3 absolute lg:(relative bg-blue-lightest bg-opacity-5 flex)"
29
+ >
30
+ <ul class="mt-0 mb-auto">
31
+ {
32
+ SIDEBAR.map((item) =>
33
+ item.header ? (
34
+ <h2 class="mt-4 font-semibold text-slate-700">{item.text}</h2>
35
+ ) : (
36
+ <li class={getLinkClasses(item)}>
37
+ <a href={item.link}>{item.text}</a>
38
+ </li>
39
+ ),
40
+ )
41
+ }
42
+ </ul>
43
+ </MenuItems>
44
+ </Astronav>
45
+
46
+ <script is:inline>
47
+ window.addEventListener("DOMContentLoaded", (event) => {
48
+ var target = document.querySelector('[aria-current="page"]');
49
+ if (target && target.offsetTop > window.innerHeight - 100) {
50
+ document.querySelector(".nav-groups").scrollTop = target.offsetTop;
51
+ }
52
+ });
53
+ </script>
@@ -1,23 +1,23 @@
1
- <script setup lang="ts">
2
- import { colors } from "./../../uno-config/theme/colors";
3
-
4
- // Get color categories
5
- const colorCategories = Object.entries(colors);
6
- </script>
7
-
8
- <template>
9
- <div class="flex flex-col space-y-12">
10
- <div v-for="[category, shades] in colorCategories" :key="category">
11
- <h3 class="capitalize">{{ category }}</h3>
12
- <div class="grid grid-cols-3 md:grid-cols-9">
13
- <div v-for="(value, name) in shades" :key="name" class="mb-6">
14
- <div class="h-12 transition-all" :style="`background: ${value}`"></div>
15
- <div class="text-sm flex flex-col text-center font-mono text-slate-500">
16
- <span>{{ name }}</span>
17
- <span class="uppercase text-xs">{{ value }}</span>
18
- </div>
19
- </div>
20
- </div>
21
- </div>
22
- </div>
1
+ <script setup lang="ts">
2
+ import { colors } from "./../../uno-config/theme/colors";
3
+
4
+ // Get color categories
5
+ const colorCategories = Object.entries(colors);
6
+ </script>
7
+
8
+ <template>
9
+ <div class="flex flex-col space-y-12">
10
+ <div v-for="[category, shades] in colorCategories" :key="category">
11
+ <h3 class="capitalize">{{ category }}</h3>
12
+ <div class="grid grid-cols-3 md:grid-cols-9">
13
+ <div v-for="(value, name) in shades" :key="name" class="mb-6">
14
+ <div class="h-12 transition-all" :style="`background: ${value}`"></div>
15
+ <div class="text-sm flex flex-col text-center font-mono text-slate-500">
16
+ <span>{{ name }}</span>
17
+ <span class="uppercase text-xs">{{ value }}</span>
18
+ </div>
19
+ </div>
20
+ </div>
21
+ </div>
22
+ </div>
23
23
  </template>
@@ -1,15 +1,15 @@
1
- <script setup lang="ts">
2
- const props = defineProps<{
3
- label: string;
4
- }>();
5
- </script>
6
-
7
- <template>
8
- <label class="group text-left w-full max-w-xs flex flex-col">
9
- <span class="group-hover:text-blue-medium ml-2 text-slate-600 text-sm group-focus-within:text-blue-medium">{{ label
10
- }}</span>
11
- <input
12
- class="group-hover:border-blue-lightest border px-4 py-2 transition-colors rounded-md w-full focus:ring focus:outline-none focus:border-blue-medium"
13
- type="text" />
14
- </label>
15
- </template>
1
+ <script setup lang="ts">
2
+ const props = defineProps<{
3
+ label: string;
4
+ }>();
5
+ </script>
6
+
7
+ <template>
8
+ <label class="group text-left w-full max-w-xs flex flex-col">
9
+ <span class="group-hover:text-blue-medium ml-2 text-slate-600 text-sm group-focus-within:text-blue-medium">{{ label
10
+ }}</span>
11
+ <input
12
+ class="group-hover:border-blue-lightest border px-4 py-2 transition-colors rounded-md w-full focus:ring focus:outline-none focus:border-blue-medium"
13
+ type="text" />
14
+ </label>
15
+ </template>
@@ -1,27 +1,27 @@
1
- ---
2
- const { id, open } = Astro.props;
3
- import Button from "../components/Button.vue";
4
- ---
5
-
6
- <style >
7
- dialog {
8
- @apply fixed top-0 left-0 right-0 bottom-0;
9
-
10
- &::backdrop {
11
- @apply bg-slate-medium/50 fixed;
12
- top: 0px;
13
- right: 0px;
14
- bottom: 0px;
15
- left: 0px;
16
- }
17
- }
18
- </style>
19
-
20
- <Button primary onclick={`window.${id}.showModal()`}>{open}</Button>
21
-
22
- <dialog id={id} class="p-6">
23
- <slot name="main" />
24
- <form method="dialog">
25
- <slot name="close" />
26
- </form>
27
- </dialog>
1
+ ---
2
+ const { id, open } = Astro.props;
3
+ import Button from "../components/Button.vue";
4
+ ---
5
+
6
+ <style >
7
+ dialog {
8
+ @apply fixed top-0 left-0 right-0 bottom-0;
9
+
10
+ &::backdrop {
11
+ @apply bg-slate-medium/50 fixed;
12
+ top: 0px;
13
+ right: 0px;
14
+ bottom: 0px;
15
+ left: 0px;
16
+ }
17
+ }
18
+ </style>
19
+
20
+ <Button primary onclick={`window.${id}.showModal()`}>{open}</Button>
21
+
22
+ <dialog id={id} class="p-6">
23
+ <slot name="main" />
24
+ <form method="dialog">
25
+ <slot name="close" />
26
+ </form>
27
+ </dialog>
@@ -1,5 +1,5 @@
1
- <article id="article" class="content">
2
- <section class="main-section">
3
- <slot />
4
- </section>
5
- </article>
1
+ <article id="article" class="content">
2
+ <section class="main-section">
3
+ <slot />
4
+ </section>
5
+ </article>
@@ -1,28 +1,28 @@
1
- <script lang="ts" setup>
2
- import { PropType } from 'vue';
3
-
4
- const props = defineProps({
5
- as: {
6
- type: String as PropType<'div' | 'td' | 'span' | 'h1' | 'h2' | 'h3'>,
7
- default: 'div',
8
- required: true,
9
- },
10
- number: {
11
- type: String,
12
- default: '',
13
- required: true,
14
- },
15
- class: {
16
- type: String,
17
- default: '',
18
- required: false,
19
- },
20
- })
21
-
22
- </script>
23
-
24
- <template>
25
- <component :is="props.as" :class="props.class">
26
- {{ props.number }}
27
- </component>
1
+ <script lang="ts" setup>
2
+ import { PropType } from 'vue';
3
+
4
+ const props = defineProps({
5
+ as: {
6
+ type: String as PropType<'div' | 'td' | 'span' | 'h1' | 'h2' | 'h3'>,
7
+ default: 'div',
8
+ required: true,
9
+ },
10
+ number: {
11
+ type: String,
12
+ default: '',
13
+ required: true,
14
+ },
15
+ class: {
16
+ type: String,
17
+ default: '',
18
+ required: false,
19
+ },
20
+ })
21
+
22
+ </script>
23
+
24
+ <template>
25
+ <component :is="props.as" :class="props.class">
26
+ {{ props.number }}
27
+ </component>
28
28
  </template>
@@ -1,38 +1,38 @@
1
- ---
2
- interface Category {
3
- id: number;
4
- name: string;
5
- slug: string;
6
- description: string;
7
- count: number;
8
- parent: number;
9
- link: string;
10
- }
11
-
12
- interface Props {
13
- categories: Category[];
14
- }
15
-
16
- const { categories } = Astro.props;
17
- ---
18
-
19
- <div class="text-brand-secondary uppercase text-base z-3 relative w-full">
20
- {
21
- categories && categories.length > 0
22
- ? categories.map((category, index) => (
23
- <>
24
- {index > 0 && (
25
- <span class="w-px h-2.5 bg-gray-300 mx-2.5 inline-block relative" />
26
- )}
27
- <a
28
- class="term-link text-sm sm:text-base hover:text-light-blue-400
29
- "
30
- href={category.link}
31
- >
32
- {category.name}
33
- </a>
34
- </>
35
- ))
36
- : null
37
- }
1
+ ---
2
+ interface Category {
3
+ id: number;
4
+ name: string;
5
+ slug: string;
6
+ description: string;
7
+ count: number;
8
+ parent: number;
9
+ link: string;
10
+ }
11
+
12
+ interface Props {
13
+ categories: Category[];
14
+ }
15
+
16
+ const { categories } = Astro.props;
17
+ ---
18
+
19
+ <div class="text-brand-secondary uppercase text-base z-3 relative w-full">
20
+ {
21
+ categories && categories.length > 0
22
+ ? categories.map((category, index) => (
23
+ <>
24
+ {index > 0 && (
25
+ <span class="w-px h-2.5 bg-gray-300 mx-2.5 inline-block relative" />
26
+ )}
27
+ <a
28
+ class="term-link text-sm sm:text-base hover:text-light-blue-400
29
+ "
30
+ href={category.link}
31
+ >
32
+ {category.name}
33
+ </a>
34
+ </>
35
+ ))
36
+ : null
37
+ }
38
38
  </div>
@@ -1,39 +1,39 @@
1
- <script setup lang="ts">
2
- interface Category {
3
- id: number;
4
- name: string;
5
- slug: string;
6
- description: string;
7
- link: string;
8
- }
9
-
10
- interface Props {
11
- category: Category;
12
- active?: boolean;
13
- }
14
-
15
- const props = withDefaults(defineProps<Props>(), {
16
- active: false
17
- });
18
- </script>
19
-
20
- <template>
21
- <a
22
- :href="props.category.link"
23
- class="category-link"
24
- :class="{ 'active': props.active }"
25
- :title="props.category.description || props.category.name"
26
- >
27
- {{ props.category.name }}
28
- </a>
29
- </template>
30
-
31
- <style>
32
- .category-link {
33
- @apply text-sm sm:text-base text-accent-lightest uppercase hover:text-blue-500 transition-colors;
34
- }
35
-
36
- .category-link.active {
37
- @apply text-blue-500;
38
- }
39
- </style>
1
+ <script setup lang="ts">
2
+ interface Category {
3
+ id: number;
4
+ name: string;
5
+ slug: string;
6
+ description: string;
7
+ link: string;
8
+ }
9
+
10
+ interface Props {
11
+ category: Category;
12
+ active?: boolean;
13
+ }
14
+
15
+ const props = withDefaults(defineProps<Props>(), {
16
+ active: false
17
+ });
18
+ </script>
19
+
20
+ <template>
21
+ <a
22
+ :href="props.category.link"
23
+ class="category-link"
24
+ :class="{ 'active': props.active }"
25
+ :title="props.category.description || props.category.name"
26
+ >
27
+ {{ props.category.name }}
28
+ </a>
29
+ </template>
30
+
31
+ <style scoped>
32
+ .category-link {
33
+ @apply text-sm sm:text-base text-accent-lightest uppercase hover:text-blue-500 transition-colors;
34
+ }
35
+
36
+ .category-link.active {
37
+ @apply text-blue-500;
38
+ }
39
+ </style>