spoko-design-system 1.1.17 → 1.2.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.
Files changed (59) hide show
  1. package/.github/workflows/code-quality.yml +9 -18
  2. package/.github/workflows/deploy.yml +4 -5
  3. package/.github/workflows/release.yml +7 -19
  4. package/.github/workflows/sonarcloud.yml +7 -19
  5. package/.vscode/settings.json +20 -0
  6. package/CHANGELOG.md +31 -0
  7. package/icon.config.ts +3 -1
  8. package/package.json +16 -16
  9. package/sonar-project.properties +4 -1
  10. package/src/components/Badge.vue +4 -1
  11. package/src/components/Badges.vue +40 -10
  12. package/src/components/Breadcrumbs.vue +41 -12
  13. package/src/components/ButtonCopy.vue +10 -4
  14. package/src/components/Category/CategoryLink.vue +5 -1
  15. package/src/components/Category/CategorySidebarToggler.vue +5 -1
  16. package/src/components/FeaturesList.vue +11 -4
  17. package/src/components/FuckRussia.vue +36 -9
  18. package/src/components/Input.vue +18 -5
  19. package/src/components/MainColors.vue +13 -3
  20. package/src/components/MainInput.vue +2 -3
  21. package/src/components/PartNumber.vue +4 -1
  22. package/src/components/Product/ProductButton.vue +4 -1
  23. package/src/components/Product/ProductDetailName.vue +4 -1
  24. package/src/components/Product/ProductDetails.vue +57 -15
  25. package/src/components/Product/ProductDoc.vue +4 -1
  26. package/src/components/Product/ProductEngineType.vue +4 -1
  27. package/src/components/Product/ProductLink.vue +27 -8
  28. package/src/components/Product/ProductLinkInfo.astro +1 -1
  29. package/src/components/Product/ProductModel.vue +4 -1
  30. package/src/components/Product/ProductModels.vue +10 -2
  31. package/src/components/Product/ProductPositions.vue +5 -1
  32. package/src/components/ProductCodes.vue +9 -2
  33. package/src/components/ProductDetailName.vue +4 -1
  34. package/src/components/ProductDetailsList.vue +46 -15
  35. package/src/components/SlimBanner.vue +9 -7
  36. package/src/components/Table.vue +16 -4
  37. package/src/components/Translations.vue +4 -1
  38. package/src/pages/index.astro +12 -12
  39. package/src/styles/base/base.css +7 -8
  40. package/src/styles/base/typography.css +2 -2
  41. package/src/styles/main.css +0 -1
  42. package/src/types/Product.ts +77 -22
  43. package/src/types/catalog.ts +33 -0
  44. package/src/types/category.ts +54 -0
  45. package/src/types/common.ts +38 -0
  46. package/src/types/index.ts +5 -232
  47. package/src/utils/api/getCategories.ts +0 -4
  48. package/src/utils/product/getProductChecklist.ts +1 -1
  49. package/src/utils/seo/getShorterDescription.ts +1 -1
  50. package/uno-config/theme/index.ts +7 -9
  51. package/uno-config/theme/shortcuts/buttons.ts +1 -1
  52. package/.astro/content-assets.mjs +0 -1
  53. package/.astro/content-modules.mjs +0 -1
  54. package/.astro/content.d.ts +0 -210
  55. package/.astro/data-store.json +0 -1
  56. package/.astro/settings.json +0 -5
  57. package/.astro/types.d.ts +0 -2
  58. package/.claude/settings.local.json +0 -25
  59. /package/{src/components/Jumbotron/styles.css → .nojekyll} +0 -0
@@ -1,20 +1,47 @@
1
1
  <template>
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" />
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 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" />
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 i-mdi:bullet class="rotate-90 inline-block bg-yellow" />
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 i-mdi:bullet class="rotate-90 inline-block bg-yellow" />
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 i-mdi:bullet class="rotate-90 inline-block bg-yellow" />
41
+ <div
42
+ i-mdi:bullet
43
+ class="rotate-90 inline-block bg-yellow"
44
+ />
18
45
  </div>
19
46
  </div>
20
47
  </template>
@@ -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 :for="id" :class="labelClass" style="transform-origin: top left">
130
+ <label
131
+ :for="id"
132
+ :class="labelClass"
133
+ style="transform-origin: top left"
134
+ >
131
135
  {{ label }}
132
- <span v-if="required" class="text-red-500 ml-1">*</span>
136
+ <span
137
+ v-if="required"
138
+ class="text-red-500 ml-1"
139
+ >*</span>
133
140
  </label>
134
141
 
