spoko-design-system 0.0.8 → 0.1.0
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/package.json +1 -1
- package/src/components/Badges.vue +2 -5
- package/src/components/Breadcrumbs.vue +2 -2
- package/src/components/Button.vue +1 -5
- package/src/components/ButtonCopy.vue +8 -8
- package/src/components/Card.astro +22 -20
- package/src/components/Carousel.astro +14 -29
- package/src/components/Copyright.astro +9 -9
- package/src/components/FuckRussia.vue +22 -7
- package/src/components/Header/Header.astro +1 -2
- package/src/components/Headline.vue +1 -6
- package/src/components/Image.astro +19 -17
- package/src/components/Jumbatron.vue +1 -1
- package/src/components/LeftSidebar.astro +38 -30
- package/src/components/MainColors.vue +8 -14
- package/src/components/MainInput.vue +9 -12
- package/src/components/MainTable.vue +0 -2
- package/src/components/Modal.astro +13 -13
- package/src/components/PageContent.astro +3 -11
- package/src/components/PostHeader.astro +1 -2
- package/src/components/PrCode.vue +2 -1
- package/src/components/ProductCarousel.astro +38 -0
- package/src/components/ProductNumber.astro +1 -2
- package/src/components/ProductTile.astro +0 -4
- package/src/components/SlimBanner.vue +26 -15
- package/src/components/TableOfContents.astro +12 -9
- package/src/components/Translations.vue +4 -8
- package/src/components/flags/FlagPL.vue +2 -1
- package/src/config.ts +1 -0
- package/src/layouts/Layout.astro +48 -33
- package/src/layouts/MainLayout.astro +71 -48
- package/src/pages/components/carousel.mdx +44 -2
- package/src/pages/components/product-tile.mdx +18 -6
- package/src/pages/components/slimbanner.mdx +7 -7
- package/src/pages/core/introduction.mdx +1 -0
- package/uno.config.ts +1 -1
- package/src/components/Header/AstroLogo.astro +0 -7
- package/src/components/RightSidebar.astro +0 -12
package/package.json
CHANGED
|
@@ -15,10 +15,7 @@ const props = defineProps({
|
|
|
15
15
|
|
|
16
16
|
<template>
|
|
17
17
|
<div v-if="(props.badges && props.badges.length > 0)" class="absolute z-2">
|
|
18
|
-
<Badge
|
|
19
|
-
|
|
20
|
-
:badge="badge"
|
|
21
|
-
:class="(badge.toLocaleLowerCase().includes('gti') ? 'bg-red-600' : badge.toLocaleLowerCase().includes('motorsport') ? 'bg-blue-600' : 'bg-black')"
|
|
22
|
-
/>
|
|
18
|
+
<Badge v-for="(badge, index) in props.badges" :key="index" :badge="badge"
|
|
19
|
+
:class="(badge.toLocaleLowerCase().includes('gti') ? 'bg-red-600' : badge.toLocaleLowerCase().includes('motorsport') ? 'bg-blue-600' : 'bg-black')" />
|
|
23
20
|
</div>
|
|
24
21
|
</template>
|
|
@@ -18,7 +18,6 @@ const props = defineProps<{
|
|
|
18
18
|
}>();
|
|
19
19
|
|
|
20
20
|
const tag = props.href && props.href.length ? 'a' : 'button'
|
|
21
|
-
|
|
22
21
|
const classes = {
|
|
23
22
|
"btn-primary": props.primary,
|
|
24
23
|
"btn-primary-outline": props.primaryOutline,
|
|
@@ -33,13 +32,10 @@ const classes = {
|
|
|
33
32
|
"btn-normal": !props.small && !props.medium,
|
|
34
33
|
"rounded-full": props.rounded
|
|
35
34
|
};
|
|
36
|
-
|
|
37
|
-
|
|
38
35
|
</script>
|
|
39
36
|
|
|
40
|
-
|
|
41
37
|
<template>
|
|
42
|
-
<component
|
|
38
|
+
<component :is="tag" :class="classes" :href="props.href" :title="props.title ? props.title : null">
|
|
43
39
|
<slot></slot>
|
|
44
40
|
</component>
|
|
45
41
|
</template>
|
|
@@ -29,9 +29,9 @@ const { copy, copied, isSupported } = useClipboard({ source });
|
|
|
29
29
|
</script>
|
|
30
30
|
|
|
31
31
|
<template>
|
|
32
|
-
<button v-if="isSupported" :aria-label="String(texts.copy)"
|
|
33
|
-
class="btn-copy
|
|
34
|
-
|
|
32
|
+
<button v-if="isSupported" :aria-label="String(texts.copy)" class="btn-copy has-tooltip" @click="copy()">
|
|
33
|
+
<span :class="`tooltip rounded-full btn-copy-text ${tooltipClasses}`"
|
|
34
|
+
:data-text="!copied ? texts.copy : texts.copied" />
|
|
35
35
|
<Icon icon="ph-copy-simple-light" class="leading-none w-full h-full" />
|
|
36
36
|
</button>
|
|
37
37
|
</template>
|
|
@@ -39,9 +39,9 @@ const { copy, copied, isSupported } = useClipboard({ source });
|
|
|
39
39
|
<style>
|
|
40
40
|
.tooltip {
|
|
41
41
|
@apply invisible absolute;
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.has-tooltip:hover .tooltip {
|
|
45
|
+
@apply visible z-50;
|
|
46
|
+
}
|
|
47
47
|
</style>
|
|
@@ -1,25 +1,27 @@
|
|
|
1
1
|
---
|
|
2
2
|
const { class: className, imgSrc, imgAlt, href } = Astro.props;
|
|
3
3
|
|
|
4
|
-
import Image from
|
|
4
|
+
import Image from "../components/Image.astro";
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
<div
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
7
|
+
<div
|
|
8
|
+
class="bg-white border border-gray-200 rounded-lg shadow dark:bg-gray-800 dark:border-gray-700 overflow-hidden"
|
|
9
|
+
>
|
|
10
|
+
<a href={href} class="aspect-ratio-video block relative">
|
|
11
|
+
{
|
|
12
|
+
imgSrc && (
|
|
13
|
+
<Image
|
|
14
|
+
imageObject={{
|
|
15
|
+
src: imgSrc,
|
|
16
|
+
alt: imgAlt,
|
|
17
|
+
height: "405",
|
|
18
|
+
width: "720",
|
|
19
|
+
}}
|
|
20
|
+
/>
|
|
21
|
+
)
|
|
22
|
+
}
|
|
23
|
+
</a>
|
|
24
|
+
<div class="p-5">
|
|
25
|
+
<slot />
|
|
26
|
+
</div>
|
|
27
|
+
</div>
|
|
@@ -1,19 +1,15 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
2
|
+
export const productObject = {
|
|
3
|
+
name: "Combi-instrument MFA+",
|
|
4
|
+
url: "https://google.com",
|
|
5
|
+
number: "6R0920870F",
|
|
6
|
+
photo:
|
|
7
|
+
"https://img.freepik.com/darmowe-wektory/tlo-retro-modeli-geometrycznych_52683-17902.jpg?w=1380&t=st=1706311337",
|
|
8
|
+
};
|
|
3
9
|
---
|
|
4
|
-
<script>
|
|
5
|
-
import { register } from "swiper/element/bundle";
|
|
6
|
-
|
|
7
|
-
document.addEventListener("astro:page-load", () => {
|
|
8
|
-
//"DOMContentLoaded"
|
|
9
|
-
// register Swiper custom elements
|
|
10
|
-
register();
|
|
11
|
-
})
|
|
12
|
-
|
|
13
|
-
</script>
|
|
14
10
|
|
|
15
11
|
<swiper-container
|
|
16
|
-
class="max-w
|
|
12
|
+
class="max-w-full w-full flex overflow-hidden"
|
|
17
13
|
grid-rows="1"
|
|
18
14
|
mousewheel-force-to-axis="true"
|
|
19
15
|
navigation="true"
|
|
@@ -22,20 +18,9 @@
|
|
|
22
18
|
slides-per-view="auto"
|
|
23
19
|
space-between="0"
|
|
24
20
|
>
|
|
25
|
-
<swiper-slide class="bg-blue-50 p-12 border-1">
|
|
26
|
-
|
|
27
|
-
</swiper-slide>
|
|
28
|
-
<swiper-slide class="bg-blue-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
<swiper-slide class="bg-blue-200 p-12 border-1">
|
|
32
|
-
C
|
|
33
|
-
</swiper-slide>
|
|
34
|
-
<swiper-slide class="bg-blue-300 p-12 border-1">
|
|
35
|
-
D
|
|
36
|
-
</swiper-slide>
|
|
37
|
-
<swiper-slide class="bg-blue-400 p-12 border-1">
|
|
38
|
-
A
|
|
39
|
-
</swiper-slide>
|
|
40
|
-
|
|
41
|
-
</swiper-container>
|
|
21
|
+
<swiper-slide class="bg-blue-50 p-12 border-1 min-w-full">A</swiper-slide>
|
|
22
|
+
<swiper-slide class="bg-blue-100 p-12 border-1 min-w-full">B</swiper-slide>
|
|
23
|
+
<swiper-slide class="bg-blue-200 p-12 border-1 min-w-full">C</swiper-slide>
|
|
24
|
+
<swiper-slide class="bg-blue-300 p-12 border-1 min-w-full">D</swiper-slide>
|
|
25
|
+
<swiper-slide class="bg-blue-400 p-12 border-1 min-w-full">A</swiper-slide>
|
|
26
|
+
</swiper-container>
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
2
|
+
const { class: className } = Astro.props;
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
5
|
+
<div
|
|
6
|
+
class="bg-vw h-11 flex items-center font-headlight justify-between px-4"
|
|
7
|
+
class:list={[className]}
|
|
8
|
+
>
|
|
9
|
+
<slot name="left-item" />
|
|
10
|
+
<slot name="middle-item" />
|
|
11
|
+
<slot name="right-item" />
|
|
12
|
+
</div>
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
|
|
22
22
|
<style lang="scss">
|
|
23
23
|
.bg-ukraine {
|
|
24
|
-
background: linear-gradient(180deg, #0066cc 56%, rgba(255,204,0,1) 44%);
|
|
24
|
+
background: linear-gradient(180deg, #0066cc 56%, rgba(255, 204, 0, 1) 44%);
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
.animate-bull {
|
|
@@ -49,17 +49,32 @@
|
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
@keyframes AnimateBull1 {
|
|
52
|
-
0% {
|
|
53
|
-
|
|
52
|
+
0% {
|
|
53
|
+
transform: translate(14px, 0px);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
100% {
|
|
57
|
+
transform: translate(86px, 0px);
|
|
58
|
+
}
|
|
54
59
|
}
|
|
55
60
|
|
|
56
61
|
@keyframes AnimateBull2 {
|
|
57
|
-
0% {
|
|
58
|
-
|
|
62
|
+
0% {
|
|
63
|
+
transform: translate(38px, 0px);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
100% {
|
|
67
|
+
transform: translate(80px, 0px);
|
|
68
|
+
}
|
|
59
69
|
}
|
|
60
70
|
|
|
61
71
|
@keyframes AnimateBull3 {
|
|
62
|
-
0% {
|
|
63
|
-
|
|
72
|
+
0% {
|
|
73
|
+
transform: translate(62px, 0px);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
100% {
|
|
77
|
+
transform: translate(88px, 0px);
|
|
78
|
+
}
|
|
64
79
|
}
|
|
65
80
|
</style>
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
2
|
import type { PropType } from 'vue'
|
|
3
3
|
|
|
4
|
-
|
|
5
4
|
const props = defineProps({
|
|
6
5
|
as: {
|
|
7
6
|
type: String as PropType<'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'div' | 'span'>,
|
|
@@ -19,20 +18,16 @@ const props = defineProps({
|
|
|
19
18
|
default: false
|
|
20
19
|
}
|
|
21
20
|
})
|
|
22
|
-
|
|
23
21
|
</script>
|
|
24
22
|
|
|
25
23
|
<template>
|
|
26
24
|
<component :is="props.as" class="mb-2.5 flex sm:block md:flex items-center leading-none"
|
|
27
25
|
:class="`headline ${props.textSize ? `text-${props.textSize}` : 'text-xl'} ${props.underline ? 'headline--underline' : ''}`">
|
|
28
|
-
<!-- default -->
|
|
29
26
|
<slot />
|
|
30
|
-
|
|
31
27
|
</component>
|
|
32
28
|
</template>
|
|
33
29
|
|
|
34
30
|
<style lang="scss">
|
|
35
|
-
|
|
36
31
|
.headline--underline {
|
|
37
32
|
@apply relative pb-4;
|
|
38
33
|
|
|
@@ -57,4 +52,4 @@ const props = defineProps({
|
|
|
57
52
|
background-color: #64748b
|
|
58
53
|
}
|
|
59
54
|
}
|
|
60
|
-
</style>
|
|
55
|
+
</style>
|
|
@@ -1,28 +1,30 @@
|
|
|
1
1
|
---
|
|
2
|
-
import { Image } from
|
|
2
|
+
import { Image } from "astro:assets";
|
|
3
3
|
|
|
4
4
|
const { imageObject } = Astro.props;
|
|
5
5
|
let inputProps = {};
|
|
6
6
|
|
|
7
7
|
if (imageObject.index && imageObject.index === 1) {
|
|
8
|
-
inputProps[
|
|
9
|
-
inputProps[
|
|
8
|
+
inputProps["data-pagefind-meta"] = "image[src], image_alt[alt]";
|
|
9
|
+
inputProps["loading"] = "eager";
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
if (imageObject.srcset && imageObject.srcset.length) {
|
|
13
|
-
inputProps[
|
|
13
|
+
inputProps["widths"] = imageObject.srcset;
|
|
14
14
|
}
|
|
15
|
-
|
|
16
15
|
---
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
+
/>
|
|
@@ -19,7 +19,7 @@ const props = defineProps({
|
|
|
19
19
|
<div class="max-w-7xl mx-auto my-auto">
|
|
20
20
|
<div class="py-8 lg:w-full"
|
|
21
21
|
:class="props.small ? 'sm:py-12 md:py-14 lg:py-16 xl:py-20' : 'sm:py-16 md:py-20 lg:py-28 xl:py-32'">
|
|
22
|
-
<header class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
|
22
|
+
<header class="mx-auto max-w-7xl px-4 sm:px-6 lg:px-8">
|
|
23
23
|
<div class="text-center">
|
|
24
24
|
<h1 class="text-3xl tracking-tight sm:(text-4xl pt-0) md:text-5xl lg:text-6xl font-headlight text-white">
|
|
25
25
|
<slot name="intro" />
|
|
@@ -1,45 +1,53 @@
|
|
|
1
1
|
---
|
|
2
|
-
import { SIDEBAR } from
|
|
3
|
-
import { Astronav, MenuItems} from "astro-navbar";
|
|
2
|
+
import { SIDEBAR } from "../config";
|
|
3
|
+
import { Astronav, MenuItems } from "astro-navbar";
|
|
4
4
|
const { currentPage } = Astro.props;
|
|
5
5
|
const currentPageMatch = currentPage.slice(1);
|
|
6
6
|
|
|
7
7
|
const isCurrentPage = (item) => {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
if (item.link) {
|
|
9
|
+
return item.link.includes(currentPageMatch);
|
|
10
|
+
}
|
|
11
|
+
return false;
|
|
12
12
|
};
|
|
13
13
|
|
|
14
14
|
const getLinkClasses = (link) => {
|
|
15
|
-
|
|
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";
|
|
16
17
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
18
|
+
if (isCurrentPage(link)) {
|
|
19
|
+
return baseClasses + " border-slate-500 text-slate-900";
|
|
20
|
+
} else {
|
|
21
|
+
return baseClasses;
|
|
22
|
+
}
|
|
23
|
+
};
|
|
23
24
|
---
|
|
25
|
+
|
|
24
26
|
<Astronav>
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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>
|
|
35
44
|
</Astronav>
|
|
36
45
|
|
|
37
46
|
<script is:inline>
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
+
});
|
|
44
53
|
</script>
|
|
45
|
-
|
|
@@ -1,16 +1,17 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
import { COLORS } from "../design.config";
|
|
3
|
+
|
|
4
|
+
const colorNames = Object.keys(COLORS);
|
|
5
|
+
</script>
|
|
6
|
+
|
|
1
7
|
<template>
|
|
2
8
|
<div class="flex flex-col space-y-12">
|
|
3
9
|
<div v-for="name in colorNames" :key="name">
|
|
4
10
|
<h3 class="capitalize">{{ name }}</h3>
|
|
5
11
|
<div class="grid grid-cols-3 md:grid-cols-9">
|
|
6
12
|
<div v-for="color in COLORS[name]" :key="color" class="mb-6">
|
|
7
|
-
<div
|
|
8
|
-
|
|
9
|
-
:style="`background: ${color.value}`"
|
|
10
|
-
></div>
|
|
11
|
-
<div
|
|
12
|
-
class="text-sm flex flex-col text-center font-mono text-slate-500"
|
|
13
|
-
>
|
|
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">
|
|
14
15
|
<span>{{ color.name }}</span>
|
|
15
16
|
<span class="uppercase text-xs">{{ color.value }}</span>
|
|
16
17
|
</div>
|
|
@@ -20,10 +21,3 @@
|
|
|
20
21
|
</div>
|
|
21
22
|
</template>
|
|
22
23
|
|
|
23
|
-
<script setup lang="ts">
|
|
24
|
-
import { COLORS } from "../design.config";
|
|
25
|
-
|
|
26
|
-
const colorNames = Object.keys(COLORS);
|
|
27
|
-
</script>
|
|
28
|
-
|
|
29
|
-
<style scoped></style>
|
|
@@ -1,18 +1,15 @@
|
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
const props = defineProps<{
|
|
3
|
+
label: string;
|
|
4
|
+
}>();
|
|
5
|
+
</script>
|
|
6
|
+
|
|
1
7
|
<template>
|
|
2
8
|
<label class="group text-left w-full max-w-xs flex flex-col">
|
|
3
|
-
<span
|
|
4
|
-
|
|
5
|
-
>{{ label }}</span
|
|
6
|
-
>
|
|
9
|
+
<span class="group-hover:text-blue-600 ml-2 text-slate-600 text-sm group-focus-within:text-blue-600">{{ label
|
|
10
|
+
}}</span>
|
|
7
11
|
<input
|
|
8
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"
|
|
9
|
-
type="text"
|
|
10
|
-
/>
|
|
13
|
+
type="text" />
|
|
11
14
|
</label>
|
|
12
15
|
</template>
|
|
13
|
-
|
|
14
|
-
<script setup lang="ts">
|
|
15
|
-
const props = defineProps<{
|
|
16
|
-
label: string;
|
|
17
|
-
}>();
|
|
18
|
-
</script>
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
---
|
|
2
|
-
const {id, open} = Astro.props;
|
|
3
|
-
import Button from
|
|
2
|
+
const { id, open } = Astro.props;
|
|
3
|
+
import Button from "../components/Button.vue";
|
|
4
4
|
---
|
|
5
|
-
<style lang="scss">
|
|
6
|
-
dialog {
|
|
7
|
-
@apply fixed top-0 left-0 right-0 bottom-0;
|
|
8
5
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
top
|
|
12
|
-
right: 0px;
|
|
13
|
-
bottom: 0px;
|
|
14
|
-
left: 0px;
|
|
6
|
+
<style lang="scss">
|
|
7
|
+
dialog {
|
|
8
|
+
@apply fixed top-0 left-0 right-0 bottom-0;
|
|
15
9
|
|
|
10
|
+
&::backdrop {
|
|
11
|
+
@apply bg-gray-500/50 fixed;
|
|
12
|
+
top: 0px;
|
|
13
|
+
right: 0px;
|
|
14
|
+
bottom: 0px;
|
|
15
|
+
left: 0px;
|
|
16
|
+
}
|
|
16
17
|
}
|
|
17
|
-
}
|
|
18
18
|
</style>
|
|
19
19
|
|
|
20
20
|
<Button primary onclick={`window.${id}.showModal()`}>{open}</Button>
|
|
@@ -24,4 +24,4 @@ dialog {
|
|
|
24
24
|
<form method="dialog">
|
|
25
25
|
<slot name="close" />
|
|
26
26
|
</form>
|
|
27
|
-
</dialog>
|
|
27
|
+
</dialog>
|
|
@@ -1,13 +1,5 @@
|
|
|
1
|
-
---
|
|
2
|
-
const { content, githubEditUrl } = Astro.props;
|
|
3
|
-
const title = content.title;
|
|
4
|
-
---
|
|
5
|
-
|
|
6
1
|
<article id="article" class="content">
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
<slot />
|
|
11
|
-
</section>
|
|
2
|
+
<section class="main-section">
|
|
3
|
+
<slot />
|
|
4
|
+
</section>
|
|
12
5
|
</article>
|
|
13
|
-
|
|
@@ -16,8 +16,7 @@ interface Props {
|
|
|
16
16
|
}[];
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
const { image, title, categories, date, author } =
|
|
20
|
-
Astro.props;
|
|
19
|
+
const { image, title, categories, date, author } = Astro.props;
|
|
21
20
|
import CategoryLink from "./CategoryLink.astro";
|
|
22
21
|
import Date from "./Date.astro";
|
|
23
22
|
---
|
|
@@ -20,7 +20,8 @@ const props = defineProps({
|
|
|
20
20
|
</script>
|
|
21
21
|
|
|
22
22
|
<template>
|
|
23
|
-
<span data-pagefind-filter="PR-Code" class="btn-prcode "
|
|
23
|
+
<span data-pagefind-filter="PR-Code" class="btn-prcode "
|
|
24
|
+
:class="`btn-prcode--${props.prcode} ${props.isPdp ? ' btn-prcode--pdp' : ''}`">
|
|
24
25
|
{{ props.prcode }}
|
|
25
26
|
</span>
|
|
26
27
|
</template>
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
import ProductTile from "../components/ProductTile.astro";
|
|
3
|
+
export const productObject = {
|
|
4
|
+
name: "Combi-instrument MFA+",
|
|
5
|
+
url: "https://google.com",
|
|
6
|
+
number: "6R0920870F",
|
|
7
|
+
photo:
|
|
8
|
+
"https://img.freepik.com/darmowe-wektory/tlo-retro-modeli-geometrycznych_52683-17902.jpg?w=1380&t=st=1706311337",
|
|
9
|
+
};
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
<div class="bg-white rounded-lg p-4 w-full">
|
|
13
|
+
<swiper-container
|
|
14
|
+
class="flex w-full max-w-full"
|
|
15
|
+
grid-rows="1"
|
|
16
|
+
mousewheel-force-to-axis="true"
|
|
17
|
+
navigation="false"
|
|
18
|
+
scrollbar="false"
|
|
19
|
+
slides-per-view="auto"
|
|
20
|
+
space-between="0"
|
|
21
|
+
>
|
|
22
|
+
<swiper-slide class="carousel-product-tile">
|
|
23
|
+
<ProductTile productObject={productObject} />
|
|
24
|
+
</swiper-slide>
|
|
25
|
+
<swiper-slide class="carousel-product-tile">
|
|
26
|
+
<ProductTile productObject={productObject} />
|
|
27
|
+
</swiper-slide>
|
|
28
|
+
<swiper-slide class="carousel-product-tile">
|
|
29
|
+
<ProductTile productObject={productObject} />
|
|
30
|
+
</swiper-slide>
|
|
31
|
+
<swiper-slide class="carousel-product-tile">
|
|
32
|
+
<ProductTile productObject={productObject} />
|
|
33
|
+
</swiper-slide>
|
|
34
|
+
<swiper-slide class="carousel-product-tile">
|
|
35
|
+
<ProductTile productObject={productObject} />
|
|
36
|
+
</swiper-slide>
|
|
37
|
+
</swiper-container>
|
|
38
|
+
</div>
|
|
@@ -86,7 +86,7 @@ const niceName = (string: string, separator = "\u00A0") => {
|
|
|
86
86
|
</div>
|
|
87
87
|
)}
|
|
88
88
|
|
|
89
|
-
{
|
|
89
|
+
{copyDisabled && (
|
|
90
90
|
<ButtonCopy
|
|
91
91
|
productNumber={String(productNumber)}
|
|
92
92
|
texts={butonTexts}
|
|
@@ -94,7 +94,6 @@ const niceName = (string: string, separator = "\u00A0") => {
|
|
|
94
94
|
client:only
|
|
95
95
|
/>
|
|
96
96
|
)}
|
|
97
|
-
|
|
98
97
|
</div>
|
|
99
98
|
|
|
100
99
|
<div
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
---
|
|
2
2
|
const { productObject, locale, index } = Astro.props;
|
|
3
|
-
import i18next, { t } from "i18next";
|
|
4
3
|
import Image from "./Image.astro"
|
|
5
4
|
import ProductNumber from "./ProductNumber.astro"
|
|
6
5
|
|
|
@@ -9,7 +8,6 @@ import ProductNumber from "./ProductNumber.astro"
|
|
|
9
8
|
{ productObject &&
|
|
10
9
|
(
|
|
11
10
|
|
|
12
|
-
<div class="flex flex-wrap sm:flex-nowrap content-between w-64 md:(w-96 min-w-96) ml-1 lg:ml-1.5 relative bg-white mb-4 underline-on-hover">
|
|
13
11
|
<!-- product image -->
|
|
14
12
|
<div class="img--4/3 img--small">
|
|
15
13
|
{ productObject.photo !== null ?
|
|
@@ -46,7 +44,5 @@ import ProductNumber from "./ProductNumber.astro"
|
|
|
46
44
|
}
|
|
47
45
|
</div>
|
|
48
46
|
|
|
49
|
-
</div>
|
|
50
|
-
|
|
51
47
|
)}
|
|
52
48
|
|
|
@@ -15,34 +15,45 @@ const toggleVisibility = () => {
|
|
|
15
15
|
</script>
|
|
16
16
|
|
|
17
17
|
<template>
|
|
18
|
-
<div v-if="isShow" data-pagefind-ignore
|
|
19
|
-
|
|
20
|
-
<span
|
|
21
|
-
|
|
18
|
+
<div v-if="isShow" data-pagefind-ignore
|
|
19
|
+
class="slimbanner bg-lightBlue-500 drop-shadow-md z-2 px-4 sm:px-8 py-3 flex items-center justify-center text-xs sm:text-base leading-none text-white relative print-hidden">
|
|
20
|
+
<span
|
|
21
|
+
class="inline-block text-4xl w-6 h-3.5 min-w-[1.25rem] mr-3 bg-gradient-to-b stops-[#0057b7_50%,50%,#ffd700_100%]" />
|
|
22
|
+
<span class="leading-none "><span
|
|
23
|
+
data-text="We stand with our friends and colleagues in Ukraine. To support Ukraine in their time of need visit " />
|
|
24
|
+
<a href="https://polo.blue/support-ukraine/" target="_blank" rel="noopener"
|
|
25
|
+
class="underline underline-offset-2 hover:text-blue-wrc">this page</a>.
|
|
22
26
|
</span>
|
|
23
27
|
|
|
24
|
-
<button class="ml-3 text-white relative w-5 h-5"
|
|
25
|
-
|
|
28
|
+
<button class="ml-3 text-white relative w-5 h-5" v-if="props.showCloseButton" @click="toggleVisibility()"
|
|
29
|
+
aria-label="Toggle">
|
|
30
|
+
<span class="close"></span>
|
|
26
31
|
</button>
|
|
27
32
|
</div>
|
|
28
|
-
<div v-else data-pagefind-ignore
|
|
33
|
+
<div v-else data-pagefind-ignore
|
|
34
|
+
class="px-4 sm:px-8 py-3 flex items-center justify-center text-xs sm:text-base leading-none text-white relative bg-black drop-shadow-md z-2 ">
|
|
29
35
|
<div class="tracking-widest leading-none">
|
|
30
|
-
<span data-text="RUSSIA IS A" /> <span class="underline decoration-red-600 decoration-1 underline-offset-3"
|
|
36
|
+
<span data-text="RUSSIA IS A" /> <span class="underline decoration-red-600 decoration-1 underline-offset-3"
|
|
37
|
+
data-text="TERRORIST" /> <span data-text="STATE" />
|
|
31
38
|
</div>
|
|
32
|
-
<button class="ml-3 text-red-600 relative w-5 h-5"
|
|
33
|
-
|
|
39
|
+
<button class="ml-3 text-red-600 relative w-5 h-5" v-if="props.showCloseButton" @click="toggleVisibility()"
|
|
40
|
+
aria-label="Toggle">
|
|
41
|
+
<span class="close"></span>
|
|
34
42
|
</button>
|
|
35
43
|
</div>
|
|
36
44
|
</template>
|
|
37
45
|
|
|
38
46
|
<style lang="scss">
|
|
39
47
|
.close {
|
|
40
|
-
@apply absolute top-0 left-0 opacity-50
|
|
48
|
+
@apply absolute top-0 left-0 opacity-50;
|
|
41
49
|
}
|
|
50
|
+
|
|
42
51
|
.close:hover {
|
|
43
52
|
@apply opacity-100;
|
|
44
53
|
}
|
|
45
|
-
|
|
54
|
+
|
|
55
|
+
.close:before,
|
|
56
|
+
.close:after {
|
|
46
57
|
position: absolute;
|
|
47
58
|
left: 0.5rem;
|
|
48
59
|
content: ' ';
|
|
@@ -50,11 +61,11 @@ const toggleVisibility = () => {
|
|
|
50
61
|
width: 2px;
|
|
51
62
|
background-color: #fff;
|
|
52
63
|
}
|
|
64
|
+
|
|
53
65
|
.close:before {
|
|
54
66
|
transform: rotate(45deg);
|
|
55
67
|
}
|
|
68
|
+
|
|
56
69
|
.close:after {
|
|
57
70
|
transform: rotate(-45deg);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
</style>
|
|
71
|
+
}</style>
|
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
2
|
+
const { headers } = Astro.props;
|
|
3
3
|
---
|
|
4
|
+
|
|
4
5
|
<ul class="flex flex-col gap-4 mt-24">
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
6
|
+
{
|
|
7
|
+
headers.map(({ slug, text }) => {
|
|
8
|
+
return (
|
|
9
|
+
<li class="text-slate-400 hover:text-slate-800 hover:text-slate-900">
|
|
10
|
+
#<a href={`#${slug}`}>{text}</a>
|
|
11
|
+
</li>
|
|
12
|
+
);
|
|
13
|
+
})
|
|
14
|
+
}
|
|
15
|
+
</ul>
|
|
@@ -13,14 +13,10 @@ const props = defineProps({
|
|
|
13
13
|
</script>
|
|
14
14
|
|
|
15
15
|
<template>
|
|
16
|
-
<div
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
type="button"
|
|
21
|
-
:href="translations.uri"
|
|
22
|
-
:title="translations.name ? translations.name : translations.title"
|
|
23
|
-
:class="[lang === 'en' ? 'i-circle-flags:en' : '', lang === 'pl' ? 'i-circle-flags:pl' : '', 'w-5 hover:rotate--3']" />
|
|
16
|
+
<div data-pagefind-ignore v-if="props.translations !== null && props.translations.uri">
|
|
17
|
+
<a aria-label="Change language" type="button" :href="translations.uri"
|
|
18
|
+
:title="translations.name ? translations.name : translations.title"
|
|
19
|
+
:class="[lang === 'en' ? 'i-circle-flags:en' : '', lang === 'pl' ? 'i-circle-flags:pl' : '', 'w-5 hover:rotate--3']" />
|
|
24
20
|
</div>
|
|
25
21
|
</template>
|
|
26
22
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<span
|
|
2
|
+
<span
|
|
3
|
+
class="drop-shadow inline-block text-4xl w-6 h-3.5 min-w-[1.25rem] mr-3 bg-gradient-to-b stops-[#fff_50%,50%,#d4213d_100%]" />
|
|
3
4
|
</template>
|
package/src/config.ts
CHANGED
|
@@ -27,6 +27,7 @@ export const SIDEBAR = [
|
|
|
27
27
|
{ text: "Breadcrumbs", link: "/components/breadcrumbs" },
|
|
28
28
|
{ text: "Buttons", link: "/components/buttons" },
|
|
29
29
|
{ text: "Card", link: "/components/card" },
|
|
30
|
+
{ text: "Carousel", link: "/components/carousel" },
|
|
30
31
|
{ text: "Copyright", link: "/components/copyright" },
|
|
31
32
|
{ text: "HandDrive", link: "/components/hand-drive" },
|
|
32
33
|
{ text: "Headline", link: "/components/headline" },
|
package/src/layouts/Layout.astro
CHANGED
|
@@ -1,43 +1,58 @@
|
|
|
1
1
|
---
|
|
2
|
-
import HeadCommon from
|
|
3
|
-
import HeadSEO from
|
|
4
|
-
import * as CONFIG from
|
|
2
|
+
import HeadCommon from "../components/HeadCommon.astro";
|
|
3
|
+
import HeadSEO from "../components/HeadSEO.astro";
|
|
4
|
+
import * as CONFIG from "../config";
|
|
5
5
|
import { t, changeLanguage } from "i18next";
|
|
6
|
-
import
|
|
7
|
-
import Copyright from
|
|
6
|
+
import "../styles/main.scss";
|
|
7
|
+
import Copyright from "../components/Copyright.astro";
|
|
8
8
|
const locale = "en";
|
|
9
9
|
changeLanguage(locale);
|
|
10
10
|
const { content = {} } = Astro.props;
|
|
11
11
|
const canonicalURL = new URL(Astro.url.pathname, Astro.site).toString();
|
|
12
12
|
---
|
|
13
13
|
|
|
14
|
-
<html dir={content.dir ??
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
14
|
+
<html dir={content.dir ?? "ltr"} lang={content.lang ?? "en-us"} class="initial">
|
|
15
|
+
<head>
|
|
16
|
+
<HeadCommon />
|
|
17
|
+
<HeadSEO {content} canonicalURL={canonicalURL} />
|
|
18
|
+
<title>
|
|
19
|
+
{
|
|
20
|
+
content.title
|
|
21
|
+
? `${content.title} 🚀 ${CONFIG.SITE.title}`
|
|
22
|
+
: CONFIG.SITE.title
|
|
23
|
+
}
|
|
24
|
+
</title>
|
|
25
|
+
</head>
|
|
20
26
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
27
|
+
<body class="bg-blue-50">
|
|
28
|
+
<div class="bg-white z-10 mb-11 relative">
|
|
29
|
+
<slot />
|
|
30
|
+
</div>
|
|
31
|
+
<footer>
|
|
32
|
+
<Copyright class="fixed bottom-0 z-0 w-full">
|
|
33
|
+
<a
|
|
34
|
+
slot="middle-item"
|
|
35
|
+
href={`https://spoko.space`}
|
|
36
|
+
target="_blank"
|
|
37
|
+
rel="follow noopener"
|
|
38
|
+
class="flex my-auto items-center mx-auto"
|
|
39
|
+
title={`Proudly made in Poland by ${
|
|
40
|
+
import.meta.env.COPYRIGHT_DOMAIN
|
|
41
|
+
}`}
|
|
42
|
+
>
|
|
43
|
+
<div class="text-xxs md:text-xs mr-1 mt-0.5 whitespace-nowrap">
|
|
44
|
+
createdy by
|
|
45
|
+
</div>
|
|
46
|
+
<img
|
|
47
|
+
class="h-4 md:h-5 w-min"
|
|
48
|
+
src="spoko.space.svg"
|
|
49
|
+
alt="Modern Websites"
|
|
50
|
+
width="126"
|
|
51
|
+
height="23"
|
|
52
|
+
loading="lazy"
|
|
53
|
+
/>
|
|
54
|
+
</a>
|
|
55
|
+
</Copyright>
|
|
56
|
+
</footer>
|
|
57
|
+
</body>
|
|
43
58
|
</html>
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
---
|
|
2
|
-
import { ViewTransitions } from
|
|
3
|
-
import HeadCommon from
|
|
4
|
-
import HeadSEO from
|
|
5
|
-
import Header from
|
|
6
|
-
import PageContent from
|
|
7
|
-
import LeftSidebar from
|
|
8
|
-
import * as CONFIG from
|
|
2
|
+
import { ViewTransitions } from "astro:transitions";
|
|
3
|
+
import HeadCommon from "../components/HeadCommon.astro";
|
|
4
|
+
import HeadSEO from "../components/HeadSEO.astro";
|
|
5
|
+
import Header from "../components/Header/Header.astro";
|
|
6
|
+
import PageContent from "../components/PageContent.astro";
|
|
7
|
+
import LeftSidebar from "../components/LeftSidebar.astro";
|
|
8
|
+
import * as CONFIG from "../config";
|
|
9
9
|
import { t, changeLanguage } from "i18next";
|
|
10
|
-
import
|
|
11
|
-
import Copyright from
|
|
10
|
+
import "../styles/main.scss";
|
|
11
|
+
import Copyright from "../components/Copyright.astro";
|
|
12
12
|
const locale = "en";
|
|
13
13
|
changeLanguage(locale);
|
|
14
14
|
const { content = {} } = Astro.props;
|
|
@@ -16,45 +16,68 @@ const currentPage = Astro.url.pathname;
|
|
|
16
16
|
const canonicalURL = new URL(Astro.url.pathname, Astro.site).toString();
|
|
17
17
|
---
|
|
18
18
|
|
|
19
|
-
<
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
19
|
+
<script>
|
|
20
|
+
// Swiper Element
|
|
21
|
+
import { register } from "swiper/element/bundle";
|
|
22
|
+
document.addEventListener("astro:page-load", () => {
|
|
23
|
+
register();
|
|
24
|
+
});
|
|
25
|
+
</script>
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
<html dir={content.dir ?? "ltr"} lang={content.lang ?? "en-us"} class="initial">
|
|
28
|
+
<head>
|
|
29
|
+
<HeadCommon />
|
|
30
|
+
<HeadSEO {content} canonicalURL={canonicalURL} />
|
|
31
|
+
<title>
|
|
32
|
+
{
|
|
33
|
+
content.title
|
|
34
|
+
? `${content.title} 🚀 ${CONFIG.SITE.title}`
|
|
35
|
+
: CONFIG.SITE.title
|
|
36
|
+
}
|
|
37
|
+
</title>
|
|
38
|
+
<ViewTransitions />
|
|
39
|
+
</head>
|
|
31
40
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
41
|
+
<body class="bg-blue-50">
|
|
42
|
+
<div class="sticky top-0 z-20 w-full bg-white/70">
|
|
43
|
+
<Header currentPage={currentPage} />
|
|
44
|
+
</div>
|
|
45
|
+
|
|
46
|
+
<div class="flex bg-white z-10 mb-11 relative">
|
|
47
|
+
<div class="sticky top-0 flex lg:(h-screen w-64) z-50">
|
|
48
|
+
<div class="mr-auto" transition:name="sidebar">
|
|
49
|
+
<LeftSidebar currentPage={currentPage} />
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
<main class="pb-4 px-4 sm:px-8 col-auto sm:(pb-32) overflow-auto w-full">
|
|
53
|
+
<PageContent content={content} transition:name="content">
|
|
54
|
+
<slot />
|
|
55
|
+
</PageContent>
|
|
56
|
+
</main>
|
|
57
|
+
</div>
|
|
58
|
+
<footer>
|
|
59
|
+
<Copyright class="fixed bottom-0 z-0 w-full">
|
|
60
|
+
<a
|
|
61
|
+
slot="middle-item"
|
|
62
|
+
href="https://spoko.space"
|
|
63
|
+
target="_blank"
|
|
64
|
+
rel="follow noopener"
|
|
65
|
+
class="flex my-auto items-center mx-auto"
|
|
66
|
+
title={`Proudly made in Poland by spoko.space`}
|
|
67
|
+
>
|
|
68
|
+
<div class="text-xxs md:text-xs mr-1 mt-0.5 whitespace-nowrap">
|
|
69
|
+
createdy by
|
|
70
|
+
</div>
|
|
71
|
+
<img
|
|
72
|
+
class="h-4 md:h-5 w-min"
|
|
73
|
+
src="/spoko.space.svg"
|
|
74
|
+
alt="Modern Websites"
|
|
75
|
+
width="126"
|
|
76
|
+
height="23"
|
|
77
|
+
loading="lazy"
|
|
78
|
+
/>
|
|
79
|
+
</a>
|
|
80
|
+
</Copyright>
|
|
81
|
+
</footer>
|
|
82
|
+
</body>
|
|
60
83
|
</html>
|
|
@@ -3,6 +3,7 @@ title: "Carousel"
|
|
|
3
3
|
layout: "../../layouts/MainLayout.astro"
|
|
4
4
|
---
|
|
5
5
|
import Carousel from '../../components/Carousel.astro'
|
|
6
|
+
import ProductCarousel from '../../components/ProductCarousel.astro'
|
|
6
7
|
|
|
7
8
|
# Carousel
|
|
8
9
|
|
|
@@ -13,8 +14,49 @@ Carousel - modern carousel based on Swiper Element (Web Component)
|
|
|
13
14
|
</div>
|
|
14
15
|
|
|
15
16
|
```js
|
|
16
|
-
|
|
17
|
+
<swiper-container
|
|
18
|
+
class="max-w-full w-full flex overflow-hidden"
|
|
19
|
+
grid-rows="1"
|
|
20
|
+
mousewheel-force-to-axis="true"
|
|
21
|
+
navigation="true"
|
|
22
|
+
pagination-type="fraction"
|
|
23
|
+
scrollbar="false"
|
|
24
|
+
slides-per-view="auto"
|
|
25
|
+
space-between="0"
|
|
26
|
+
>
|
|
27
|
+
<swiper-slide class="bg-blue-50 p-12 border-1 min-w-full">A</swiper-slide>
|
|
28
|
+
<swiper-slide class="bg-blue-100 p-12 border-1 min-w-full">B</swiper-slide>
|
|
29
|
+
<swiper-slide class="bg-blue-200 p-12 border-1 min-w-full">C</swiper-slide>
|
|
30
|
+
<swiper-slide class="bg-blue-300 p-12 border-1 min-w-full">D</swiper-slide>
|
|
31
|
+
<swiper-slide class="bg-blue-400 p-12 border-1 min-w-full">A</swiper-slide>
|
|
32
|
+
</swiper-container>
|
|
17
33
|
```
|
|
18
34
|
#
|
|
19
35
|
|
|
20
|
-
Find the code for this page in the `src/pages/components/carousel.mdx` file.
|
|
36
|
+
Find the code for this page in the `src/pages/components/carousel.mdx` file.
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
## Product Carousel
|
|
40
|
+
<div class="component-preview">
|
|
41
|
+
<ProductCarousel />
|
|
42
|
+
</div>
|
|
43
|
+
```html
|
|
44
|
+
<div class="bg-white rounded-lg p-4 w-full">
|
|
45
|
+
<swiper-container
|
|
46
|
+
class="flex w-full max-w-full"
|
|
47
|
+
grid-rows="1"
|
|
48
|
+
mousewheel-force-to-axis="true"
|
|
49
|
+
navigation="false"
|
|
50
|
+
scrollbar="false"
|
|
51
|
+
slides-per-view="auto"
|
|
52
|
+
space-between="0"
|
|
53
|
+
>
|
|
54
|
+
<swiper-slide
|
|
55
|
+
class="carousel-product-tile"
|
|
56
|
+
>
|
|
57
|
+
<ProductTile productObject={productObject} />
|
|
58
|
+
</swiper-slide>
|
|
59
|
+
...
|
|
60
|
+
</swiper-container>
|
|
61
|
+
</div>
|
|
62
|
+
```
|
|
@@ -15,15 +15,27 @@ export const productObject = {
|
|
|
15
15
|
|
|
16
16
|
ProductTile - product link component which can be used for carousels, section with related products, recently added etc.
|
|
17
17
|
|
|
18
|
+
It requires a container with a specific width - it's best to set it directly in the carousel's `<swiper-slide>` tag.
|
|
19
|
+
#
|
|
20
|
+
|
|
18
21
|
<div class="component-preview">
|
|
19
22
|
<div class="flex flex-wrap bg-white w-full p-4 pb-0">
|
|
20
23
|
|
|
21
|
-
<
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
<
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
<div class="flex flex-wrap sm:flex-nowrap content-between w-64 min-w-64 md:(w-96 min-w-96) ml-1 lg:ml-1.5 relative bg-white mb-4 underline-on-hover">
|
|
25
|
+
<ProductTile productObject={productObject} />
|
|
26
|
+
</div>
|
|
27
|
+
<div class="flex flex-wrap sm:flex-nowrap content-between w-64 min-w-64 md:(w-96 min-w-96) ml-1 lg:ml-1.5 relative bg-white mb-4 underline-on-hover">
|
|
28
|
+
<ProductTile productObject={productObject} />
|
|
29
|
+
</div>
|
|
30
|
+
<div class="flex flex-wrap sm:flex-nowrap content-between w-64 min-w-64 md:(w-96 min-w-96) ml-1 lg:ml-1.5 relative bg-white mb-4 underline-on-hover">
|
|
31
|
+
<ProductTile productObject={productObject} />
|
|
32
|
+
</div>
|
|
33
|
+
<div class="flex flex-wrap sm:flex-nowrap content-between w-64 min-w-64 md:(w-96 min-w-96) ml-1 lg:ml-1.5 relative bg-white mb-4 underline-on-hover">
|
|
34
|
+
<ProductTile productObject={productObject} />
|
|
35
|
+
</div>
|
|
36
|
+
<div class="flex flex-wrap sm:flex-nowrap content-between w-64 min-w-64 md:(w-96 min-w-96) ml-1 lg:ml-1.5 relative bg-white mb-4 underline-on-hover">
|
|
37
|
+
<ProductTile productObject={productObject} />
|
|
38
|
+
</div>
|
|
27
39
|
</div>
|
|
28
40
|
</div>
|
|
29
41
|
|
|
@@ -9,13 +9,13 @@ import SlimBanner from '../../components/SlimBanner.vue'
|
|
|
9
9
|
SlimBanner - solidarity with Ukraine.
|
|
10
10
|
|
|
11
11
|
<div class="component-preview">
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
12
|
+
<SlimBanner
|
|
13
|
+
class="w-full"
|
|
14
|
+
client:load
|
|
15
|
+
showCloseButton
|
|
16
|
+
transition:name="slim-banner"
|
|
17
|
+
transition:persist
|
|
18
|
+
/>
|
|
19
19
|
</div>
|
|
20
20
|
|
|
21
21
|
```js
|
|
@@ -20,6 +20,7 @@ The project is still in the development phase, use at your own risk ;-)
|
|
|
20
20
|
Although it's not required, you can create folders for new sections.
|
|
21
21
|
|
|
22
22
|
To show the section on the left side navigation, add it to the navigation config file at `src/config.ts`.
|
|
23
|
+
#
|
|
23
24
|
|
|
24
25
|
Example:
|
|
25
26
|
|
package/uno.config.ts
CHANGED
|
@@ -41,7 +41,7 @@ export default defineConfig({
|
|
|
41
41
|
['img--small', 'w-60 sm:(w-22) xl:(w-30)'],
|
|
42
42
|
['img--medium', 'w-60'],
|
|
43
43
|
['underline-on-hover', 'relative flex w-full bg-white pb-1 dark:bg-blue-901 after:absolute after:bg-lightBlue-500 after:w-[calc(100%-1rem)] after:left-0 after:h-px after:top-[calc(100%-1px)] after:bottom-1 after:content-empty after:scale-x-0 after:transition-transform-300 after:origin-top-right hover:after:origin-top-left hover:after:scale-x-100'],
|
|
44
|
-
|
|
44
|
+
['carousel-product-tile', 'flex flex-wrap sm:flex-nowrap content-between w-64 min-w-64 lg:(w-28.57% min-w-28.57%) 2xl:(w-24.09% min-w-24.09%) relative'],
|
|
45
45
|
['btn-primary', 'bg-lightBlue-500 border border-transparent font-medium hover:bg-lightBlue-600 inline-flex items-center justify-center shadow text-base text-white'],
|
|
46
46
|
['btn-primary-outline', 'border-lightBlue-500 border font-medium inline-flex items-center justify-center shadow text-base text-lightBlue-500 transition-all hover:(bg-lightBlue-500 text-white)'],
|
|
47
47
|
['btn-secondary', 'bg-gray-500 border border-transparent font-medium hover:bg-gray-600 inline-flex items-center justify-center shadow text-base text-white'],
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
import TableOfContents from './TableOfContents.astro';
|
|
3
|
-
const { content } = Astro.props;
|
|
4
|
-
const headers = content.astro?.headers || [];
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
<nav aria-labelledby="grid-right">
|
|
8
|
-
<div class="px-8">
|
|
9
|
-
<TableOfContents headers={headers} />
|
|
10
|
-
<pre>{JSON.stringify(content)}</pre>
|
|
11
|
-
</div>
|
|
12
|
-
</nav>
|