spoko-design-system 0.2.94 → 0.2.96

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 +83 -83
  14. package/dev-dist/sw.js +91 -91
  15. package/dev-dist/workbox-c676b6d3.js +3391 -3391
  16. package/icon.config.ts +224 -224
  17. package/index.ts +62 -62
  18. package/package.json +116 -116
  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 +63 -63
  41. package/src/components/ButtonCopy.vue +36 -36
  42. package/src/components/Card.astro +27 -27
  43. package/src/components/Carousel.astro +26 -26
  44. package/src/components/Category/CategoriesCarousel.astro +101 -101
  45. package/src/components/Category/CategoryDetails.astro +135 -134
  46. package/src/components/Category/CategoryLink.vue +23 -23
  47. package/src/components/Category/CategorySidebarToggler.vue +9 -9
  48. package/src/components/Category/CategoryTile.astro +39 -49
  49. package/src/components/Category/CategoryViewToggler.astro +81 -109
  50. package/src/components/Category/SubCategoryLink.vue +19 -29
  51. package/src/components/CategoryLink.astro +18 -18
  52. package/src/components/Copyright.astro +12 -12
  53. package/src/components/Date.astro +7 -7
  54. package/src/components/Faq.astro +33 -33
  55. package/src/components/FaqItem.astro +96 -96
  56. package/src/components/FeaturesList.vue +41 -41
  57. package/src/components/FuckRussia.vue +62 -62
  58. package/src/components/HandDrive.astro +29 -29
  59. package/src/components/Header/Header.astro +210 -210
  60. package/src/components/Header/SkipToContent.astro +1 -1
  61. package/src/components/Headline.vue +48 -48
  62. package/src/components/Image.astro +30 -30
  63. package/src/components/Jumbatron.vue +40 -40
  64. package/src/components/LanguageSuggestion.astro +69 -0
  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 +28 -48
  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/uno-config/index.ts +61 -61
  158. package/uno-config/theme/breakpoints.ts +9 -9
  159. package/uno-config/theme/colors.ts +66 -66
  160. package/uno-config/theme/dimensions.ts +17 -17
  161. package/uno-config/theme/effects.ts +14 -14
  162. package/uno-config/theme/grid.ts +10 -10
  163. package/uno-config/theme/index.ts +25 -25
  164. package/uno-config/theme/shortcuts/buttons.ts +38 -38
  165. package/uno-config/theme/shortcuts/components.ts +82 -82
  166. package/uno-config/theme/shortcuts/index.ts +16 -16
  167. package/uno-config/theme/shortcuts/layout.ts +58 -58
  168. package/uno-config/theme/typography.ts +29 -29
  169. 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,41 +1,41 @@
