spoko-design-system 0.0.9 → 0.1.1
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/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 +5 -15
- package/src/components/ProductNumber.astro +1 -2
- 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 +26 -26
- package/src/layouts/Layout.astro +48 -33
- package/src/layouts/MainLayout.astro +69 -53
- package/src/pages/components/slimbanner.mdx +7 -7
- package/src/pages/core/introduction.mdx +1 -0
- package/src/components/Header/AstroLogo.astro +0 -7
- package/src/components/RightSidebar.astro +0 -12
- package/src/components/newFile.tsx +0 -42
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,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>
|
|
@@ -19,29 +19,19 @@ export const productObject = {
|
|
|
19
19
|
slides-per-view="auto"
|
|
20
20
|
space-between="0"
|
|
21
21
|
>
|
|
22
|
-
<swiper-slide
|
|
23
|
-
class="carousel-product-tile"
|
|
24
|
-
>
|
|
22
|
+
<swiper-slide class="carousel-product-tile">
|
|
25
23
|
<ProductTile productObject={productObject} />
|
|
26
24
|
</swiper-slide>
|
|
27
|
-
<swiper-slide
|
|
28
|
-
class="carousel-product-tile"
|
|
29
|
-
>
|
|
25
|
+
<swiper-slide class="carousel-product-tile">
|
|
30
26
|
<ProductTile productObject={productObject} />
|
|
31
27
|
</swiper-slide>
|
|
32
|
-
<swiper-slide
|
|
33
|
-
class="carousel-product-tile"
|
|
34
|
-
>
|
|
28
|
+
<swiper-slide class="carousel-product-tile">
|
|
35
29
|
<ProductTile productObject={productObject} />
|
|
36
30
|
</swiper-slide>
|
|
37
|
-
<swiper-slide
|
|
38
|
-
class="carousel-product-tile"
|
|
39
|
-
>
|
|
31
|
+
<swiper-slide class="carousel-product-tile">
|
|
40
32
|
<ProductTile productObject={productObject} />
|
|
41
33
|
</swiper-slide>
|
|
42
|
-
<swiper-slide
|
|
43
|
-
class="carousel-product-tile"
|
|
44
|
-
>
|
|
34
|
+
<swiper-slide class="carousel-product-tile">
|
|
45
35
|
<ProductTile productObject={productObject} />
|
|
46
36
|
</swiper-slide>
|
|
47
37
|
</swiper-container>
|
|
@@ -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
|
|
@@ -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
|
@@ -17,36 +17,36 @@ export const OPEN_GRAPH = {
|
|
|
17
17
|
|
|
18
18
|
export const SIDEBAR = [
|
|
19
19
|
{ text: "Core", header: true },
|
|
20
|
-
{ text: "Introduction", link: "/core/introduction" },
|
|
21
|
-
{ text: "Colors", link: "/core/colors" },
|
|
22
|
-
{ text: "Typography", link: "/core/typography" },
|
|
23
|
-
{ text: "Shadows", link: "/core/shadows" },
|
|
20
|
+
{ text: "Introduction", link: "/core/introduction/" },
|
|
21
|
+
{ text: "Colors", link: "/core/colors/" },
|
|
22
|
+
{ text: "Typography", link: "/core/typography/" },
|
|
23
|
+
{ text: "Shadows", link: "/core/shadows/" },
|
|
24
24
|
|
|
25
25
|
{ text: "Components", header: true },
|
|
26
|
-
{ text: "Badges", link: "/components/badges" },
|
|
27
|
-
{ text: "Breadcrumbs", link: "/components/breadcrumbs" },
|
|
28
|
-
{ text: "Buttons", link: "/components/buttons" },
|
|
29
|
-
{ text: "Card", link: "/components/card" },
|
|
30
|
-
{ text: "Carousel", link: "/components/carousel" },
|
|
31
|
-
{ text: "Copyright", link: "/components/copyright" },
|
|
32
|
-
{ text: "HandDrive", link: "/components/hand-drive" },
|
|
33
|
-
{ text: "Headline", link: "/components/headline" },
|
|
34
|
-
{ text: "Icons", link: "/components/icons" },
|
|
35
|
-
{ text: "Image", link: "/components/image" },
|
|
36
|
-
{ text: "Input", link: "/components/input" },
|
|
37
|
-
{ text: "Jumbatron", link: "/components/jumbatron" },
|
|
38
|
-
{ text: "Modal", link: "/components/modal" },
|
|
39
|
-
{ text: "PostHeader", link: "/components/post-header" },
|
|
40
|
-
{ text: "PR-Code", link: "/components/pr-code" },
|
|
41
|
-
{ text: "Product Number", link: "/components/product-number" },
|
|
42
|
-
{ text: "Product Tile", link: "/components/product-tile" },
|
|
43
|
-
{ text: "Table", link: "/components/table" },
|
|
26
|
+
{ text: "Badges", link: "/components/badges/" },
|
|
27
|
+
{ text: "Breadcrumbs", link: "/components/breadcrumbs/" },
|
|
28
|
+
{ text: "Buttons", link: "/components/buttons/" },
|
|
29
|
+
{ text: "Card", link: "/components/card/" },
|
|
30
|
+
{ text: "Carousel", link: "/components/carousel/" },
|
|
31
|
+
{ text: "Copyright", link: "/components/copyright/" },
|
|
32
|
+
{ text: "HandDrive", link: "/components/hand-drive/" },
|
|
33
|
+
{ text: "Headline", link: "/components/headline/" },
|
|
34
|
+
{ text: "Icons", link: "/components/icons/" },
|
|
35
|
+
{ text: "Image", link: "/components/image/" },
|
|
36
|
+
{ text: "Input", link: "/components/input/" },
|
|
37
|
+
{ text: "Jumbatron", link: "/components/jumbatron/" },
|
|
38
|
+
{ text: "Modal", link: "/components/modal/" },
|
|
39
|
+
{ text: "PostHeader", link: "/components/post-header/" },
|
|
40
|
+
{ text: "PR-Code", link: "/components/pr-code/" },
|
|
41
|
+
{ text: "Product Number", link: "/components/product-number/" },
|
|
42
|
+
{ text: "Product Tile", link: "/components/product-tile/" },
|
|
43
|
+
{ text: "Table", link: "/components/table/" },
|
|
44
44
|
|
|
45
45
|
{ text: "Extras", header: true },
|
|
46
|
-
{ text: "Flags", link: "/components/flags" },
|
|
47
|
-
{ text: "SlimBanner", link: "/components/slimbanner" },
|
|
48
|
-
{ text: "FuckRussia", link: "/components/fuck-russia" },
|
|
46
|
+
{ text: "Flags", link: "/components/flags/" },
|
|
47
|
+
{ text: "SlimBanner", link: "/components/slimbanner/" },
|
|
48
|
+
{ text: "FuckRussia", link: "/components/fuck-russia/" },
|
|
49
49
|
|
|
50
50
|
{ text: "Patterns", header: true },
|
|
51
|
-
{ text: "Introduction", link: "/patterns/introduction" },
|
|
51
|
+
{ text: "Introduction", link: "/patterns/introduction/" },
|
|
52
52
|
];
|
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,67 +1,83 @@
|
|
|
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;
|
|
15
15
|
const currentPage = Astro.url.pathname;
|
|
16
16
|
const canonicalURL = new URL(Astro.url.pathname, Astro.site).toString();
|
|
17
17
|
---
|
|
18
|
+
|
|
18
19
|
<script>
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
20
|
+
// Swiper Element
|
|
21
|
+
import { register } from "swiper/element/bundle";
|
|
22
|
+
document.addEventListener("astro:page-load", () => {
|
|
23
|
+
register();
|
|
24
|
+
});
|
|
24
25
|
</script>
|
|
25
26
|
|
|
26
|
-
<html dir={content.dir ??
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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>
|
|
33
40
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
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>
|
|
38
45
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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>
|
|
67
83
|
</html>
|
|
@@ -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
|
|
|
@@ -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>
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import Image from "./Image.astro";
|
|
2
|
-
import ProductNumber from "./ProductNumber.astro";
|
|
3
|
-
|
|
4
|
-
<Fragment>
|
|
5
|
-
{productObject &&
|
|
6
|
-
(
|
|
7
|
-
|
|
8
|
-
<Fragment><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">
|
|
9
|
-
{/** product image */}
|
|
10
|
-
<div class="img--4/3 img--small">
|
|
11
|
-
{productObject.photo !== null ?
|
|
12
|
-
<Fragment><Image imageObject={{
|
|
13
|
-
src: 'https://img.freepik.com/darmowe-wektory/tlo-retro-modeli-geometrycznych_52683-17902.jpg?w=1380&t=st=1706311337',
|
|
14
|
-
alt: 'Image Alt',
|
|
15
|
-
height: '180',
|
|
16
|
-
width: '240',
|
|
17
|
-
class: 'img--overlay object-cover'
|
|
18
|
-
}} /></Fragment>
|
|
19
|
-
:
|
|
20
|
-
<Fragment><img src="/1x1.png" class="bg-gray-100/70" alt={productObject.name} /></Fragment>}
|
|
21
|
-
</div>
|
|
22
|
-
|
|
23
|
-
{/** product deails */}
|
|
24
|
-
<div class="sm:pl-4 flex flex-col">
|
|
25
|
-
<a class="font-light leading-none mb-2 pr-4 line-clamp-2 h-[2em] before:(content-empty absolute left-0 right-4 h-full top-0)" href={productObject.url} itemprop="url" title={productObject.number}>
|
|
26
|
-
{productObject.name}
|
|
27
|
-
</a>
|
|
28
|
-
|
|
29
|
-
<ProductNumber productNumber={productObject.number} copyDisabled={true} />
|
|
30
|
-
|
|
31
|
-
{index !== null &&
|
|
32
|
-
(<Fragment><meta itemprop="position" content={String(index)} /></Fragment>
|
|
33
|
-
,
|
|
34
|
-
<Fragment><meta itemprop="name" content={productObject.name} /></Fragment>)}
|
|
35
|
-
</div>
|
|
36
|
-
|
|
37
|
-
</div></Fragment>
|
|
38
|
-
|
|
39
|
-
)}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
</Fragment>;
|