spoko-design-system 0.0.1 → 0.0.5
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/icon.d.ts +8109 -10
- package/.github/workflows/deploy.yml +39 -39
- package/.stackblitzrc +5 -5
- package/.vscode/extensions.json +5 -4
- package/.vscode/launch.json +11 -11
- package/.vscode/settings.json +6 -0
- package/LICENSE +21 -21
- package/Layout/Header.astro +111 -89
- package/README.md +94 -69
- package/astro-i18next.config.mjs +17 -17
- package/astro-i18next.config.ts +10 -10
- package/astro.config.mjs +51 -42
- package/index.ts +6 -6
- package/package.json +25 -17
- package/public/astro-design-system-logo.svg +10 -10
- package/public/favicon.ico +0 -0
- package/public/favicon.svg +0 -0
- 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 +8 -5
- package/public/locales/pl/translation.json +8 -5
- package/public/make-scrollable-code-focusable.js +3 -3
- package/public/polo.blue.svg +29 -0
- package/public/spoko.space.svg +71 -0
- package/public/twitter.svg +46 -46
- package/sandbox.config.json +11 -11
- package/src/MyComponent.astro +8 -8
- package/src/components/Badge.vue +19 -19
- package/src/components/Badges.vue +24 -23
- package/src/components/Breadcrumbs.vue +108 -111
- package/src/components/Button.vue +37 -0
- package/src/components/ButtonCopy.vue +52 -0
- package/src/components/Card.astro +25 -0
- package/src/components/CategoryLink.astro +18 -0
- package/src/components/Copyright.astro +11 -11
- package/src/components/Date.astro +7 -0
- package/src/components/FuckRussia.vue +65 -65
- package/src/components/HandDrive.astro +29 -30
- package/src/components/HeadCommon.astro +40 -40
- package/src/components/HeadSEO.astro +41 -41
- package/src/components/Header/AstroLogo.astro +7 -27
- package/src/components/Header/Header.astro +44 -48
- package/src/components/Header/SkipToContent.astro +1 -1
- package/src/components/Headline.vue +60 -0
- package/src/components/Image.astro +30 -0
- package/src/components/Jumbatron.vue +46 -31
- package/src/components/LeftSidebar.astro +45 -44
- package/src/components/MainColors.vue +29 -29
- package/src/components/MainInput.vue +18 -18
- package/src/components/MainTable.vue +40 -45
- package/src/components/Modal.astro +30 -0
- package/src/components/PageContent.astro +14 -14
- package/src/components/PostHeader.astro +104 -0
- package/src/components/PrCode.vue +156 -0
- package/src/components/ProductNumber.astro +117 -0
- package/src/components/ProductTile.astro +54 -0
- package/src/components/RightSidebar.astro +15 -11
- package/src/components/SlimBanner.vue +59 -59
- package/src/components/TableOfContents.astro +11 -11
- package/src/components/Translations.vue +27 -0
- package/src/components/flags/FlagPL.vue +2 -2
- package/src/components/flags/FlagUA.vue +2 -2
- package/src/components/layout/Header.astro +50 -69
- package/src/config.ts +51 -42
- package/src/design.config.ts +73 -92
- package/src/env.d.ts +1 -1
- package/src/flag-poland.svg +1 -0
- package/src/flag-uk.svg +1 -0
- package/src/layouts/Layout.astro +43 -0
- package/src/layouts/MainLayout.astro +60 -50
- package/src/pages/components/badges.mdx +69 -35
- package/src/pages/components/breadcrumbs.mdx +136 -103
- package/src/pages/components/buttons.mdx +143 -60
- package/src/pages/components/card.mdx +40 -0
- package/src/pages/components/copyright.mdx +41 -24
- package/src/pages/components/flags.mdx +40 -26
- package/src/pages/components/fuck-russia.mdx +39 -16
- package/src/pages/components/hand-drive.mdx +38 -27
- package/src/pages/components/headline.mdx +148 -0
- package/src/pages/components/icons.astro +54 -45
- package/src/pages/components/image.mdx +502 -0
- package/src/pages/components/input.mdx +45 -14
- package/src/pages/components/jumbatron.mdx +71 -48
- package/src/pages/components/modal.mdx +64 -0
- package/src/pages/components/post-header.mdx +58 -0
- package/src/pages/components/pr-code.mdx +41 -0
- package/src/pages/components/product-number.mdx +65 -0
- package/src/pages/components/product-tile.mdx +39 -0
- package/src/pages/components/slimbanner.mdx +29 -27
- package/src/pages/components/table.mdx +39 -20
- package/src/pages/core/colors.mdx +8 -8
- package/src/pages/core/introduction.mdx +74 -68
- package/src/pages/core/shadows.astro +20 -20
- package/src/pages/core/typography.astro +46 -46
- package/src/pages/index.astro +70 -52
- package/src/pages/patterns/introduction.mdx +60 -61
- package/src/styles/_variables.scss +75 -75
- package/src/styles/base/_base.scss +166 -158
- package/src/styles/base/_typography.scss +147 -147
- package/src/styles/content.scss +66 -71
- package/src/styles/main.scss +22 -22
- package/tailwind.config.cjs +8 -8
- package/tsconfig.json +11 -11
- package/uno.config.ts +246 -227
- package/src/components/MainButton.vue +0 -26
- package/src/components/MainStatusPill.vue +0 -32
- package/src/pages/components/status-pill.mdx +0 -22
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<label class="group text-left w-full max-w-xs flex flex-col">
|
|
3
|
-
<span
|
|
4
|
-
class="group-hover:text-blue-600 ml-2 text-slate-600 text-sm group-focus-within:text-blue-600"
|
|
5
|
-
>{{ label }}</span
|
|
6
|
-
>
|
|
7
|
-
<input
|
|
8
|
-
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
|
-
/>
|
|
11
|
-
</label>
|
|
12
|
-
</template>
|
|
13
|
-
|
|
14
|
-
<script setup lang="ts">
|
|
15
|
-
const props = defineProps<{
|
|
16
|
-
label: string;
|
|
17
|
-
}>();
|
|
18
|
-
</script>
|
|
1
|
+
<template>
|
|
2
|
+
<label class="group text-left w-full max-w-xs flex flex-col">
|
|
3
|
+
<span
|
|
4
|
+
class="group-hover:text-blue-600 ml-2 text-slate-600 text-sm group-focus-within:text-blue-600"
|
|
5
|
+
>{{ label }}</span
|
|
6
|
+
>
|
|
7
|
+
<input
|
|
8
|
+
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
|
+
/>
|
|
11
|
+
</label>
|
|
12
|
+
</template>
|
|
13
|
+
|
|
14
|
+
<script setup lang="ts">
|
|
15
|
+
const props = defineProps<{
|
|
16
|
+
label: string;
|
|
17
|
+
}>();
|
|
18
|
+
</script>
|
|
@@ -1,45 +1,40 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<table class="table-auto text-left border bg-white shadow-md">
|
|
3
|
-
<thead class="bg-slate-800 text-white">
|
|
4
|
-
<tr class="border">
|
|
5
|
-
<th class="px-4 py-2">id</th>
|
|
6
|
-
<th class="px-4 py-2">Name</th>
|
|
7
|
-
<th class="px-4 py-2">Email</th>
|
|
8
|
-
</tr>
|
|
9
|
-
</thead>
|
|
10
|
-
<tbody>
|
|
11
|
-
<tr class="border" v-for="row in tableData" :key="row">
|
|
12
|
-
<td class="px-4 py-2" v-for="key in Object.keys(row)" :key="key">
|
|
13
|
-
{{ row[key] }}
|
|
14
|
-
</td>
|
|
15
|
-
</tr>
|
|
16
|
-
</tbody>
|
|
17
|
-
</table>
|
|
18
|
-
</template>
|
|
19
|
-
|
|
20
|
-
<script setup lang="ts">
|
|
21
|
-
const tableData = [
|
|
22
|
-
{
|
|
23
|
-
id: 1,
|
|
24
|
-
name: "
|
|
25
|
-
email: "
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
id: 2,
|
|
29
|
-
name: "
|
|
30
|
-
email: "
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
id: 3,
|
|
34
|
-
name: "
|
|
35
|
-
email: "
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
},
|
|
42
|
-
];
|
|
43
|
-
</script>
|
|
44
|
-
|
|
45
|
-
<style scoped></style>
|
|
1
|
+
<template>
|
|
2
|
+
<table class="table-auto text-left border bg-white shadow-md">
|
|
3
|
+
<thead class="bg-slate-800 text-white">
|
|
4
|
+
<tr class="border">
|
|
5
|
+
<th class="px-4 py-2">id</th>
|
|
6
|
+
<th class="px-4 py-2">Name</th>
|
|
7
|
+
<th class="px-4 py-2">Email</th>
|
|
8
|
+
</tr>
|
|
9
|
+
</thead>
|
|
10
|
+
<tbody>
|
|
11
|
+
<tr class="border" v-for="row in tableData" :key="row">
|
|
12
|
+
<td class="px-4 py-2" v-for="key in Object.keys(row)" :key="key">
|
|
13
|
+
{{ row[key] }}
|
|
14
|
+
</td>
|
|
15
|
+
</tr>
|
|
16
|
+
</tbody>
|
|
17
|
+
</table>
|
|
18
|
+
</template>
|
|
19
|
+
|
|
20
|
+
<script setup lang="ts">
|
|
21
|
+
const tableData = [
|
|
22
|
+
{
|
|
23
|
+
id: 1,
|
|
24
|
+
name: "Lorem Ipsum",
|
|
25
|
+
email: "lorem@email.com",
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
id: 2,
|
|
29
|
+
name: "Chuck Norris",
|
|
30
|
+
email: "ipsum@email.com",
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
id: 3,
|
|
34
|
+
name: "Ipsum Lorem",
|
|
35
|
+
email: "lorem@email.com",
|
|
36
|
+
}
|
|
37
|
+
];
|
|
38
|
+
</script>
|
|
39
|
+
|
|
40
|
+
<style scoped></style>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
const {id, open} = Astro.props;
|
|
3
|
+
import Button from '../components/Button.vue'
|
|
4
|
+
---
|
|
5
|
+
<style lang="scss">
|
|
6
|
+
dialog {
|
|
7
|
+
@apply fixed top-0 left-0 right-0 bottom-0;
|
|
8
|
+
// position: fixed;
|
|
9
|
+
// left: 50%;
|
|
10
|
+
// top: 50%;
|
|
11
|
+
// transform: translate(-50%, -50%);
|
|
12
|
+
&::backdrop {
|
|
13
|
+
@apply bg-gray-500/50 fixed;
|
|
14
|
+
top: 0px;
|
|
15
|
+
right: 0px;
|
|
16
|
+
bottom: 0px;
|
|
17
|
+
left: 0px;
|
|
18
|
+
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
</style>
|
|
22
|
+
|
|
23
|
+
<Button primary onclick={`window.${id}.showModal()`}>{open}</Button>
|
|
24
|
+
|
|
25
|
+
<dialog id={id} class="p-6">
|
|
26
|
+
<slot name="main" />
|
|
27
|
+
<form method="dialog">
|
|
28
|
+
<slot name="close" />
|
|
29
|
+
</form>
|
|
30
|
+
</dialog>
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
---
|
|
2
|
-
const { content, githubEditUrl } = Astro.props;
|
|
3
|
-
const title = content.title;
|
|
4
|
-
// const headers = content.astro.headers;
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
<article id="article" class="content">
|
|
8
|
-
<section class="main-section">
|
|
9
|
-
<nav class="block sm:hidden">
|
|
10
|
-
</nav>
|
|
11
|
-
<slot />
|
|
12
|
-
</section>
|
|
13
|
-
</article>
|
|
14
|
-
|
|
1
|
+
---
|
|
2
|
+
const { content, githubEditUrl } = Astro.props;
|
|
3
|
+
const title = content.title;
|
|
4
|
+
// const headers = content.astro.headers;
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
<article id="article" class="content">
|
|
8
|
+
<section class="main-section">
|
|
9
|
+
<nav class="block sm:hidden">
|
|
10
|
+
</nav>
|
|
11
|
+
<slot />
|
|
12
|
+
</section>
|
|
13
|
+
</article>
|
|
14
|
+
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
---
|
|
2
|
+
interface Props {
|
|
3
|
+
title: string;
|
|
4
|
+
image: string;
|
|
5
|
+
date?: string | null;
|
|
6
|
+
lang: string;
|
|
7
|
+
|
|
8
|
+
author: {
|
|
9
|
+
firstName: string;
|
|
10
|
+
name: string;
|
|
11
|
+
} | null;
|
|
12
|
+
|
|
13
|
+
categories: {
|
|
14
|
+
name: string;
|
|
15
|
+
uri: string;
|
|
16
|
+
}[];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const { image, title, categories, date, author } =
|
|
20
|
+
Astro.props;
|
|
21
|
+
import CategoryLink from "./CategoryLink.astro";
|
|
22
|
+
import Date from "./Date.astro";
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
<header
|
|
26
|
+
class="post-header pt-11 w-full justify-center text-white z-2 bg-blue-900"
|
|
27
|
+
>
|
|
28
|
+
<div class="heading flex flex-wrap">
|
|
29
|
+
<div
|
|
30
|
+
class="w-full sm:max-w-[640px] md:max-w-3xl lg:max-w-5xl xl:max-w-7xl 2xl:max-w-[1536px] px-4 py-5 flex flex-col flex-wrap"
|
|
31
|
+
>
|
|
32
|
+
<h1
|
|
33
|
+
class="font-textbold text-2xl mb-1 sm:text-3xl md:(text-4xl mb-3) xl:text-6xl mt-1 order-2 line-clamp-3 pb-1"
|
|
34
|
+
>
|
|
35
|
+
{title}
|
|
36
|
+
</h1>
|
|
37
|
+
<CategoryLink categories={categories} />
|
|
38
|
+
<div class="order-3 flex items-center text-gray-1 00">
|
|
39
|
+
{
|
|
40
|
+
author && (
|
|
41
|
+
<span class="text-sm" title={author.firstName} data-pagefind-ignore>
|
|
42
|
+
{author.name}
|
|
43
|
+
</span>
|
|
44
|
+
)
|
|
45
|
+
}
|
|
46
|
+
{author && date && <span class="mx-1">-</span>}
|
|
47
|
+
{date && <Date date={date} />}
|
|
48
|
+
</div>
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
<div class="featured-image">
|
|
52
|
+
<img src={image} alt={title} />
|
|
53
|
+
</div>
|
|
54
|
+
</header>
|
|
55
|
+
|
|
56
|
+
<style lang="scss">
|
|
57
|
+
.post-header {
|
|
58
|
+
@apply flex relative items-center;
|
|
59
|
+
min-height: 19vw;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.heading {
|
|
63
|
+
@apply text-white relative flex items-center justify-center mt-auto w-full pt-11 z-[2];
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.featured-image {
|
|
67
|
+
@apply absolute top-0 bottom-0 left-0 right-0 overflow-hidden w-full bg-gray-100 z-1;
|
|
68
|
+
|
|
69
|
+
&:before,
|
|
70
|
+
&:after {
|
|
71
|
+
@apply content-empty top-0 bottom-0 left-0 right-0 absolute;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
&:before {
|
|
75
|
+
z-index: 5;
|
|
76
|
+
background: linear-gradient(
|
|
77
|
+
0deg,
|
|
78
|
+
rgba(0, 0, 0, 0.95),
|
|
79
|
+
transparent 30%,
|
|
80
|
+
transparent 70%,
|
|
81
|
+
rgba(0, 0, 0, 0.95)
|
|
82
|
+
);
|
|
83
|
+
opacity: 0.5;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
&:after {
|
|
87
|
+
background: radial-gradient(circle at 50% 85%, #00437a 0, #001e50 100%);
|
|
88
|
+
opacity: 0.8;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
img {
|
|
92
|
+
@apply w-full h-full object-cover block max-w-full;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
</style>
|
|
96
|
+
|
|
97
|
+
<style is:global>
|
|
98
|
+
.icon {
|
|
99
|
+
@apply text-lightBlue-400 mr-2;
|
|
100
|
+
width: 1em;
|
|
101
|
+
height: 1em;
|
|
102
|
+
fill: currentcolor;
|
|
103
|
+
}
|
|
104
|
+
</style>
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
<script lang="ts" setup>
|
|
2
|
+
/*
|
|
3
|
+
VAG group (VW/Audi/Skoda/Seat/Porsche/Bentley/Lamborghini/Ducati/Cupra/Scania/MAN) manufacturer PR-Code
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { PropType } from 'vue'
|
|
7
|
+
|
|
8
|
+
const props = defineProps({
|
|
9
|
+
prcode: {
|
|
10
|
+
type: Object as PropType<string[] | null>,
|
|
11
|
+
default: null,
|
|
12
|
+
required: true,
|
|
13
|
+
},
|
|
14
|
+
isPdp: {
|
|
15
|
+
type: Boolean,
|
|
16
|
+
default: false,
|
|
17
|
+
required: false,
|
|
18
|
+
},
|
|
19
|
+
})
|
|
20
|
+
</script>
|
|
21
|
+
|
|
22
|
+
<template>
|
|
23
|
+
<span data-pagefind-filter="PR-Code" class="btn-prcode " :class="`btn-prcode--${props.prcode} ${props.isPdp ? ' btn-prcode--pdp' : ''}`">
|
|
24
|
+
{{ props.prcode }}
|
|
25
|
+
</span>
|
|
26
|
+
</template>
|
|
27
|
+
|
|
28
|
+
<style lang="scss" scoped>
|
|
29
|
+
.btn-prcode {
|
|
30
|
+
|
|
31
|
+
&--pdp {
|
|
32
|
+
@apply mb-1
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
&:before {
|
|
36
|
+
@apply rounded-2 shadow-sm py-0.5 px-2 bg-gray-100 whitespace-nowrap text-xs dark:text-black dark:bg-lightBlue-500 text-center z-50;
|
|
37
|
+
|
|
38
|
+
display: none;
|
|
39
|
+
position: absolute;
|
|
40
|
+
top: -10px;
|
|
41
|
+
transform: translateY(-50%) translateX(-50%);
|
|
42
|
+
left: 50%;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
&:hover:before {
|
|
46
|
+
display: block;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
&--2JK {
|
|
50
|
+
color: #f3881d;
|
|
51
|
+
|
|
52
|
+
&:before {
|
|
53
|
+
content: 'CROSS';
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
&--1LR,
|
|
58
|
+
&--1ZG,
|
|
59
|
+
&--1ZJ {
|
|
60
|
+
&:before {
|
|
61
|
+
content: '⌀ 256 mm';
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
&--1KD,
|
|
66
|
+
&--1ZP,
|
|
67
|
+
&--1ZR {
|
|
68
|
+
&:before {
|
|
69
|
+
content: '⌀ 310 mm';
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
&--1ZD,
|
|
74
|
+
&--1ZC,
|
|
75
|
+
&--1LN {
|
|
76
|
+
&:before {
|
|
77
|
+
content: '⌀ 288 mm; LUCAS';
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
&--2JZ {
|
|
82
|
+
@apply: text-lightBlue-500;
|
|
83
|
+
|
|
84
|
+
&:before {
|
|
85
|
+
content: 'Bluemotion';
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
&--7L6 {
|
|
90
|
+
@apply: text-lightBlue-500;
|
|
91
|
+
|
|
92
|
+
&:before {
|
|
93
|
+
content: 'Bluemotion (CFWA + start-stop)';
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
&--1KK,
|
|
98
|
+
&--1KT,
|
|
99
|
+
&--1KV,
|
|
100
|
+
&--1LV,
|
|
101
|
+
&--2EJ {
|
|
102
|
+
&:before {
|
|
103
|
+
content: '⌀ 230 mm';
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
&--2JE {
|
|
108
|
+
@apply text-lightBlue-700;
|
|
109
|
+
|
|
110
|
+
&:before {
|
|
111
|
+
content: 'BlueGT';
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
&--2JP {
|
|
116
|
+
&:before {
|
|
117
|
+
content: 'R-Line';
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// WRC Street R
|
|
122
|
+
&--E5M,
|
|
123
|
+
|
|
124
|
+
// emblems/stickers
|
|
125
|
+
&--1KD,
|
|
126
|
+
|
|
127
|
+
//brakes
|
|
128
|
+
&--1ZP,
|
|
129
|
+
|
|
130
|
+
//brakes
|
|
131
|
+
&--2JQ,
|
|
132
|
+
|
|
133
|
+
//bumpers / engine parts
|
|
134
|
+
&--TA2 {
|
|
135
|
+
color: blue;
|
|
136
|
+
|
|
137
|
+
&:before {
|
|
138
|
+
content: 'R WRC Street';
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// GTI
|
|
143
|
+
&--1KV,
|
|
144
|
+
&--1ZD,
|
|
145
|
+
&--1ZR,
|
|
146
|
+
&--0NH,
|
|
147
|
+
&--2JD {
|
|
148
|
+
color: red;
|
|
149
|
+
|
|
150
|
+
&:before {
|
|
151
|
+
content: 'GTI';
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
}
|
|
156
|
+
</style>
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
---
|
|
2
|
+
import { t } from "i18next";
|
|
3
|
+
import ButtonCopy from "./ButtonCopy.vue";
|
|
4
|
+
|
|
5
|
+
const {
|
|
6
|
+
copyDisabled,
|
|
7
|
+
productNumber,
|
|
8
|
+
isPdp,
|
|
9
|
+
small,
|
|
10
|
+
big,
|
|
11
|
+
class: className,
|
|
12
|
+
} = Astro.props;
|
|
13
|
+
|
|
14
|
+
const butonTexts = {
|
|
15
|
+
copy: t("copy"),
|
|
16
|
+
copied: t("copied"),
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
const isLetter = (string: string) => {
|
|
20
|
+
return string.toLowerCase() !== string.toUpperCase();
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
const niceName = (string: string, separator = "\u00A0") => {
|
|
24
|
+
let word = string; //e.g. to 6Q0947106EY20 .split('+')
|
|
25
|
+
|
|
26
|
+
if (
|
|
27
|
+
isLetter(string[0]) === true &&
|
|
28
|
+
isLetter(string[1]) === false &&
|
|
29
|
+
string.length === 9
|
|
30
|
+
) {
|
|
31
|
+
// mainly liquids
|
|
32
|
+
word = string
|
|
33
|
+
.replace(
|
|
34
|
+
/^(\w{1})(\w{3})(\w{3})(.*)$/,
|
|
35
|
+
`$1${separator}$2${separator}$3${separator}$4`,
|
|
36
|
+
)
|
|
37
|
+
.replace(/(^\s+|\s+$)/, "");
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// wheels / emblems e.g. 6R0601025AK8Z8 --> 6R0 601 025 AB 8Z8 || 6C0601025DFZZ --> 6C0 601 025 D FZZ || 6R0853433ADA1 -> 6R0 853 433 A DA1
|
|
41
|
+
else if (string.length >= 13) {
|
|
42
|
+
// console.log('part number: wheels / emblems', word)
|
|
43
|
+
word = string
|
|
44
|
+
.replace(
|
|
45
|
+
/^(\w{3})(\w{3})(\w{3})(.*)(\w{3})$/,
|
|
46
|
+
`$1${separator}$2${separator}$3${separator}$4${separator}$5`,
|
|
47
|
+
)
|
|
48
|
+
.replace(/(^\s+|\s+$)/, "");
|
|
49
|
+
} else if (string.length > 12) {
|
|
50
|
+
// accessories / mats
|
|
51
|
+
word = string
|
|
52
|
+
.replace(
|
|
53
|
+
/^(\w{3})(\w{3})(\w{3})(\w{1})(.*)$/,
|
|
54
|
+
`$1${separator}$2${separator}$3${separator}$4${separator}$5`,
|
|
55
|
+
)
|
|
56
|
+
.replace(/(^\s+|\s+$)/, "");
|
|
57
|
+
} else {
|
|
58
|
+
// other parts
|
|
59
|
+
word = string
|
|
60
|
+
.replace(/(\w{3})/g, `$1${separator}`)
|
|
61
|
+
.replace(/(^\s+|\s+$)/, "");
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return word.replace(" ", separator);
|
|
65
|
+
};
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
{
|
|
69
|
+
productNumber !== null && (
|
|
70
|
+
<div
|
|
71
|
+
class={`product-number ${
|
|
72
|
+
big ? "text-lg" : `text-sm ${className ? className : "mt-2 sm:mt-0"}`
|
|
73
|
+
}`}
|
|
74
|
+
>
|
|
75
|
+
<div
|
|
76
|
+
class={`inline-flex leading-none relative ${small ? "w-full" : ""}`}
|
|
77
|
+
itemprop="identifier"
|
|
78
|
+
>
|
|
79
|
+
{isPdp ? (
|
|
80
|
+
<h2 id={productNumber} class="product-code">
|
|
81
|
+
{productNumber}
|
|
82
|
+
</h2>
|
|
83
|
+
) : (
|
|
84
|
+
<div id={productNumber} class="product-code">
|
|
85
|
+
{productNumber}
|
|
86
|
+
</div>
|
|
87
|
+
)}
|
|
88
|
+
|
|
89
|
+
{ copyDisabled && (
|
|
90
|
+
<ButtonCopy
|
|
91
|
+
productNumber={String(productNumber)}
|
|
92
|
+
texts={butonTexts}
|
|
93
|
+
tooltipClasses=""
|
|
94
|
+
client:only
|
|
95
|
+
/>
|
|
96
|
+
)}
|
|
97
|
+
|
|
98
|
+
</div>
|
|
99
|
+
|
|
100
|
+
<div
|
|
101
|
+
class={`code-formatted ${small ? "tracking-wide" : "tracking-tight"}`}
|
|
102
|
+
>
|
|
103
|
+
<div class="relative inset-0" data-pagefind-ignore>
|
|
104
|
+
{niceName(productNumber, ".")}
|
|
105
|
+
</div>
|
|
106
|
+
<div class="absolute inset-0" data-pagefind-ignore>
|
|
107
|
+
{niceName(productNumber, "-")}
|
|
108
|
+
</div>
|
|
109
|
+
{isPdp ? (
|
|
110
|
+
<h3 class="number-secondary">{niceName(productNumber)}</h3>
|
|
111
|
+
) : (
|
|
112
|
+
<div class="number-secondary">{niceName(productNumber)}</div>
|
|
113
|
+
)}
|
|
114
|
+
</div>
|
|
115
|
+
</div>
|
|
116
|
+
)
|
|
117
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
const { productObject, locale, index } = Astro.props;
|
|
3
|
+
import i18next, { t } from "i18next";
|
|
4
|
+
import Image from "./Image.astro"
|
|
5
|
+
import ProductNumber from "./ProductNumber.astro"
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
{ productObject &&
|
|
10
|
+
(
|
|
11
|
+
|
|
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">
|
|
13
|
+
<!-- product image -->
|
|
14
|
+
<div>
|
|
15
|
+
{ productObject.photo !== null ?
|
|
16
|
+
<div class="img--4/3 img--small">
|
|
17
|
+
<Image
|
|
18
|
+
imageObject={
|
|
19
|
+
{
|
|
20
|
+
src: 'https://img.freepik.com/darmowe-wektory/tlo-retro-modeli-geometrycznych_52683-17902.jpg?w=1380&t=st=1706311337',
|
|
21
|
+
alt: 'Image Alt',
|
|
22
|
+
height: '180',
|
|
23
|
+
width: '240',
|
|
24
|
+
class: 'img--overlay object-cover'
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/>
|
|
28
|
+
</div>
|
|
29
|
+
:
|
|
30
|
+
<img src="/1x1.png" class="bg-gray-100/70" alt={productObject.name} />
|
|
31
|
+
}
|
|
32
|
+
</div>
|
|
33
|
+
|
|
34
|
+
<!-- product deails -->
|
|
35
|
+
<div class="sm:pl-4 flex flex-col" >
|
|
36
|
+
<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)"
|
|
37
|
+
href={productObject.url} itemprop="url"
|
|
38
|
+
title={productObject.number}
|
|
39
|
+
>
|
|
40
|
+
{ productObject.name }
|
|
41
|
+
</a>
|
|
42
|
+
|
|
43
|
+
<ProductNumber productNumber={productObject.number} copyDisabled={true} />
|
|
44
|
+
|
|
45
|
+
{ index !== null &&
|
|
46
|
+
( <meta itemprop="position" content={String(index)} />
|
|
47
|
+
<meta itemprop="name" content={productObject.name} /> )
|
|
48
|
+
}
|
|
49
|
+
</div>
|
|
50
|
+
|
|
51
|
+
</div>
|
|
52
|
+
|
|
53
|
+
)}
|
|
54
|
+
|
|
@@ -1,11 +1,15 @@
|
|
|
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
|
-
|
|
11
|
-
</
|
|
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>
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
<!-- {"title":"Introduction","description":"Docs intro","file":"C:/www/2024/elements/src/pages/core/introduction.mdx","url":"/core/introduction"} -->
|