spoko-design-system 1.2.2 → 1.3.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/.github/workflows/claude.yml +37 -0
- package/CHANGELOG.md +8 -0
- package/package.json +1 -1
- package/src/components/Badge.vue +6 -3
- package/src/components/Badges.vue +4 -1
- package/src/components/Breadcrumbs.vue +41 -12
- 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 +18 -5
- package/src/components/MainColors.vue +13 -3
- 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 +57 -15
- package/src/components/Product/ProductDoc.vue +4 -1
- package/src/components/Product/ProductEngineType.vue +4 -1
- package/src/components/Product/ProductLink.vue +26 -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 +42 -11
- package/src/components/SlimBanner.vue +9 -7
- package/src/components/Table.vue +15 -3
- package/src/components/Translations.vue +4 -1
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
name: Claude Code
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
issue_comment:
|
|
5
|
+
types: [created]
|
|
6
|
+
pull_request_review_comment:
|
|
7
|
+
types: [created]
|
|
8
|
+
issues:
|
|
9
|
+
types: [opened, assigned]
|
|
10
|
+
pull_request_review:
|
|
11
|
+
types: [submitted]
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
claude:
|
|
15
|
+
if: |
|
|
16
|
+
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
|
|
17
|
+
(github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude')) ||
|
|
18
|
+
(github.event_name == 'pull_request_review' && contains(github.event.review.body, '@claude')) ||
|
|
19
|
+
(github.event_name == 'issues' && (contains(github.event.issue.body, '@claude') || contains(github.event.issue.title, '@claude')))
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
permissions:
|
|
22
|
+
contents: write
|
|
23
|
+
pull-requests: write
|
|
24
|
+
issues: write
|
|
25
|
+
id-token: write
|
|
26
|
+
actions: read
|
|
27
|
+
steps:
|
|
28
|
+
- name: Checkout repository
|
|
29
|
+
uses: actions/checkout@v4
|
|
30
|
+
with:
|
|
31
|
+
fetch-depth: 1
|
|
32
|
+
|
|
33
|
+
- name: Run Claude Code
|
|
34
|
+
id: claude
|
|
35
|
+
uses: anthropics/claude-code-action@v1
|
|
36
|
+
with:
|
|
37
|
+
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
|
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
## [1.3.1](https://github.com/polo-blue/sds/compare/v1.3.0...v1.3.1) (2025-10-05)
|
|
2
|
+
|
|
3
|
+
## [1.3.0](https://github.com/polo-blue/sds/compare/v1.2.2...v1.3.0) (2025-10-05)
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
* add Claude Code GitHub Action workflow ([eba488f](https://github.com/polo-blue/sds/commit/eba488fe781ebb3e7676dc7e6dfd30cf3130798a))
|
|
8
|
+
|
|
1
9
|
## [1.2.2](https://github.com/polo-blue/sds/compare/v1.2.1...v1.2.2) (2025-10-05)
|
|
2
10
|
|
|
3
11
|
## [1.2.1](https://github.com/polo-blue/sds/compare/v1.2.0...v1.2.1) (2025-10-05)
|
package/package.json
CHANGED
package/src/components/Badge.vue
CHANGED
|
@@ -2,19 +2,22 @@
|
|
|
2
2
|
const props = defineProps({
|
|
3
3
|
badge: {
|
|
4
4
|
type: String,
|
|
5
|
-
required:
|
|
5
|
+
required: false,
|
|
6
6
|
default: '',
|
|
7
7
|
},
|
|
8
8
|
class: {
|
|
9
9
|
type: String,
|
|
10
|
-
required:
|
|
10
|
+
required: false,
|
|
11
11
|
default: 'bg-gray',
|
|
12
12
|
},
|
|
13
13
|
});
|
|
14
14
|
</script>
|
|
15
15
|
|
|
16
16
|
<template>
|
|
17
|
-
<div
|
|
17
|
+
<div
|
|
18
|
+
class="badge"
|
|
19
|
+
:class="props.class"
|
|
20
|
+
>
|
|
18
21
|
{{ props.badge }}
|
|
19
22
|
</div>
|
|
20
23
|
</template>
|
|
@@ -47,7 +47,10 @@ const getBadgeColor = (badge: string | BadgeObject): string => {
|
|
|
47
47
|
</script>
|
|
48
48
|
|
|
49
49
|
<template>
|
|
50
|
-
<div
|
|
50
|
+
<div
|
|
51
|
+
v-if="props.badges && props.badges.length > 0"
|
|
52
|
+
class="absolute z-2"
|
|
53
|
+
>
|
|
51
54
|
<Badge
|
|
52
55
|
v-for="(badge, index) in props.badges"
|
|
53
56
|
: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,7 +60,10 @@ 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"
|
|
@@ -58,7 +71,10 @@ const isLast = (index: number) => {
|
|
|
58
71
|
itemprop="item"
|
|
59
72
|
i-carbon-home
|
|
60
73
|
/>
|
|
61
|
-
<meta
|
|
74
|
+
<meta
|
|
75
|
+
itemprop="position"
|
|
76
|
+
content="1"
|
|
77
|
+
>
|
|
62
78
|
</li>
|
|
63
79
|
<li
|
|
64
80
|
v-for="(crumb, index) in breadcrumbs"
|
|
@@ -68,7 +84,10 @@ const isLast = (index: number) => {
|
|
|
68
84
|
itemscope
|
|
69
85
|
itemtype="https://schema.org/ListItem"
|
|
70
86
|
>
|
|
71
|
-
<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>
|
|
72
91
|
|
|
73
92
|
<a
|
|
74
93
|
v-if="!isLast(index)"
|
|
@@ -77,7 +96,10 @@ const isLast = (index: number) => {
|
|
|
77
96
|
itemprop="item"
|
|
78
97
|
:title="`Polo 6R ${crumb.name}`"
|
|
79
98
|
>
|
|
80
|
-
<strong
|
|
99
|
+
<strong
|
|
100
|
+
class="font-normal"
|
|
101
|
+
itemprop="name"
|
|
102
|
+
>{{ crumb.name }}</strong>
|
|
81
103
|
</a>
|
|
82
104
|
<a
|
|
83
105
|
v-else
|
|
@@ -86,15 +108,22 @@ const isLast = (index: number) => {
|
|
|
86
108
|
:title="`Polo 6R ${crumb.name} ${productNumber}`"
|
|
87
109
|
itemprop="item"
|
|
88
110
|
>
|
|
89
|
-
<span
|
|
111
|
+
<span
|
|
112
|
+
class="font-normal"
|
|
113
|
+
itemprop="name"
|
|
114
|
+
>
|
|
90
115
|
<span v-html="crumb.name" />
|
|
91
|
-
<b
|
|
92
|
-
|
|
93
|
-
|
|
116
|
+
<b
|
|
117
|
+
v-if="productNumber"
|
|
118
|
+
class="hidden sm:inline font-normal ml-1"
|
|
119
|
+
> {{ productNumber }}</b>
|
|
94
120
|
</span>
|
|
95
121
|
</a>
|
|
96
122
|
|
|
97
|
-
<meta
|
|
123
|
+
<meta
|
|
124
|
+
itemprop="position"
|
|
125
|
+
:content="String(props.showHome ? index + 2 : index + 1)"
|
|
126
|
+
>
|
|
98
127
|
</li>
|
|
99
128
|
</ul>
|
|
100
129
|
</nav>
|
|
@@ -27,11 +27,18 @@ const { copy, copied } = useClipboard({ source, legacy: true });
|
|
|
27
27
|
</script>
|
|
28
28
|
|
|
29
29
|
<template>
|
|
30
|
-
<button
|
|
30
|
+
<button
|
|
31
|
+
:aria-label="texts.copy"
|
|
32
|
+
class="btn-copy has-tooltip"
|
|
33
|
+
@click="copy()"
|
|
34
|
+
>
|
|
31
35
|
<span
|
|
32
36
|
:class="`tooltip rounded-full btn-copy-text ${tooltipClasses}`"
|
|
33
37
|
:data-text="!copied ? texts.copy : texts.copied"
|
|
34
38
|
/>
|
|
35
|
-
<span
|
|
39
|
+
<span
|
|
40
|
+
i-ph-copy-simple-light
|
|
41
|
+
class="leading-none w-full h-full"
|
|
42
|
+
/>
|
|
36
43
|
</button>
|
|
37
44
|
</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, index) in props.items"
|
|
28
|
+
:key="index"
|
|
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
|
@@ -125,18 +125,31 @@ 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
|
|
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,13 +7,23 @@ const colorCategories = Object.entries(colors);
|
|
|
7
7
|
|
|
8
8
|
<template>
|
|
9
9
|
<div class="flex flex-col space-y-12">
|
|
10
|
-
<div
|
|
10
|
+
<div
|
|
11
|
+
v-for="[category, shades] in colorCategories"
|
|
12
|
+
:key="category"
|
|
13
|
+
>
|
|
11
14
|
<h3 class="capitalize">
|
|
12
15
|
{{ category }}
|
|
13
16
|
</h3>
|
|
14
17
|
<div class="grid grid-cols-3 md:grid-cols-9">
|
|
15
|
-
<div
|
|
16
|
-
|
|
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
|
+
/>
|
|
17
27
|
<div class="text-sm flex flex-col text-center font-mono text-slate-500">
|
|
18
28
|
<span>{{ name }}</span>
|
|
19
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,25 +106,34 @@ 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
138
|
v-for="(mark, markIndex) in JSON.parse(String(detail.value))"
|
|
104
139
|
:key="markIndex"
|
|
@@ -107,8 +142,15 @@ const props = defineProps({
|
|
|
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>
|
|
@@ -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>
|
|
@@ -144,14 +144,25 @@ 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
|
-
|
|
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
|
+
/>
|
|
153
161
|
|
|
154
|
-
<td
|
|
162
|
+
<td
|
|
163
|
+
v-if="'links' in row"
|
|
164
|
+
class="details-table-cell"
|
|
165
|
+
>
|
|
155
166
|
<ul class="list-none p-0 m-0">
|
|
156
167
|
<li
|
|
157
168
|
v-for="(link, linkIndex) in row.links"
|
|
@@ -164,14 +175,22 @@ const groupedItems = computed(() => {
|
|
|
164
175
|
'leading-none inline-block mr-2 w-4 min-w-4 h-4 text-gray-400',
|
|
165
176
|
]"
|
|
166
177
|
/>
|
|
167
|
-
<a
|
|
178
|
+
<a
|
|
179
|
+
:href="link.value"
|
|
180
|
+
target="_blank"
|
|
181
|
+
rel="noopener noreferrer"
|
|
182
|
+
class="link-primary"
|
|
183
|
+
>
|
|
168
184
|
{{ link.name }}
|
|
169
185
|
</a>
|
|
170
186
|
</li>
|
|
171
187
|
</ul>
|
|
172
188
|
</td>
|
|
173
189
|
|
|
174
|
-
<td
|
|
190
|
+
<td
|
|
191
|
+
v-else-if="'id' in row && isColorArray(row)"
|
|
192
|
+
class="details-table-cell"
|
|
193
|
+
>
|
|
175
194
|
<ul class="list-none p-0 m-0">
|
|
176
195
|
<li
|
|
177
196
|
v-for="(colorItem, colorIndex) in row.value as ColorCode[]"
|
|
@@ -189,11 +208,17 @@ const groupedItems = computed(() => {
|
|
|
189
208
|
</ul>
|
|
190
209
|
</td>
|
|
191
210
|
|
|
192
|
-
<td
|
|
211
|
+
<td
|
|
212
|
+
v-else-if="'id' in row && isPaintMarks(row)"
|
|
213
|
+
class="details-table-cell"
|
|
214
|
+
>
|
|
193
215
|
<span class="text-gray-700 dark:text-gray-300">{{ row.value }}</span>
|
|
194
216
|
</td>
|
|
195
217
|
|
|
196
|
-
<td
|
|
218
|
+
<td
|
|
219
|
+
v-else-if="'id' in row && isForExteriorColour(row)"
|
|
220
|
+
class="details-table-cell"
|
|
221
|
+
>
|
|
197
222
|
<ul class="list-none p-0 m-0">
|
|
198
223
|
<li
|
|
199
224
|
v-for="(colorEntry, colourIndex) in row.value as ColorCode[]"
|
|
@@ -211,7 +236,10 @@ const groupedItems = computed(() => {
|
|
|
211
236
|
</ul>
|
|
212
237
|
</td>
|
|
213
238
|
|
|
214
|
-
<td
|
|
239
|
+
<td
|
|
240
|
+
v-else-if="'id' in row && isGenericArray(row)"
|
|
241
|
+
class="details-table-cell"
|
|
242
|
+
>
|
|
215
243
|
<ul class="list-none p-0 m-0">
|
|
216
244
|
<li
|
|
217
245
|
v-for="(item, itemIndex) in row.value as string[]"
|
|
@@ -230,7 +258,10 @@ const groupedItems = computed(() => {
|
|
|
230
258
|
v-html="row.value"
|
|
231
259
|
/>
|
|
232
260
|
|
|
233
|
-
<slot
|
|
261
|
+
<slot
|
|
262
|
+
v-else-if="'id' in row"
|
|
263
|
+
:name="row.id"
|
|
264
|
+
>
|
|
234
265
|
<td class="details-table-cell">
|
|
235
266
|
{{ row.value }}
|
|
236
267
|
</td>
|
|
@@ -15,22 +15,24 @@ 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
|
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, index) in props.data"
|
|
29
|
+
:key="index"
|
|
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>
|
|
@@ -18,7 +18,10 @@ const props = defineProps({
|
|
|
18
18
|
</script>
|
|
19
19
|
|
|
20
20
|
<template>
|
|
21
|
-
<div
|
|
21
|
+
<div
|
|
22
|
+
v-if="props.translations !== null && props.translations.uri"
|
|
23
|
+
data-pagefind-ignore
|
|
24
|
+
>
|
|
22
25
|
<a
|
|
23
26
|
aria-label="Change language"
|
|
24
27
|
type="button"
|