spoko-design-system 0.9.6 → 1.0.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/.astro/content.d.ts +1 -1
- package/.astro/data-store.json +1 -1
- package/.astro/settings.json +4 -4
- package/.astro/types.d.ts +2 -1
- package/.claude/settings.local.json +11 -1
- package/.github/dependabot.yml +11 -11
- package/.github/todo.yml +3 -3
- package/.github/workflows/deploy.yml +39 -39
- package/.github/workflows/release.yml +64 -0
- package/.releaserc.json +93 -0
- package/.stackblitzrc +5 -5
- package/.vscode/extensions.json +4 -5
- package/.vscode/launch.json +11 -11
- package/.vscode/settings.json +1 -5
- package/CHANGELOG.md +20 -0
- package/CONTRIBUTING.md +183 -0
- package/LICENSE +21 -21
- package/README.md +132 -116
- package/astro.config.mjs +84 -86
- package/dev-dist/sw.js +91 -91
- package/dev-dist/workbox-c676b6d3.js +3391 -3391
- package/icon.config.ts +340 -310
- package/index.ts +70 -70
- package/package.json +19 -11
- package/public/arrow-bottom.svg +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/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 +94 -94
- package/src/components/Button.vue +101 -101
- package/src/components/ButtonCopy.astro +183 -183
- package/src/components/ButtonCopy.vue +36 -36
- package/src/components/Card.astro +27 -27
- package/src/components/Carousel.astro +26 -26
- package/src/components/Category/CategoriesCarousel.astro +100 -101
- package/src/components/Category/CategoryDetails.astro +168 -169
- package/src/components/Category/CategoryLink.vue +28 -28
- package/src/components/Category/CategorySidebarToggler.vue +9 -9
- package/src/components/Category/CategoryTile.astro +37 -37
- package/src/components/Category/CategoryViewToggler.astro +89 -89
- package/src/components/Category/SubCategoryLink.vue +19 -19
- package/src/components/Copyright.astro +12 -12
- package/src/components/Date.astro +7 -7
- package/src/components/Faq.astro +32 -33
- package/src/components/FaqItem.astro +80 -80
- package/src/components/FeaturesList.vue +37 -37
- package/src/components/FuckRussia.vue +62 -62
- package/src/components/HandDrive.astro +55 -29
- package/src/components/Header/Header.astro +210 -210
- package/src/components/Header/SkipToContent.astro +1 -1
- package/src/components/Headline.vue +107 -87
- package/src/components/Image.astro +30 -30
- package/src/components/LeftSidebar.astro +53 -53
- package/src/components/MainColors.vue +22 -22
- 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/Post/PostCategories.astro +41 -41
- package/src/components/Post/PostCategories.vue +30 -30
- package/src/components/PostHeader.astro +103 -103
- package/src/components/PrCode.vue +141 -141
- package/src/components/Product/ProductButton.vue +18 -18
- package/src/components/Product/ProductCarousel.astro +35 -35
- package/src/components/Product/ProductEngineType.vue +42 -42
- package/src/components/Product/ProductImage.astro +40 -40
- package/src/components/Product/ProductLink.astro +96 -101
- package/src/components/Product/ProductLink.vue +59 -59
- package/src/components/Product/ProductLinkInfo.astro +37 -37
- package/src/components/Product/ProductNumber.astro +60 -60
- 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 +216 -216
- package/src/components/ProductTile.astro +47 -48
- package/src/components/Quote.vue +23 -23
- package/src/components/ReloadPrompt.astro +50 -50
- package/src/components/SlimBanner.vue +72 -72
- 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 → layout}/CallToAction.astro +52 -52
- package/src/components/{Layout → layout}/Container.astro +7 -7
- package/src/components/{Layout → layout}/Header.astro +80 -80
- package/src/config.ts +56 -56
- package/src/design.config.ts +98 -98
- package/src/env.d.ts +6 -6
- package/src/layouts/Layout.astro +58 -61
- package/src/layouts/MainLayout.astro +78 -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 +57 -57
- package/src/pages/components/breadcrumbs.mdx +139 -139
- package/src/pages/components/buttons.mdx +359 -360
- 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 +78 -38
- package/src/pages/components/headline.mdx +137 -137
- package/src/pages/components/icons.astro +135 -135
- package/src/pages/components/image.mdx +513 -513
- package/src/pages/components/input.mdx +367 -367
- package/src/pages/components/jumbotron.mdx +359 -359
- package/src/pages/components/modal.mdx +64 -64
- package/src/pages/components/post-header.mdx +64 -64
- package/src/pages/components/pr-code.mdx +65 -65
- package/src/pages/components/product-number.mdx +58 -58
- package/src/pages/components/product-tile.mdx +51 -51
- package/src/pages/components/quote.mdx +33 -33
- package/src/pages/components/slimbanner.mdx +35 -35
- 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 +49 -49
- package/src/pages/index.astro +264 -133
- package/src/pages/patterns/introduction.mdx +60 -60
- package/src/pwa.ts +12 -12
- package/src/styles/_variables.scss +70 -70
- package/src/styles/base/base.css +184 -184
- package/src/styles/base/grid.css +92 -92
- package/src/styles/base/typography.css +70 -70
- package/src/styles/content.css +73 -73
- package/src/styles/main.css +7 -7
- package/src/types/Product.ts +31 -31
- package/src/types/astro.d.ts +3 -3
- package/src/utils/category/getMainCategoryList.ts +8 -17
- package/src/utils/product/getPriceFormatted.ts +12 -15
- package/src/utils/product/getProductChecklist.ts +16 -17
- package/src/utils/product/useFormatProductNumber.ts +41 -41
- package/src/utils/seo/getShorterDescription.ts +14 -14
- package/src/utils/text/formatDate.ts +5 -5
- package/src/utils/text/formatLocaleNumber.ts +5 -6
- package/src/utils/text/formatPad.ts +12 -12
- package/src/utils/text/getNumberFormatted.ts +33 -33
- package/src/utils/text/getTranslatedLink.ts +5 -5
- package/src/utils/text.ts +19 -19
- package/tailwind.config.cjs +8 -8
- package/tsconfig.json +28 -28
- package/uno-config/index.ts +262 -268
- package/uno-config/theme/breakpoints.ts +9 -9
- package/uno-config/theme/colors.ts +64 -64
- package/uno-config/theme/dimensions.ts +17 -17
- package/uno-config/theme/effects.ts +14 -14
- package/uno-config/theme/grid.ts +10 -10
- package/uno-config/theme/index.ts +28 -28
- package/uno-config/theme/shortcuts/buttons.ts +53 -53
- package/uno-config/theme/shortcuts/components.ts +123 -123
- package/uno-config/theme/shortcuts/index.ts +20 -20
- package/uno-config/theme/shortcuts/layout.ts +74 -74
- package/uno-config/theme/typography.ts +29 -29
- package/uno.config.ts +2 -2
- package/.astro/icon.d.ts +0 -11909
- package/astro-i18next.config.mjs +0 -18
- package/astro-i18next.config.ts +0 -11
- package/public/locales/en/translation.json +0 -13
- package/public/locales/pl/translation.json +0 -13
|
@@ -1,70 +1,70 @@
|
|
|
1
|
-
@font-face {
|
|
2
|
-
font-family: 'vw_textregular';
|
|
3
|
-
src: url('/fonts/vwtext-regular-webfont.woff2') format('woff2');
|
|
4
|
-
font-weight: normal;
|
|
5
|
-
font-style: normal;
|
|
6
|
-
font-display: swap;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
@font-face {
|
|
10
|
-
font-family: 'vw_textbold';
|
|
11
|
-
src: url('/fonts/vwtext-bold-webfont.woff2') format('woff2');
|
|
12
|
-
font-weight: normal;
|
|
13
|
-
font-style: normal;
|
|
14
|
-
font-display: fallback;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
.font-vw-textbold {
|
|
18
|
-
font-family: 'vw_textbold';
|
|
19
|
-
font-display: fallback;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
@font-face {
|
|
23
|
-
font-family: 'vw_headbold';
|
|
24
|
-
src: url('/fonts/vwhead-bold-webfont.woff2') format('woff2');
|
|
25
|
-
font-weight: normal;
|
|
26
|
-
font-style: normal;
|
|
27
|
-
font-display: fallback;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
.font-vw-headbold {
|
|
31
|
-
font-family: 'vw_headbold' !important;
|
|
32
|
-
font-display: fallback;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
@font-face {
|
|
36
|
-
font-family: 'vw_headregular';
|
|
37
|
-
src: url('/fonts/vwhead-regular-webfont.woff2') format('woff2');
|
|
38
|
-
font-weight: normal;
|
|
39
|
-
font-style: normal;
|
|
40
|
-
font-display: fallback;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
@font-face {
|
|
44
|
-
font-family: 'vw_headlight';
|
|
45
|
-
src: url('/fonts/vwhead-light-webfont.woff2') format('woff2'),;
|
|
46
|
-
font-weight: normal;
|
|
47
|
-
font-style: normal;
|
|
48
|
-
font-display: swap;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
@font-face {
|
|
52
|
-
font-family: 'Nova Mono';
|
|
53
|
-
src: url('/fonts/nova-mono-v13-latin-regular.woff2') format('woff2');
|
|
54
|
-
font-weight: normal;
|
|
55
|
-
font-style: normal;
|
|
56
|
-
font-display: swap;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
@font-face {
|
|
60
|
-
font-family: 'vw_textlight';
|
|
61
|
-
src: url('/fonts/vwtext-light-webfont.woff2') format('woff2');
|
|
62
|
-
font-weight: normal;
|
|
63
|
-
font-style: normal;
|
|
64
|
-
font-display: swap;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/* for some content which don't need to index in Google */
|
|
68
|
-
[data-text]:before {
|
|
69
|
-
content: attr(data-text);
|
|
70
|
-
}
|
|
1
|
+
@font-face {
|
|
2
|
+
font-family: 'vw_textregular';
|
|
3
|
+
src: url('/fonts/vwtext-regular-webfont.woff2') format('woff2');
|
|
4
|
+
font-weight: normal;
|
|
5
|
+
font-style: normal;
|
|
6
|
+
font-display: swap;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
@font-face {
|
|
10
|
+
font-family: 'vw_textbold';
|
|
11
|
+
src: url('/fonts/vwtext-bold-webfont.woff2') format('woff2');
|
|
12
|
+
font-weight: normal;
|
|
13
|
+
font-style: normal;
|
|
14
|
+
font-display: fallback;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.font-vw-textbold {
|
|
18
|
+
font-family: 'vw_textbold';
|
|
19
|
+
font-display: fallback;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
@font-face {
|
|
23
|
+
font-family: 'vw_headbold';
|
|
24
|
+
src: url('/fonts/vwhead-bold-webfont.woff2') format('woff2');
|
|
25
|
+
font-weight: normal;
|
|
26
|
+
font-style: normal;
|
|
27
|
+
font-display: fallback;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.font-vw-headbold {
|
|
31
|
+
font-family: 'vw_headbold' !important;
|
|
32
|
+
font-display: fallback;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
@font-face {
|
|
36
|
+
font-family: 'vw_headregular';
|
|
37
|
+
src: url('/fonts/vwhead-regular-webfont.woff2') format('woff2');
|
|
38
|
+
font-weight: normal;
|
|
39
|
+
font-style: normal;
|
|
40
|
+
font-display: fallback;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
@font-face {
|
|
44
|
+
font-family: 'vw_headlight';
|
|
45
|
+
src: url('/fonts/vwhead-light-webfont.woff2') format('woff2'),;
|
|
46
|
+
font-weight: normal;
|
|
47
|
+
font-style: normal;
|
|
48
|
+
font-display: swap;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@font-face {
|
|
52
|
+
font-family: 'Nova Mono';
|
|
53
|
+
src: url('/fonts/nova-mono-v13-latin-regular.woff2') format('woff2');
|
|
54
|
+
font-weight: normal;
|
|
55
|
+
font-style: normal;
|
|
56
|
+
font-display: swap;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
@font-face {
|
|
60
|
+
font-family: 'vw_textlight';
|
|
61
|
+
src: url('/fonts/vwtext-light-webfont.woff2') format('woff2');
|
|
62
|
+
font-weight: normal;
|
|
63
|
+
font-style: normal;
|
|
64
|
+
font-display: swap;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/* for some content which don't need to index in Google */
|
|
68
|
+
[data-text]:before {
|
|
69
|
+
content: attr(data-text);
|
|
70
|
+
}
|
package/src/styles/content.css
CHANGED
|
@@ -1,73 +1,73 @@
|
|
|
1
|
-
.content {
|
|
2
|
-
.main-section {
|
|
3
|
-
&>h1,
|
|
4
|
-
&>h2,
|
|
5
|
-
&>h3,
|
|
6
|
-
&>h4,
|
|
7
|
-
&>h5,
|
|
8
|
-
&>h6 {
|
|
9
|
-
margin-top: 1.77rem;
|
|
10
|
-
}
|
|
11
|
-
&>h1 {
|
|
12
|
-
font-size: 22pt;
|
|
13
|
-
font-weight: 400;
|
|
14
|
-
}
|
|
15
|
-
&>h2 {
|
|
16
|
-
font-size: 17pt;
|
|
17
|
-
font-weight: 500;
|
|
18
|
-
}
|
|
19
|
-
&>h3 {
|
|
20
|
-
font-size: 15pt;
|
|
21
|
-
}
|
|
22
|
-
&>h4 {
|
|
23
|
-
font-size: 13pt;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
&>ul {
|
|
27
|
-
@apply list-disc pl-5
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
&>h1,
|
|
32
|
-
&>h2,
|
|
33
|
-
&>h3,
|
|
34
|
-
&>h4,
|
|
35
|
-
&>h5 {
|
|
36
|
-
font-weight: bold;
|
|
37
|
-
@apply font-textbold;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
code {
|
|
41
|
-
font-family: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Monaco,
|
|
42
|
-
Consolas, "Liberation Mono", "Courier New", monospace;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
.component-preview {
|
|
46
|
-
@apply bg-blue-medium bg-opacity-5 px-4 py-4 mx-0 flex items-center overflow-x-auto sm:(p-8);
|
|
47
|
-
gap: 1rem;
|
|
48
|
-
border-radius: 0.33rem;
|
|
49
|
-
border: 1px solid theme("colors.slate.200");
|
|
50
|
-
resize: both;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
.astro-code {
|
|
54
|
-
@apply mx-0 p-4;
|
|
55
|
-
border-radius: 0.44rem;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
table {
|
|
60
|
-
@apply table-auto text-left border bg-white shadow-md;
|
|
61
|
-
|
|
62
|
-
tr {
|
|
63
|
-
@apply border;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
td, th {
|
|
67
|
-
@apply px-4 py-2;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
thead {
|
|
71
|
-
@apply bg-gray-100;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
1
|
+
.content {
|
|
2
|
+
.main-section {
|
|
3
|
+
&>h1,
|
|
4
|
+
&>h2,
|
|
5
|
+
&>h3,
|
|
6
|
+
&>h4,
|
|
7
|
+
&>h5,
|
|
8
|
+
&>h6 {
|
|
9
|
+
margin-top: 1.77rem;
|
|
10
|
+
}
|
|
11
|
+
&>h1 {
|
|
12
|
+
font-size: 22pt;
|
|
13
|
+
font-weight: 400;
|
|
14
|
+
}
|
|
15
|
+
&>h2 {
|
|
16
|
+
font-size: 17pt;
|
|
17
|
+
font-weight: 500;
|
|
18
|
+
}
|
|
19
|
+
&>h3 {
|
|
20
|
+
font-size: 15pt;
|
|
21
|
+
}
|
|
22
|
+
&>h4 {
|
|
23
|
+
font-size: 13pt;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
&>ul {
|
|
27
|
+
@apply list-disc pl-5
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
&>h1,
|
|
32
|
+
&>h2,
|
|
33
|
+
&>h3,
|
|
34
|
+
&>h4,
|
|
35
|
+
&>h5 {
|
|
36
|
+
font-weight: bold;
|
|
37
|
+
@apply font-textbold;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
code {
|
|
41
|
+
font-family: "IBM Plex Mono", ui-monospace, SFMono-Regular, Menlo, Monaco,
|
|
42
|
+
Consolas, "Liberation Mono", "Courier New", monospace;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.component-preview {
|
|
46
|
+
@apply bg-blue-medium bg-opacity-5 px-4 py-4 mx-0 flex items-center overflow-x-auto sm:(p-8);
|
|
47
|
+
gap: 1rem;
|
|
48
|
+
border-radius: 0.33rem;
|
|
49
|
+
border: 1px solid theme("colors.slate.200");
|
|
50
|
+
resize: both;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.astro-code {
|
|
54
|
+
@apply mx-0 p-4;
|
|
55
|
+
border-radius: 0.44rem;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
table {
|
|
60
|
+
@apply table-auto text-left border bg-white shadow-md;
|
|
61
|
+
|
|
62
|
+
tr {
|
|
63
|
+
@apply border;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
td, th {
|
|
67
|
+
@apply px-4 py-2;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
thead {
|
|
71
|
+
@apply bg-gray-100;
|
|
72
|
+
}
|
|
73
|
+
}
|
package/src/styles/main.css
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
/* @import "variables"; */
|
|
3
|
-
@import "base/typography";
|
|
4
|
-
@import "base/base";
|
|
5
|
-
@import "base/grid";
|
|
6
|
-
|
|
7
|
-
@import "content.css";
|
|
1
|
+
|
|
2
|
+
/* @import "variables"; */
|
|
3
|
+
@import "base/typography";
|
|
4
|
+
@import "base/base";
|
|
5
|
+
@import "base/grid";
|
|
6
|
+
|
|
7
|
+
@import "content.css";
|
package/src/types/Product.ts
CHANGED
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
export interface ProductImage {
|
|
2
|
-
path: string;
|
|
3
|
-
}
|
|
4
|
-
|
|
5
|
-
export interface BaseProduct {
|
|
6
|
-
id: string | number;
|
|
7
|
-
number: string;
|
|
8
|
-
photo: string | null;
|
|
9
|
-
price_pln?: number;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export interface ShopProduct extends BaseProduct {
|
|
13
|
-
images: ProductImage[];
|
|
14
|
-
slug: string;
|
|
15
|
-
name_pl: string;
|
|
16
|
-
name_en: string;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export interface CatalogProduct extends BaseProduct {
|
|
20
|
-
photo: string | null;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export type Product = ShopProduct | CatalogProduct;
|
|
24
|
-
|
|
25
|
-
export interface ProductLinkProps {
|
|
26
|
-
productId: string;
|
|
27
|
-
bigTile?: boolean;
|
|
28
|
-
locale: string;
|
|
29
|
-
index?: number | null;
|
|
30
|
-
loading?: 'lazy' | 'eager';
|
|
31
|
-
isShopProduct?: boolean;
|
|
1
|
+
export interface ProductImage {
|
|
2
|
+
path: string;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
export interface BaseProduct {
|
|
6
|
+
id: string | number;
|
|
7
|
+
number: string;
|
|
8
|
+
photo: string | null;
|
|
9
|
+
price_pln?: number;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface ShopProduct extends BaseProduct {
|
|
13
|
+
images: ProductImage[];
|
|
14
|
+
slug: string;
|
|
15
|
+
name_pl: string;
|
|
16
|
+
name_en: string;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface CatalogProduct extends BaseProduct {
|
|
20
|
+
photo: string | null;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export type Product = ShopProduct | CatalogProduct;
|
|
24
|
+
|
|
25
|
+
export interface ProductLinkProps {
|
|
26
|
+
productId: string;
|
|
27
|
+
bigTile?: boolean;
|
|
28
|
+
locale: string;
|
|
29
|
+
index?: number | null;
|
|
30
|
+
loading?: 'lazy' | 'eager';
|
|
31
|
+
isShopProduct?: boolean;
|
|
32
32
|
}
|
package/src/types/astro.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
declare module '*.astro' {
|
|
2
|
-
const component: any;
|
|
3
|
-
export default component;
|
|
1
|
+
declare module '*.astro' {
|
|
2
|
+
const component: any;
|
|
3
|
+
export default component;
|
|
4
4
|
}
|
|
@@ -1,31 +1,22 @@
|
|
|
1
1
|
import type { CatObject } from "@types/index";
|
|
2
2
|
|
|
3
|
-
import i18next, { t } from "i18next";
|
|
4
3
|
import { getApiCategories } from "@utils/api/getCategories";
|
|
5
4
|
import { getSortedCategories } from "@utils/category/getSortedCategories";
|
|
6
5
|
|
|
7
6
|
// Retrieve main categories:
|
|
8
7
|
export const getMainCategoryList = async (locale: string = 'en'): Promise<CatObject[]> => {
|
|
9
|
-
// Set the selected language
|
|
10
|
-
await i18next.changeLanguage(locale);
|
|
11
|
-
|
|
12
8
|
// Fetch categories from API
|
|
13
9
|
const categories = await getApiCategories();
|
|
14
10
|
|
|
15
|
-
//
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
: ''
|
|
21
|
-
|
|
22
|
-
if (!desc) {
|
|
23
|
-
console.warn('No category description', category.slug, i18next.language);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
return { ...category, name, desc };
|
|
11
|
+
// Use category data directly (English only)
|
|
12
|
+
const processedCategories = categories.map((category) => {
|
|
13
|
+
return {
|
|
14
|
+
...category,
|
|
15
|
+
name: category.name || category.slug,
|
|
16
|
+
desc: category.desc || ''
|
|
17
|
+
};
|
|
27
18
|
});
|
|
28
19
|
|
|
29
20
|
// Sort and return processed categories
|
|
30
|
-
return
|
|
21
|
+
return processedCategories.sort(getSortedCategories);
|
|
31
22
|
};
|
|
@@ -1,16 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
|
|
1
|
+
export const getPriceFormatted = (product: any) => {
|
|
2
|
+
// Default to EUR formatting for English-only design system
|
|
3
|
+
if (product.price_eur) {
|
|
4
|
+
return new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(product.price_eur)
|
|
5
|
+
}
|
|
6
|
+
if (product.price_pln) {
|
|
7
|
+
return new Intl.NumberFormat('pl-PL', { style: 'currency', currency: 'PLN' }).format(product.price_pln)
|
|
8
|
+
}
|
|
9
|
+
return 'no price'
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
|
|
16
13
|
export default getPriceFormatted;
|
|
@@ -1,17 +1,16 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
export default getProductCheckList;
|
|
1
|
+
|
|
2
|
+
export const getProductCheckList = (productDetails) => {
|
|
3
|
+
if (!productDetails || !productDetails.length) {
|
|
4
|
+
return null;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
const list = productDetails.filter(item => item.icon);
|
|
8
|
+
|
|
9
|
+
if (!list.length) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
return list.map(detail => detail.value || 'Detail');
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export default getProductCheckList;
|
|
@@ -1,42 +1,42 @@
|
|
|
1
|
-
const LIQUIDS_PATTERN = /^(\w{1})(\w{3})(\w{3})(.*)$/;
|
|
2
|
-
const WHEELS_EMBLEMS_PATTERN = /^(\w{3})(\w{3})(\w{3})(.*)(\w{3})$/;
|
|
3
|
-
const ACCESSORIES_MATS_PATTERN = /^(\w{3})(\w{3})(\w{3})(\w{1})(.*)$/;
|
|
4
|
-
const OTHER_PARTS_PATTERN = /(\w{3})/g;
|
|
5
|
-
|
|
6
|
-
const isLetter = (char: string): boolean => char.toLowerCase() !== char.toUpperCase();
|
|
7
|
-
|
|
8
|
-
interface FormattedNumbers {
|
|
9
|
-
standard: string;
|
|
10
|
-
dot: string;
|
|
11
|
-
dash: string;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export default function useFormatProductNumber(productNumber: string | null): { formattedNumbers: FormattedNumbers | null } {
|
|
15
|
-
if (!productNumber) return { formattedNumbers: null };
|
|
16
|
-
|
|
17
|
-
const formatProductNumber = (number: string, separator: string): string => {
|
|
18
|
-
let formatted = number;
|
|
19
|
-
|
|
20
|
-
if (isLetter(number[0]) && !isLetter(number[1]) && number.length === 9) {
|
|
21
|
-
formatted = formatted.replace(LIQUIDS_PATTERN, `$1${separator}$2${separator}$3${separator}$4`);
|
|
22
|
-
} else if (number.length >= 13) {
|
|
23
|
-
formatted = formatted.replace(WHEELS_EMBLEMS_PATTERN, `$1${separator}$2${separator}$3${separator}$4${separator}$5`);
|
|
24
|
-
} else if (number.length > 12) {
|
|
25
|
-
formatted = formatted.replace(ACCESSORIES_MATS_PATTERN, `$1${separator}$2${separator}$3${separator}$4${separator}$5`);
|
|
26
|
-
} else {
|
|
27
|
-
formatted = formatted.replace(OTHER_PARTS_PATTERN, `$1${separator}`);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
return formatted
|
|
31
|
-
.replace(' ', separator)
|
|
32
|
-
.replace(/[^a-zA-Z0-9]$/, ''); // Remove the end trailing separator
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
const formattedNumbers: FormattedNumbers = {
|
|
36
|
-
standard: formatProductNumber(productNumber, '\u00A0'),
|
|
37
|
-
dot: formatProductNumber(productNumber, '.'),
|
|
38
|
-
dash: formatProductNumber(productNumber, '-')
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
return { formattedNumbers };
|
|
1
|
+
const LIQUIDS_PATTERN = /^(\w{1})(\w{3})(\w{3})(.*)$/;
|
|
2
|
+
const WHEELS_EMBLEMS_PATTERN = /^(\w{3})(\w{3})(\w{3})(.*)(\w{3})$/;
|
|
3
|
+
const ACCESSORIES_MATS_PATTERN = /^(\w{3})(\w{3})(\w{3})(\w{1})(.*)$/;
|
|
4
|
+
const OTHER_PARTS_PATTERN = /(\w{3})/g;
|
|
5
|
+
|
|
6
|
+
const isLetter = (char: string): boolean => char.toLowerCase() !== char.toUpperCase();
|
|
7
|
+
|
|
8
|
+
interface FormattedNumbers {
|
|
9
|
+
standard: string;
|
|
10
|
+
dot: string;
|
|
11
|
+
dash: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export default function useFormatProductNumber(productNumber: string | null): { formattedNumbers: FormattedNumbers | null } {
|
|
15
|
+
if (!productNumber) return { formattedNumbers: null };
|
|
16
|
+
|
|
17
|
+
const formatProductNumber = (number: string, separator: string): string => {
|
|
18
|
+
let formatted = number;
|
|
19
|
+
|
|
20
|
+
if (isLetter(number[0]) && !isLetter(number[1]) && number.length === 9) {
|
|
21
|
+
formatted = formatted.replace(LIQUIDS_PATTERN, `$1${separator}$2${separator}$3${separator}$4`);
|
|
22
|
+
} else if (number.length >= 13) {
|
|
23
|
+
formatted = formatted.replace(WHEELS_EMBLEMS_PATTERN, `$1${separator}$2${separator}$3${separator}$4${separator}$5`);
|
|
24
|
+
} else if (number.length > 12) {
|
|
25
|
+
formatted = formatted.replace(ACCESSORIES_MATS_PATTERN, `$1${separator}$2${separator}$3${separator}$4${separator}$5`);
|
|
26
|
+
} else {
|
|
27
|
+
formatted = formatted.replace(OTHER_PARTS_PATTERN, `$1${separator}`);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return formatted
|
|
31
|
+
.replace(' ', separator)
|
|
32
|
+
.replace(/[^a-zA-Z0-9]$/, ''); // Remove the end trailing separator
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const formattedNumbers: FormattedNumbers = {
|
|
36
|
+
standard: formatProductNumber(productNumber, '\u00A0'),
|
|
37
|
+
dot: formatProductNumber(productNumber, '.'),
|
|
38
|
+
dash: formatProductNumber(productNumber, '-')
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
return { formattedNumbers };
|
|
42
42
|
}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
const MAX_DESCRIPTION_LENGTH = 150;
|
|
2
|
-
|
|
3
|
-
export const getShorterDescription = (description: string | null, limit = MAX_DESCRIPTION_LENGTH) => {
|
|
4
|
-
function cutString(s: string, n: number) {
|
|
5
|
-
const text = s.replace(/(\n)/g, " ");
|
|
6
|
-
const cut = text.indexOf('. ', n);
|
|
7
|
-
return cut === -1 ? text : `${text.substring(0, cut)}.`;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
return description ? cutString(description, limit) || '' : '';
|
|
11
|
-
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export default getShorterDescription;
|
|
1
|
+
const MAX_DESCRIPTION_LENGTH = 150;
|
|
2
|
+
|
|
3
|
+
export const getShorterDescription = (description: string | null, limit = MAX_DESCRIPTION_LENGTH) => {
|
|
4
|
+
function cutString(s: string, n: number) {
|
|
5
|
+
const text = s.replace(/(\n)/g, " ");
|
|
6
|
+
const cut = text.indexOf('. ', n);
|
|
7
|
+
return cut === -1 ? text : `${text.substring(0, cut)}.`;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
return description ? cutString(description, limit) || '' : '';
|
|
11
|
+
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export default getShorterDescription;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
/* Format date */
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export default function formatDate(date: Date ) {
|
|
5
|
-
return new Date(date);
|
|
1
|
+
/* Format date */
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
export default function formatDate(date: Date ) {
|
|
5
|
+
return new Date(date);
|
|
6
6
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
/* Format numbers like details data: liters, measuring etc. */
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
return i18next.language === 'en' ? String(number).replace(/,/g, '.') : String(number);
|
|
1
|
+
/* Format numbers like details data: liters, measuring etc. */
|
|
2
|
+
|
|
3
|
+
export default function formatLocaleNumber(number: number ) {
|
|
4
|
+
// For English-only design system, always use dot notation
|
|
5
|
+
return String(number).replace(/,/g, '.');
|
|
7
6
|
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
export const formatPad = (num: number, size: number) => {
|
|
2
|
-
return String(num).padStart(size, '0');
|
|
3
|
-
}
|
|
4
|
-
|
|
5
|
-
export default formatPad;
|
|
6
|
-
// export const formatPad = (num: number, size: number) => {
|
|
7
|
-
// let productId = String(num)
|
|
8
|
-
|
|
9
|
-
// if (size < 10)
|
|
10
|
-
// while (productId.length < size) productId = `0${productId}`
|
|
11
|
-
|
|
12
|
-
// return productId
|
|
1
|
+
export const formatPad = (num: number, size: number) => {
|
|
2
|
+
return String(num).padStart(size, '0');
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
export default formatPad;
|
|
6
|
+
// export const formatPad = (num: number, size: number) => {
|
|
7
|
+
// let productId = String(num)
|
|
8
|
+
|
|
9
|
+
// if (size < 10)
|
|
10
|
+
// while (productId.length < size) productId = `0${productId}`
|
|
11
|
+
|
|
12
|
+
// return productId
|
|
13
13
|
// }
|