spoko-design-system 0.9.2 → 0.9.4

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 (172) hide show
  1. package/.astro/settings.json +4 -4
  2. package/.astro/types.d.ts +1 -1
  3. package/.claude/settings.local.json +2 -1
  4. package/.github/dependabot.yml +11 -11
  5. package/.github/todo.yml +3 -3
  6. package/.github/workflows/deploy.yml +39 -39
  7. package/.stackblitzrc +5 -5
  8. package/.vscode/extensions.json +5 -5
  9. package/.vscode/launch.json +11 -11
  10. package/.vscode/settings.json +5 -5
  11. package/LICENSE +21 -21
  12. package/README.md +116 -116
  13. package/astro-i18next.config.mjs +17 -17
  14. package/astro-i18next.config.ts +10 -10
  15. package/astro.config.mjs +86 -86
  16. package/dev-dist/sw.js +91 -91
  17. package/dev-dist/workbox-c676b6d3.js +3391 -3391
  18. package/icon.config.ts +310 -310
  19. package/index.ts +70 -70
  20. package/package.json +124 -124
  21. package/public/arrow-bottom.svg +7 -7
  22. package/public/fonts/lg.svg +53 -53
  23. package/public/fonts/vwhead-bold-demo.html +549 -549
  24. package/public/fonts/vwhead-regular-demo.html +549 -549
  25. package/public/fonts/vwtext-bold-demo.html +549 -549
  26. package/public/fonts/vwtext-regular-demo.html +549 -549
  27. package/public/github.svg +3 -3
  28. package/public/grid_dot.svg +4 -4
  29. package/public/linkedin.svg +44 -44
  30. package/public/locales/en/translation.json +12 -12
  31. package/public/locales/pl/translation.json +12 -12
  32. package/public/make-scrollable-code-focusable.js +3 -3
  33. package/public/pagefind.yml +3 -3
  34. package/public/polo.blue.svg +29 -29
  35. package/public/spoko.space.svg +71 -71
  36. package/public/twitter.svg +46 -46
  37. package/renovate.json +6 -6
  38. package/sandbox.config.json +11 -11
  39. package/src/MyComponent.astro +8 -8
  40. package/src/components/Badge.vue +19 -19
  41. package/src/components/Badges.vue +21 -21
  42. package/src/components/Breadcrumbs.vue +94 -94
  43. package/src/components/Button.vue +101 -101
  44. package/src/components/ButtonCopy.astro +183 -183
  45. package/src/components/ButtonCopy.vue +36 -36
  46. package/src/components/Card.astro +27 -27
  47. package/src/components/Carousel.astro +26 -26
  48. package/src/components/Category/CategoriesCarousel.astro +101 -101
  49. package/src/components/Category/CategoryDetails.astro +169 -169
  50. package/src/components/Category/CategoryLink.vue +28 -28
  51. package/src/components/Category/CategorySidebarToggler.vue +9 -9
  52. package/src/components/Category/CategoryTile.astro +37 -37
  53. package/src/components/Category/CategoryViewToggler.astro +89 -89
  54. package/src/components/Category/SubCategoryLink.vue +19 -19
  55. package/src/components/Copyright.astro +12 -12
  56. package/src/components/Date.astro +7 -7
  57. package/src/components/Faq.astro +33 -33
  58. package/src/components/FaqItem.astro +80 -80
  59. package/src/components/FeaturesList.vue +37 -37
  60. package/src/components/FuckRussia.vue +62 -62
  61. package/src/components/HandDrive.astro +29 -29
  62. package/src/components/Header/Header.astro +210 -210
  63. package/src/components/Header/SkipToContent.astro +1 -1
  64. package/src/components/Headline.vue +87 -87
  65. package/src/components/Image.astro +30 -30
  66. package/src/components/{layout → Layout}/CallToAction.astro +52 -52
  67. package/src/components/{layout → Layout}/Container.astro +7 -7
  68. package/src/components/{layout → Layout}/Header.astro +80 -80
  69. package/src/components/LeftSidebar.astro +53 -53
  70. package/src/components/MainColors.vue +22 -22
  71. package/src/components/MainInput.vue +15 -15
  72. package/src/components/Modal.astro +27 -27
  73. package/src/components/PageContent.astro +5 -5
  74. package/src/components/PartNumber.vue +27 -27
  75. package/src/components/Post/PostCategories.astro +41 -41
  76. package/src/components/Post/PostCategories.vue +30 -30
  77. package/src/components/PostHeader.astro +103 -103
  78. package/src/components/PrCode.vue +141 -141
  79. package/src/components/Product/ProductButton.vue +18 -18
  80. package/src/components/Product/ProductCarousel.astro +35 -35
  81. package/src/components/Product/ProductEngineType.vue +42 -42
  82. package/src/components/Product/ProductImage.astro +40 -40
  83. package/src/components/Product/ProductLink.astro +101 -101
  84. package/src/components/Product/ProductLink.vue +59 -59
  85. package/src/components/Product/ProductLinkInfo.astro +37 -37
  86. package/src/components/Product/ProductNumber.astro +60 -60
  87. package/src/components/ProductCarousel.astro +38 -38
  88. package/src/components/ProductCodes.vue +39 -39
  89. package/src/components/ProductDetailName.vue +52 -52
  90. package/src/components/ProductDetailsList.vue +216 -216
  91. package/src/components/ProductTile.astro +48 -48
  92. package/src/components/Quote.vue +23 -23
  93. package/src/components/ReloadPrompt.astro +50 -50
  94. package/src/components/SlimBanner.vue +72 -72
  95. package/src/components/Table.vue +32 -32
  96. package/src/components/TableOfContents.astro +15 -15
  97. package/src/components/Translations.vue +23 -23
  98. package/src/components/flags/FlagPL.vue +3 -3
  99. package/src/components/flags/FlagUA.vue +2 -2
  100. package/src/config.ts +56 -56
  101. package/src/design.config.ts +98 -98
  102. package/src/env.d.ts +6 -6
  103. package/src/layouts/Layout.astro +61 -61
  104. package/src/layouts/MainLayout.astro +81 -81
  105. package/src/layouts/partials/FooterCommon.astro +4 -4
  106. package/src/layouts/partials/HeadCommon.astro +44 -44
  107. package/src/layouts/partials/HeadSEO.astro +41 -41
  108. package/src/pages/components/badges.mdx +57 -57
  109. package/src/pages/components/breadcrumbs.mdx +139 -139
  110. package/src/pages/components/buttons.mdx +360 -360
  111. package/src/pages/components/card.mdx +294 -294
  112. package/src/pages/components/carousel.mdx +62 -62
  113. package/src/pages/components/copyright.mdx +42 -42
  114. package/src/pages/components/details-list.mdx +115 -115
  115. package/src/pages/components/features-list.mdx +37 -37
  116. package/src/pages/components/flags.mdx +49 -49
  117. package/src/pages/components/fuck-russia.mdx +39 -39
  118. package/src/pages/components/hand-drive.mdx +38 -38
  119. package/src/pages/components/headline.mdx +137 -137
  120. package/src/pages/components/icons.astro +135 -135
  121. package/src/pages/components/image.mdx +513 -513
  122. package/src/pages/components/input.mdx +367 -367
  123. package/src/pages/components/jumbotron.mdx +359 -359
  124. package/src/pages/components/modal.mdx +64 -64
  125. package/src/pages/components/post-header.mdx +64 -64
  126. package/src/pages/components/pr-code.mdx +65 -65
  127. package/src/pages/components/product-number.mdx +58 -58
  128. package/src/pages/components/product-tile.mdx +51 -51
  129. package/src/pages/components/quote.mdx +33 -33
  130. package/src/pages/components/slimbanner.mdx +35 -35
  131. package/src/pages/components/table.mdx +108 -108
  132. package/src/pages/core/colors.mdx +10 -10
  133. package/src/pages/core/grid.mdx +89 -89
  134. package/src/pages/core/introduction.mdx +77 -77
  135. package/src/pages/core/shadows.astro +20 -20
  136. package/src/pages/core/typography.astro +49 -49
  137. package/src/pages/index.astro +133 -133
  138. package/src/pages/patterns/introduction.mdx +60 -60
  139. package/src/pwa.ts +12 -12
  140. package/src/styles/_variables.scss +70 -70
  141. package/src/styles/base/base.css +184 -184
  142. package/src/styles/base/grid.css +92 -92
  143. package/src/styles/base/typography.css +70 -70
  144. package/src/styles/content.css +73 -73
  145. package/src/styles/main.css +7 -7
  146. package/src/types/Product.ts +31 -31
  147. package/src/types/astro.d.ts +3 -3
  148. package/src/utils/product/getPriceFormatted.ts +15 -15
  149. package/src/utils/product/getProductChecklist.ts +17 -17
  150. package/src/utils/product/useFormatProductNumber.ts +41 -41
  151. package/src/utils/seo/getShorterDescription.ts +14 -14
  152. package/src/utils/text/formatDate.ts +5 -5
  153. package/src/utils/text/formatLocaleNumber.ts +6 -6
  154. package/src/utils/text/formatPad.ts +12 -12
  155. package/src/utils/text/getNumberFormatted.ts +33 -33
  156. package/src/utils/text/getTranslatedLink.ts +5 -5
  157. package/src/utils/text.ts +19 -19
  158. package/tailwind.config.cjs +8 -8
  159. package/tsconfig.json +28 -28
  160. package/uno-config/index.ts +268 -266
  161. package/uno-config/theme/breakpoints.ts +9 -9
  162. package/uno-config/theme/colors.ts +64 -64
  163. package/uno-config/theme/dimensions.ts +17 -17
  164. package/uno-config/theme/effects.ts +14 -14
  165. package/uno-config/theme/grid.ts +10 -10
  166. package/uno-config/theme/index.ts +28 -28
  167. package/uno-config/theme/shortcuts/buttons.ts +53 -53
  168. package/uno-config/theme/shortcuts/components.ts +123 -123
  169. package/uno-config/theme/shortcuts/index.ts +20 -20
  170. package/uno-config/theme/shortcuts/layout.ts +74 -74
  171. package/uno-config/theme/typography.ts +29 -29
  172. package/uno.config.ts +2 -2