135
- <div v-if="error && typeof error === 'string'" class="input-error-message">
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 v-if="success && typeof success === 'string'" class="input-success-message">
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 v-for="[category, shades] in colorCategories" :key="category">
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 v-for="(value, name) in shades" :key="name" class="mb-6">
16
- <div class="h-12 transition-all" :style="`background: ${value}`" />
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
- >{{ props.label }}</span
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>
@@ -21,7 +21,10 @@ const props = defineProps({
21
21
  </script>
22
22
 
23
23
  <template>
24
- <component :is="props.as" :class="props.class">
24
+ <component
25
+ :is="props.as"
26
+ :class="props.class"
27
+ >
25
28
  {{ props.number }}
26
29
  </component>
27
30
  </template>
@@ -9,7 +9,10 @@ const props = defineProps({
9
9
  </script>
10
10
 
11
11
  <template>
12
- <button class="product-button" :class="props.shadow ? 'drop-shadow hover:(drop-shadow-md)' : ''">
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 class="colon-after" :class="styles && styles.length ? styles : 'mt-auto'">
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 v-for="(detail, index) in details" :key="index">
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 v-if="detail.id" class="inline-block mr-1 items--0">
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 v-if="detail.translated" :class="detail.id ? 'font-semibold' : ''" class="items--1">
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 v-for="(color, indexColor) in detail.value" :key="indexColor" class="comma">
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 v-else-if="detail.id !== 'paint-marks' && !detail.isArrayValue" class="items--3">
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 v-else-if="detail.id && detail.id === 'paint-marks'" class="items items--4">
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 v-if="detail.id" :text="getTranslation(`detail.${detail.id}`)" />
75
- <div v-if="detail.value" class="leading-4 flex items-end">
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 v-else-if="detail.id !== 'paint-marks' && !detail.isArrayValue" class="">
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
- detail.id === 'for-exterior-colour' &&
91
- detail.isArrayValue
119
+ detail.id === 'for-exterior-colour' &&
120
+ detail.isArrayValue
92
121
  "
93
122
  class=""
94
123
  >
95
- <div v-for="(color, indexColor) in JSON.parse(String(detail.value))" :key="indexColor">
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 v-else-if="detail.id && detail.id === 'paint-marks'" class="items">
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 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">
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 i-system-uicons-document-justified class="text-blue-lightest dark:text-accent-light" />
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>
@@ -15,7 +15,10 @@ const props = withDefaults(
15
15
  </script>
16
16
 
17
17
  <template>
18
- <ul v-if="props.engines.length" class="engine-types">
18
+ <ul
19
+ v-if="props.engines.length"
20
+ class="engine-types"
21
+ >
19
22
  <li
20
23
  v-for="(engine, index) in props.engines"
21
24
  :key="engine.id"
@@ -1,16 +1,27 @@
1
1
  <template>
2
- <div class="product-link" itemscope itemtype="https://schema.org/Product">
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 src="/1x1.png" class="bg-neutral-lightest/70" :alt="productName" />
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 v-if="price" class="block mb-2 font-600 font-headbold text-5">
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 :product-number="productNumber" :copy-disabled="true" />
36
+ <ProductNumber
37
+ :product-number="productNumber"
38
+ :copy-disabled="true"
39
+ />
26
40
 
27
41
  <template v-if="index !== null">
28
- <meta itemprop="position" :content="index.toString()" />
29
- <meta itemprop="name" :content="nameFormatted" />
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>
@@ -34,8 +54,7 @@
34
54
 
35
55
  <script setup lang="ts">
36
56
  import { computed } from 'vue';
37
- import { ProductNumber } from 'spoko-design-system';
38
- import { removeSemicolon } from 'spoko-design-system';
57
+ import { ProductNumber, removeSemicolon } from 'spoko-design-system';
39
58
 
40
59
  interface Props {
41
60
  productName: string;
@@ -1,5 +1,5 @@
1
1
  ---
2
- import type { Product } from '../../types/Product';
2
+ import type { Product } from '../../types/catalog';
3
3
  import ProductNumber from './ProductNumber.astro';
4
4
 
5
5
  interface Props {
@@ -10,7 +10,10 @@ const props = defineProps({
10
10
  });
11
11
  </script>
12
12
  <template>
13
- <strong class="product-model" :data-pagefind-filter="`model:${props.carModel.name}`">{{
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 inline-flex flex-wrap max-w-max>
15
- <span v-for="(modelId, index) in props.modelIds" :key="index" class="product-model block">
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 v-for="position in props.positions" :key="position.sort" class="product-position">
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 v-for="(prcode, index) in settings.prcodes" :key="index" class="not-last:mr-1">
28
- <PrCode v-if="!String(prcode).includes('+')" :prcode="prcode" />
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 :is="props.as" class="font-bold detail-name w-full sm:w-50 flex 2xl:w-64">
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>
@@ -105,7 +105,7 @@ const groupedItems = computed(() => {
105
105
  const linkGroups = new Map<string, GroupedLink>();
106
106
 
107
107
  // Process all elements
108
- props.items.forEach(item => {
108
+ for (const item of props.items) {
109
109
  // If it's a link (blog, youtube, vimeo)
110
110
  if (isLink(item.id)) {
111
111
  // Add a link to the relevant group
@@ -125,12 +125,12 @@ const groupedItems = computed(() => {
125
125
  // If it's not a link, add it normally to the results
126
126
  result.push(item);
127
127
  }
128
- });
128
+ }
129
129
 
130
130
  // Add all link groups at the end
131
- linkGroups.forEach(group => {
131
+ for (const group of linkGroups.values()) {
132
132
  result.push(group);
133
- });
133
+ }
134
134
 
135
135
  return result;
136
136
  });
@@ -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 v-for="(row, index) in groupedItems" :key="index" class="details-table-row">
152
- <ProductDetailName as="th" :text="getHeaderText(row)" class="details-table-header" />
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 v-if="'links' in row" class="details-table-cell">
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 :href="link.value" target="_blank" rel="noopener noreferrer" class="link-primary">
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 v-else-if="'id' in row && isColorArray(row)" class="details-table-cell">
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 v-else-if="'id' in row && isPaintMarks(row)" class="details-table-cell">
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 v-else-if="'id' in row && isForExteriorColour(row)" class="details-table-cell">
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 v-else-if="'id' in row && isGenericArray(row)" class="details-table-cell">
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 v-else-if="'id' in row" :name="row.id">
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 v-if="isShow" data-pagefind-ignore class="slimbanner">
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
- ><span
24
- data-text="We stand with our friends and colleagues in Ukraine. To support Ukraine in their time of need visit "
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
- >this page</a
33
- >.
35
+ >this page</a>.
34
36
  </span>
35
37
 
36
38
  <button