spoko-design-system 0.2.17 → 0.2.19
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/dependabot.yml +11 -11
- package/.github/todo.yml +3 -3
- package/.github/workflows/deploy.yml +39 -39
- package/.stackblitzrc +5 -5
- package/.vscode/extensions.json +5 -5
- package/.vscode/launch.json +11 -11
- package/.vscode/settings.json +5 -5
- package/LICENSE +21 -21
- package/README.md +113 -113
- package/astro-i18next.config.mjs +17 -17
- package/astro-i18next.config.ts +10 -10
- package/astro.config.mjs +141 -141
- package/dev-dist/sw.js +91 -91
- package/dev-dist/workbox-c676b6d3.js +3391 -3391
- package/index.ts +6 -6
- package/package.json +7 -7
- package/public/fonts/lg.svg +53 -53
- package/public/fonts/vwhead-bold-demo.html +549 -549
- package/public/fonts/vwhead-regular-demo.html +549 -549
- package/public/fonts/vwtext-bold-demo.html +549 -549
- package/public/fonts/vwtext-regular-demo.html +549 -549
- package/public/github.svg +3 -3
- package/public/grid_dot.svg +4 -4
- package/public/linkedin.svg +44 -44
- package/public/locales/en/translation.json +8 -8
- package/public/locales/pl/translation.json +8 -8
- package/public/make-scrollable-code-focusable.js +3 -3
- package/public/pagefind.yml +3 -3
- package/public/polo.blue.svg +29 -29
- package/public/spoko.space.svg +71 -71
- package/public/twitter.svg +46 -46
- package/renovate.json +6 -6
- package/sandbox.config.json +11 -11
- package/src/MyComponent.astro +8 -8
- package/src/components/Badge.vue +19 -19
- package/src/components/Badges.vue +21 -21
- package/src/components/Breadcrumbs.vue +110 -110
- package/src/components/Button.vue +55 -55
- package/src/components/ButtonCopy.vue +47 -47
- package/src/components/Card.astro +27 -27
- package/src/components/Carousel.astro +26 -26
- package/src/components/CategoryLink.astro +18 -18
- package/src/components/Copyright.astro +12 -12
- package/src/components/Date.astro +7 -7
- package/src/components/FeaturesList.vue +41 -41
- package/src/components/FuckRussia.vue +80 -80
- package/src/components/HandDrive.astro +29 -29
- package/src/components/Header/Header.astro +214 -214
- package/src/components/Header/SkipToContent.astro +1 -1
- package/src/components/Headline.vue +48 -48
- package/src/components/Image.astro +30 -30
- package/src/components/Jumbatron.vue +33 -35
- package/src/components/LeftSidebar.astro +53 -53
- package/src/components/MainColors.vue +23 -23
- package/src/components/MainInput.vue +15 -15
- package/src/components/Modal.astro +27 -27
- package/src/components/PageContent.astro +5 -5
- package/src/components/PartNumber.vue +27 -27
- package/src/components/PostHeader.astro +103 -103
- package/src/components/PrCode.vue +156 -156
- package/src/components/ProductCarousel.astro +38 -38
- package/src/components/ProductCodes.vue +39 -39
- package/src/components/ProductDetailName.vue +52 -52
- package/src/components/ProductDetailsList.vue +65 -65
- package/src/components/ProductNumber copy.astro +116 -116
- package/src/components/ProductNumber.astro +114 -114
- package/src/components/ProductTile.astro +48 -48
- package/src/components/Quote.vue +23 -23
- package/src/components/ReloadPrompt.astro +50 -50
- package/src/components/SlimBanner.vue +70 -70
- package/src/components/Table.vue +32 -32
- package/src/components/TableOfContents.astro +15 -15
- package/src/components/Translations.vue +23 -23
- package/src/components/flags/FlagPL.vue +3 -3
- package/src/components/flags/FlagUA.vue +2 -2
- package/src/components/layout/Container.astro +7 -7
- package/src/components/layout/Header.astro +80 -80
- package/src/config.ts +56 -56
- package/src/design.config.ts +79 -79
- package/src/env.d.ts +1 -1
- package/src/layouts/Layout.astro +60 -60
- package/src/layouts/MainLayout.astro +81 -81
- package/src/layouts/partials/FooterCommon.astro +4 -4
- package/src/layouts/partials/HeadCommon.astro +44 -44
- package/src/layouts/partials/HeadSEO.astro +41 -41
- package/src/pages/components/badges.mdx +55 -55
- package/src/pages/components/breadcrumbs.mdx +139 -139
- package/src/pages/components/buttons.mdx +236 -236
- package/src/pages/components/card.mdx +294 -294
- package/src/pages/components/carousel.mdx +62 -62
- package/src/pages/components/copyright.mdx +42 -42
- package/src/pages/components/details-list.mdx +115 -115
- package/src/pages/components/features-list.mdx +37 -37
- package/src/pages/components/flags.mdx +49 -49
- package/src/pages/components/fuck-russia.mdx +39 -39
- package/src/pages/components/hand-drive.mdx +38 -38
- package/src/pages/components/headline.mdx +152 -152
- package/src/pages/components/icons.astro +48 -48
- package/src/pages/components/image.mdx +513 -513
- package/src/pages/components/input.mdx +45 -45
- package/src/pages/components/jumbatron.mdx +73 -73
- package/src/pages/components/modal.mdx +64 -64
- package/src/pages/components/post-header.mdx +60 -60
- package/src/pages/components/pr-code.mdx +65 -65
- package/src/pages/components/product-number.mdx +66 -66
- package/src/pages/components/product-tile.mdx +51 -51
- package/src/pages/components/quote.mdx +33 -33
- package/src/pages/components/slimbanner.mdx +29 -29
- package/src/pages/components/table.mdx +108 -108
- package/src/pages/core/colors.mdx +10 -10
- package/src/pages/core/grid.mdx +89 -89
- package/src/pages/core/introduction.mdx +77 -77
- package/src/pages/core/shadows.astro +20 -20
- package/src/pages/core/typography.astro +47 -47
- package/src/pages/index.astro +125 -125
- package/src/pages/patterns/introduction.mdx +60 -60
- package/src/pwa.ts +12 -12
- package/src/styles/_variables.scss +66 -66
- package/src/styles/base/_base.scss +184 -184
- package/src/styles/base/_typography.scss +70 -70
- package/src/styles/base/grid.scss +98 -98
- package/src/styles/content.scss +64 -64
- package/src/styles/main.scss +7 -7
- package/tailwind.config.cjs +8 -8
- package/tsconfig.json +11 -11
- package/uno.config.ts +253 -253
|
@@ -1,110 +1,110 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
|
|
3
|
-
export interface Breadcrumb {
|
|
4
|
-
name: string,
|
|
5
|
-
path: string
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
import type { PropType } from 'vue'
|
|
9
|
-
|
|
10
|
-
const props = defineProps({
|
|
11
|
-
showBack: {
|
|
12
|
-
type: Boolean,
|
|
13
|
-
required: false,
|
|
14
|
-
},
|
|
15
|
-
textBack: {
|
|
16
|
-
type: String,
|
|
17
|
-
required: false,
|
|
18
|
-
default: 'Back'
|
|
19
|
-
},
|
|
20
|
-
showHome: {
|
|
21
|
-
type: Boolean,
|
|
22
|
-
required: false,
|
|
23
|
-
},
|
|
24
|
-
breadcrumbs: {
|
|
25
|
-
type: Object as PropType<Breadcrumb[]>,
|
|
26
|
-
required: true
|
|
27
|
-
},
|
|
28
|
-
productNumber: {
|
|
29
|
-
type: String,
|
|
30
|
-
required: false,
|
|
31
|
-
default: null
|
|
32
|
-
}
|
|
33
|
-
})
|
|
34
|
-
|
|
35
|
-
const isLast = (index: Number) => {
|
|
36
|
-
return index === props.breadcrumbs.length - 1
|
|
37
|
-
}
|
|
38
|
-
</script>
|
|
39
|
-
|
|
40
|
-
<template>
|
|
41
|
-
<nav>
|
|
42
|
-
<ul class="breadcrumbs flex items-center p-0 leading-none ">
|
|
43
|
-
<li v-if="props.showBack" class="breadcrumb-item flex">
|
|
44
|
-
<button
|
|
45
|
-
class="breadcrumb-link flex items-center px-0 py-2 sm:py-1 hover:text-lightBlue-500 whitespace-nowrap my-auto"
|
|
46
|
-
:title="props.textBack" onclick="history.back()">
|
|
47
|
-
<span class="block px-3" i-bx-bx-arrow-back />
|
|
48
|
-
</button>
|
|
49
|
-
</li>
|
|
50
|
-
</ul>
|
|
51
|
-
<ul class="breadcrumbs flex items-center p-0 overflow-x-auto overflow-y-hidden sm:mr-12 leading-none " itemscope
|
|
52
|
-
itemtype="https://schema.org/BreadcrumbList">
|
|
53
|
-
<li v-if="props.showHome" class="breadcrumb-item flex">
|
|
54
|
-
<a href="/"
|
|
55
|
-
class="breadcrumb-link flex items-center px-0 py-2 sm:py-1 hover:text-lightBlue-400 whitespace-nowrap translate-y-0 text-sm my-auto px-3"
|
|
56
|
-
:title="textBack" itemprop="item" i-carbon-home>
|
|
57
|
-
</a>
|
|
58
|
-
<meta itemprop="position" content="1">
|
|
59
|
-
</li>
|
|
60
|
-
<li v-for="(crumb, index) in breadcrumbs" :key="index" class="breadcrumb-item flex" itemprop="itemListElement"
|
|
61
|
-
itemscope itemtype="https://schema.org/ListItem">
|
|
62
|
-
<a v-if="!isLast(index)" :href="crumb.path" class="breadcrumb-link whitespace-nowrap py-2 sm:py-1 px-1"
|
|
63
|
-
itemprop="item" :title="`Polo 6R ${crumb.name}`">
|
|
64
|
-
<strong class="font-normal" itemprop="name">{{ crumb.name }}</strong>
|
|
65
|
-
</a>
|
|
66
|
-
<a v-else :href="crumb.path"
|
|
67
|
-
class="breadcrumb-link breadcrumb-link--disabled whitespace-nowrap pointer-events-none py-2 sm:py-1 px-1"
|
|
68
|
-
:title="`Polo 6R ${crumb.name} ${productNumber}`">
|
|
69
|
-
<strong class="font-normal" itemprop="name" v-html="crumb.name" /> <b>{{ productNumber }}</b>
|
|
70
|
-
</a>
|
|
71
|
-
<meta itemprop="position" :content="String(props.showHome ? index + 2 : index + 1)">
|
|
72
|
-
</li>
|
|
73
|
-
</ul>
|
|
74
|
-
</nav>
|
|
75
|
-
</template>
|
|
76
|
-
|
|
77
|
-
<style lang="scss" scoped>
|
|
78
|
-
.breadcrumbs {
|
|
79
|
-
list-style: none;
|
|
80
|
-
font-size: 0.875rem;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
.breadcrumb-item {
|
|
84
|
-
|
|
85
|
-
&+.breadcrumb-item:before {
|
|
86
|
-
@apply py-2 sm:py-1 px-1;
|
|
87
|
-
display: inline-block;
|
|
88
|
-
padding-right: .5rem;
|
|
89
|
-
color: #bdbdbd;
|
|
90
|
-
content: "/";
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
b {
|
|
94
|
-
@apply hidden sm:inline font-normal;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
.breadcrumb-link {
|
|
99
|
-
border: 0;
|
|
100
|
-
cursor: pointer;
|
|
101
|
-
|
|
102
|
-
&--disabled {
|
|
103
|
-
cursor: default;
|
|
104
|
-
|
|
105
|
-
&:hover {
|
|
106
|
-
color: inherit;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
</style>
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
|
|
3
|
+
export interface Breadcrumb {
|
|
4
|
+
name: string,
|
|
5
|
+
path: string
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
import type { PropType } from 'vue'
|
|
9
|
+
|
|
10
|
+
const props = defineProps({
|
|
11
|
+
showBack: {
|
|
12
|
+
type: Boolean,
|
|
13
|
+
required: false,
|
|
14
|
+
},
|
|
15
|
+
textBack: {
|
|
16
|
+
type: String,
|
|
17
|
+
required: false,
|
|
18
|
+
default: 'Back'
|
|
19
|
+
},
|
|
20
|
+
showHome: {
|
|
21
|
+
type: Boolean,
|
|
22
|
+
required: false,
|
|
23
|
+
},
|
|
24
|
+
breadcrumbs: {
|
|
25
|
+
type: Object as PropType<Breadcrumb[]>,
|
|
26
|
+
required: true
|
|
27
|
+
},
|
|
28
|
+
productNumber: {
|
|
29
|
+
type: String,
|
|
30
|
+
required: false,
|
|
31
|
+
default: null
|
|
32
|
+
}
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
const isLast = (index: Number) => {
|
|
36
|
+
return index === props.breadcrumbs.length - 1
|
|
37
|
+
}
|
|
38
|
+
</script>
|
|
39
|
+
|
|
40
|
+
<template>
|
|
41
|
+
<nav>
|
|
42
|
+
<ul class="breadcrumbs flex items-center p-0 leading-none ">
|
|
43
|
+
<li v-if="props.showBack" class="breadcrumb-item flex">
|
|
44
|
+
<button
|
|
45
|
+
class="breadcrumb-link flex items-center px-0 py-2 sm:py-1 hover:text-lightBlue-500 whitespace-nowrap my-auto"
|
|
46
|
+
:title="props.textBack" onclick="history.back()">
|
|
47
|
+
<span class="block px-3" i-bx-bx-arrow-back />
|
|
48
|
+
</button>
|
|
49
|
+
</li>
|
|
50
|
+
</ul>
|
|
51
|
+
<ul class="breadcrumbs flex items-center p-0 overflow-x-auto overflow-y-hidden sm:mr-12 leading-none " itemscope
|
|
52
|
+
itemtype="https://schema.org/BreadcrumbList">
|
|
53
|
+
<li v-if="props.showHome" class="breadcrumb-item flex">
|
|
54
|
+
<a href="/"
|
|
55
|
+
class="breadcrumb-link flex items-center px-0 py-2 sm:py-1 hover:text-lightBlue-400 whitespace-nowrap translate-y-0 text-sm my-auto px-3"
|
|
56
|
+
:title="textBack" itemprop="item" i-carbon-home>
|
|
57
|
+
</a>
|
|
58
|
+
<meta itemprop="position" content="1">
|
|
59
|
+
</li>
|
|
60
|
+
<li v-for="(crumb, index) in breadcrumbs" :key="index" class="breadcrumb-item flex" itemprop="itemListElement"
|
|
61
|
+
itemscope itemtype="https://schema.org/ListItem">
|
|
62
|
+
<a v-if="!isLast(index)" :href="crumb.path" class="breadcrumb-link whitespace-nowrap py-2 sm:py-1 px-1"
|
|
63
|
+
itemprop="item" :title="`Polo 6R ${crumb.name}`">
|
|
64
|
+
<strong class="font-normal" itemprop="name">{{ crumb.name }}</strong>
|
|
65
|
+
</a>
|
|
66
|
+
<a v-else :href="crumb.path"
|
|
67
|
+
class="breadcrumb-link breadcrumb-link--disabled whitespace-nowrap pointer-events-none py-2 sm:py-1 px-1"
|
|
68
|
+
:title="`Polo 6R ${crumb.name} ${productNumber}`">
|
|
69
|
+
<strong class="font-normal" itemprop="name" v-html="crumb.name" /> <b>{{ productNumber }}</b>
|
|
70
|
+
</a>
|
|
71
|
+
<meta itemprop="position" :content="String(props.showHome ? index + 2 : index + 1)">
|
|
72
|
+
</li>
|
|
73
|
+
</ul>
|
|
74
|
+
</nav>
|
|
75
|
+
</template>
|
|
76
|
+
|
|
77
|
+
<style lang="scss" scoped>
|
|
78
|
+
.breadcrumbs {
|
|
79
|
+
list-style: none;
|
|
80
|
+
font-size: 0.875rem;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.breadcrumb-item {
|
|
84
|
+
|
|
85
|
+
&+.breadcrumb-item:before {
|
|
86
|
+
@apply py-2 sm:py-1 px-1;
|
|
87
|
+
display: inline-block;
|
|
88
|
+
padding-right: .5rem;
|
|
89
|
+
color: #bdbdbd;
|
|
90
|
+
content: "/";
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
b {
|
|
94
|
+
@apply hidden sm:inline font-normal;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.breadcrumb-link {
|
|
99
|
+
border: 0;
|
|
100
|
+
cursor: pointer;
|
|
101
|
+
|
|
102
|
+
&--disabled {
|
|
103
|
+
cursor: default;
|
|
104
|
+
|
|
105
|
+
&:hover {
|
|
106
|
+
color: inherit;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
</style>
|
|
@@ -1,56 +1,56 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
|
|
3
|
-
const props = defineProps<{
|
|
4
|
-
href?: string;
|
|
5
|
-
title?: string;
|
|
6
|
-
primary?: boolean;
|
|
7
|
-
primaryOutline?: boolean;
|
|
8
|
-
secondary?: boolean;
|
|
9
|
-
secondaryOutline?: boolean;
|
|
10
|
-
tertiary?: boolean;
|
|
11
|
-
tertiaryOutline?: boolean;
|
|
12
|
-
text?: boolean;
|
|
13
|
-
tag?: boolean;
|
|
14
|
-
small?: boolean;
|
|
15
|
-
medium?: boolean;
|
|
16
|
-
rounded?: boolean;
|
|
17
|
-
}>();
|
|
18
|
-
|
|
19
|
-
const tag = props.href && props.href.length ? 'a' : 'button'
|
|
20
|
-
const classes = {
|
|
21
|
-
"btn-primary": props.primary,
|
|
22
|
-
"btn-primary-outline": props.primaryOutline,
|
|
23
|
-
"btn-secondary": props.secondary,
|
|
24
|
-
"btn-secondary-outline": props.secondaryOutline,
|
|
25
|
-
"btn-tertiary": props.tertiary,
|
|
26
|
-
"btn-tertiary-outline": props.tertiaryOutline,
|
|
27
|
-
"btn-text": props.text,
|
|
28
|
-
"btn-tag": props.tag,
|
|
29
|
-
"btn-sm": props.medium,
|
|
30
|
-
"btn-xs": props.small,
|
|
31
|
-
"btn-normal": !props.small && !props.medium,
|
|
32
|
-
"rounded-full": props.rounded
|
|
33
|
-
};
|
|
34
|
-
</script>
|
|
35
|
-
|
|
36
|
-
<template>
|
|
37
|
-
<component :is="tag" :class="classes" :href="props.href" :title="props.title ? props.title : null">
|
|
38
|
-
<slot></slot>
|
|
39
|
-
</component>
|
|
40
|
-
</template>
|
|
41
|
-
|
|
42
|
-
<style lang="scss">
|
|
43
|
-
.btn-primary,
|
|
44
|
-
.btn-secondary {
|
|
45
|
-
svg {
|
|
46
|
-
color: #fff;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
.btn-tertiary {
|
|
51
|
-
svg {
|
|
52
|
-
color: var(--primary);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
|
|
1
|
+
<script setup lang="ts">
|
|
2
|
+
|
|
3
|
+
const props = defineProps<{
|
|
4
|
+
href?: string;
|
|
5
|
+
title?: string;
|
|
6
|
+
primary?: boolean;
|
|
7
|
+
primaryOutline?: boolean;
|
|
8
|
+
secondary?: boolean;
|
|
9
|
+
secondaryOutline?: boolean;
|
|
10
|
+
tertiary?: boolean;
|
|
11
|
+
tertiaryOutline?: boolean;
|
|
12
|
+
text?: boolean;
|
|
13
|
+
tag?: boolean;
|
|
14
|
+
small?: boolean;
|
|
15
|
+
medium?: boolean;
|
|
16
|
+
rounded?: boolean;
|
|
17
|
+
}>();
|
|
18
|
+
|
|
19
|
+
const tag = props.href && props.href.length ? 'a' : 'button'
|
|
20
|
+
const classes = {
|
|
21
|
+
"btn-primary": props.primary,
|
|
22
|
+
"btn-primary-outline": props.primaryOutline,
|
|
23
|
+
"btn-secondary": props.secondary,
|
|
24
|
+
"btn-secondary-outline": props.secondaryOutline,
|
|
25
|
+
"btn-tertiary": props.tertiary,
|
|
26
|
+
"btn-tertiary-outline": props.tertiaryOutline,
|
|
27
|
+
"btn-text": props.text,
|
|
28
|
+
"btn-tag": props.tag,
|
|
29
|
+
"btn-sm": props.medium,
|
|
30
|
+
"btn-xs": props.small,
|
|
31
|
+
"btn-normal": !props.small && !props.medium,
|
|
32
|
+
"rounded-full": props.rounded
|
|
33
|
+
};
|
|
34
|
+
</script>
|
|
35
|
+
|
|
36
|
+
<template>
|
|
37
|
+
<component :is="tag" :class="classes" :href="props.href" :title="props.title ? props.title : null">
|
|
38
|
+
<slot></slot>
|
|
39
|
+
</component>
|
|
40
|
+
</template>
|
|
41
|
+
|
|
42
|
+
<style lang="scss">
|
|
43
|
+
.btn-primary,
|
|
44
|
+
.btn-secondary {
|
|
45
|
+
svg {
|
|
46
|
+
color: #fff;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.btn-tertiary {
|
|
51
|
+
svg {
|
|
52
|
+
color: var(--primary);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
56
|
</style>
|
|
@@ -1,47 +1,47 @@
|
|
|
1
|
-
<script lang="ts" setup>
|
|
2
|
-
import { useClipboard } from "@vueuse/core";
|
|
3
|
-
import { Icon } from "@iconify/vue";
|
|
4
|
-
import { PropType } from "vue";
|
|
5
|
-
|
|
6
|
-
const props = defineProps({
|
|
7
|
-
productNumber: {
|
|
8
|
-
type: String,
|
|
9
|
-
default: '',
|
|
10
|
-
required: true,
|
|
11
|
-
},
|
|
12
|
-
tooltipClasses: {
|
|
13
|
-
type: String,
|
|
14
|
-
required: false,
|
|
15
|
-
default: '',
|
|
16
|
-
},
|
|
17
|
-
texts: {
|
|
18
|
-
type: Object as PropType<{ copy: String, copied: String }>,
|
|
19
|
-
required: true,
|
|
20
|
-
default: {
|
|
21
|
-
copy: 'copy',
|
|
22
|
-
copied: 'copied',
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
})
|
|
26
|
-
const source = props.productNumber;
|
|
27
|
-
const { copy, copied, isSupported } = useClipboard({ source });
|
|
28
|
-
|
|
29
|
-
</script>
|
|
30
|
-
|
|
31
|
-
<template>
|
|
32
|
-
<button v-if="isSupported" :aria-label="String(texts.copy)" class="btn-copy has-tooltip" @click="copy()">
|
|
33
|
-
<span :class="`tooltip rounded-full btn-copy-text ${tooltipClasses}`"
|
|
34
|
-
:data-text="!copied ? texts.copy : texts.copied" />
|
|
35
|
-
<Icon icon="ph-copy-simple-light" class="leading-none w-full h-full" />
|
|
36
|
-
</button>
|
|
37
|
-
</template>
|
|
38
|
-
|
|
39
|
-
<style>
|
|
40
|
-
.tooltip {
|
|
41
|
-
@apply invisible absolute;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
.has-tooltip:hover .tooltip {
|
|
45
|
-
@apply visible z-50;
|
|
46
|
-
}
|
|
47
|
-
</style>
|
|
1
|
+
<script lang="ts" setup>
|
|
2
|
+
import { useClipboard } from "@vueuse/core";
|
|
3
|
+
import { Icon } from "@iconify/vue";
|
|
4
|
+
import { PropType } from "vue";
|
|
5
|
+
|
|
6
|
+
const props = defineProps({
|
|
7
|
+
productNumber: {
|
|
8
|
+
type: String,
|
|
9
|
+
default: '',
|
|
10
|
+
required: true,
|
|
11
|
+
},
|
|
12
|
+
tooltipClasses: {
|
|
13
|
+
type: String,
|
|
14
|
+
required: false,
|
|
15
|
+
default: '',
|
|
16
|
+
},
|
|
17
|
+
texts: {
|
|
18
|
+
type: Object as PropType<{ copy: String, copied: String }>,
|
|
19
|
+
required: true,
|
|
20
|
+
default: {
|
|
21
|
+
copy: 'copy',
|
|
22
|
+
copied: 'copied',
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
})
|
|
26
|
+
const source = props.productNumber;
|
|
27
|
+
const { copy, copied, isSupported } = useClipboard({ source });
|
|
28
|
+
|
|
29
|
+
</script>
|
|
30
|
+
|
|
31
|
+
<template>
|
|
32
|
+
<button v-if="isSupported" :aria-label="String(texts.copy)" class="btn-copy has-tooltip" @click="copy()">
|
|
33
|
+
<span :class="`tooltip rounded-full btn-copy-text ${tooltipClasses}`"
|
|
34
|
+
:data-text="!copied ? texts.copy : texts.copied" />
|
|
35
|
+
<Icon icon="ph-copy-simple-light" class="leading-none w-full h-full" />
|
|
36
|
+
</button>
|
|
37
|
+
</template>
|
|
38
|
+
|
|
39
|
+
<style>
|
|
40
|
+
.tooltip {
|
|
41
|
+
@apply invisible absolute;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.has-tooltip:hover .tooltip {
|
|
45
|
+
@apply visible z-50;
|
|
46
|
+
}
|
|
47
|
+
</style>
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
---
|
|
2
|
-
const { class: className, imgSrc, imgAlt, href } = Astro.props;
|
|
3
|
-
|
|
4
|
-
import Image from "../components/Image.astro";
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
<div
|
|
8
|
-
class="bg-white border border-gray-200 rounded-lg shadow overflow-hidden"
|
|
9
|
-
>
|
|
10
|
-
<a href={href} class="aspect-ratio-video block relative">
|
|
11
|
-
{
|
|
12
|
-
imgSrc && (
|
|
13
|
-
<Image
|
|
14
|
-
imageObject={{
|
|
15
|
-
src: imgSrc,
|
|
16
|
-
alt: imgAlt,
|
|
17
|
-
height: "405",
|
|
18
|
-
width: "720",
|
|
19
|
-
}}
|
|
20
|
-
/>
|
|
21
|
-
)
|
|
22
|
-
}
|
|
23
|
-
</a>
|
|
24
|
-
<div class="p-5">
|
|
25
|
-
<slot />
|
|
26
|
-
</div>
|
|
27
|
-
</div>
|
|
1
|
+
---
|
|
2
|
+
const { class: className, imgSrc, imgAlt, href } = Astro.props;
|
|
3
|
+
|
|
4
|
+
import Image from "../components/Image.astro";
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
<div
|
|
8
|
+
class="bg-white border border-gray-200 rounded-lg shadow overflow-hidden"
|
|
9
|
+
>
|
|
10
|
+
<a href={href} class="aspect-ratio-video block relative">
|
|
11
|
+
{
|
|
12
|
+
imgSrc && (
|
|
13
|
+
<Image
|
|
14
|
+
imageObject={{
|
|
15
|
+
src: imgSrc,
|
|
16
|
+
alt: imgAlt,
|
|
17
|
+
height: "405",
|
|
18
|
+
width: "720",
|
|
19
|
+
}}
|
|
20
|
+
/>
|
|
21
|
+
)
|
|
22
|
+
}
|
|
23
|
+
</a>
|
|
24
|
+
<div class="p-5">
|
|
25
|
+
<slot />
|
|
26
|
+
</div>
|
|
27
|
+
</div>
|
|
@@ -1,26 +1,26 @@
|
|
|
1
|
-
---
|
|
2
|
-
export const productObject = {
|
|
3
|
-
name: "Combi-instrument MFA+",
|
|
4
|
-
url: "https://google.com",
|
|
5
|
-
number: "6R0920870F",
|
|
6
|
-
photo:
|
|
7
|
-
"https://img.freepik.com/darmowe-wektory/tlo-retro-modeli-geometrycznych_52683-17902.jpg?w=1380&t=st=1706311337",
|
|
8
|
-
};
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
<swiper-container
|
|
12
|
-
class="max-w-full w-full flex overflow-hidden"
|
|
13
|
-
grid-rows="1"
|
|
14
|
-
mousewheel-force-to-axis="true"
|
|
15
|
-
navigation="true"
|
|
16
|
-
pagination-type="fraction"
|
|
17
|
-
scrollbar="false"
|
|
18
|
-
slides-per-view="auto"
|
|
19
|
-
space-between="0"
|
|
20
|
-
>
|
|
21
|
-
<swiper-slide class="bg-blue-50 p-12 border-1 min-w-full">A</swiper-slide>
|
|
22
|
-
<swiper-slide class="bg-blue-100 p-12 border-1 min-w-full">B</swiper-slide>
|
|
23
|
-
<swiper-slide class="bg-blue-200 p-12 border-1 min-w-full">C</swiper-slide>
|
|
24
|
-
<swiper-slide class="bg-blue-300 p-12 border-1 min-w-full">D</swiper-slide>
|
|
25
|
-
<swiper-slide class="bg-blue-400 p-12 border-1 min-w-full">A</swiper-slide>
|
|
26
|
-
</swiper-container>
|
|
1
|
+
---
|
|
2
|
+
export const productObject = {
|
|
3
|
+
name: "Combi-instrument MFA+",
|
|
4
|
+
url: "https://google.com",
|
|
5
|
+
number: "6R0920870F",
|
|
6
|
+
photo:
|
|
7
|
+
"https://img.freepik.com/darmowe-wektory/tlo-retro-modeli-geometrycznych_52683-17902.jpg?w=1380&t=st=1706311337",
|
|
8
|
+
};
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
<swiper-container
|
|
12
|
+
class="max-w-full w-full flex overflow-hidden"
|
|
13
|
+
grid-rows="1"
|
|
14
|
+
mousewheel-force-to-axis="true"
|
|
15
|
+
navigation="true"
|
|
16
|
+
pagination-type="fraction"
|
|
17
|
+
scrollbar="false"
|
|
18
|
+
slides-per-view="auto"
|
|
19
|
+
space-between="0"
|
|
20
|
+
>
|
|
21
|
+
<swiper-slide class="bg-blue-50 p-12 border-1 min-w-full">A</swiper-slide>
|
|
22
|
+
<swiper-slide class="bg-blue-100 p-12 border-1 min-w-full">B</swiper-slide>
|
|
23
|
+
<swiper-slide class="bg-blue-200 p-12 border-1 min-w-full">C</swiper-slide>
|
|
24
|
+
<swiper-slide class="bg-blue-300 p-12 border-1 min-w-full">D</swiper-slide>
|
|
25
|
+
<swiper-slide class="bg-blue-400 p-12 border-1 min-w-full">A</swiper-slide>
|
|
26
|
+
</swiper-container>
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
---
|
|
2
|
-
const { categories } = Astro.props;
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
<div class="text-light-blue-400 uppercase text-base z-3 relative w-full">
|
|
6
|
-
{
|
|
7
|
-
categories
|
|
8
|
-
? categories.map((category) => (
|
|
9
|
-
<a
|
|
10
|
-
class="term-link text-sm sm:text-base not-first:(before:content-empty) before:(w-px h-2.5 bg-gray-300 mx-2.5 inline-block relative)"
|
|
11
|
-
href={category.uri}
|
|
12
|
-
>
|
|
13
|
-
{category.name}
|
|
14
|
-
</a>
|
|
15
|
-
))
|
|
16
|
-
: null
|
|
17
|
-
}
|
|
18
|
-
</div>
|
|
1
|
+
---
|
|
2
|
+
const { categories } = Astro.props;
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
<div class="text-light-blue-400 uppercase text-base z-3 relative w-full">
|
|
6
|
+
{
|
|
7
|
+
categories
|
|
8
|
+
? categories.map((category) => (
|
|
9
|
+
<a
|
|
10
|
+
class="term-link text-sm sm:text-base not-first:(before:content-empty) before:(w-px h-2.5 bg-gray-300 mx-2.5 inline-block relative)"
|
|
11
|
+
href={category.uri}
|
|
12
|
+
>
|
|
13
|
+
{category.name}
|
|
14
|
+
</a>
|
|
15
|
+
))
|
|
16
|
+
: null
|
|
17
|
+
}
|
|
18
|
+
</div>
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
---
|
|
2
|
-
const { class: className } = Astro.props;
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
<div
|
|
6
|
-
class="bg-vw h-11 flex items-center font-headlight justify-between px-4"
|
|
7
|
-
class:list={[className]}
|
|
8
|
-
>
|
|
9
|
-
<slot name="left-item" />
|
|
10
|
-
<slot name="middle-item" />
|
|
11
|
-
<slot name="right-item" />
|
|
12
|
-
</div>
|
|
1
|
+
---
|
|
2
|
+
const { class: className } = Astro.props;
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
<div
|
|
6
|
+
class="bg-vw h-11 flex items-center font-headlight justify-between px-4"
|
|
7
|
+
class:list={[className]}
|
|
8
|
+
>
|
|
9
|
+
<slot name="left-item" />
|
|
10
|
+
<slot name="middle-item" />
|
|
11
|
+
<slot name="right-item" />
|
|
12
|
+
</div>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
---
|
|
2
|
-
const { date } = Astro.props;
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
<time class="text-sm flex items-center mr-2" datetime={date}>
|
|
6
|
-
{new Date(date).toLocaleDateString()}
|
|
7
|
-
</time>
|
|
1
|
+
---
|
|
2
|
+
const { date } = Astro.props;
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
<time class="text-sm flex items-center mr-2" datetime={date}>
|
|
6
|
+
{new Date(date).toLocaleDateString()}
|
|
7
|
+
</time>
|