spoko-design-system 0.2.79 → 0.2.81

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 (155) hide show
  1. package/.github/dependabot.yml +11 -11
  2. package/.github/todo.yml +3 -3
  3. package/.github/workflows/deploy.yml +39 -39
  4. package/.stackblitzrc +5 -5
  5. package/.vscode/extensions.json +5 -5
  6. package/.vscode/launch.json +11 -11
  7. package/.vscode/settings.json +5 -5
  8. package/LICENSE +21 -21
  9. package/README.md +113 -113
  10. package/astro-i18next.config.mjs +17 -17
  11. package/astro-i18next.config.ts +10 -10
  12. package/astro.config.mjs +147 -147
  13. package/dev-dist/sw.js +91 -91
  14. package/dev-dist/workbox-c676b6d3.js +3391 -3391
  15. package/index.ts +65 -65
  16. package/package.json +3 -3
  17. package/public/fonts/lg.svg +53 -53
  18. package/public/fonts/vwhead-bold-demo.html +549 -549
  19. package/public/fonts/vwhead-regular-demo.html +549 -549
  20. package/public/fonts/vwtext-bold-demo.html +549 -549
  21. package/public/fonts/vwtext-regular-demo.html +549 -549
  22. package/public/github.svg +3 -3
  23. package/public/grid_dot.svg +4 -4
  24. package/public/linkedin.svg +44 -44
  25. package/public/locales/en/translation.json +8 -8
  26. package/public/locales/pl/translation.json +8 -8
  27. package/public/make-scrollable-code-focusable.js +3 -3
  28. package/public/pagefind.yml +3 -3
  29. package/public/polo.blue.svg +29 -29
  30. package/public/spoko.space.svg +71 -71
  31. package/public/twitter.svg +46 -46
  32. package/renovate.json +6 -6
  33. package/sandbox.config.json +11 -11
  34. package/src/MyComponent.astro +8 -8
  35. package/src/components/Badge.vue +19 -19
  36. package/src/components/Badges.vue +21 -21
  37. package/src/components/Breadcrumbs.vue +107 -107
  38. package/src/components/Button.vue +55 -55
  39. package/src/components/ButtonCopy.vue +36 -36
  40. package/src/components/Card.astro +27 -27
  41. package/src/components/Carousel.astro +26 -26
  42. package/src/components/Category/CategoriesCarousel.astro +101 -101
  43. package/src/components/Category/CategoriesSidebar.astro +186 -186
  44. package/src/components/Category/CategoryDetails.astro +82 -82
  45. package/src/components/Category/CategoryLink.vue +23 -23
  46. package/src/components/Category/CategorySection.astro +69 -69
  47. package/src/components/Category/CategorySidebarToggler.vue +9 -9
  48. package/src/components/Category/CategoryTile.astro +49 -49
  49. package/src/components/Category/SubCategoryLink.vue +29 -29
  50. package/src/components/CategoryLink.astro +18 -18
  51. package/src/components/Copyright.astro +12 -12
  52. package/src/components/Date.astro +7 -7
  53. package/src/components/Faq.astro +33 -33
  54. package/src/components/FaqItem.astro +96 -96
  55. package/src/components/FeaturesList.vue +41 -41
  56. package/src/components/FuckRussia.vue +62 -62
  57. package/src/components/HandDrive.astro +29 -29
  58. package/src/components/Header/Header.astro +210 -210
  59. package/src/components/Header/SkipToContent.astro +1 -1
  60. package/src/components/Headline.vue +48 -48
  61. package/src/components/Image.astro +30 -30
  62. package/src/components/Jumbatron.vue +40 -40
  63. package/src/components/LeftSidebar.astro +53 -53
  64. package/src/components/MainColors.vue +23 -23
  65. package/src/components/MainInput.vue +15 -15
  66. package/src/components/Modal.astro +27 -27
  67. package/src/components/PageContent.astro +5 -5
  68. package/src/components/PartNumber.vue +27 -27
  69. package/src/components/PostHeader.astro +103 -103
  70. package/src/components/PrCode.vue +141 -141
  71. package/src/components/Product/ProductButton.vue +18 -18
  72. package/src/components/Product/ProductCarousel.astro +35 -35
  73. package/src/components/Product/ProductCodes.vue +174 -174
  74. package/src/components/Product/ProductEngineType.vue +42 -42
  75. package/src/components/Product/ProductImage.astro +40 -40
  76. package/src/components/Product/ProductLink.astro +101 -101
  77. package/src/components/Product/ProductLink.vue +59 -59
  78. package/src/components/Product/ProductLinkInfo.astro +37 -37
  79. package/src/components/Product/ProductNumber.astro +61 -61
  80. package/src/components/ProductCarousel.astro +38 -38
  81. package/src/components/ProductCodes.vue +39 -39
  82. package/src/components/ProductDetailName.vue +52 -52
  83. package/src/components/ProductDetailsList.vue +65 -65
  84. package/src/components/ProductTile.astro +48 -48
  85. package/src/components/Quote.vue +23 -23
  86. package/src/components/ReloadPrompt.astro +50 -50
  87. package/src/components/SlimBanner.vue +72 -72
  88. package/src/components/Table.vue +32 -32
  89. package/src/components/TableOfContents.astro +15 -15
  90. package/src/components/Translations.vue +23 -23
  91. package/src/components/flags/FlagPL.vue +3 -3
  92. package/src/components/flags/FlagUA.vue +2 -2
  93. package/src/components/layout/Container.astro +7 -7
  94. package/src/components/layout/Header.astro +80 -80
  95. package/src/config.ts +56 -56
  96. package/src/design.config.ts +81 -81
  97. package/src/env.d.ts +1 -1
  98. package/src/layouts/Layout.astro +60 -60
  99. package/src/layouts/MainLayout.astro +81 -81
  100. package/src/layouts/partials/FooterCommon.astro +4 -4
  101. package/src/layouts/partials/HeadCommon.astro +44 -44
  102. package/src/layouts/partials/HeadSEO.astro +41 -41
  103. package/src/pages/components/badges.mdx +57 -57
  104. package/src/pages/components/breadcrumbs.mdx +139 -139
  105. package/src/pages/components/buttons.mdx +236 -236
  106. package/src/pages/components/card.mdx +294 -294
  107. package/src/pages/components/carousel.mdx +62 -62
  108. package/src/pages/components/copyright.mdx +42 -42
  109. package/src/pages/components/details-list.mdx +115 -115
  110. package/src/pages/components/features-list.mdx +37 -37
  111. package/src/pages/components/flags.mdx +49 -49
  112. package/src/pages/components/fuck-russia.mdx +39 -39
  113. package/src/pages/components/hand-drive.mdx +38 -38
  114. package/src/pages/components/headline.mdx +152 -152
  115. package/src/pages/components/icons.astro +48 -48
  116. package/src/pages/components/image.mdx +513 -513
  117. package/src/pages/components/input.mdx +45 -45
  118. package/src/pages/components/jumbatron.mdx +95 -95
  119. package/src/pages/components/modal.mdx +64 -64
  120. package/src/pages/components/post-header.mdx +60 -60
  121. package/src/pages/components/pr-code.mdx +65 -65
  122. package/src/pages/components/product-number.mdx +58 -58
  123. package/src/pages/components/product-tile.mdx +51 -51
  124. package/src/pages/components/quote.mdx +33 -33
  125. package/src/pages/components/slimbanner.mdx +35 -35
  126. package/src/pages/components/table.mdx +108 -108
  127. package/src/pages/core/colors.mdx +10 -10
  128. package/src/pages/core/grid.mdx +89 -89
  129. package/src/pages/core/introduction.mdx +77 -77
  130. package/src/pages/core/shadows.astro +20 -20
  131. package/src/pages/core/typography.astro +47 -47
  132. package/src/pages/index.astro +126 -126
  133. package/src/pages/patterns/introduction.mdx +60 -60
  134. package/src/pwa.ts +12 -12
  135. package/src/styles/_variables.scss +70 -70
  136. package/src/styles/base/base.css +184 -184
  137. package/src/styles/base/grid.css +92 -92
  138. package/src/styles/base/typography.css +70 -70
  139. package/src/styles/content.css +73 -73
  140. package/src/styles/main.css +7 -7
  141. package/src/types/Product.ts +31 -31
  142. package/src/types/astro.d.ts +3 -3
  143. package/src/utils/product/getPriceFormatted.ts +15 -15
  144. package/src/utils/product/getProductChecklist.ts +17 -17
  145. package/src/utils/product/useFormatProductNumber.ts +41 -41
  146. package/src/utils/seo/getShorterDescription.ts +14 -14
  147. package/src/utils/text/formatDate.ts +5 -5
  148. package/src/utils/text/formatLocaleNumber.ts +6 -6
  149. package/src/utils/text/formatPad.ts +12 -12
  150. package/src/utils/text/getNumberFormatted.ts +33 -33
  151. package/src/utils/text/getTranslatedLink.ts +5 -5
  152. package/src/utils/text.ts +28 -28
  153. package/tailwind.config.cjs +8 -8
  154. package/tsconfig.json +28 -28
  155. package/uno.config.ts +256 -256