@@ -1,88 +1,88 @@
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
- fontFamily: {
16
- type: String as PropType<'head' | 'text' | 'novamono' | 'mono'>,
17
- required: false,
18
- default: 'head'
19
- },
20
- fontWeight: {
21
- type: String as PropType<'light' | 'regular' | 'bold' | 'light-bold' | 'light-thin'>,
22
- required: false,
23
- default: 'regular'
24
- },
25
- underline: {
26
- type: Boolean,
27
- required: false,
28
- default: false
29
- }
30
- })
31
-
32
- // Generate the typography class based on font family and weight
33
- const getTypographyClass = (): string => {
34
- const family = props.fontFamily
35
- const weight = props.fontWeight
36
-
37
- // Handle special cases for mono fonts
38
- if (family === 'novamono' || family === 'mono') {
39
- return `font-${family}`
40
- }
41
-
42
- // For head family, generate specific classes
43
- if (family === 'head') {
44
- if (weight === 'light') return 'headline-light'
45
- if (weight === 'bold') return 'headline-bold'
46
- if (weight === 'light-bold') return 'headline-light-bold'
47
- if (weight === 'light-thin') return 'headline-light-thin'
48
- return 'headline' // for regular weight
49
- }
50
-
51
- // For text family, generate appropriate class
52
- if (family === 'text') {
53
- return `font-text${weight}`
54
- }
55
-
56
- // Default fallback
57
- return 'headline'
58
- }
59
-
60
- const typographyClass = getTypographyClass()
61
- </script>
62
-
63
- <template>
64
- <component :is="props.as" class="mb-2.5 flex sm:block md:flex items-center leading-none"
65
- :class="`${typographyClass} ${props.textSize ? `text-${props.textSize}` : 'text-xl'} ${props.underline ? 'headline--underline' : ''}`">
66
- <slot />
67
- </component>
68
- </template>
69
-
70
- <style>
71
- .headline--underline {
72
- @apply relative pb-4;
73
-
74
- &:after {
75
- @apply content-empty absolute left-0 bottom-0;
76
- height: 3px;
77
- width: 55px;
78
- background-color: var(--clr-primary-400);
79
- }
80
-
81
- &:before {
82
- @apply content-empty absolute left-0 bottom-px h-px;
83
- width: 95%;
84
- max-width: 255px;
85
- background-color: #64748b
86
- }
87
- }
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
+ fontFamily: {
16
+ type: String as PropType<'head' | 'text' | 'novamono' | 'mono'>,
17
+ required: false,
18
+ default: 'head'
19
+ },
20
+ fontWeight: {
21
+ type: String as PropType<'light' | 'regular' | 'bold' | 'light-bold' | 'light-thin'>,
22
+ required: false,
23
+ default: 'regular'
24
+ },
25
+ underline: {
26
+ type: Boolean,
27
+ required: false,
28
+ default: false
29
+ }
30
+ })
31
+
32
+ // Generate the typography class based on font family and weight
33
+ const getTypographyClass = (): string => {
34
+ const family = props.fontFamily
35
+ const weight = props.fontWeight
36
+
37
+ // Handle special cases for mono fonts
38
+ if (family === 'novamono' || family === 'mono') {
39
+ return `font-${family}`
40
+ }
41
+
42
+ // For head family, generate specific classes
43
+ if (family === 'head') {
44
+ if (weight === 'light') return 'headline-light'
45
+ if (weight === 'bold') return 'headline-bold'
46
+ if (weight === 'light-bold') return 'headline-light-bold'
47
+ if (weight === 'light-thin') return 'headline-light-thin'
48
+ return 'headline' // for regular weight
49
+ }
50
+
51
+ // For text family, generate appropriate class
52
+ if (family === 'text') {
53
+ return `font-text${weight}`
54
+ }
55
+
56
+ // Default fallback
57
+ return 'headline'
58
+ }
59
+
60
+ const typographyClass = getTypographyClass()
61
+ </script>
62
+
63
+ <template>
64
+ <component :is="props.as" class="mb-2.5 flex sm:block md:flex items-center leading-none"
65
+ :class="`${typographyClass} ${props.textSize ? `text-${props.textSize}` : 'text-xl'} ${props.underline ? 'headline--underline' : ''}`">
66
+ <slot />
67
+ </component>
68
+ </template>
69
+
70
+ <style>
71
+ .headline--underline {
72
+ @apply relative pb-4;
73
+
74
+ &:after {
75
+ @apply content-empty absolute left-0 bottom-0;
76
+ height: 3px;
77
+ width: 55px;
78
+ background-color: var(--clr-primary-400);
79
+ }
80
+
81
+ &:before {
82
+ @apply content-empty absolute left-0 bottom-px h-px;
83
+ width: 95%;
84
+ max-width: 255px;
85
+ background-color: #64748b
86
+ }
87
+ }
88
88
  </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 Button from "./../Button.vue"
