spoko-design-system 1.1.13 → 1.1.15
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/CHANGELOG.md +12 -0
- package/package.json +1 -1
- package/src/components/Badge.vue +4 -1
- package/src/components/Badges.vue +4 -1
- package/src/components/Breadcrumbs.vue +42 -14
- package/src/components/Button.vue +1 -1
- package/src/components/ButtonCopy.vue +9 -2
- package/src/components/Category/CategoryLink.vue +5 -1
- package/src/components/Category/CategorySidebarToggler.vue +5 -1
- package/src/components/FeaturesList.vue +9 -2
- package/src/components/FuckRussia.vue +36 -9
- package/src/components/Input.vue +22 -9
- package/src/components/MainColors.vue +16 -4
- package/src/components/MainInput.vue +2 -3
- package/src/components/PartNumber.vue +4 -1
- package/src/components/Product/ProductButton.vue +4 -1
- package/src/components/Product/ProductDetailName.vue +4 -1
- package/src/components/Product/ProductDetails.vue +59 -17
- package/src/components/Product/ProductDoc.vue +4 -1
- package/src/components/Product/ProductEngineType.vue +4 -1
- package/src/components/Product/ProductLink.vue +27 -6
- package/src/components/Product/ProductModel.vue +4 -1
- package/src/components/Product/ProductModels.vue +10 -2
- package/src/components/Product/ProductPositions.vue +5 -1
- package/src/components/ProductCodes.vue +9 -2
- package/src/components/ProductDetailName.vue +4 -1
- package/src/components/ProductDetailsList.vue +49 -14
- package/src/components/SlimBanner.vue +15 -13
- package/src/components/Table.vue +15 -3
- package/src/components/Translations.vue +6 -1
- package/src/pwa.ts +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
## [1.1.15](https://github.com/polo-blue/sds/compare/v1.1.14...v1.1.15) (2025-09-23)
|
|
2
|
+
|
|
3
|
+
### Bug Fixes
|
|
4
|
+
|
|
5
|
+
* resolve majority of ESLint warnings ([54c4b7f](https://github.com/polo-blue/sds/commit/54c4b7f611301523ef61359cd62e818026033549))
|
|
6
|
+
|
|
7
|
+
## [1.1.14](https://github.com/polo-blue/sds/compare/v1.1.13...v1.1.14) (2025-09-23)
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
|
|
11
|
+
* use props.label in MainInput.vue template to resolve unused props error ([abd1e7b](https://github.com/polo-blue/sds/commit/abd1e7b724873b005d0cf5274af4aa189653c94a))
|
|
12
|
+
|
|
1
13
|
## [1.1.13](https://github.com/polo-blue/sds/compare/v1.1.12...v1.1.13) (2025-09-23)
|
|
2
14
|
|
|
3
15
|
### Bug Fixes
|
package/package.json
CHANGED
package/src/components/Badge.vue
CHANGED
|
@@ -14,7 +14,10 @@ const props = defineProps({
|
|
|
14
14
|
</script>
|
|
15
15
|
|
|
16
16
|
<template>
|
|
17
|
-
<div
|
|
17
|
+
<div
|
|
18
|
+
v-if="props.badges && props.badges.length > 0"
|
|
19
|
+
class="absolute z-2"
|
|
20
|
+
>
|
|
18
21
|
<Badge
|
|
19
22
|
v-for="(badge, index) in props.badges"
|
|
20
23
|
:key="index"
|
|
@@ -39,9 +39,19 @@ const isLast = (index: number) => {
|
|
|
39
39
|
<template>
|
|
40
40
|
<nav>
|
|
41
41
|
<ul class="breadcrumbs-base">
|
|
42
|
-
<li
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
<li
|
|
43
|
+
v-if="props.showBack"
|
|
44
|
+
class="breadcrumb-item"
|
|
45
|
+
>
|
|
46
|
+
<button
|
|
47
|
+
class="breadcrumb-back-btn"
|
|
48
|
+
:title="props.textBack"
|
|
49
|
+
onclick="history.back()"
|
|
50
|
+
>
|
|
51
|
+
<span
|
|
52
|
+
class="block px-3"
|
|
53
|
+
i-bx-bx-arrow-back
|
|
54
|
+
/>
|
|
45
55
|
</button>
|
|
46
56
|
</li>
|
|
47
57
|
</ul>
|
|
@@ -50,16 +60,21 @@ const isLast = (index: number) => {
|
|
|
50
60
|
itemscope
|
|
51
61
|
itemtype="https://schema.org/BreadcrumbList"
|
|
52
62
|
>
|
|
53
|
-
<li
|
|
63
|
+
<li
|
|
64
|
+
v-if="props.showHome"
|
|
65
|
+
class="breadcrumb-item"
|
|
66
|
+
>
|
|
54
67
|
<a
|
|
55
68
|
href="/"
|
|
56
69
|
class="breadcrumb-link flex items-center px-3 sm:px-0 py-4.25 sm:py-1 hover:text-brand-secondary whitespace-nowrap translate-y-0 text-sm my-auto"
|
|
57
70
|
:title="props.textBack"
|
|
58
71
|
itemprop="item"
|
|
59
72
|
i-carbon-home
|
|
73
|
+
/>
|
|
74
|
+
<meta
|
|
75
|
+
itemprop="position"
|
|
76
|
+
content="1"
|
|
60
77
|
>
|
|
61
|
-
</a>
|
|
62
|
-
<meta itemprop="position" content="1" />
|
|
63
78
|
</li>
|
|
64
79
|
<li
|
|
65
80
|
v-for="(crumb, index) in breadcrumbs"
|
|
@@ -69,7 +84,10 @@ const isLast = (index: number) => {
|
|
|
69
84
|
itemscope
|
|
70
85
|
itemtype="https://schema.org/ListItem"
|
|
71
86
|
>
|
|
72
|
-
<span
|
|
87
|
+
<span
|
|
88
|
+
v-if="index > 0 || props.showHome"
|
|
89
|
+
class="text-gray-400 px-1 py-4.25 sm:py-1"
|
|
90
|
+
>/</span>
|
|
73
91
|
|
|
74
92
|
<a
|
|
75
93
|
v-if="!isLast(index)"
|
|
@@ -78,7 +96,10 @@ const isLast = (index: number) => {
|
|
|
78
96
|
itemprop="item"
|
|
79
97
|
:title="`Polo 6R ${crumb.name}`"
|
|
80
98
|
>
|
|
81
|
-
<strong
|
|
99
|
+
<strong
|
|
100
|
+
class="font-normal"
|
|
101
|
+
itemprop="name"
|
|
102
|
+
>{{ crumb.name }}</strong>
|
|
82
103
|
</a>
|
|
83
104
|
<a
|
|
84
105
|
v-else
|
|
@@ -87,15 +108,22 @@ const isLast = (index: number) => {
|
|
|
87
108
|
:title="`Polo 6R ${crumb.name} ${productNumber}`"
|
|
88
109
|
itemprop="item"
|
|
89
110
|
>
|
|
90
|
-
<span
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
111
|
+
<span
|
|
112
|
+
class="font-normal"
|
|
113
|
+
itemprop="name"
|
|
114
|
+
>
|
|
115
|
+
<span v-html="crumb.name" />
|
|
116
|
+
<b
|
|
117
|
+
v-if="productNumber"
|
|
118
|
+
class="hidden sm:inline font-normal ml-1"
|
|
119
|
+
> {{ productNumber }}</b>
|
|
95
120
|
</span>
|
|
96
121
|
</a>
|
|
97
122
|
|
|
98
|
-
<meta
|
|
123
|
+
<meta
|
|
124
|
+
itemprop="position"
|
|
125
|
+
:content="String(props.showHome ? index + 2 : index + 1)"
|
|
126
|
+
>
|
|
99
127
|
</li>
|
|
100
128
|
</ul>
|
|
101
129
|
</nav>
|
|
@@ -28,11 +28,18 @@ const { copy, copied } = useClipboard({ source, legacy: true });
|
|
|
28
28
|
</script>
|
|
29
29
|
|
|
30
30
|
<template>
|
|
31
|
-
<button
|
|
31
|
+
<button
|
|
32
|
+
:aria-label="texts.copy"
|
|
33
|
+
class="btn-copy has-tooltip"
|
|
34
|
+
@click="copy()"
|
|
35
|
+
>
|
|
32
36
|
<span
|
|
33
37
|
:class="`tooltip rounded-full btn-copy-text ${tooltipClasses}`"
|
|
34
38
|
:data-text="!copied ? texts.copy : texts.copied"
|
|
35
39
|
/>
|
|
36
|
-
<span
|
|
40
|
+
<span
|
|
41
|
+
i-ph-copy-simple-light
|
|
42
|
+
class="leading-none w-full h-full"
|
|
43
|
+
/>
|
|
37
44
|
</button>
|
|
38
45
|
</template>
|
|
@@ -16,11 +16,18 @@ const props = defineProps({
|
|
|
16
16
|
</script>
|
|
17
17
|
|
|
18
18
|
<template>
|
|
19
|
-
<h2
|
|
19
|
+
<h2
|
|
20
|
+
v-if="props.caption"
|
|
21
|
+
class="features-list-caption"
|
|
22
|
+
>
|
|
20
23
|
{{ props.caption }}
|
|
21
24
|
</h2>
|
|
22
25
|
<ul class="features-list-ul">
|
|
23
|
-
<li
|
|
26
|
+
<li
|
|
27
|
+
v-for="item in props.items"
|
|
28
|
+
:key="item"
|
|
29
|
+
class="features-list-item"
|
|
30
|
+
>
|
|
24
31
|
{{ item }}
|
|
25
32
|
</li>
|
|
26
33
|
</ul>
|
|
@@ -1,20 +1,47 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
2
|
+
<div
|
|
3
|
+
class="relative flex"
|
|
4
|
+
title="FUCK PUTIN! FUCK RUZZIA!"
|
|
5
|
+
>
|
|
6
|
+
<div
|
|
7
|
+
i-mdi:tank
|
|
8
|
+
class="inline-block bg-ukraine mr-1 mt-0.5"
|
|
9
|
+
/>
|
|
10
|
+
<div
|
|
11
|
+
i-mdi:tank
|
|
12
|
+
class="inline-block bg-ukraine mr-1 mt-0.5"
|
|
13
|
+
/>
|
|
14
|
+
<div
|
|
15
|
+
i-mdi:tank
|
|
16
|
+
class="inline-block bg-ukraine mr-5 mt-0.5"
|
|
17
|
+
/>
|
|
6
18
|
<div class="relative">
|
|
7
|
-
<div
|
|
8
|
-
|
|
19
|
+
<div
|
|
20
|
+
class="inline-block absolute"
|
|
21
|
+
i-noto-v1:flag-for-flag-russia
|
|
22
|
+
/>
|
|
23
|
+
<div
|
|
24
|
+
i-emojione:fire
|
|
25
|
+
class="inline-block absolute -mt-1 animate-ping animate-pulseR"
|
|
26
|
+
/>
|
|
9
27
|
</div>
|
|
10
28
|
<div class="absolute left-0 animate-bull animate-bull--1 -mt-1">
|
|
11
|
-
<div
|
|
29
|
+
<div
|
|
30
|
+
i-mdi:bullet
|
|
31
|
+
class="rotate-90 inline-block bg-yellow"
|
|
32
|
+
/>
|
|
12
33
|
</div>
|
|
13
34
|
<div class="absolute left-0 animate-bull animate-bull animate-bull--2 -mt-1">
|
|
14
|
-
<div
|
|
35
|
+
<div
|
|
36
|
+
i-mdi:bullet
|
|
37
|
+
class="rotate-90 inline-block bg-yellow"
|
|
38
|
+
/>
|
|
15
39
|
</div>
|
|
16
40
|
<div class="absolute left-0 animate-bull animate-bull--3 -mt-1">
|
|
17
|
-
<div
|
|
41
|
+
<div
|
|
42
|
+
i-mdi:bullet
|
|
43
|
+
class="rotate-90 inline-block bg-yellow"
|
|
44
|
+
/>
|
|
18
45
|
</div>
|
|
19
46
|
</div>
|
|
20
47
|
</template>
|
package/src/components/Input.vue
CHANGED
|
@@ -106,37 +106,50 @@ const handleBlur = (event: globalThis.FocusEvent) => emit('blur', event);
|
|
|
106
106
|
:class="inputClass + ' peer'"
|
|
107
107
|
:placeholder="placeholder"
|
|
108
108
|
:value="modelValue"
|
|
109
|
+
v-bind="attrs"
|
|
109
110
|
@input="handleInput"
|
|
110
111
|
@focus="handleFocus"
|
|
111
112
|
@blur="handleBlur"
|
|
112
|
-
|
|
113
|
-
></textarea>
|
|
113
|
+
/>
|
|
114
114
|
|
|
115
115
|
<input
|
|
116
116
|
v-else
|
|
117
|
-
:type="type"
|
|
118
117
|
:id="id"
|
|
118
|
+
:type="type"
|
|
119
119
|
:name="name || id"
|
|
120
120
|
:required="required"
|
|
121
121
|
:class="inputClass + ' peer'"
|
|
122
122
|
:placeholder="placeholder"
|
|
123
123
|
:value="modelValue"
|
|
124
|
+
v-bind="attrs"
|
|
124
125
|
@input="handleInput"
|
|
125
126
|
@focus="handleFocus"
|
|
126
127
|
@blur="handleBlur"
|
|
127
|
-
|
|
128
|
-
/>
|
|
128
|
+
>
|
|
129
129
|
|
|
130
|
-
<label
|
|
130
|
+
<label
|
|
131
|
+
:for="id"
|
|
132
|
+
:class="labelClass"
|
|
133
|
+
style="transform-origin: top left"
|
|
134
|
+
>
|
|
131
135
|
{{ label }}
|
|
132
|
-
<span
|
|
136
|
+
<span
|
|
137
|
+
v-if="required"
|
|
138
|
+
class="text-red-500 ml-1"
|
|
139
|
+
>*</span>
|
|
133
140
|
</label>
|
|
134
141
|
|
|
135
|
-
<div
|
|
142
|
+
<div
|
|
143
|
+
v-if="error && typeof error === 'string'"
|
|
144
|
+
class="input-error-message"
|
|
145
|
+
>
|
|
136
146
|
{{ error }}
|
|
137
147
|
</div>
|
|
138
148
|
|
|
139
|
-
<div
|
|
149
|
+
<div
|
|
150
|
+
v-if="success && typeof success === 'string'"
|
|
151
|
+
class="input-success-message"
|
|
152
|
+
>
|
|
140
153
|
{{ success }}
|
|
141
154
|
</div>
|
|
142
155
|
</div>
|
|
@@ -7,11 +7,23 @@ const colorCategories = Object.entries(colors);
|
|
|
7
7
|
|
|
8
8
|
<template>
|
|
9
9
|
<div class="flex flex-col space-y-12">
|
|
10
|
-
<div
|
|
11
|
-
|
|
10
|
+
<div
|
|
11
|
+
v-for="[category, shades] in colorCategories"
|
|
12
|
+
:key="category"
|
|
13
|
+
>
|
|
14
|
+
<h3 class="capitalize">
|
|
15
|
+
{{ category }}
|
|
16
|
+
</h3>
|
|
12
17
|
<div class="grid grid-cols-3 md:grid-cols-9">
|
|
13
|
-
<div
|
|
14
|
-
|
|
18
|
+
<div
|
|
19
|
+
v-for="(value, name) in shades"
|
|
20
|
+
:key="name"
|
|
21
|
+
class="mb-6"
|
|
22
|
+
>
|
|
23
|
+
<div
|
|
24
|
+
class="h-12 transition-all"
|
|
25
|
+
:style="`background: ${value}`"
|
|
26
|
+
/>
|
|
15
27
|
<div class="text-sm flex flex-col text-center font-mono text-slate-500">
|
|
16
28
|
<span>{{ name }}</span>
|
|
17
29
|
<span class="uppercase text-xs">{{ value }}</span>
|
|
@@ -8,11 +8,10 @@ const props = defineProps<{
|
|
|
8
8
|
<label class="group text-left w-full max-w-xs flex flex-col">
|
|
9
9
|
<span
|
|
10
10
|
class="group-hover:text-blue-medium ml-2 text-slate-600 text-sm group-focus-within:text-blue-medium"
|
|
11
|
-
|
|
12
|
-
>
|
|
11
|
+
>{{ props.label }}</span>
|
|
13
12
|
<input
|
|
14
13
|
class="group-hover:border-blue-lightest border px-4 py-2 transition-colors rounded-md w-full focus:ring focus:outline-none focus:border-blue-medium"
|
|
15
14
|
type="text"
|
|
16
|
-
|
|
15
|
+
>
|
|
17
16
|
</label>
|
|
18
17
|
</template>
|
|
@@ -9,7 +9,10 @@ const props = defineProps({
|
|
|
9
9
|
</script>
|
|
10
10
|
|
|
11
11
|
<template>
|
|
12
|
-
<button
|
|
12
|
+
<button
|
|
13
|
+
class="product-button"
|
|
14
|
+
:class="props.shadow ? 'drop-shadow hover:(drop-shadow-md)' : ''"
|
|
15
|
+
>
|
|
13
16
|
<slot />
|
|
14
17
|
</button>
|
|
15
18
|
</template>
|
|
@@ -15,7 +15,10 @@ const props = defineProps({
|
|
|
15
15
|
|
|
16
16
|
<template>
|
|
17
17
|
<div class="font-bold detail-name w-full sm:w-50 flex">
|
|
18
|
-
<span
|
|
18
|
+
<span
|
|
19
|
+
class="colon-after"
|
|
20
|
+
:class="styles && styles.length ? styles : 'mt-auto'"
|
|
21
|
+
>
|
|
19
22
|
{{ props.text }}
|
|
20
23
|
</span>
|
|
21
24
|
</div>
|
|
@@ -30,18 +30,28 @@ const props = defineProps({
|
|
|
30
30
|
|
|
31
31
|
<template>
|
|
32
32
|
<div v-if="details && details.length">
|
|
33
|
-
<template
|
|
33
|
+
<template
|
|
34
|
+
v-for="(detail, index) in details"
|
|
35
|
+
:key="index"
|
|
36
|
+
>
|
|
34
37
|
<!-- PDP PAGE - PRODUCT ROW -->
|
|
35
38
|
<!-- <pre>{{ JSON.stringify(details) }}</pre> -->
|
|
36
39
|
<li
|
|
37
40
|
v-if="props.small"
|
|
38
41
|
class="text-xs md:text-sm text-slate-darkest dark:text-neutral-light leading-tight font-textlight md:font-textregular"
|
|
39
42
|
>
|
|
40
|
-
<span
|
|
43
|
+
<span
|
|
44
|
+
v-if="detail.id"
|
|
45
|
+
class="inline-block mr-1 items--0"
|
|
46
|
+
>
|
|
41
47
|
{{ getTranslation(`detail.${detail.id}`) }}:
|
|
42
48
|
</span>
|
|
43
49
|
|
|
44
|
-
<span
|
|
50
|
+
<span
|
|
51
|
+
v-if="detail.translated"
|
|
52
|
+
:class="detail.id ? 'font-semibold' : ''"
|
|
53
|
+
class="items--1"
|
|
54
|
+
>
|
|
45
55
|
{{ detail.value }}
|
|
46
56
|
</span>
|
|
47
57
|
|
|
@@ -49,16 +59,26 @@ const props = defineProps({
|
|
|
49
59
|
v-else-if="detail.value !== undefined && detail.id === 'color' && detail.isArrayValue"
|
|
50
60
|
class="items--2 inline-block"
|
|
51
61
|
>
|
|
52
|
-
<span
|
|
62
|
+
<span
|
|
63
|
+
v-for="(color, indexColor) in detail.value"
|
|
64
|
+
:key="indexColor"
|
|
65
|
+
class="comma"
|
|
66
|
+
>
|
|
53
67
|
{{ color['name'] }}
|
|
54
68
|
</span>
|
|
55
69
|
</div>
|
|
56
70
|
|
|
57
|
-
<span
|
|
71
|
+
<span
|
|
72
|
+
v-else-if="detail.id !== 'paint-marks' && !detail.isArrayValue"
|
|
73
|
+
class="items--3"
|
|
74
|
+
>
|
|
58
75
|
{{ locale === 'en' ? String(detail.value).replace(/,/g, '.') : String(detail.value) }}
|
|
59
76
|
</span>
|
|
60
77
|
|
|
61
|
-
<span
|
|
78
|
+
<span
|
|
79
|
+
v-else-if="detail.id && detail.id === 'paint-marks'"
|
|
80
|
+
class="items items--4"
|
|
81
|
+
>
|
|
62
82
|
{{ detail.value }}
|
|
63
83
|
<!-- <span v-for="(mark, index2) in JSON.parse(String(detail.value))" :key="index2" class="item">
|
|
64
84
|
{{ mark[0] }} x <span>{{ getTranslation(`color.${mark[1]}`) }}</span>
|
|
@@ -71,8 +91,14 @@ const props = defineProps({
|
|
|
71
91
|
class="text-sm mt-1 md:mt-4 mb-4 grid grid-cols-2 sm:(grid-cols-details-desktop grid-flow-col auto-cols-max) gap-4"
|
|
72
92
|
>
|
|
73
93
|
<!-- PRODUCT CARD -->
|
|
74
|
-
<ProductDetailName
|
|
75
|
-
|
|
94
|
+
<ProductDetailName
|
|
95
|
+
v-if="detail.id"
|
|
96
|
+
:text="getTranslation(`detail.${detail.id}`)"
|
|
97
|
+
/>
|
|
98
|
+
<div
|
|
99
|
+
v-if="detail.value"
|
|
100
|
+
class="leading-4 flex items-end"
|
|
101
|
+
>
|
|
76
102
|
<span
|
|
77
103
|
v-if="detail.translated && !detail.isArrayValue"
|
|
78
104
|
:class="detail.id === 'light-function' ? 'whitespace-pre-line' : ''"
|
|
@@ -80,35 +106,51 @@ const props = defineProps({
|
|
|
80
106
|
{{ getTranslation(`detail.value.${detail.value}`) }}
|
|
81
107
|
</span>
|
|
82
108
|
|
|
83
|
-
<span
|
|
109
|
+
<span
|
|
110
|
+
v-else-if="detail.id !== 'paint-marks' && !detail.isArrayValue"
|
|
111
|
+
class=""
|
|
112
|
+
>
|
|
84
113
|
{{ detail.value }}
|
|
85
114
|
</span>
|
|
86
115
|
|
|
87
116
|
<span
|
|
88
117
|
v-else-if="
|
|
89
118
|
detail.value !== undefined &&
|
|
90
|
-
|
|
91
|
-
|
|
119
|
+
detail.id === 'for-exterior-colour' &&
|
|
120
|
+
detail.isArrayValue
|
|
92
121
|
"
|
|
93
122
|
class=""
|
|
94
123
|
>
|
|
95
|
-
<div
|
|
124
|
+
<div
|
|
125
|
+
v-for="(color, indexColor) in JSON.parse(String(detail.value))"
|
|
126
|
+
:key="indexColor"
|
|
127
|
+
>
|
|
96
128
|
<span class="font-mono">{{ color }}</span> -
|
|
97
129
|
{{ getTranslation(`colorCodes.${color}`) }}
|
|
98
130
|
</div>
|
|
99
131
|
</span>
|
|
100
132
|
|
|
101
|
-
<span
|
|
133
|
+
<span
|
|
134
|
+
v-else-if="detail.id && detail.id === 'paint-marks'"
|
|
135
|
+
class="items"
|
|
136
|
+
>
|
|
102
137
|
<span
|
|
103
|
-
v-for="(mark,
|
|
104
|
-
:key="
|
|
138
|
+
v-for="(mark, markIndex) in JSON.parse(String(detail.value))"
|
|
139
|
+
:key="markIndex"
|
|
105
140
|
class="item"
|
|
106
141
|
>
|
|
107
142
|
{{ mark[0] }} x <span>{{ getTranslation(`color.${mark[1]}`) }}</span>
|
|
108
143
|
</span>
|
|
109
144
|
</span>
|
|
110
|
-
<ul
|
|
111
|
-
|
|
145
|
+
<ul
|
|
146
|
+
v-else-if="detail.id && detail.isArrayValue"
|
|
147
|
+
class="items"
|
|
148
|
+
>
|
|
149
|
+
<li
|
|
150
|
+
v-for="(d, index3) in JSON.parse(String(detail.value))"
|
|
151
|
+
:key="index3"
|
|
152
|
+
class="item"
|
|
153
|
+
>
|
|
112
154
|
· {{ d }}
|
|
113
155
|
</li>
|
|
114
156
|
</ul>
|
|
@@ -20,7 +20,10 @@ const props = defineProps({
|
|
|
20
20
|
:title="props.file.path"
|
|
21
21
|
class="flex items-center hover:underline underline-offset-2 hover:underline-1"
|
|
22
22
|
>
|
|
23
|
-
<div
|
|
23
|
+
<div
|
|
24
|
+
i-system-uicons-document-justified
|
|
25
|
+
class="text-blue-lightest dark:text-accent-light"
|
|
26
|
+
/>
|
|
24
27
|
<span>{{ props.file.name }}</span>
|
|
25
28
|
</a>
|
|
26
29
|
</li>
|
|
@@ -1,16 +1,27 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div
|
|
2
|
+
<div
|
|
3
|
+
class="product-link"
|
|
4
|
+
itemscope
|
|
5
|
+
itemtype="https://schema.org/Product"
|
|
6
|
+
>
|
|
3
7
|
<div
|
|
4
8
|
:class="[bigTile ? 'product-link--big-tile' : 'product-thumb--plp product-thumb--carousel']"
|
|
5
9
|
>
|
|
6
10
|
<!-- Slot na ProductImage z Astro -->
|
|
7
11
|
<slot name="image">
|
|
8
|
-
<img
|
|
12
|
+
<img
|
|
13
|
+
src="/1x1.png"
|
|
14
|
+
class="bg-neutral-lightest/70"
|
|
15
|
+
:alt="productName"
|
|
16
|
+
>
|
|
9
17
|
</slot>
|
|
10
18
|
</div>
|
|
11
19
|
|
|
12
20
|
<div :class="[bigTile ? '' : 'sm:pl-4']">
|
|
13
|
-
<p
|
|
21
|
+
<p
|
|
22
|
+
v-if="price"
|
|
23
|
+
class="block mb-2 font-600 font-headbold text-5"
|
|
24
|
+
>
|
|
14
25
|
{{ price }}
|
|
15
26
|
</p>
|
|
16
27
|
|
|
@@ -22,11 +33,20 @@
|
|
|
22
33
|
v-html="nameFormatted"
|
|
23
34
|
/>
|
|
24
35
|
|
|
25
|
-
<ProductNumber
|
|
36
|
+
<ProductNumber
|
|
37
|
+
:product-number="productNumber"
|
|
38
|
+
:copy-disabled="true"
|
|
39
|
+
/>
|
|
26
40
|
|
|
27
41
|
<template v-if="index !== null">
|
|
28
|
-
<meta
|
|
29
|
-
|
|
42
|
+
<meta
|
|
43
|
+
itemprop="position"
|
|
44
|
+
:content="index.toString()"
|
|
45
|
+
>
|
|
46
|
+
<meta
|
|
47
|
+
itemprop="name"
|
|
48
|
+
:content="nameFormatted"
|
|
49
|
+
>
|
|
30
50
|
</template>
|
|
31
51
|
</div>
|
|
32
52
|
</div>
|
|
@@ -47,6 +67,7 @@ interface Props {
|
|
|
47
67
|
}
|
|
48
68
|
|
|
49
69
|
const props = withDefaults(defineProps<Props>(), {
|
|
70
|
+
price: undefined,
|
|
50
71
|
bigTile: false,
|
|
51
72
|
index: null,
|
|
52
73
|
});
|
|
@@ -10,7 +10,10 @@ const props = defineProps({
|
|
|
10
10
|
});
|
|
11
11
|
</script>
|
|
12
12
|
<template>
|
|
13
|
-
<strong
|
|
13
|
+
<strong
|
|
14
|
+
class="product-model"
|
|
15
|
+
:data-pagefind-filter="`model:${props.carModel.name}`"
|
|
16
|
+
>{{
|
|
14
17
|
props.carModel.name
|
|
15
18
|
}}</strong>
|
|
16
19
|
</template>
|
|
@@ -11,8 +11,16 @@ const props = defineProps({
|
|
|
11
11
|
</script>
|
|
12
12
|
|
|
13
13
|
<template>
|
|
14
|
-
<div
|
|
15
|
-
|
|
14
|
+
<div
|
|
15
|
+
inline-flex
|
|
16
|
+
flex-wrap
|
|
17
|
+
max-w-max
|
|
18
|
+
>
|
|
19
|
+
<span
|
|
20
|
+
v-for="(modelId, index) in props.modelIds"
|
|
21
|
+
:key="index"
|
|
22
|
+
class="product-model block"
|
|
23
|
+
>
|
|
16
24
|
<ProductModel :id="modelId" />
|
|
17
25
|
</span>
|
|
18
26
|
</div>
|
|
@@ -16,7 +16,11 @@ const props = defineProps({
|
|
|
16
16
|
</script>
|
|
17
17
|
|
|
18
18
|
<template>
|
|
19
|
-
<span
|
|
19
|
+
<span
|
|
20
|
+
v-for="position in props.positions"
|
|
21
|
+
:key="position.sort"
|
|
22
|
+
class="product-position"
|
|
23
|
+
>
|
|
20
24
|
{{ position.name }}
|
|
21
25
|
</span>
|
|
22
26
|
</template>
|
|
@@ -24,8 +24,15 @@ const settings = {
|
|
|
24
24
|
</script>
|
|
25
25
|
|
|
26
26
|
<template>
|
|
27
|
-
<span
|
|
28
|
-
|
|
27
|
+
<span
|
|
28
|
+
v-for="(prcode, index) in settings.prcodes"
|
|
29
|
+
:key="index"
|
|
30
|
+
class="not-last:mr-1"
|
|
31
|
+
>
|
|
32
|
+
<PrCode
|
|
33
|
+
v-if="!String(prcode).includes('+')"
|
|
34
|
+
:prcode="prcode"
|
|
35
|
+
/>
|
|
29
36
|
<span v-else>
|
|
30
37
|
<PrCode
|
|
31
38
|
v-for="(splittedCode, index2) in String(prcode).split('+')"
|
|
@@ -23,7 +23,10 @@ const props = defineProps({
|
|
|
23
23
|
</script>
|
|
24
24
|
|
|
25
25
|
<template>
|
|
26
|
-
<component
|
|
26
|
+
<component
|
|
27
|
+
:is="props.as"
|
|
28
|
+
class="font-bold detail-name w-full sm:w-50 flex 2xl:w-64"
|
|
29
|
+
>
|
|
27
30
|
<span :class="styles && styles.length ? styles : 'mt-auto'">
|
|
28
31
|
<b class="bg-white z-1 colon-after pr-1">{{ props.text }}</b>
|
|
29
32
|
</span>
|
|
@@ -139,17 +139,30 @@ const groupedItems = computed(() => {
|
|
|
139
139
|
<template>
|
|
140
140
|
<table class="details-table">
|
|
141
141
|
<caption v-if="!!$slots.caption || caption">
|
|
142
|
-
<slot name="caption">
|
|
142
|
+
<slot name="caption">
|
|
143
|
+
{{ caption }}
|
|
144
|
+
</slot>
|
|
143
145
|
</caption>
|
|
144
146
|
<colgroup>
|
|
145
|
-
<col class="details-table-col"
|
|
146
|
-
<col class="details-table-col"
|
|
147
|
+
<col class="details-table-col">
|
|
148
|
+
<col class="details-table-col">
|
|
147
149
|
</colgroup>
|
|
148
150
|
<tbody>
|
|
149
|
-
<tr
|
|
150
|
-
|
|
151
|
+
<tr
|
|
152
|
+
v-for="(row, index) in groupedItems"
|
|
153
|
+
:key="index"
|
|
154
|
+
class="details-table-row"
|
|
155
|
+
>
|
|
156
|
+
<ProductDetailName
|
|
157
|
+
as="th"
|
|
158
|
+
:text="getHeaderText(row)"
|
|
159
|
+
class="details-table-header"
|
|
160
|
+
/>
|
|
151
161
|
|
|
152
|
-
<td
|
|
162
|
+
<td
|
|
163
|
+
v-if="'links' in row"
|
|
164
|
+
class="details-table-cell"
|
|
165
|
+
>
|
|
153
166
|
<ul class="list-none p-0 m-0">
|
|
154
167
|
<li
|
|
155
168
|
v-for="(link, linkIndex) in row.links"
|
|
@@ -162,14 +175,22 @@ const groupedItems = computed(() => {
|
|
|
162
175
|
'leading-none inline-block mr-2 w-4 min-w-4 h-4 text-gray-400',
|
|
163
176
|
]"
|
|
164
177
|
/>
|
|
165
|
-
<a
|
|
178
|
+
<a
|
|
179
|
+
:href="link.value"
|
|
180
|
+
target="_blank"
|
|
181
|
+
rel="noopener noreferrer"
|
|
182
|
+
class="link-primary"
|
|
183
|
+
>
|
|
166
184
|
{{ link.name }}
|
|
167
185
|
</a>
|
|
168
186
|
</li>
|
|
169
187
|
</ul>
|
|
170
188
|
</td>
|
|
171
189
|
|
|
172
|
-
<td
|
|
190
|
+
<td
|
|
191
|
+
v-else-if="'id' in row && isColorArray(row)"
|
|
192
|
+
class="details-table-cell"
|
|
193
|
+
>
|
|
173
194
|
<ul class="list-none p-0 m-0">
|
|
174
195
|
<li
|
|
175
196
|
v-for="(colorItem, colorIndex) in row.value as ColorCode[]"
|
|
@@ -187,11 +208,17 @@ const groupedItems = computed(() => {
|
|
|
187
208
|
</ul>
|
|
188
209
|
</td>
|
|
189
210
|
|
|
190
|
-
<td
|
|
211
|
+
<td
|
|
212
|
+
v-else-if="'id' in row && isPaintMarks(row)"
|
|
213
|
+
class="details-table-cell"
|
|
214
|
+
>
|
|
191
215
|
<span class="text-gray-700 dark:text-gray-300">{{ row.value }}</span>
|
|
192
216
|
</td>
|
|
193
217
|
|
|
194
|
-
<td
|
|
218
|
+
<td
|
|
219
|
+
v-else-if="'id' in row && isForExteriorColour(row)"
|
|
220
|
+
class="details-table-cell"
|
|
221
|
+
>
|
|
195
222
|
<ul class="list-none p-0 m-0">
|
|
196
223
|
<li
|
|
197
224
|
v-for="(colorEntry, colourIndex) in row.value as ColorCode[]"
|
|
@@ -209,7 +236,10 @@ const groupedItems = computed(() => {
|
|
|
209
236
|
</ul>
|
|
210
237
|
</td>
|
|
211
238
|
|
|
212
|
-
<td
|
|
239
|
+
<td
|
|
240
|
+
v-else-if="'id' in row && isGenericArray(row)"
|
|
241
|
+
class="details-table-cell"
|
|
242
|
+
>
|
|
213
243
|
<ul class="list-none p-0 m-0">
|
|
214
244
|
<li
|
|
215
245
|
v-for="(item, itemIndex) in row.value as string[]"
|
|
@@ -226,10 +256,15 @@ const groupedItems = computed(() => {
|
|
|
226
256
|
v-else-if="'id' in row && isHtmlValue(row.value)"
|
|
227
257
|
class="details-table-cell"
|
|
228
258
|
v-html="row.value"
|
|
229
|
-
|
|
259
|
+
/>
|
|
230
260
|
|
|
231
|
-
<slot
|
|
232
|
-
|
|
261
|
+
<slot
|
|
262
|
+
v-else-if="'id' in row"
|
|
263
|
+
:name="row.id"
|
|
264
|
+
>
|
|
265
|
+
<td class="details-table-cell">
|
|
266
|
+
{{ row.value }}
|
|
267
|
+
</td>
|
|
233
268
|
</slot>
|
|
234
269
|
</tr>
|
|
235
270
|
</tbody>
|
|
@@ -15,31 +15,33 @@ const toggleVisibility = () => {
|
|
|
15
15
|
</script>
|
|
16
16
|
|
|
17
17
|
<template>
|
|
18
|
-
<div
|
|
18
|
+
<div
|
|
19
|
+
v-if="isShow"
|
|
20
|
+
data-pagefind-ignore
|
|
21
|
+
class="slimbanner"
|
|
22
|
+
>
|
|
19
23
|
<span
|
|
20
24
|
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%]"
|
|
21
25
|
/>
|
|
22
|
-
<span class="leading-none"
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
/>
|
|
26
|
+
<span class="leading-none"><span
|
|
27
|
+
data-text="We stand with our friends and colleagues in Ukraine. To support Ukraine in their time of need visit "
|
|
28
|
+
/>
|
|
26
29
|
<a
|
|
27
30
|
href="https://polo.blue/support-ukraine/"
|
|
28
31
|
target="_blank"
|
|
29
32
|
rel="noopener"
|
|
30
33
|
title="Support Ukraine"
|
|
31
34
|
class="underline underline-offset-2 hover:text-blue-wrc"
|
|
32
|
-
|
|
33
|
-
>.
|
|
35
|
+
>this page</a>.
|
|
34
36
|
</span>
|
|
35
37
|
|
|
36
38
|
<button
|
|
37
|
-
class="btn-close text-white"
|
|
38
39
|
v-if="props.showCloseButton"
|
|
39
|
-
|
|
40
|
+
class="btn-close text-white"
|
|
40
41
|
aria-label="Toggle"
|
|
42
|
+
@click="toggleVisibility()"
|
|
41
43
|
>
|
|
42
|
-
<span class="close close-dark"
|
|
44
|
+
<span class="close close-dark" />
|
|
43
45
|
</button>
|
|
44
46
|
</div>
|
|
45
47
|
<div
|
|
@@ -56,12 +58,12 @@ const toggleVisibility = () => {
|
|
|
56
58
|
<span data-text="STATE" />
|
|
57
59
|
</div>
|
|
58
60
|
<button
|
|
59
|
-
class="btn-close"
|
|
60
61
|
v-if="props.showCloseButton"
|
|
61
|
-
|
|
62
|
+
class="btn-close"
|
|
62
63
|
aria-label="Toggle"
|
|
64
|
+
@click="toggleVisibility()"
|
|
63
65
|
>
|
|
64
|
-
<span class="close close-light"
|
|
66
|
+
<span class="close close-light" />
|
|
65
67
|
</button>
|
|
66
68
|
</div>
|
|
67
69
|
</template>
|
package/src/components/Table.vue
CHANGED
|
@@ -14,14 +14,26 @@ const capitalizeFirstLetter = (text: String) => {
|
|
|
14
14
|
<table class="table-auto text-left border bg-white shadow-md">
|
|
15
15
|
<thead class="bg-gray-500 text-white">
|
|
16
16
|
<tr class="border">
|
|
17
|
-
<th
|
|
17
|
+
<th
|
|
18
|
+
v-for="(thead, index) in theads"
|
|
19
|
+
:key="index"
|
|
20
|
+
class="px-4 py-2 font-semibold"
|
|
21
|
+
>
|
|
18
22
|
{{ capitalizeFirstLetter(thead) }}
|
|
19
23
|
</th>
|
|
20
24
|
</tr>
|
|
21
25
|
</thead>
|
|
22
26
|
<tbody>
|
|
23
|
-
<tr
|
|
24
|
-
|
|
27
|
+
<tr
|
|
28
|
+
v-for="row in props.data"
|
|
29
|
+
:key="row"
|
|
30
|
+
class="border"
|
|
31
|
+
>
|
|
32
|
+
<td
|
|
33
|
+
v-for="key in Object.keys(row)"
|
|
34
|
+
:key="key"
|
|
35
|
+
class="px-4 py-2"
|
|
36
|
+
>
|
|
25
37
|
{{ row[key] }}
|
|
26
38
|
</td>
|
|
27
39
|
</tr>
|
|
@@ -4,6 +4,7 @@ import { PropType } from 'vue';
|
|
|
4
4
|
const props = defineProps({
|
|
5
5
|
lang: {
|
|
6
6
|
type: String,
|
|
7
|
+
default: 'en',
|
|
7
8
|
},
|
|
8
9
|
translations: {
|
|
9
10
|
type: Object as PropType<{
|
|
@@ -11,12 +12,16 @@ const props = defineProps({
|
|
|
11
12
|
title: string | null;
|
|
12
13
|
name: string | null;
|
|
13
14
|
} | null>,
|
|
15
|
+
default: null,
|
|
14
16
|
},
|
|
15
17
|
});
|
|
16
18
|
</script>
|
|
17
19
|
|
|
18
20
|
<template>
|
|
19
|
-
<div
|
|
21
|
+
<div
|
|
22
|
+
v-if="props.translations !== null && props.translations.uri"
|
|
23
|
+
data-pagefind-ignore
|
|
24
|
+
>
|
|
20
25
|
<a
|
|
21
26
|
aria-label="Change language"
|
|
22
27
|
type="button"
|
package/src/pwa.ts
CHANGED
|
@@ -3,11 +3,11 @@ import { registerSW } from 'virtual:pwa-register';
|
|
|
3
3
|
registerSW({
|
|
4
4
|
immediate: true,
|
|
5
5
|
onRegisteredSW(swScriptUrl) {
|
|
6
|
-
|
|
6
|
+
|
|
7
7
|
console.log('SW registered: ', swScriptUrl);
|
|
8
8
|
},
|
|
9
9
|
onOfflineReady() {
|
|
10
|
-
|
|
10
|
+
|
|
11
11
|
console.log('PWA application ready to work offline');
|
|
12
12
|
},
|
|
13
13
|
});
|