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.
Files changed (180) hide show
  1. package/.astro/content.d.ts +1 -1
  2. package/.astro/data-store.json +1 -1
  3. package/.astro/settings.json +4 -4
  4. package/.astro/types.d.ts +2 -1
  5. package/.claude/settings.local.json +11 -1
  6. package/.github/dependabot.yml +11 -11
  7. package/.github/todo.yml +3 -3
  8. package/.github/workflows/deploy.yml +39 -39
  9. package/.github/workflows/release.yml +64 -0
  10. package/.releaserc.json +93 -0
  11. package/.stackblitzrc +5 -5
  12. package/.vscode/extensions.json +4 -5
  13. package/.vscode/launch.json +11 -11
  14. package/.vscode/settings.json +1 -5
  15. package/CHANGELOG.md +20 -0
  16. package/CONTRIBUTING.md +183 -0
  17. package/LICENSE +21 -21
  18. package/README.md +132 -116
  19. package/astro.config.mjs +84 -86
  20. package/dev-dist/sw.js +91 -91
  21. package/dev-dist/workbox-c676b6d3.js +3391 -3391
  22. package/icon.config.ts +340 -310
  23. package/index.ts +70 -70
  24. package/package.json +19 -11
  25. package/public/arrow-bottom.svg +7 -7
  26. package/public/fonts/lg.svg +53 -53
  27. package/public/fonts/vwhead-bold-demo.html +549 -549
  28. package/public/fonts/vwhead-regular-demo.html +549 -549
  29. package/public/fonts/vwtext-bold-demo.html +549 -549
  30. package/public/fonts/vwtext-regular-demo.html +549 -549
  31. package/public/github.svg +3 -3
  32. package/public/grid_dot.svg +4 -4
  33. package/public/linkedin.svg +44 -44
  34. package/public/make-scrollable-code-focusable.js +3 -3
  35. package/public/pagefind.yml +3 -3
  36. package/public/polo.blue.svg +29 -29
  37. package/public/spoko.space.svg +71 -71
  38. package/public/twitter.svg +46 -46
  39. package/renovate.json +6 -6
  40. package/sandbox.config.json +11 -11
  41. package/src/MyComponent.astro +8 -8
  42. package/src/components/Badge.vue +19 -19
  43. package/src/components/Badges.vue +21 -21
  44. package/src/components/Breadcrumbs.vue +94 -94
  45. package/src/components/Button.vue +101 -101
  46. package/src/components/ButtonCopy.astro +183 -183
  47. package/src/components/ButtonCopy.vue +36 -36
  48. package/src/components/Card.astro +27 -27
  49. package/src/components/Carousel.astro +26 -26
  50. package/src/components/Category/CategoriesCarousel.astro +100 -101
  51. package/src/components/Category/CategoryDetails.astro +168 -169
  52. package/src/components/Category/CategoryLink.vue +28 -28
  53. package/src/components/Category/CategorySidebarToggler.vue +9 -9
  54. package/src/components/Category/CategoryTile.astro +37 -37
  55. package/src/components/Category/CategoryViewToggler.astro +89 -89
  56. package/src/components/Category/SubCategoryLink.vue +19 -19
  57. package/src/components/Copyright.astro +12 -12
  58. package/src/components/Date.astro +7 -7
  59. package/src/components/Faq.astro +32 -33
  60. package/src/components/FaqItem.astro +80 -80
  61. package/src/components/FeaturesList.vue +37 -37
  62. package/src/components/FuckRussia.vue +62 -62
  63. package/src/components/HandDrive.astro +55 -29
  64. package/src/components/Header/Header.astro +210 -210
  65. package/src/components/Header/SkipToContent.astro +1 -1
  66. package/src/components/Headline.vue +107 -87
  67. package/src/components/Image.astro +30 -30
  68. package/src/components/LeftSidebar.astro +53 -53
  69. package/src/components/MainColors.vue +22 -22
  70. package/src/components/MainInput.vue +15 -15
  71. package/src/components/Modal.astro +27 -27
  72. package/src/components/PageContent.astro +5 -5
  73. package/src/components/PartNumber.vue +27 -27
  74. package/src/components/Post/PostCategories.astro +41 -41
  75. package/src/components/Post/PostCategories.vue +30 -30
  76. package/src/components/PostHeader.astro +103 -103
  77. package/src/components/PrCode.vue +141 -141
  78. package/src/components/Product/ProductButton.vue +18 -18
  79. package/src/components/Product/ProductCarousel.astro +35 -35
  80. package/src/components/Product/ProductEngineType.vue +42 -42
  81. package/src/components/Product/ProductImage.astro +40 -40
  82. package/src/components/Product/ProductLink.astro +96 -101
  83. package/src/components/Product/ProductLink.vue +59 -59
  84. package/src/components/Product/ProductLinkInfo.astro +37 -37
  85. package/src/components/Product/ProductNumber.astro +60 -60
  86. package/src/components/ProductCarousel.astro +38 -38
  87. package/src/components/ProductCodes.vue +39 -39
  88. package/src/components/ProductDetailName.vue +52 -52
  89. package/src/components/ProductDetailsList.vue +216 -216
  90. package/src/components/ProductTile.astro +47 -48
  91. package/src/components/Quote.vue +23 -23
  92. package/src/components/ReloadPrompt.astro +50 -50
  93. package/src/components/SlimBanner.vue +72 -72
  94. package/src/components/Table.vue +32 -32
  95. package/src/components/TableOfContents.astro +15 -15
  96. package/src/components/Translations.vue +23 -23
  97. package/src/components/flags/FlagPL.vue +3 -3
  98. package/src/components/flags/FlagUA.vue +2 -2
  99. package/src/components/{Layout → layout}/CallToAction.astro +52 -52
  100. package/src/components/{Layout → layout}/Container.astro +7 -7
  101. package/src/components/{Layout → layout}/Header.astro +80 -80
  102. package/src/config.ts +56 -56
  103. package/src/design.config.ts +98 -98
  104. package/src/env.d.ts +6 -6
  105. package/src/layouts/Layout.astro +58 -61
  106. package/src/layouts/MainLayout.astro +78 -81
  107. package/src/layouts/partials/FooterCommon.astro +4 -4
  108. package/src/layouts/partials/HeadCommon.astro +44 -44
  109. package/src/layouts/partials/HeadSEO.astro +41 -41
  110. package/src/pages/components/badges.mdx +57 -57
  111. package/src/pages/components/breadcrumbs.mdx +139 -139
  112. package/src/pages/components/buttons.mdx +359 -360
  113. package/src/pages/components/card.mdx +294 -294
  114. package/src/pages/components/carousel.mdx +62 -62
  115. package/src/pages/components/copyright.mdx +42 -42
  116. package/src/pages/components/details-list.mdx +115 -115
  117. package/src/pages/components/features-list.mdx +37 -37
  118. package/src/pages/components/flags.mdx +49 -49
  119. package/src/pages/components/fuck-russia.mdx +39 -39
  120. package/src/pages/components/hand-drive.mdx +78 -38
  121. package/src/pages/components/headline.mdx +137 -137
  122. package/src/pages/components/icons.astro +135 -135
  123. package/src/pages/components/image.mdx +513 -513
  124. package/src/pages/components/input.mdx +367 -367
  125. package/src/pages/components/jumbotron.mdx +359 -359
  126. package/src/pages/components/modal.mdx +64 -64
  127. package/src/pages/components/post-header.mdx +64 -64
  128. package/src/pages/components/pr-code.mdx +65 -65
  129. package/src/pages/components/product-number.mdx +58 -58
  130. package/src/pages/components/product-tile.mdx +51 -51
  131. package/src/pages/components/quote.mdx +33 -33
  132. package/src/pages/components/slimbanner.mdx +35 -35
  133. package/src/pages/components/table.mdx +108 -108
  134. package/src/pages/core/colors.mdx +10 -10
  135. package/src/pages/core/grid.mdx +89 -89
  136. package/src/pages/core/introduction.mdx +77 -77
  137. package/src/pages/core/shadows.astro +20 -20
  138. package/src/pages/core/typography.astro +49 -49
  139. package/src/pages/index.astro +264 -133
  140. package/src/pages/patterns/introduction.mdx +60 -60
  141. package/src/pwa.ts +12 -12
  142. package/src/styles/_variables.scss +70 -70
  143. package/src/styles/base/base.css +184 -184
  144. package/src/styles/base/grid.css +92 -92
  145. package/src/styles/base/typography.css +70 -70
  146. package/src/styles/content.css +73 -73
  147. package/src/styles/main.css +7 -7
  148. package/src/types/Product.ts +31 -31
  149. package/src/types/astro.d.ts +3 -3
  150. package/src/utils/category/getMainCategoryList.ts +8 -17
  151. package/src/utils/product/getPriceFormatted.ts +12 -15
  152. package/src/utils/product/getProductChecklist.ts +16 -17
  153. package/src/utils/product/useFormatProductNumber.ts +41 -41
  154. package/src/utils/seo/getShorterDescription.ts +14 -14
  155. package/src/utils/text/formatDate.ts +5 -5
  156. package/src/utils/text/formatLocaleNumber.ts +5 -6
  157. package/src/utils/text/formatPad.ts +12 -12
  158. package/src/utils/text/getNumberFormatted.ts +33 -33
  159. package/src/utils/text/getTranslatedLink.ts +5 -5
  160. package/src/utils/text.ts +19 -19
  161. package/tailwind.config.cjs +8 -8
  162. package/tsconfig.json +28 -28
  163. package/uno-config/index.ts +262 -268
  164. package/uno-config/theme/breakpoints.ts +9 -9
  165. package/uno-config/theme/colors.ts +64 -64
  166. package/uno-config/theme/dimensions.ts +17 -17
  167. package/uno-config/theme/effects.ts +14 -14
  168. package/uno-config/theme/grid.ts +10 -10
  169. package/uno-config/theme/index.ts +28 -28
  170. package/uno-config/theme/shortcuts/buttons.ts +53 -53
  171. package/uno-config/theme/shortcuts/components.ts +123 -123
  172. package/uno-config/theme/shortcuts/index.ts +20 -20
  173. package/uno-config/theme/shortcuts/layout.ts +74 -74
  174. package/uno-config/theme/typography.ts +29 -29
  175. package/uno.config.ts +2 -2
  176. package/.astro/icon.d.ts +0 -11909
  177. package/astro-i18next.config.mjs +0 -18
  178. package/astro-i18next.config.ts +0 -11
  179. package/public/locales/en/translation.json +0 -13
  180. 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