@@ -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-600 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-600 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,16 +1,16 @@
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
+ 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
+
16
16
  export default getPriceFormatted;
@@ -1,17 +1,17 @@
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
+ 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,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,7 @@
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
+ import i18next from "i18next";
4
+
5
+ export default function formatLocaleNumber(number: number ) {
6
+ return i18next.language === 'en' ? String(number).replace(/,/g, '.') : String(number);
7
7
  }
@@ -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
  // }
@@ -1,34 +1,34 @@
1
- export const getNumberFormatted = (num, digits) => {
2
- const lookup = [
3
- { value: 1e18, symbol: "E" },
4
- { value: 1e15, symbol: "P" },
5
- { value: 1e12, symbol: "T" },
6
- { value: 1e9, symbol: "G" },
7
- { value: 1e6, symbol: "M" },
8
- { value: 1e3, symbol: "k" },
9
- { value: 1, symbol: "" }
10
- ];
11
- const item = lookup.find(item => num >= item.value) || lookup[lookup.length - 1];
12
- return (num / item.value).toFixed(digits).replace(/\.0+$|(\.[0-9]*[1-9])0+$/, "$1") + item.symbol;
13
- }
14
-
15
- export default getNumberFormatted;
16
- /*
17
- * Tests
18
- */
19
- // const tests = [
20
- // { num: 0, digits: 1 },
21
- // { num: 12, digits: 1 },
22
- // { num: 1234, digits: 1 },
23
- // { num: 100000000, digits: 1 },
24
- // { num: 299792458, digits: 1 },
25
- // { num: 759878, digits: 1 },
26
- // { num: 759878, digits: 0 },
27
- // { num: 123, digits: 1 },
28
- // { num: 123.456, digits: 1 },
29
- // { num: 123.456, digits: 2 },
30
- // { num: 123.456, digits: 4 }
31
- // ];
32
- // tests.forEach(test => {
33
- // console.log("getNumberFormatted(%f, %i) = %s", test.num, test.digits, getNumberFormatted(test.num, test.digits));
1
+ export const getNumberFormatted = (num, digits) => {
2
+ const lookup = [
3
+ { value: 1e18, symbol: "E" },
4
+ { value: 1e15, symbol: "P" },
5
+ { value: 1e12, symbol: "T" },
6
+ { value: 1e9, symbol: "G" },
7
+ { value: 1e6, symbol: "M" },
8
+ { value: 1e3, symbol: "k" },
9
+ { value: 1, symbol: "" }
10
+ ];
11
+ const item = lookup.find(item => num >= item.value) || lookup[lookup.length - 1];
12
+ return (num / item.value).toFixed(digits).replace(/\.0+$|(\.[0-9]*[1-9])0+$/, "$1") + item.symbol;
13
+ }
14
+
15
+ export default getNumberFormatted;
16
+ /*
17
+ * Tests
18
+ */
19
+ // const tests = [
20
+ // { num: 0, digits: 1 },
21
+ // { num: 12, digits: 1 },
22
+ // { num: 1234, digits: 1 },
23
+ // { num: 100000000, digits: 1 },
24
+ // { num: 299792458, digits: 1 },
25
+ // { num: 759878, digits: 1 },
26
+ // { num: 759878, digits: 0 },
27
+ // { num: 123, digits: 1 },
28
+ // { num: 123.456, digits: 1 },
29
+ // { num: 123.456, digits: 2 },
30
+ // { num: 123.456, digits: 4 }
31
+ // ];
32
+ // tests.forEach(test => {
33
+ // console.log("getNumberFormatted(%f, %i) = %s", test.num, test.digits, getNumberFormatted(test.num, test.digits));
34
34
  // });