3
-
4
- interface Props {
5
- class?: string;
6
- title?: string;
7
- description?: string;
8
- }
9
-
10
- const { class: additionalClasses, title: propTitle, description: propDescription } = Astro.props;
11
-
12
- // Sprawdzamy, czy slot 'description' ma jakąkolwiek zawartość
13
- const hasDescriptionSlotContent = Astro.slots.has('description');
14
- ---
15
-
16
- <section
17
- class:list={[
18
- "full-width border-blue-medium bg-blue-darker/5 border-t-4 md:(border-t-0 px-6 bg-white) my-8",
19
- additionalClasses,
20
- ]}
21
- >
22
- <div class="flex flex-col items-center gap-4 md:(flex-row border-l-4 border-blue-medium bg-blue-darker/5 px-6) py-6">
23
- <div class="flex-shrink-0 hidden md:block">
24
- <slot name="icon">
25
- <span i-ph:sparkle-thin class="mr-1 text-8 md:text-10 text-brand-secondary"></span>
26
- </slot>
27
- </div>
28
- <div class="flex-1 text-center md:text-left">
29
- <h3 class="text-lg font-semibold text-blue-darker">
30
- <slot name="title">
31
- {propTitle || 'Domyślny tytuł akcji'}
32
- </slot>
33
- </h3>
34
- {(propDescription || hasDescriptionSlotContent) && (
35
- <p class="text-blue-darker mt-1">
36
- <slot name="description">
37
- {propDescription || 'Domyślny opis, który zachęca do działania.'}
38
- </slot>
39
- </p>
40
- )}
41
- </div>
42
- <slot name="action">
43
- <Button
44
- type="button"
45
- class:list="w-fit place-self-center gap-2"
46
- tertiary
47
- rounded
48
- title="Domyślny przycisk akcji">
49
- Kliknij mnie!
50
- </Button>
51
- </slot>
52
- </div>
1
+ ---
2
+ import Button from "./../Button.vue"
3
+
4
+ interface Props {
5
+ class?: string;
6
+ title?: string;
7
+ description?: string;
8
+ }
9
+
10
+ const { class: additionalClasses, title: propTitle, description: propDescription } = Astro.props;
11
+
12
+ // Sprawdzamy, czy slot 'description' ma jakąkolwiek zawartość
13
+ const hasDescriptionSlotContent = Astro.slots.has('description');
14
+ ---
15
+
16
+ <section
17
+ class:list={[
18
+ "full-width border-blue-medium bg-blue-darker/5 border-t-4 md:(border-t-0 px-6 bg-white) my-8",
19
+ additionalClasses,
20
+ ]}
21
+ >
22
+ <div class="flex flex-col items-center gap-4 md:(flex-row border-l-4 border-blue-medium bg-blue-darker/5 px-6) py-6">
23
+ <div class="flex-shrink-0 hidden md:block">
24
+ <slot name="icon">
25
+ <span i-ph:sparkle-thin class="mr-1 text-8 md:text-10 text-brand-secondary"></span>
26
+ </slot>
27
+ </div>
28
+ <div class="flex-1 text-center md:text-left">
29
+ <h3 class="text-lg font-semibold text-blue-darker">
30
+ <slot name="title">
31
+ {propTitle || 'Domyślny tytuł akcji'}
32
+ </slot>
33
+ </h3>
34
+ {(propDescription || hasDescriptionSlotContent) && (
35
+ <p class="text-blue-darker mt-1">
36
+ <slot name="description">
37
+ {propDescription || 'Domyślny opis, który zachęca do działania.'}
38
+ </slot>
39
+ </p>
40
+ )}
41
+ </div>
42
+ <slot name="action">
43
+ <Button
44
+ type="button"
45
+ class:list="w-fit place-self-center gap-2"
46
+ tertiary
47
+ rounded
48
+ title="Domyślny przycisk akcji">
49
+ Kliknij mnie!
50
+ </Button>
51
+ </slot>
52
+ </div>
53
53
  </section>
