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.
- package/.astro/settings.json +4 -4
- package/.astro/types.d.ts +1 -1
- package/.claude/settings.local.json +2 -1
- package/.github/dependabot.yml +11 -11
- package/.github/todo.yml +3 -3
- package/.github/workflows/deploy.yml +39 -39
- package/.stackblitzrc +5 -5
- package/.vscode/extensions.json +5 -5
- package/.vscode/launch.json +11 -11
- package/.vscode/settings.json +5 -5
- package/LICENSE +21 -21
- package/README.md +116 -116
- package/astro-i18next.config.mjs +17 -17
- package/astro-i18next.config.ts +10 -10
- package/astro.config.mjs +86 -86
- package/dev-dist/sw.js +91 -91
- package/dev-dist/workbox-c676b6d3.js +3391 -3391
- package/icon.config.ts +310 -310
- package/index.ts +70 -70
- package/package.json +124 -124
- package/public/arrow-bottom.svg +7 -7
- package/public/fonts/lg.svg +53 -53
- package/public/fonts/vwhead-bold-demo.html +549 -549
- package/public/fonts/vwhead-regular-demo.html +549 -549
- package/public/fonts/vwtext-bold-demo.html +549 -549
- package/public/fonts/vwtext-regular-demo.html +549 -549
- package/public/github.svg +3 -3
- package/public/grid_dot.svg +4 -4
- package/public/linkedin.svg +44 -44
- package/public/locales/en/translation.json +12 -12
- package/public/locales/pl/translation.json +12 -12
- package/public/make-scrollable-code-focusable.js +3 -3
- package/public/pagefind.yml +3 -3
- package/public/polo.blue.svg +29 -29
- package/public/spoko.space.svg +71 -71
- package/public/twitter.svg +46 -46
- package/renovate.json +6 -6
- package/sandbox.config.json +11 -11
- package/src/MyComponent.astro +8 -8
- package/src/components/Badge.vue +19 -19
- package/src/components/Badges.vue +21 -21
- package/src/components/Breadcrumbs.vue +94 -94
- package/src/components/Button.vue +101 -101
- package/src/components/ButtonCopy.astro +183 -183
- package/src/components/ButtonCopy.vue +36 -36
- package/src/components/Card.astro +27 -27
- package/src/components/Carousel.astro +26 -26
- package/src/components/Category/CategoriesCarousel.astro +101 -101
- package/src/components/Category/CategoryDetails.astro +169 -169
- package/src/components/Category/CategoryLink.vue +28 -28
- package/src/components/Category/CategorySidebarToggler.vue +9 -9
- package/src/components/Category/CategoryTile.astro +37 -37
- package/src/components/Category/CategoryViewToggler.astro +89 -89
- package/src/components/Category/SubCategoryLink.vue +19 -19
- package/src/components/Copyright.astro +12 -12
- package/src/components/Date.astro +7 -7
- package/src/components/Faq.astro +33 -33
- package/src/components/FaqItem.astro +80 -80
- package/src/components/FeaturesList.vue +37 -37
- package/src/components/FuckRussia.vue +62 -62
- package/src/components/HandDrive.astro +29 -29
- package/src/components/Header/Header.astro +210 -210
- package/src/components/Header/SkipToContent.astro +1 -1
- package/src/components/Headline.vue +87 -87
- package/src/components/Image.astro +30 -30
- package/src/components/{layout → Layout}/CallToAction.astro +52 -52
- package/src/components/{layout → Layout}/Container.astro +7 -7
- package/src/components/{layout → Layout}/Header.astro +80 -80
- package/src/components/LeftSidebar.astro +53 -53
- package/src/components/MainColors.vue +22 -22
- package/src/components/MainInput.vue +15 -15
- package/src/components/Modal.astro +27 -27
- package/src/components/PageContent.astro +5 -5
- package/src/components/PartNumber.vue +27 -27
- package/src/components/Post/PostCategories.astro +41 -41
- package/src/components/Post/PostCategories.vue +30 -30
- package/src/components/PostHeader.astro +103 -103
- package/src/components/PrCode.vue +141 -141
- package/src/components/Product/ProductButton.vue +18 -18
- package/src/components/Product/ProductCarousel.astro +35 -35
- package/src/components/Product/ProductEngineType.vue +42 -42
- package/src/components/Product/ProductImage.astro +40 -40
- package/src/components/Product/ProductLink.astro +101 -101
- package/src/components/Product/ProductLink.vue +59 -59
- package/src/components/Product/ProductLinkInfo.astro +37 -37
- package/src/components/Product/ProductNumber.astro +60 -60
- package/src/components/ProductCarousel.astro +38 -38
- package/src/components/ProductCodes.vue +39 -39
- package/src/components/ProductDetailName.vue +52 -52
- package/src/components/ProductDetailsList.vue +216 -216
- package/src/components/ProductTile.astro +48 -48
- package/src/components/Quote.vue +23 -23
- package/src/components/ReloadPrompt.astro +50 -50
- package/src/components/SlimBanner.vue +72 -72
- package/src/components/Table.vue +32 -32
- package/src/components/TableOfContents.astro +15 -15
- package/src/components/Translations.vue +23 -23
- package/src/components/flags/FlagPL.vue +3 -3
- package/src/components/flags/FlagUA.vue +2 -2
- package/src/config.ts +56 -56
- package/src/design.config.ts +98 -98
- package/src/env.d.ts +6 -6
- package/src/layouts/Layout.astro +61 -61
- package/src/layouts/MainLayout.astro +81 -81
- package/src/layouts/partials/FooterCommon.astro +4 -4
- package/src/layouts/partials/HeadCommon.astro +44 -44
- package/src/layouts/partials/HeadSEO.astro +41 -41
- package/src/pages/components/badges.mdx +57 -57
- package/src/pages/components/breadcrumbs.mdx +139 -139
- package/src/pages/components/buttons.mdx +360 -360
- package/src/pages/components/card.mdx +294 -294
- package/src/pages/components/carousel.mdx +62 -62
- package/src/pages/components/copyright.mdx +42 -42
- package/src/pages/components/details-list.mdx +115 -115
- package/src/pages/components/features-list.mdx +37 -37
- package/src/pages/components/flags.mdx +49 -49
- package/src/pages/components/fuck-russia.mdx +39 -39
- package/src/pages/components/hand-drive.mdx +38 -38
- package/src/pages/components/headline.mdx +137 -137
- package/src/pages/components/icons.astro +135 -135
- package/src/pages/components/image.mdx +513 -513
- package/src/pages/components/input.mdx +367 -367
- package/src/pages/components/jumbotron.mdx +359 -359
- package/src/pages/components/modal.mdx +64 -64
- package/src/pages/components/post-header.mdx +64 -64
- package/src/pages/components/pr-code.mdx +65 -65
- package/src/pages/components/product-number.mdx +58 -58
- package/src/pages/components/product-tile.mdx +51 -51
- package/src/pages/components/quote.mdx +33 -33
- package/src/pages/components/slimbanner.mdx +35 -35
- package/src/pages/components/table.mdx +108 -108
- package/src/pages/core/colors.mdx +10 -10
- package/src/pages/core/grid.mdx +89 -89
- package/src/pages/core/introduction.mdx +77 -77
- package/src/pages/core/shadows.astro +20 -20
- package/src/pages/core/typography.astro +49 -49
- package/src/pages/index.astro +133 -133
- package/src/pages/patterns/introduction.mdx +60 -60
- package/src/pwa.ts +12 -12
- package/src/styles/_variables.scss +70 -70
- package/src/styles/base/base.css +184 -184
- package/src/styles/base/grid.css +92 -92
- package/src/styles/base/typography.css +70 -70
- package/src/styles/content.css +73 -73
- package/src/styles/main.css +7 -7
- package/src/types/Product.ts +31 -31
- package/src/types/astro.d.ts +3 -3
- package/src/utils/product/getPriceFormatted.ts +15 -15
- package/src/utils/product/getProductChecklist.ts +17 -17
- package/src/utils/product/useFormatProductNumber.ts +41 -41
- package/src/utils/seo/getShorterDescription.ts +14 -14
- package/src/utils/text/formatDate.ts +5 -5
- package/src/utils/text/formatLocaleNumber.ts +6 -6
- package/src/utils/text/formatPad.ts +12 -12
- package/src/utils/text/getNumberFormatted.ts +33 -33
- package/src/utils/text/getTranslatedLink.ts +5 -5
- package/src/utils/text.ts +19 -19
- package/tailwind.config.cjs +8 -8
- package/tsconfig.json +28 -28
- package/uno-config/index.ts +268 -266
- package/uno-config/theme/breakpoints.ts +9 -9
- package/uno-config/theme/colors.ts +64 -64
- package/uno-config/theme/dimensions.ts +17 -17
- package/uno-config/theme/effects.ts +14 -14
- package/uno-config/theme/grid.ts +10 -10
- package/uno-config/theme/index.ts +28 -28
- package/uno-config/theme/shortcuts/buttons.ts +53 -53
- package/uno-config/theme/shortcuts/components.ts +123 -123
- package/uno-config/theme/shortcuts/index.ts +20 -20
- package/uno-config/theme/shortcuts/layout.ts +74 -74
- package/uno-config/theme/typography.ts +29 -29
- 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>
|