@@ -1,5 +1,5 @@
1
- export const getTranslatedLink = ( link:string, locale='en' ) => {
2
- return locale === 'en' ? link : `/${locale}${link}`
3
- }
4
-
5
- export default getTranslatedLink;
1
+ export const getTranslatedLink = ( link:string, locale='en' ) => {
2
+ return locale === 'en' ? link : `/${locale}${link}`
3
+ }
4
+
5
+ export default getTranslatedLink;
package/src/utils/text.ts CHANGED
@@ -1,28 +1,28 @@
1
- import i18next, { t } from "i18next";
2
-
3
- // import { t } from "i18next";
4
-
5
- export const getTranslation = (translationKey: string) => {
6
- // console.log('search translation for', translationKey, t(translationKey))
7
- return i18next.exists(translationKey) ? t(translationKey) : `missing ${translationKey}`
8
- }
9
-
10
- export const text2paragraphs = (text: string, firstLineBottomMargin: boolean = false) => {
11
- // return '<p class="mb-2">' + text.split(/[\n\r]+/g).join('</p><p>') + '</p>'
12
- let out = '<p' + (firstLineBottomMargin ? 'class="mb-3"' : '') + '>' + text.split("\n").join('</p><p>') + '<\/p>';
13
- return out.split('<p><\/p><p>').join('<p class="mt-3">');
14
- }
15
-
16
-
17
- export const countWords = (str: string) => {
18
- return str.trim().split(/\s+/).length;
19
- }
20
-
21
- export const firstSentence = (str: string) => {
22
- return str.split('\.');
23
- }
24
-
25
- export const removeSemicolon = (name: string) => {
26
- return name.replace(';', '')
27
- }
28
-
1
+ // import i18next, { t } from "i18next";
2
+
3
+ // import { t } from "i18next";
4
+
5
+ // export const getTranslation = (translationKey: string) => {
6
+ // // console.log('search translation for', translationKey, t(translationKey))
7
+ // return i18next.exists(translationKey) ? t(translationKey) : `missing ${translationKey}`
8
+ // }
9
+
10
+ export const text2paragraphs = (text: string, firstLineBottomMargin: boolean = false) => {
11
+ // return '<p class="mb-2">' + text.split(/[\n\r]+/g).join('</p><p>') + '</p>'
12
+ let out = '<p' + (firstLineBottomMargin ? 'class="mb-3"' : '') + '>' + text.split("\n").join('</p><p>') + '<\/p>';
13
+ return out.split('<p><\/p><p>').join('<p class="mt-3">');
14
+ }
15
+
16
+
17
+ export const countWords = (str: string) => {
18
+ return str.trim().split(/\s+/).length;
19
+ }
20
+
21
+ export const firstSentence = (str: string) => {
22
+ return str.split('\.');
23
+ }
24
+
25
+ export const removeSemicolon = (name: string) => {
26
+ return name.replace(';', '')
27
+ }
28
+
@@ -1,8 +1,8 @@
1
- module.exports = {
2
- // darkMode: "class",
3
- content: ["./src/**/*.{astro,html,js,jsx,svelte,ts,tsx,vue}"],
4
- theme: {
5
- extend: {},
6
- },
7
- plugins: [],
8
- };
1
+ module.exports = {
2
+ // darkMode: "class",
3
+ content: ["./src/**/*.{astro,html,js,jsx,svelte,ts,tsx,vue}"],
4
+ theme: {
5
+ extend: {},
6
+ },
7
+ plugins: [],
8
+ };