+ }
@@ -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
+ }
@@ -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";
@@ -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
  }
@@ -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
- // Map categories with translations
16
- const translatedCategories = categories.map((category) => {
17
- const name = t(`cat.${category.slug}.name`);
18
- const desc = i18next.exists(`cat.${category.slug}.desc`)
19
- ? t(`cat.${category.slug}.desc`)
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 translatedCategories.sort(getSortedCategories);
21
+ return processedCategories.sort(getSortedCategories);
31
22
  };
@@ -1,16 +1,13 @@
1
- import i18next from "i18next";
2
-
3
- export const getPriceFormatted = (product: any) => {
4
- if (i18next.language === 'en') {
5
- return new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(product.price_eur, )
6
- }
7
- if (i18next.language === 'pl') {
8
- return new Intl.NumberFormat('pl-PL', { style: 'currency', currency: 'PLN' }).format(product.price_pln, )
9
- }
10
- else {
11
- return 'no price'
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
- import { t } from "i18next";
2
-
3
- export const getProductCheckList = (productDetails) => {
4
- if (!productDetails || !productDetails.length) {
5
- return null;
6
- }
7
-
8
- const list = productDetails.filter(item => item.icon);
9
-
10
- if (!list.length) {
11
- return null;
12
- }
13
-
14
- return list.map(detail => t(`detail.value.${detail.value}`));
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
- import i18next from "i18next";
4
-
5
- export default function formatLocaleNumber(number: number ) {
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
  // }