1
- <script setup lang="ts">
2
- import { useSlots } from 'vue';
3
-
4
- const slots = useSlots()
5
- const hasSlot = (name) => {
6
- return !!slots[name];
7
- }
8
- const props = defineProps({
9
- small: {
10
- type: Boolean,
11
- default: null,
12
- required: false,
13
- },
14
- intro: {
15
- type: String,
16
- default: '',
17
- required: false,
18
- }
19
- })
20
- </script>
21
-
22
- <template>
23
- <header class="relative flow content-grid bg-vw mx-auto my-auto py-8 lg:w-full text-center" :class="props.small ? 'md:min-h-xs sm:py-12 md:py-14 lg:py-16 xl:py-20' : 'md:min-h-md sm:py-16 md:py-20 lg:py-28 xl:py-32'">
24
-
25
- <slot name="intro">
26
- <h1 class="text-3xl headline-light text-white sm:(text-4xl pt-0) md:text-5xl lg:text-6xl " v-html="props.intro" />
27
- </slot>
28
-
29
- <slot name="subtitle" />
30
- <div class="mt-5 sm:(mt-8 flex justify-center)" v-if="hasSlot('cta')">
31
- <slot name="cta" />
32
- </div>
33
- </header>
34
- </template>
35
- <style>
36
- .bg-vw {
37
- background: radial-gradient(circle at 50% 85%,
38
- #00437A 0%,
39
- #001E50 100%)
40
- }
1
+ <script setup lang="ts">
2
+ import { useSlots } from 'vue';
3
+
4
+ const slots = useSlots()
5
+ const hasSlot = (name) => {
6
+ return !!slots[name];
7
+ }
8
+ const props = defineProps({
9
+ small: {
10
+ type: Boolean,
11
+ default: null,
12
+ required: false,
13
+ },
14
+ intro: {
15
+ type: String,
16
+ default: '',
17
+ required: false,
18
+ }
19
+ })
20
+ </script>
21
+
22
+ <template>
23
+ <header class="relative flow content-grid bg-vw mx-auto my-auto py-8 lg:w-full text-center" :class="props.small ? 'md:min-h-xs sm:py-12 md:py-14 lg:py-16 xl:py-20' : 'md:min-h-md sm:py-16 md:py-20 lg:py-28 xl:py-32'">
24
+
25
+ <slot name="intro">
26
+ <h1 class="text-3xl headline-light text-white sm:(text-4xl pt-0) md:text-5xl lg:text-6xl " v-html="props.intro" />
27
+ </slot>
28
+
29
+ <slot name="subtitle" />
30
+ <div class="mt-5 sm:(mt-8 flex justify-center)" v-if="hasSlot('cta')">
31
+ <slot name="cta" />
32
+ </div>
33
+ </header>
34
+ </template>
35
+ <style>
36
+ .bg-vw {
37
+ background: radial-gradient(circle at 50% 85%,
38
+ #00437A 0%,
39
+ #001E50 100%)
40
+ }
41
41
  </style>
@@ -0,0 +1,69 @@
1
+ ---
2
+ // components/LanguageSuggestion.astro
3
+ interface Props {
4
+ position?: 'top' | 'bottom';
5
+ className?: string;
6
+ customPath?: string;
7
+ dismissTimeout?: number; // Auto-dismiss after X ms
8
+ showIcon?: boolean;
9
+ }
10
+
11
+ const {
12
+ position = 'bottom',
13
+ className = '',
14
+ customPath,
15
+ dismissTimeout,
16
+ showIcon = true
17
+ } = Astro.props;
18
+
19
+ const currentLocale = Astro.currentLocale;
20
+ const preferredLocale = Astro.preferredLocale;
21
+
22
+ const targetPath = customPath
23
+ ? `/${preferredLocale}${customPath}`
24
+ : `/${preferredLocale}${Astro.url.pathname}`;
25
+ ---
26
+
27
+ <div
28
+ id="languageSuggestion"
29
+ class:list={[
30
+ 'fixed right-4 bg-white shadow-lg p-4 rounded-lg hidden transition-opacity duration-300',
31
+ position === 'top' ? 'top-4' : 'bottom-4',
32
+ className
33
+ ]}
34
+ role="alert"
35
+ >
36
+ <a
37
+ href={targetPath}
38
+ class="flex items-center gap-2 font-medium hover:underline"
39
+ >
40
+ {showIcon && <span class="material-icons-outlined text-sm">translate</span>}
41
+ {new Intl.DisplayNames([preferredLocale], {type: 'language'}).of(preferredLocale)}
42
+ </a>
43
+ <button
44
+ class="absolute top-1.5 right-1.5 p-1 opacity-60 hover:opacity-100 transition-opacity"
45
+ aria-label="Dismiss"
46
+ onclick="this.parentElement.remove(); localStorage.setItem('languageSuggestDenied', true);"
47
+ >
48
+
49
+ </button>
50
+ </div>
51
+
52
+ <script define:vars={{ currentLocale, preferredLocale, dismissTimeout }}>
53
+ const shouldShow =
54
+ preferredLocale &&
55
+ preferredLocale !== currentLocale &&
56
+ !localStorage.getItem('languageSuggestDenied');
57
+
58
+ if (shouldShow) {
59
+ const popup = document.getElementById('languageSuggestion');
60
+ popup?.classList.remove('hidden');
61
+
62
+ if (dismissTimeout) {
63
+ setTimeout(() => {
64
+ popup?.classList.add('opacity-0');
65
+ setTimeout(() => popup?.remove(), 300);
66
+ }, dismissTimeout);
67
+ }
68
+ }
69
+ </script>
@@ -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-500 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-500 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 "../design.config";
3
-
4
- const colorNames = Object.keys(COLORS);
5
- </script>
6
-
7
- <template>
8
- <div class="flex flex-col space-y-12">
9
- <div v-for="name in colorNames" :key="name">
10
- <h3 class="capitalize">{{ name }}</h3>
11
- <div class="grid grid-cols-3 md:grid-cols-9">
12
- <div v-for="color in COLORS[name]" :key="color" class="mb-6">
13
- <div class="h-12 transition-all" :style="`background: ${color.value}`"></div>
14
- <div class="text-sm flex flex-col text-center font-mono text-slate-500">
15
- <span>{{ color.name }}</span>
16
- <span class="uppercase text-xs">{{ color.value }}</span>
17
- </div>
18
- </div>
19
- </div>
20
- </div>
21
- </div>
22
- </template>
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>
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-600 ml-2 text-slate-600 text-sm group-focus-within:text-blue-600">{{ label
10
- }}</span>
11
- <input
12
- class="group-hover:border-blue-500 border px-4 py-2 transition-colors rounded-md w-full focus:ring focus:outline-none focus:border-blue-600"
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-600 ml-2 text-slate-600 text-sm group-focus-within:text-blue-600">{{ label
10
+ }}</span>
11
+ <input
12
+ class="group-hover:border-blue-500 border px-4 py-2 transition-colors rounded-md w-full focus:ring focus:outline-none focus:border-blue-600"
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>