spoko-design-system 0.7.5 → 0.7.6
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/settings.json +4 -4
- 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 +114 -114
- package/astro-i18next.config.mjs +17 -17
- package/astro-i18next.config.ts +10 -10
- package/astro.config.mjs +86 -86
- package/dev-dist/sw.js +91 -91
- package/dev-dist/workbox-c676b6d3.js +3391 -3391
- package/icon.config.ts +309 -309
- package/index.ts +66 -66
- package/package.json +1 -1
- 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 +107 -107
- 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 +101 -101
- package/src/components/Category/CategoryDetails.astro +169 -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 +33 -33
- package/src/components/FaqItem.astro +80 -80
- package/src/components/FeaturesList.vue +41 -41
- package/src/components/FuckRussia.vue +62 -62
- package/src/components/HandDrive.astro +29 -29
- package/src/components/Header/Header.astro +210 -210
- 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/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 +39 -39
- 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/ProductCodes.vue +174 -174
- package/src/components/Product/ProductEngineType.vue +42 -42
- package/src/components/Product/ProductImage.astro +40 -40
- package/src/components/Product/ProductLink.astro +101 -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 +157 -157
- 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 +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/Container.astro +7 -7
- package/src/components/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 +61 -61
- 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 +57 -57
- package/src/pages/components/breadcrumbs.mdx +139 -139
- package/src/pages/components/buttons.mdx +360 -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 +38 -38
- package/src/pages/components/headline.mdx +152 -152
- 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 +133 -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/product/getPriceFormatted.ts +15 -15
- package/src/utils/product/getProductChecklist.ts +17 -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 +6 -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 +232 -232
- 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 +92 -92
- package/uno-config/theme/shortcuts/index.ts +20 -20
- package/uno-config/theme/shortcuts/layout.ts +64 -64
- package/uno-config/theme/typography.ts +29 -29
- package/uno.config.ts +2 -2
|
@@ -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,19 +1,19 @@
|
|
|
1
|
-
export const text2paragraphs = (text: string, firstLineBottomMargin: boolean = false) => {
|
|
2
|
-
// return '<p class="mb-2">' + text.split(/[\n\r]+/g).join('</p><p>') + '</p>'
|
|
3
|
-
let out = '<p' + (firstLineBottomMargin ? 'class="mb-3"' : '') + '>' + text.split("\n").join('</p><p>') + '<\/p>';
|
|
4
|
-
return out.split('<p><\/p><p>').join('<p class="mt-3">');
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
export const countWords = (str: string) => {
|
|
9
|
-
return str.trim().split(/\s+/).length;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export const firstSentence = (str: string) => {
|
|
13
|
-
return str.split('\.');
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export const removeSemicolon = (name: string) => {
|
|
17
|
-
return name.replace(';', '')
|
|
18
|
-
}
|
|
19
|
-
|
|
1
|
+
export const text2paragraphs = (text: string, firstLineBottomMargin: boolean = false) => {
|
|
2
|
+
// return '<p class="mb-2">' + text.split(/[\n\r]+/g).join('</p><p>') + '</p>'
|
|
3
|
+
let out = '<p' + (firstLineBottomMargin ? 'class="mb-3"' : '') + '>' + text.split("\n").join('</p><p>') + '<\/p>';
|
|
4
|
+
return out.split('<p><\/p><p>').join('<p class="mt-3">');
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
export const countWords = (str: string) => {
|
|
9
|
+
return str.trim().split(/\s+/).length;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const firstSentence = (str: string) => {
|
|
13
|
+
return str.split('\.');
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export const removeSemicolon = (name: string) => {
|
|
17
|
+
return name.replace(';', '')
|
|
18
|
+
}
|
|
19
|
+
|
package/tailwind.config.cjs
CHANGED
|
@@ -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
|
+
};
|
package/tsconfig.json
CHANGED
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
{
|
|
2
|
-
"include": ["env.d.ts", "src/**/*", "src/**/*.vue", "src/**/*.astro", "src/**/*.d.ts", "*.ts"],
|
|
3
|
-
"compilerOptions": {
|
|
4
|
-
"baseUrl": "src",
|
|
5
|
-
|
|
6
|
-
// Enable JSON imports.
|
|
7
|
-
"resolveJsonModule": true,
|
|
8
|
-
|
|
9
|
-
// Enable stricter transpilation for better output.
|
|
10
|
-
"isolatedModules": true,
|
|
11
|
-
|
|
12
|
-
// Astro will directly run your TypeScript code, no transpilation needed.
|
|
13
|
-
"noEmit": true,
|
|
14
|
-
|
|
15
|
-
"target": "esnext",
|
|
16
|
-
"useDefineForClassFields": true,
|
|
17
|
-
"module": "esnext",
|
|
18
|
-
"moduleResolution": "node",
|
|
19
|
-
"jsx": "preserve",
|
|
20
|
-
"allowJs": true,
|
|
21
|
-
"types": ["vite/client", "vitest", "@vue/runtime-dom", "@astrojs/ts", "@astrojs/ts-plugin", "unplugin-vue-macros/macros-global", "unplugin-icons/types/astro"],
|
|
22
|
-
"paths": {
|
|
23
|
-
"@components/*": ["components/*"],
|
|
24
|
-
"@utils/*": ["utils/*"],
|
|
25
|
-
"@types/*": ["types/*"]
|
|
26
|
-
}
|
|
27
|
-
},
|
|
28
|
-
"exclude": ["dist", "node_modules"]
|
|
1
|
+
{
|
|
2
|
+
"include": ["env.d.ts", "src/**/*", "src/**/*.vue", "src/**/*.astro", "src/**/*.d.ts", "*.ts"],
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"baseUrl": "src",
|
|
5
|
+
|
|
6
|
+
// Enable JSON imports.
|
|
7
|
+
"resolveJsonModule": true,
|
|
8
|
+
|
|
9
|
+
// Enable stricter transpilation for better output.
|
|
10
|
+
"isolatedModules": true,
|
|
11
|
+
|
|
12
|
+
// Astro will directly run your TypeScript code, no transpilation needed.
|
|
13
|
+
"noEmit": true,
|
|
14
|
+
|
|
15
|
+
"target": "esnext",
|
|
16
|
+
"useDefineForClassFields": true,
|
|
17
|
+
"module": "esnext",
|
|
18
|
+
"moduleResolution": "node",
|
|
19
|
+
"jsx": "preserve",
|
|
20
|
+
"allowJs": true,
|
|
21
|
+
"types": ["vite/client", "vitest", "@vue/runtime-dom", "@astrojs/ts", "@astrojs/ts-plugin", "unplugin-vue-macros/macros-global", "unplugin-icons/types/astro"],
|
|
22
|
+
"paths": {
|
|
23
|
+
"@components/*": ["components/*"],
|
|
24
|
+
"@utils/*": ["utils/*"],
|
|
25
|
+
"@types/*": ["types/*"]
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
"exclude": ["dist", "node_modules"]
|
|
29
29
|
}
|