spoko-design-system 1.1.1 → 1.1.2
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/.claude/settings.local.json +2 -1
- package/.github/workflows/code-quality.yml +3 -3
- package/.prettierrc +1 -0
- package/CHANGELOG.md +6 -0
- package/package.json +8 -2
- package/src/MyComponent.astro +1 -1
- package/src/components/Badge.vue +2 -2
- package/src/components/Badges.vue +17 -7
- package/src/components/Breadcrumbs.vue +47 -39
- package/src/components/Button.vue +31 -30
- package/src/components/ButtonCopy.astro +12 -17
- package/src/components/ButtonCopy.vue +26 -25
- package/src/components/Card.astro +4 -6
- package/src/components/Carousel.astro +4 -4
- package/src/components/Category/CategoriesCarousel.astro +75 -75
- package/src/components/Category/CategoryDetails.astro +75 -79
- package/src/components/Category/CategoryLink.vue +8 -12
- package/src/components/Category/CategorySidebarToggler.vue +2 -7
- package/src/components/Category/CategoryTile.astro +3 -3
- package/src/components/Category/CategoryViewToggler.astro +18 -18
- package/src/components/Category/SubCategoryLink.vue +13 -13
- package/src/components/Faq.astro +16 -17
- package/src/components/FaqItem.astro +27 -27
- package/src/components/FeaturesList.vue +19 -29
- package/src/components/FuckRussia.vue +40 -27
- package/src/components/HandDrive.astro +11 -15
- package/src/components/Header/Header.astro +165 -166
- package/src/components/Header/SkipToContent.astro +1 -1
- package/src/components/Headline.vue +44 -27
- package/src/components/Image.astro +5 -7
- package/src/components/Input.vue +143 -153
- package/src/components/Jumbotron/index.astro +143 -156
- package/src/components/Jumbotron/types.ts +28 -29
- package/src/components/Jumbotron/variants/Default.astro +44 -40
- package/src/components/Jumbotron/variants/Hero.astro +45 -53
- package/src/components/Jumbotron/variants/Post.astro +68 -64
- package/src/components/Jumbotron/variants/PostSplit.astro +89 -81
- package/src/components/Jumbotron.astro +12 -12
- package/src/components/LanguageSuggestion.astro +66 -69
- package/src/components/LeftSidebar.astro +10 -10
- package/src/components/MainColors.vue +2 -2
- package/src/components/MainInput.vue +6 -3
- package/src/components/Modal.astro +2 -2
- package/src/components/PartNumber.vue +2 -3
- package/src/components/Post/PostCategories.astro +2 -4
- package/src/components/Post/PostCategories.vue +2 -2
- package/src/components/PostHeader.astro +4 -6
- package/src/components/PrCode.vue +20 -19
- package/src/components/Product/ProductButton.vue +2 -5
- package/src/components/Product/ProductCarousel.astro +38 -27
- package/src/components/Product/ProductColors.vue +46 -42
- package/src/components/Product/ProductDetailName.vue +22 -22
- package/src/components/Product/ProductDetails.vue +115 -99
- package/src/components/Product/ProductDoc.vue +27 -25
- package/src/components/Product/ProductEngineType.vue +13 -10
- package/src/components/Product/ProductImage.astro +18 -19
- package/src/components/Product/ProductLink.vue +55 -58
- package/src/components/Product/ProductLinkInfo.astro +15 -18
- package/src/components/Product/ProductModel.vue +25 -24
- package/src/components/Product/ProductModels.vue +29 -33
- package/src/components/Product/ProductName.vue +15 -15
- package/src/components/Product/ProductNumber.astro +23 -31
- package/src/components/Product/ProductPositions.vue +32 -34
- package/src/components/ProductCarousel.astro +5 -5
- package/src/components/ProductCodes.vue +12 -14
- package/src/components/ProductDetailName.vue +18 -20
- package/src/components/ProductDetailsList.vue +48 -27
- package/src/components/Quote.vue +8 -6
- package/src/components/ReloadPrompt.astro +39 -47
- package/src/components/SlimBanner.vue +44 -19
- package/src/components/Table.vue +4 -6
- package/src/components/Translations.vue +17 -8
- package/src/components/flags/FlagPL.vue +4 -3
- package/src/components/flags/FlagUA.vue +2 -2
- package/src/components/layout/CallToAction.astro +17 -12
- package/src/components/layout/Container.astro +3 -1
- package/src/components/layout/Header.astro +12 -21
- package/src/config.ts +43 -43
- package/src/design.config.ts +63 -63
- package/src/env.d.ts +4 -4
- package/src/layouts/Layout.astro +10 -19
- package/src/layouts/MainLayout.astro +13 -19
- package/src/layouts/partials/FooterCommon.astro +2 -2
- package/src/layouts/partials/HeadCommon.astro +9 -9
- package/src/layouts/partials/HeadSEO.astro +12 -5
- package/src/pages/components/icons.astro +130 -121
- package/src/pages/core/shadows.astro +18 -11
- package/src/pages/index.astro +178 -75
- package/src/pwa.ts +4 -4
- package/src/styles/base/base.css +14 -19
- package/src/styles/base/grid.css +54 -58
- package/src/styles/base/typography.css +40 -40
- package/src/styles/content.css +25 -23
- package/src/styles/main.css +5 -6
- package/src/types/Product.ts +31 -31
- package/src/types/astro.d.ts +1 -1
- package/src/types/index.ts +234 -237
- package/src/utils/api/getCategories.ts +9 -9
- package/src/utils/category/getMainCategoryList.ts +22 -22
- package/src/utils/category/getSortedCategories.ts +7 -11
- package/src/utils/product/getPriceFormatted.ts +14 -11
- package/src/utils/product/getProductChecklist.ts +10 -11
- package/src/utils/product/useFormatProductNumber.ts +18 -9
- package/src/utils/seo/getShorterDescription.ts +6 -4
- package/src/utils/text/formatDate.ts +2 -3
- package/src/utils/text/formatLocaleNumber.ts +2 -2
- package/src/utils/text/formatPad.ts +2 -2
- package/src/utils/text/getNumberFormatted.ts +10 -10
- package/src/utils/text/getTranslatedLink.ts +3 -3
- package/src/utils/text.ts +11 -8
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
-
import { PropType, computed } from
|
|
3
|
-
import ProductDetailName from
|
|
2
|
+
import { PropType, computed } from 'vue';
|
|
3
|
+
import ProductDetailName from './ProductDetailName.vue';
|
|
4
4
|
|
|
5
5
|
interface ColorCode {
|
|
6
6
|
code: string;
|
|
@@ -30,7 +30,7 @@ interface GroupedLink {
|
|
|
30
30
|
|
|
31
31
|
const props = defineProps({
|
|
32
32
|
items: { type: Array as PropType<TableItem[]>, default: () => [] },
|
|
33
|
-
caption: { type: String, default: null }
|
|
33
|
+
caption: { type: String, default: null },
|
|
34
34
|
});
|
|
35
35
|
|
|
36
36
|
// Function to check if a value is a link
|
|
@@ -60,7 +60,6 @@ const isForExteriorColour = (item: TableItem) => {
|
|
|
60
60
|
return item.id === 'for-exterior-colour' && Array.isArray(item.value);
|
|
61
61
|
};
|
|
62
62
|
|
|
63
|
-
|
|
64
63
|
// Function to check if value is HTML string (fallback)
|
|
65
64
|
const isHtmlValue = (value: unknown): boolean => {
|
|
66
65
|
return typeof value === 'string' && (value.includes('<span') || value.includes('<br>'));
|
|
@@ -72,9 +71,12 @@ const getHeaderText = (row: TableItem | GroupedLink) => {
|
|
|
72
71
|
return row.id.charAt(0).toUpperCase() + row.id.slice(1);
|
|
73
72
|
}
|
|
74
73
|
// Użyj `name` z obiektu `TableItem`, jeśli istnieje, w przeciwnym razie sformatuj `id`.
|
|
75
|
-
return 'name' in row
|
|
76
|
-
|
|
77
|
-
.
|
|
74
|
+
return 'name' in row
|
|
75
|
+
? row.name
|
|
76
|
+
: row.id
|
|
77
|
+
.split('-')
|
|
78
|
+
.map(word => word.charAt(0).toUpperCase() + word.slice(1))
|
|
79
|
+
.join(' ');
|
|
78
80
|
};
|
|
79
81
|
|
|
80
82
|
// Function to determine the icon class for a link type
|
|
@@ -110,14 +112,14 @@ const groupedItems = computed(() => {
|
|
|
110
112
|
if (!linkGroups.has(item.id)) {
|
|
111
113
|
linkGroups.set(item.id, {
|
|
112
114
|
id: item.id,
|
|
113
|
-
links: []
|
|
115
|
+
links: [],
|
|
114
116
|
});
|
|
115
117
|
}
|
|
116
118
|
|
|
117
119
|
// Add link to the relevant group
|
|
118
120
|
linkGroups.get(item.id)?.links.push({
|
|
119
121
|
name: item.name,
|
|
120
|
-
value: item.value as string
|
|
122
|
+
value: item.value as string,
|
|
121
123
|
});
|
|
122
124
|
} else {
|
|
123
125
|
// If it's not a link, add it normally to the results
|
|
@@ -140,18 +142,26 @@ const groupedItems = computed(() => {
|
|
|
140
142
|
<slot name="caption">{{ caption }}</slot>
|
|
141
143
|
</caption>
|
|
142
144
|
<colgroup>
|
|
143
|
-
<col class="details-table-col"
|
|
144
|
-
<col class="details-table-col"
|
|
145
|
+
<col class="details-table-col" />
|
|
146
|
+
<col class="details-table-col" />
|
|
145
147
|
</colgroup>
|
|
146
148
|
<tbody>
|
|
147
|
-
<tr v-for="row, index in groupedItems" :key="index" class="details-table-row">
|
|
149
|
+
<tr v-for="(row, index) in groupedItems" :key="index" class="details-table-row">
|
|
148
150
|
<ProductDetailName as="th" :text="getHeaderText(row)" class="details-table-header" />
|
|
149
151
|
|
|
150
152
|
<td v-if="'links' in row" class="details-table-cell">
|
|
151
153
|
<ul class="list-none p-0 m-0">
|
|
152
|
-
<li
|
|
154
|
+
<li
|
|
155
|
+
v-for="(link, linkIndex) in row.links"
|
|
156
|
+
:key="linkIndex"
|
|
157
|
+
class="mb-2 last:mb-0 flex items-center"
|
|
158
|
+
>
|
|
153
159
|
<span
|
|
154
|
-
:class="[
|
|
160
|
+
:class="[
|
|
161
|
+
getLinkIconClass(row.id),
|
|
162
|
+
'leading-none inline-block mr-2 w-4 min-w-4 h-4 text-gray-400',
|
|
163
|
+
]"
|
|
164
|
+
/>
|
|
155
165
|
<a :href="link.value" target="_blank" rel="noopener noreferrer" class="link-primary">
|
|
156
166
|
{{ link.name }}
|
|
157
167
|
</a>
|
|
@@ -161,13 +171,15 @@ const groupedItems = computed(() => {
|
|
|
161
171
|
|
|
162
172
|
<td v-else-if="'id' in row && isColorArray(row)" class="details-table-cell">
|
|
163
173
|
<ul class="list-none p-0 m-0">
|
|
164
|
-
<li
|
|
165
|
-
|
|
166
|
-
|
|
174
|
+
<li
|
|
175
|
+
v-for="(colorItem, colorIndex) in row.value as ColorCode[]"
|
|
176
|
+
:key="colorIndex"
|
|
177
|
+
class="flex items-center gap-1 mb-1 last:mb-0"
|
|
178
|
+
>
|
|
167
179
|
<template v-if="colorItem.code">
|
|
168
180
|
<code class="font-mono text-sm">
|
|
169
|
-
|
|
170
|
-
|
|
181
|
+
{{ colorItem.code }}
|
|
182
|
+
</code>
|
|
171
183
|
<span class="text-gray-400">-</span>
|
|
172
184
|
</template>
|
|
173
185
|
<span class="text-gray-700 dark:text-gray-300">{{ colorItem.name }}</span>
|
|
@@ -181,13 +193,15 @@ const groupedItems = computed(() => {
|
|
|
181
193
|
|
|
182
194
|
<td v-else-if="'id' in row && isForExteriorColour(row)" class="details-table-cell">
|
|
183
195
|
<ul class="list-none p-0 m-0">
|
|
184
|
-
<li
|
|
185
|
-
|
|
186
|
-
|
|
196
|
+
<li
|
|
197
|
+
v-for="(colorEntry, colourIndex) in row.value as ColorCode[]"
|
|
198
|
+
:key="colourIndex"
|
|
199
|
+
class="flex items-center gap-1 mb-1 last:mb-0"
|
|
200
|
+
>
|
|
187
201
|
<template v-if="colorEntry.code">
|
|
188
202
|
<code class="font-mono text-sm">
|
|
189
|
-
|
|
190
|
-
|
|
203
|
+
{{ colorEntry.code }}
|
|
204
|
+
</code>
|
|
191
205
|
<span class="text-gray-400">-</span>
|
|
192
206
|
</template>
|
|
193
207
|
<span class="text-gray-700 dark:text-gray-300">{{ colorEntry.name }}</span>
|
|
@@ -197,15 +211,22 @@ const groupedItems = computed(() => {
|
|
|
197
211
|
|
|
198
212
|
<td v-else-if="'id' in row && isGenericArray(row)" class="details-table-cell">
|
|
199
213
|
<ul class="list-none p-0 m-0">
|
|
200
|
-
<li
|
|
201
|
-
|
|
214
|
+
<li
|
|
215
|
+
v-for="(item, itemIndex) in row.value as string[]"
|
|
216
|
+
:key="itemIndex"
|
|
217
|
+
class="flex items-start gap-2 mb-1 last:mb-0 leading-relaxed"
|
|
218
|
+
>
|
|
202
219
|
<span class="text-gray-500 font-bold flex-shrink-0 mt-0.5">·</span>
|
|
203
220
|
<span class="text-gray-700 dark:text-gray-300 text-sm">{{ item }}</span>
|
|
204
221
|
</li>
|
|
205
222
|
</ul>
|
|
206
223
|
</td>
|
|
207
224
|
|
|
208
|
-
<td
|
|
225
|
+
<td
|
|
226
|
+
v-else-if="'id' in row && isHtmlValue(row.value)"
|
|
227
|
+
class="details-table-cell"
|
|
228
|
+
v-html="row.value"
|
|
229
|
+
></td>
|
|
209
230
|
|
|
210
231
|
<slot v-else-if="'id' in row" :name="row.id">
|
|
211
232
|
<td class="details-table-cell">{{ row.value }}</td>
|
package/src/components/Quote.vue
CHANGED
|
@@ -11,13 +11,15 @@ const props = defineProps({
|
|
|
11
11
|
type: String,
|
|
12
12
|
default: '',
|
|
13
13
|
required: false,
|
|
14
|
-
}
|
|
15
|
-
})
|
|
14
|
+
},
|
|
15
|
+
});
|
|
16
16
|
</script>
|
|
17
17
|
|
|
18
18
|
<template>
|
|
19
|
-
<component
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
<component
|
|
20
|
+
:is="props.as"
|
|
21
|
+
class="px-8 sm:px-8 mx-4 sm:mx-6 lg:max-w-4xl drop-shadow-primary text-2xl md:text-4xl lg:text-4.5xl relative font-light after:left-0 after:content-empty after:rounded-3xl after:top-0 after:absolute after:h-full after:border-solid after:border-[var(--primary)] after:border-l-3 after:z-0"
|
|
22
|
+
>
|
|
23
|
+
<slot>{{ props.text }}</slot>
|
|
24
|
+
</component>
|
|
23
25
|
</template>
|
|
@@ -1,51 +1,43 @@
|
|
|
1
1
|
<script src="./../pwa.ts"></script>
|
|
2
|
-
<div
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
>
|
|
7
|
-
|
|
8
|
-
<span id="toast-message"></span>
|
|
9
|
-
</div>
|
|
10
|
-
<button id="pwa-refresh">
|
|
11
|
-
Reload
|
|
12
|
-
</button>
|
|
13
|
-
<button id="pwa-close">
|
|
14
|
-
Close
|
|
15
|
-
</button>
|
|
2
|
+
<div id="pwa-toast" role="alert" aria-labelledby="toast-message">
|
|
3
|
+
<div class="message">
|
|
4
|
+
<span id="toast-message"></span>
|
|
5
|
+
</div>
|
|
6
|
+
<button id="pwa-refresh"> Reload </button>
|
|
7
|
+
<button id="pwa-close"> Close </button>
|
|
16
8
|
</div>
|
|
17
9
|
|
|
18
10
|
<style>
|
|
19
|
-
#pwa-toast {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
}
|
|
32
|
-
#pwa-toast .message {
|
|
33
|
-
|
|
34
|
-
}
|
|
35
|
-
#pwa-toast button {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
-
#pwa-toast.show {
|
|
43
|
-
|
|
44
|
-
}
|
|
45
|
-
button#pwa-refresh {
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
#pwa-toast.show.refresh button#pwa-refresh {
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
</style>
|
|
11
|
+
#pwa-toast {
|
|
12
|
+
visibility: hidden;
|
|
13
|
+
position: fixed;
|
|
14
|
+
right: 0;
|
|
15
|
+
bottom: 0;
|
|
16
|
+
margin: 16px;
|
|
17
|
+
padding: 12px;
|
|
18
|
+
border: 1px solid #8885;
|
|
19
|
+
border-radius: 4px;
|
|
20
|
+
z-index: 1;
|
|
21
|
+
text-align: left;
|
|
22
|
+
box-shadow: 3px 4px 5px 0 #8885;
|
|
23
|
+
}
|
|
24
|
+
#pwa-toast .message {
|
|
25
|
+
margin-bottom: 8px;
|
|
26
|
+
}
|
|
27
|
+
#pwa-toast button {
|
|
28
|
+
border: 1px solid #8885;
|
|
29
|
+
outline: none;
|
|
30
|
+
margin-right: 5px;
|
|
31
|
+
border-radius: 2px;
|
|
32
|
+
padding: 3px 10px;
|
|
33
|
+
}
|
|
34
|
+
#pwa-toast.show {
|
|
35
|
+
visibility: visible;
|
|
36
|
+
}
|
|
37
|
+
button#pwa-refresh {
|
|
38
|
+
display: none;
|
|
39
|
+
}
|
|
40
|
+
#pwa-toast.show.refresh button#pwa-refresh {
|
|
41
|
+
display: inline-block;
|
|
42
|
+
}
|
|
43
|
+
</style>
|
|
@@ -7,36 +7,60 @@ const props = defineProps({
|
|
|
7
7
|
default: true,
|
|
8
8
|
required: false,
|
|
9
9
|
},
|
|
10
|
-
})
|
|
11
|
-
const isShow = ref(true)
|
|
10
|
+
});
|
|
11
|
+
const isShow = ref(true);
|
|
12
12
|
const toggleVisibility = () => {
|
|
13
|
-
isShow.value = !isShow.value
|
|
14
|
-
}
|
|
13
|
+
isShow.value = !isShow.value;
|
|
14
|
+
};
|
|
15
15
|
</script>
|
|
16
16
|
|
|
17
17
|
<template>
|
|
18
18
|
<div v-if="isShow" data-pagefind-ignore class="slimbanner">
|
|
19
19
|
<span
|
|
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%]"
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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%]"
|
|
21
|
+
/>
|
|
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
|
+
<a
|
|
27
|
+
href="https://polo.blue/support-ukraine/"
|
|
28
|
+
target="_blank"
|
|
29
|
+
rel="noopener"
|
|
30
|
+
title="Support Ukraine"
|
|
31
|
+
class="underline underline-offset-2 hover:text-blue-wrc"
|
|
32
|
+
>this page</a
|
|
33
|
+
>.
|
|
25
34
|
</span>
|
|
26
35
|
|
|
27
|
-
<button
|
|
28
|
-
|
|
36
|
+
<button
|
|
37
|
+
class="btn-close text-white"
|
|
38
|
+
v-if="props.showCloseButton"
|
|
39
|
+
@click="toggleVisibility()"
|
|
40
|
+
aria-label="Toggle"
|
|
41
|
+
>
|
|
29
42
|
<span class="close close-dark"></span>
|
|
30
43
|
</button>
|
|
31
44
|
</div>
|
|
32
|
-
<div
|
|
33
|
-
|
|
45
|
+
<div
|
|
46
|
+
v-else
|
|
47
|
+
data-pagefind-ignore
|
|
48
|
+
class="px-4 sm:px-8 py-3 flex items-center justify-center text-xs sm:text-base leading-none text-white relative bg-black drop-shadow-md z-2"
|
|
49
|
+
>
|
|
34
50
|
<div class="tracking-widest leading-none">
|
|
35
|
-
<span data-text="RUSSIA IS A" />
|
|
36
|
-
|
|
51
|
+
<span data-text="RUSSIA IS A" />
|
|
52
|
+
<span
|
|
53
|
+
class="underline decoration-red-600 decoration-1 underline-offset-3"
|
|
54
|
+
data-text="TERRORIST"
|
|
55
|
+
/>
|
|
56
|
+
<span data-text="STATE" />
|
|
37
57
|
</div>
|
|
38
|
-
<button
|
|
39
|
-
|
|
58
|
+
<button
|
|
59
|
+
class="btn-close"
|
|
60
|
+
v-if="props.showCloseButton"
|
|
61
|
+
@click="toggleVisibility()"
|
|
62
|
+
aria-label="Toggle"
|
|
63
|
+
>
|
|
40
64
|
<span class="close close-light"></span>
|
|
41
65
|
</button>
|
|
42
66
|
</div>
|
|
@@ -44,7 +68,7 @@ const toggleVisibility = () => {
|
|
|
44
68
|
|
|
45
69
|
<style>
|
|
46
70
|
.btn-close {
|
|
47
|
-
|
|
71
|
+
@apply ml-3 relative w-5 h-5;
|
|
48
72
|
}
|
|
49
73
|
|
|
50
74
|
.close {
|
|
@@ -70,4 +94,5 @@ const toggleVisibility = () => {
|
|
|
70
94
|
|
|
71
95
|
.close:after {
|
|
72
96
|
transform: rotate(-45deg);
|
|
73
|
-
}
|
|
97
|
+
}
|
|
98
|
+
</style>
|
package/src/components/Table.vue
CHANGED
|
@@ -3,19 +3,18 @@ const props = defineProps<{
|
|
|
3
3
|
data: string;
|
|
4
4
|
}>();
|
|
5
5
|
|
|
6
|
-
const theads = Object.keys(Object.values(props.data)[0])
|
|
6
|
+
const theads = Object.keys(Object.values(props.data)[0]);
|
|
7
7
|
|
|
8
8
|
const capitalizeFirstLetter = (text: String) => {
|
|
9
|
-
return text[0].toUpperCase() + text.slice(1)
|
|
10
|
-
}
|
|
11
|
-
|
|
9
|
+
return text[0].toUpperCase() + text.slice(1);
|
|
10
|
+
};
|
|
12
11
|
</script>
|
|
13
12
|
|
|
14
13
|
<template>
|
|
15
14
|
<table class="table-auto text-left border bg-white shadow-md">
|
|
16
15
|
<thead class="bg-gray-500 text-white">
|
|
17
16
|
<tr class="border">
|
|
18
|
-
<th class="px-4 py-2 font-semibold" v-for="thead, index in theads" :key="index">
|
|
17
|
+
<th class="px-4 py-2 font-semibold" v-for="(thead, index) in theads" :key="index">
|
|
19
18
|
{{ capitalizeFirstLetter(thead) }}
|
|
20
19
|
</th>
|
|
21
20
|
</tr>
|
|
@@ -29,4 +28,3 @@ const capitalizeFirstLetter = (text: String) => {
|
|
|
29
28
|
</tbody>
|
|
30
29
|
</table>
|
|
31
30
|
</template>
|
|
32
|
-
|
|
@@ -1,23 +1,32 @@
|
|
|
1
|
-
|
|
2
1
|
<script setup lang="ts">
|
|
3
2
|
import { PropType } from 'vue';
|
|
4
3
|
|
|
5
4
|
const props = defineProps({
|
|
6
5
|
lang: {
|
|
7
|
-
type: String
|
|
6
|
+
type: String,
|
|
8
7
|
},
|
|
9
8
|
translations: {
|
|
10
|
-
type: Object as PropType<{
|
|
11
|
-
|
|
9
|
+
type: Object as PropType<{
|
|
10
|
+
uri: string | null;
|
|
11
|
+
title: string | null;
|
|
12
|
+
name: string | null;
|
|
13
|
+
} | null>,
|
|
14
|
+
},
|
|
12
15
|
});
|
|
13
16
|
</script>
|
|
14
17
|
|
|
15
18
|
<template>
|
|
16
19
|
<div data-pagefind-ignore v-if="props.translations !== null && props.translations.uri">
|
|
17
|
-
<a
|
|
20
|
+
<a
|
|
21
|
+
aria-label="Change language"
|
|
22
|
+
type="button"
|
|
23
|
+
:href="translations.uri"
|
|
18
24
|
:title="translations.name ? translations.name : translations.title"
|
|
19
|
-
:class="[
|
|
25
|
+
:class="[
|
|
26
|
+
lang === 'en' ? 'i-circle-flags:en' : '',
|
|
27
|
+
lang === 'pl' ? 'i-circle-flags:pl' : '',
|
|
28
|
+
'w-5 hover:rotate--3',
|
|
29
|
+
]"
|
|
30
|
+
/>
|
|
20
31
|
</div>
|
|
21
32
|
</template>
|
|
22
|
-
|
|
23
|
-
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
<span
|
|
3
|
+
class="drop-shadow inline-block text-4xl w-6 h-3.5 min-w-[1.25rem] mr-3 bg-gradient-to-b stops-[#fff_50%,50%,#d4213d_100%]"
|
|
4
|
+
/>
|
|
5
|
+
</template>
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
|
|
3
|
-
</template>
|
|
2
|
+
<span class="flag-ua" />
|
|
3
|
+
</template>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
import Button from
|
|
2
|
+
import Button from './../Button.vue';
|
|
3
3
|
|
|
4
4
|
interface Props {
|
|
5
5
|
class?: string;
|
|
@@ -15,11 +15,13 @@ const hasDescriptionSlotContent = Astro.slots.has('description');
|
|
|
15
15
|
|
|
16
16
|
<section
|
|
17
17
|
class:list={[
|
|
18
|
-
|
|
18
|
+
'full-width border-blue-medium bg-blue-darker/5 border-t-4 md:(border-t-0 px-6 bg-white) my-8',
|
|
19
19
|
additionalClasses,
|
|
20
20
|
]}
|
|
21
21
|
>
|
|
22
|
-
<div
|
|
22
|
+
<div
|
|
23
|
+
class="flex flex-col items-center gap-4 md:(flex-row border-l-4 border-blue-medium bg-blue-darker/5 px-6) py-6"
|
|
24
|
+
>
|
|
23
25
|
<div class="flex-shrink-0 hidden md:block">
|
|
24
26
|
<slot name="icon">
|
|
25
27
|
<span i-ph:sparkle-thin class="mr-1 text-8 md:text-10 text-brand-secondary"></span>
|
|
@@ -31,13 +33,15 @@ const hasDescriptionSlotContent = Astro.slots.has('description');
|
|
|
31
33
|
{propTitle || 'Domyślny tytuł akcji'}
|
|
32
34
|
</slot>
|
|
33
35
|
</h3>
|
|
34
|
-
{
|
|
35
|
-
|
|
36
|
-
<
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
36
|
+
{
|
|
37
|
+
(propDescription || hasDescriptionSlotContent) && (
|
|
38
|
+
<p class="text-blue-darker mt-1">
|
|
39
|
+
<slot name="description">
|
|
40
|
+
{propDescription || 'Domyślny opis, który zachęca do działania.'}
|
|
41
|
+
</slot>
|
|
42
|
+
</p>
|
|
43
|
+
)
|
|
44
|
+
}
|
|
41
45
|
</div>
|
|
42
46
|
<slot name="action">
|
|
43
47
|
<Button
|
|
@@ -45,9 +49,10 @@ const hasDescriptionSlotContent = Astro.slots.has('description');
|
|
|
45
49
|
class:list="w-fit place-self-center gap-2"
|
|
46
50
|
tertiary
|
|
47
51
|
rounded
|
|
48
|
-
title="Domyślny przycisk akcji"
|
|
52
|
+
title="Domyślny przycisk akcji"
|
|
53
|
+
>
|
|
49
54
|
Kliknij mnie!
|
|
50
55
|
</Button>
|
|
51
56
|
</slot>
|
|
52
57
|
</div>
|
|
53
|
-
</section>
|
|
58
|
+
</section>
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
const { class: className, isFullWidth } = Astro.props;
|
|
3
3
|
---
|
|
4
4
|
|
|
5
|
-
<div
|
|
5
|
+
<div
|
|
6
|
+
class:list={[`${isFullWidth ? 'max-w-full' : 'max-w-screen-xl'} mx-auto px-5 py-4`, className]}
|
|
7
|
+
>
|
|
6
8
|
<slot />
|
|
7
9
|
</div>
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
---
|
|
2
2
|
const { class: className } = Astro.props;
|
|
3
|
-
import { Icon } from
|
|
3
|
+
import { Icon } from 'astro-icon/components';
|
|
4
4
|
|
|
5
5
|
const navItemsLeft = [
|
|
6
6
|
{
|
|
7
|
-
title:
|
|
8
|
-
description:
|
|
9
|
-
url:
|
|
10
|
-
img:
|
|
7
|
+
title: 'Components',
|
|
8
|
+
description: 'The building blocks for our UI.',
|
|
9
|
+
url: '/components/buttons',
|
|
10
|
+
img: '/Components.jpg',
|
|
11
11
|
},
|
|
12
12
|
{
|
|
13
|
-
title:
|
|
14
|
-
description:
|
|
15
|
-
url:
|
|
16
|
-
img:
|
|
13
|
+
title: 'Patterns',
|
|
14
|
+
description: 'Common patterns for building interfaces.',
|
|
15
|
+
url: '/patterns/introduction',
|
|
16
|
+
img: '/Patterns.jpg',
|
|
17
17
|
},
|
|
18
18
|
];
|
|
19
19
|
---
|
|
@@ -23,7 +23,7 @@ const navItemsLeft = [
|
|
|
23
23
|
itemtype="http://schema.org/WPHeader"
|
|
24
24
|
class:list={[
|
|
25
25
|
className,
|
|
26
|
-
|
|
26
|
+
'nav print-hidden mx-auto px-4 shadow-md relative flex items-center justify-between h-24 sm:h-14 flex-wrap sm:flex-nowrap pt-1 sm:pt-0',
|
|
27
27
|
]}
|
|
28
28
|
>
|
|
29
29
|
<div class="flex items-center justify-start sm:items-stretch order-1">
|
|
@@ -47,9 +47,7 @@ const navItemsLeft = [
|
|
|
47
47
|
</div>
|
|
48
48
|
</div>
|
|
49
49
|
|
|
50
|
-
<div
|
|
51
|
-
class="relative md:block sm:ml-4 w-full order-4 h-10 md:(w-64 mr-auto order-2)"
|
|
52
|
-
>
|
|
50
|
+
<div class="relative md:block sm:ml-4 w-full order-4 h-10 md:(w-64 mr-auto order-2)">
|
|
53
51
|
<slot name="search" />
|
|
54
52
|
</div>
|
|
55
53
|
|
|
@@ -59,14 +57,7 @@ const navItemsLeft = [
|
|
|
59
57
|
itemscope
|
|
60
58
|
itemtype="http://schema.org/SiteNavigationElement"
|
|
61
59
|
>
|
|
62
|
-
<a
|
|
63
|
-
class="icon-btn mx-2"
|
|
64
|
-
title=""
|
|
65
|
-
aria-label=""
|
|
66
|
-
href="#"
|
|
67
|
-
itemprop="url"
|
|
68
|
-
data-astro-reload
|
|
69
|
-
>
|
|
60
|
+
<a class="icon-btn mx-2" title="" aria-label="" href="#" itemprop="url" data-astro-reload>
|
|
70
61
|
<Icon name="carbon:language" />
|
|
71
62
|
</a>
|
|
72
63
|
</div>
|