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