@@ -1,7 +1,7 @@
1
- ---
2
- const { class: className, isFullWidth } = Astro.props;
3
- ---
4
-
5
- <div class:list={[`${isFullWidth ? 'max-w-full' : 'max-w-screen-xl'} mx-auto px-5 py-4`, className]}>
6
- <slot />
7
- </div>
1
+ ---
2
+ const { class: className, isFullWidth } = Astro.props;
3
+ ---
4
+
5
+ <div class:list={[`${isFullWidth ? 'max-w-full' : 'max-w-screen-xl'} mx-auto px-5 py-4`, className]}>
6
+ <slot />
7
+ </div>
@@ -1,80 +1,80 @@
1
- ---
2
- const { class: className } = Astro.props;
3
- import { Icon } from "astro-icon/components";
4
-
5
- const navItemsLeft = [
6
- {
7
- title: "Components",
8
- description: "The building blocks for our UI.",
9
- url: "/components/buttons",
10
- img: "/Components.jpg",
11
- },
12
- {
13
- title: "Patterns",
14
- description: "Common patterns for building interfaces.",
15
- url: "/patterns/introduction",
16
- img: "/Patterns.jpg",
17
- },
18
- ];
19
- ---
20
-
21
- <nav
22
- itemscope
23
- itemtype="http://schema.org/WPHeader"
24
- class:list={[
25
- className,
26
- "nav print-hidden mx-auto px-4 shadow-md relative flex items-center justify-between h-24 sm:h-14 flex-wrap sm:flex-nowrap pt-1 sm:pt-0",
27
- ]}
28
- >
29
- <div class="flex items-center justify-start sm:items-stretch order-1">
30
- <slot name="logo" />
31
-
32
- <div class="hidden sm:block sm:ml-6">
33
- <div class="flex space-x-4" itemprop="hasPart">
34
- {
35
- navItemsLeft.map(({ title, description, url, img }) => (
36
- <a
37
- href={url}
38
- class="text-gray-400 hover:bg-blue-darker hover:text-white px-3 py-1 rounded-full text-sm font-medium"
39
- title={description}
40
- itemprop="url"
41
- >
42
- {title}
43
- </a>
44
- ))
45
- }
46
- </div>
47
- </div>
48
- </div>
49
-
50
- <div
51
- class="relative md:block sm:ml-4 w-full order-4 h-10 md:(w-64 mr-auto order-2)"
52
- >
53
- <slot name="search" />
54
- </div>
55
-
56
- <div
57
- class="flex items-center pr-0 sm:static sm:inset-auto ml-auto sm:ml-6 -mr-2 print:hidden order-3 sm:order-3 w-20 justify-end"
58
- itemprop="hasPart"
59
- itemscope
60
- itemtype="http://schema.org/SiteNavigationElement"
61
- >
62
- <a
63
- class="icon-btn mx-2"
64
- title=""
65
- aria-label=""
66
- href="#"
67
- itemprop="url"
68
- data-astro-reload
69
- >
70
- <Icon name="carbon:language" />
71
- </a>
72
- </div>
73
- </nav>
74
-
75
- <style is:global>
76
- nav {
77
- /* display: grid; */
78
- place-items: center;
79
- }
80
- </style>
1
+ ---
2
+ const { class: className } = Astro.props;
3
+ import { Icon } from "astro-icon/components";
4
+
5
+ const navItemsLeft = [
6
+ {
7
+ title: "Components",
8
+ description: "The building blocks for our UI.",
9
+ url: "/components/buttons",
10
+ img: "/Components.jpg",
11
+ },
12
+ {
13
+ title: "Patterns",
14
+ description: "Common patterns for building interfaces.",
15
+ url: "/patterns/introduction",
16
+ img: "/Patterns.jpg",
17
+ },
18
+ ];
19
+ ---
20
+
21
+ <nav
22
+ itemscope
23
+ itemtype="http://schema.org/WPHeader"
24
+ class:list={[
25
+ className,
26
+ "nav print-hidden mx-auto px-4 shadow-md relative flex items-center justify-between h-24 sm:h-14 flex-wrap sm:flex-nowrap pt-1 sm:pt-0",
27
+ ]}
28
+ >
29
+ <div class="flex items-center justify-start sm:items-stretch order-1">
30
+ <slot name="logo" />
31
+
32
+ <div class="hidden sm:block sm:ml-6">
33
+ <div class="flex space-x-4" itemprop="hasPart">
34
+ {
35
+ navItemsLeft.map(({ title, description, url, img }) => (
36
+ <a
37
+ href={url}
38
+ class="text-gray-400 hover:bg-blue-darker hover:text-white px-3 py-1 rounded-full text-sm font-medium"
39
+ title={description}
40
+ itemprop="url"
41
+ >
42
+ {title}
43
+ </a>
44
+ ))
45
+ }
46
+ </div>
47
+ </div>
48
+ </div>
49
+
50
+ <div
51
+ class="relative md:block sm:ml-4 w-full order-4 h-10 md:(w-64 mr-auto order-2)"
52
+ >
53
+ <slot name="search" />
54
+ </div>
55
+
56
+ <div
57
+ class="flex items-center pr-0 sm:static sm:inset-auto ml-auto sm:ml-6 -mr-2 print:hidden order-3 sm:order-3 w-20 justify-end"
58
+ itemprop="hasPart"
59
+ itemscope
60
+ itemtype="http://schema.org/SiteNavigationElement"
61
+ >
62
+ <a
63
+ class="icon-btn mx-2"
64
+ title=""
65
+ aria-label=""
66
+ href="#"
67
+ itemprop="url"
68
+ data-astro-reload
69
+ >
70
+ <Icon name="carbon:language" />
71
+ </a>
72
+ </div>
73
+ </nav>
74
+
75
+ <style is:global>
76
+ nav {
77
+ /* display: grid; */
78
+ place-items: center;
79
+ }
80
+ </style>
@@ -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>