@windstream/react-shared-components 0.1.93 → 0.1.94
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/README.md +635 -635
- package/dist/contentful/index.esm.js +3 -3
- package/dist/contentful/index.esm.js.map +1 -1
- package/dist/contentful/index.js +3 -3
- package/dist/contentful/index.js.map +1 -1
- package/dist/core.d.ts +6 -6
- package/dist/index.d.ts +2 -2
- package/dist/index.esm.js +13 -5
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +13 -5
- package/dist/index.js.map +1 -1
- package/dist/next/index.esm.js +2 -2
- package/dist/next/index.esm.js.map +1 -1
- package/dist/next/index.js +2 -2
- package/dist/next/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/utils/index.esm.js +1 -1
- package/dist/utils/index.esm.js.map +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.js.map +1 -1
- package/package.json +191 -185
- package/src/components/accordion/Accordion.stories.tsx +230 -230
- package/src/components/accordion/index.test.tsx +270 -0
- package/src/components/accordion/index.tsx +70 -70
- package/src/components/accordion/types.ts +12 -12
- package/src/components/alert-card/AlertCard.stories.tsx +171 -171
- package/src/components/alert-card/index.test.tsx +152 -0
- package/src/components/alert-card/index.tsx +41 -41
- package/src/components/alert-card/types.ts +13 -13
- package/src/components/animation-wrapper/index.test.tsx +424 -0
- package/src/components/animation-wrapper/index.tsx +129 -129
- package/src/components/animation-wrapper/types.ts +11 -11
- package/src/components/brand-button/BrandButton.stories.tsx +223 -223
- package/src/components/brand-button/helpers.ts +35 -35
- package/src/components/brand-button/index.test.tsx +292 -0
- package/src/components/brand-button/index.tsx +120 -120
- package/src/components/brand-button/types.ts +38 -38
- package/src/components/button/Button.stories.tsx +108 -108
- package/src/components/button/index.test.tsx +91 -0
- package/src/components/button/index.tsx +27 -27
- package/src/components/button/types.ts +14 -14
- package/src/components/call-button/CallButton.stories.tsx +324 -324
- package/src/components/call-button/index.test.tsx +260 -0
- package/src/components/call-button/index.tsx +106 -106
- package/src/components/call-button/types.ts +16 -16
- package/src/components/checkbox/Checkbox.stories.tsx +247 -247
- package/src/components/checkbox/index.test.tsx +252 -0
- package/src/components/checkbox/index.tsx +197 -197
- package/src/components/checkbox/types.ts +27 -27
- package/src/components/checklist/Checklist.stories.tsx +150 -150
- package/src/components/checklist/index.test.tsx +231 -0
- package/src/components/checklist/index.tsx +96 -61
- package/src/components/checklist/types.ts +23 -17
- package/src/components/collapse/Collapse.stories.tsx +255 -255
- package/src/components/collapse/index.test.tsx +277 -0
- package/src/components/collapse/index.tsx +47 -46
- package/src/components/collapse/types.ts +6 -6
- package/src/components/divider/Divider.stories.tsx +205 -205
- package/src/components/divider/index.test.tsx +53 -0
- package/src/components/divider/index.tsx +22 -22
- package/src/components/divider/type.ts +3 -3
- package/src/components/image/Image.stories.tsx +113 -113
- package/src/components/image/index.test.tsx +174 -0
- package/src/components/image/index.tsx +25 -25
- package/src/components/image/types.ts +40 -40
- package/src/components/input/Input.stories.tsx +325 -325
- package/src/components/input/index.test.tsx +348 -0
- package/src/components/input/index.tsx +177 -177
- package/src/components/input/types.ts +37 -37
- package/src/components/link/Link.stories.tsx +163 -163
- package/src/components/link/index.test.tsx +199 -0
- package/src/components/link/index.tsx +116 -116
- package/src/components/link/types.ts +25 -25
- package/src/components/list/List.stories.tsx +272 -272
- package/src/components/list/index.test.tsx +166 -0
- package/src/components/list/index.tsx +88 -88
- package/src/components/list/list-item/index.tsx +38 -38
- package/src/components/list/list-item/types.ts +13 -13
- package/src/components/list/types.ts +29 -29
- package/src/components/material-icon/MaterialIcon.stories.tsx +322 -322
- package/src/components/material-icon/constants.ts +99 -99
- package/src/components/material-icon/index.test.tsx +130 -0
- package/src/components/material-icon/index.tsx +47 -47
- package/src/components/material-icon/types.ts +31 -31
- package/src/components/modal/Modal.stories.tsx +171 -171
- package/src/components/modal/index.test.tsx +310 -0
- package/src/components/modal/index.tsx +164 -164
- package/src/components/modal/types.ts +24 -24
- package/src/components/next-image/index.test.tsx +406 -0
- package/src/components/next-image/index.tsx +74 -74
- package/src/components/next-image/types.ts +1 -1
- package/src/components/pagination/index.test.tsx +521 -0
- package/src/components/pagination/index.tsx +91 -91
- package/src/components/pagination/types.ts +6 -6
- package/src/components/radio-button/RadioButton.stories.tsx +307 -307
- package/src/components/radio-button/index.test.tsx +151 -0
- package/src/components/radio-button/index.tsx +75 -75
- package/src/components/radio-button/types.ts +21 -21
- package/src/components/see-more/SeeMore.stories.tsx +181 -181
- package/src/components/see-more/index.test.tsx +96 -0
- package/src/components/see-more/index.tsx +44 -44
- package/src/components/see-more/types.ts +4 -4
- package/src/components/select/Select.stories.tsx +411 -411
- package/src/components/select/index.test.tsx +256 -0
- package/src/components/select/index.tsx +155 -155
- package/src/components/select/types.ts +36 -36
- package/src/components/select-plan-button/SelectPlanButton.stories.tsx +184 -184
- package/src/components/select-plan-button/index.test.tsx +173 -0
- package/src/components/select-plan-button/index.tsx +63 -63
- package/src/components/select-plan-button/types.ts +17 -17
- package/src/components/skeleton/Skeleton.stories.tsx +179 -179
- package/src/components/skeleton/index.test.tsx +74 -0
- package/src/components/skeleton/index.tsx +61 -61
- package/src/components/skeleton/types.ts +4 -4
- package/src/components/spinner/Spinner.stories.tsx +335 -335
- package/src/components/spinner/index.test.tsx +76 -0
- package/src/components/spinner/index.tsx +44 -44
- package/src/components/spinner/types.ts +5 -5
- package/src/components/text/Text.stories.tsx +321 -321
- package/src/components/text/index.test.tsx +65 -0
- package/src/components/text/index.tsx +25 -25
- package/src/components/text/types.ts +45 -45
- package/src/components/tooltip/Tooltip.stories.tsx +219 -219
- package/src/components/tooltip/index.test.tsx +50 -0
- package/src/components/tooltip/index.tsx +74 -74
- package/src/components/tooltip/types.ts +7 -7
- package/src/components/view-cart-button/ViewCartButton.stories.tsx +252 -252
- package/src/components/view-cart-button/index.test.tsx +57 -0
- package/src/components/view-cart-button/index.tsx +42 -42
- package/src/components/view-cart-button/types.ts +5 -5
- package/src/contentful/blocks/accordion/Accordion.stories.mocks.tsx +128 -128
- package/src/contentful/blocks/accordion/Accordion.stories.tsx +98 -98
- package/src/contentful/blocks/accordion/index.test.tsx +218 -0
- package/src/contentful/blocks/accordion/index.tsx +114 -112
- package/src/contentful/blocks/accordion/types.ts +34 -34
- package/src/contentful/blocks/address-input-banner/index.test.tsx +132 -0
- package/src/contentful/blocks/address-input-banner/index.tsx +52 -52
- package/src/contentful/blocks/address-input-banner/types.ts +14 -14
- package/src/contentful/blocks/anchored-bottom-banner/index.test.tsx +287 -0
- package/src/contentful/blocks/anchored-bottom-banner/index.tsx +181 -181
- package/src/contentful/blocks/anchored-bottom-banner/types.ts +13 -13
- package/src/contentful/blocks/blogs-grid/BlogGrid.stories.mocks.tsx +144 -144
- package/src/contentful/blocks/blogs-grid/BlogGrid.stories.tsx +157 -156
- package/src/contentful/blocks/blogs-grid/index.test.tsx +355 -0
- package/src/contentful/blocks/blogs-grid/index.tsx +134 -134
- package/src/contentful/blocks/blogs-grid/types.ts +26 -26
- package/src/contentful/blocks/blogs-grid-base/index.test.tsx +274 -0
- package/src/contentful/blocks/blogs-grid-base/index.tsx +119 -119
- package/src/contentful/blocks/blogs-grid-base/types.ts +36 -36
- package/src/contentful/blocks/breadcrumbs/BreadcrumbNavigation.stories.tsx +147 -147
- package/src/contentful/blocks/breadcrumbs/index.test.tsx +281 -0
- package/src/contentful/blocks/breadcrumbs/index.tsx +95 -95
- package/src/contentful/blocks/breadcrumbs/types.ts +8 -8
- package/src/contentful/blocks/button/Button.stories.tsx +40 -40
- package/src/contentful/blocks/button/index.test.tsx +339 -0
- package/src/contentful/blocks/button/index.tsx +131 -131
- package/src/contentful/blocks/button/types.ts +39 -39
- package/src/contentful/blocks/callout/Callout.stories.tsx +23 -23
- package/src/contentful/blocks/callout/index.test.tsx +539 -0
- package/src/contentful/blocks/callout/index.tsx +277 -277
- package/src/contentful/blocks/callout/types.ts +78 -78
- package/src/contentful/blocks/cards/Cards.stories.tsx +23 -23
- package/src/contentful/blocks/cards/blog-card/index.test.tsx +218 -0
- package/src/contentful/blocks/cards/blog-card/index.tsx +129 -129
- package/src/contentful/blocks/cards/blog-card/types.ts +34 -34
- package/src/contentful/blocks/cards/floating-image-card/index.test.tsx +201 -0
- package/src/contentful/blocks/cards/floating-image-card/index.tsx +119 -119
- package/src/contentful/blocks/cards/floating-image-card/types.ts +30 -30
- package/src/contentful/blocks/cards/full-image-card/index.test.tsx +216 -0
- package/src/contentful/blocks/cards/full-image-card/index.tsx +130 -130
- package/src/contentful/blocks/cards/full-image-card/types.ts +29 -29
- package/src/contentful/blocks/cards/index.test.tsx +39 -0
- package/src/contentful/blocks/cards/index.tsx +13 -13
- package/src/contentful/blocks/cards/product-card/index.test.tsx +263 -0
- package/src/contentful/blocks/cards/product-card/index.tsx +251 -251
- package/src/contentful/blocks/cards/product-card/types.ts +28 -28
- package/src/contentful/blocks/cards/simple-card/index.test.tsx +364 -0
- package/src/contentful/blocks/cards/simple-card/index.tsx +325 -325
- package/src/contentful/blocks/cards/simple-card/types.ts +71 -71
- package/src/contentful/blocks/cards/testimonial-card/index.test.tsx +180 -0
- package/src/contentful/blocks/cards/testimonial-card/index.tsx +90 -90
- package/src/contentful/blocks/cards/testimonial-card/types.tsx +12 -12
- package/src/contentful/blocks/cards/types.ts +1 -1
- package/src/contentful/blocks/carousel/Carousel.stories.tsx +23 -23
- package/src/contentful/blocks/carousel/helper.test.tsx +539 -0
- package/src/contentful/blocks/carousel/helper.tsx +494 -494
- package/src/contentful/blocks/carousel/index.test.tsx +308 -0
- package/src/contentful/blocks/carousel/index.tsx +87 -87
- package/src/contentful/blocks/carousel/types.test.ts +16 -0
- package/src/contentful/blocks/carousel/types.ts +145 -145
- package/src/contentful/blocks/cart-retention-banner/index.test.tsx +409 -0
- package/src/contentful/blocks/cart-retention-banner/index.tsx +109 -109
- package/src/contentful/blocks/cart-retention-banner/types.ts +11 -11
- package/src/contentful/blocks/comparison-table/index.test.tsx +114 -0
- package/src/contentful/blocks/comparison-table/index.tsx +29 -29
- package/src/contentful/blocks/comparison-table/types.ts +6 -6
- package/src/contentful/blocks/cookiebanner/index.test.tsx +277 -0
- package/src/contentful/blocks/cookiebanner/index.tsx +146 -146
- package/src/contentful/blocks/cookiebanner/type.ts +7 -7
- package/src/contentful/blocks/cta-callout/CtaCallout.stories.tsx +46 -46
- package/src/contentful/blocks/cta-callout/index.test.tsx +244 -0
- package/src/contentful/blocks/cta-callout/index.tsx +73 -73
- package/src/contentful/blocks/cta-callout/types.ts +26 -26
- package/src/contentful/blocks/dynamic-tabs/index.test.tsx +240 -0
- package/src/contentful/blocks/dynamic-tabs/index.tsx +204 -204
- package/src/contentful/blocks/dynamic-tabs/types.ts +21 -21
- package/src/contentful/blocks/email-input-block/index.test.tsx +213 -0
- package/src/contentful/blocks/email-input-block/index.tsx +121 -116
- package/src/contentful/blocks/email-input-block/types.ts +16 -16
- package/src/contentful/blocks/find-kinetic/FindKinetic.stories.tsx +23 -23
- package/src/contentful/blocks/find-kinetic/index.test.tsx +269 -0
- package/src/contentful/blocks/find-kinetic/index.tsx +138 -138
- package/src/contentful/blocks/find-kinetic/types.ts +20 -20
- package/src/contentful/blocks/floating-banner/FloatingBanner.stories.tsx +34 -34
- package/src/contentful/blocks/floating-banner/index.test.tsx +246 -0
- package/src/contentful/blocks/floating-banner/index.tsx +97 -97
- package/src/contentful/blocks/floating-banner/types.ts +22 -22
- package/src/contentful/blocks/footer/Footer.stories.tsx +317 -317
- package/src/contentful/blocks/footer/index.test.tsx +302 -0
- package/src/contentful/blocks/footer/index.tsx +91 -91
- package/src/contentful/blocks/footer/types.ts +13 -13
- package/src/contentful/blocks/image-promo-bar/ImagePromoBar.stories.tsx +23 -23
- package/src/contentful/blocks/image-promo-bar/helper.test.tsx +61 -0
- package/src/contentful/blocks/image-promo-bar/helper.tsx +28 -28
- package/src/contentful/blocks/image-promo-bar/index.test.tsx +467 -0
- package/src/contentful/blocks/image-promo-bar/index.tsx +246 -246
- package/src/contentful/blocks/image-promo-bar/types.ts +44 -44
- package/src/contentful/blocks/image-promo-bar/vimeo-embed.test.tsx +142 -0
- package/src/contentful/blocks/image-promo-bar/vimeo-embed.tsx +93 -93
- package/src/contentful/blocks/image-promo-bar/youtube-embed.test.tsx +104 -0
- package/src/contentful/blocks/image-promo-bar/youtube-embed.tsx +46 -46
- package/src/contentful/blocks/modal/constants.ts +53 -53
- package/src/contentful/blocks/modal/index.test.tsx +209 -0
- package/src/contentful/blocks/modal/index.tsx +108 -108
- package/src/contentful/blocks/modal/types.ts +12 -12
- package/src/contentful/blocks/navigation/Navigation.stories.mocks.tsx +78 -78
- package/src/contentful/blocks/navigation/Navigation.stories.tsx +138 -138
- package/src/contentful/blocks/navigation/desktop-link-groups.tsx/index.test.tsx +208 -0
- package/src/contentful/blocks/navigation/desktop-link-groups.tsx/index.tsx +141 -141
- package/src/contentful/blocks/navigation/index.test.tsx +924 -0
- package/src/contentful/blocks/navigation/index.tsx +569 -569
- package/src/contentful/blocks/navigation/mobile-link-groups.tsx/index.test.tsx +131 -0
- package/src/contentful/blocks/navigation/mobile-link-groups.tsx/index.tsx +82 -82
- package/src/contentful/blocks/navigation/types.ts +71 -71
- package/src/contentful/blocks/primary-hero/PrimaryHero.stories.tsx +23 -23
- package/src/contentful/blocks/primary-hero/index.test.tsx +286 -0
- package/src/contentful/blocks/primary-hero/index.tsx +239 -236
- package/src/contentful/blocks/primary-hero/types.ts +37 -37
- package/src/contentful/blocks/search-block/index.test.tsx +268 -0
- package/src/contentful/blocks/search-block/index.tsx +90 -90
- package/src/contentful/blocks/search-block/types.ts +15 -15
- package/src/contentful/blocks/shape-background-wrapper/ShapeBackgroundWrapper.stories.tsx +26 -26
- package/src/contentful/blocks/shape-background-wrapper/index.test.tsx +284 -0
- package/src/contentful/blocks/shape-background-wrapper/index.tsx +124 -124
- package/src/contentful/blocks/shape-background-wrapper/types.ts +36 -36
- package/src/contentful/blocks/text/Text.stories.tsx +23 -23
- package/src/contentful/blocks/text/index.test.tsx +36 -0
- package/src/contentful/blocks/text/index.tsx +12 -12
- package/src/contentful/blocks/text/types.ts +1 -1
- package/src/contentful/index.test.ts +45 -0
- package/src/contentful/index.ts +105 -105
- package/src/global-mocks/contentful/to-document.ts +25 -0
- package/src/global-mocks/cookie.ts +48 -0
- package/src/global-mocks/cx.ts +37 -0
- package/src/global-mocks/index.ts +89 -0
- package/src/global-mocks/speed-card-bg.ts +27 -0
- package/src/global-mocks/utm.ts +49 -0
- package/src/hooks/contentful/use-contentful-rich-text.test.tsx +1758 -0
- package/src/hooks/contentful/use-contentful-rich-text.tsx +309 -309
- package/src/hooks/contentful/use-processed-check-list.test.tsx +277 -0
- package/src/hooks/contentful/use-processed-check-list.ts +63 -63
- package/src/hooks/use-body-scroll-lock.test.ts +134 -0
- package/src/hooks/use-body-scroll-lock.ts +34 -34
- package/src/hooks/use-carousel-swipe.test.ts +393 -0
- package/src/hooks/use-carousel-swipe.ts +264 -264
- package/src/hooks/use-outside-click.test.ts +142 -0
- package/src/hooks/use-outside-click.ts +17 -17
- package/src/index.ts +107 -107
- package/src/next/index.test.ts +7 -0
- package/src/next/index.ts +5 -5
- package/src/setupTests.ts +52 -46
- package/src/stories/DocsTemplate.tsx +24 -24
- package/src/styles/globals.css +343 -343
- package/src/types/global.d.ts +9 -9
- package/src/types/micro-components.ts +99 -99
- package/src/types/utm.ts +49 -49
- package/src/utils/contentful/to-document.test.ts +85 -0
- package/src/utils/contentful/to-document.ts +24 -24
- package/src/utils/cookie.test.ts +180 -0
- package/src/utils/cookie.ts +84 -84
- package/src/utils/cx.test.ts +90 -0
- package/src/utils/cx.ts +49 -49
- package/src/utils/index.test.ts +115 -0
- package/src/utils/index.ts +41 -41
- package/src/utils/speed-card-bg.test.ts +46 -0
- package/src/utils/speed-card-bg.ts +24 -24
- package/src/utils/utm.test.ts +359 -0
- package/src/utils/utm.ts +221 -221
package/src/utils/cookie.ts
CHANGED
|
@@ -1,84 +1,84 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cookie Helpers for UTM Parameter Storage
|
|
3
|
-
*
|
|
4
|
-
* Provides Base64-encoded JSON cookie storage for UTM parameters.
|
|
5
|
-
*/
|
|
6
|
-
import type { UTMProperties } from "../types/utm";
|
|
7
|
-
import { Base64 } from "js-base64";
|
|
8
|
-
import Cookies from "js-cookie";
|
|
9
|
-
|
|
10
|
-
const UTM_COOKIE_KEY = "utm_parameters";
|
|
11
|
-
const DEFAULT_DOMAIN = ".gokinetic.com";
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* Reads UTM parameters from the Base64-encoded cookie.
|
|
15
|
-
* @returns Parsed UTMProperties or null if cookie doesn't exist / is invalid.
|
|
16
|
-
*/
|
|
17
|
-
export function getUTMs(): UTMProperties | null {
|
|
18
|
-
if (typeof window === "undefined") return null;
|
|
19
|
-
|
|
20
|
-
const raw = Cookies.get(UTM_COOKIE_KEY);
|
|
21
|
-
if (!raw) return null;
|
|
22
|
-
|
|
23
|
-
try {
|
|
24
|
-
const decoded = Base64.decode(raw);
|
|
25
|
-
return JSON.parse(decoded) as UTMProperties;
|
|
26
|
-
} catch {
|
|
27
|
-
return null;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Stores UTM parameters as a Base64-encoded JSON cookie.
|
|
33
|
-
* @param utms - The UTM properties to store.
|
|
34
|
-
* @param domain - Cookie domain (defaults to `.gokinetic.com`).
|
|
35
|
-
*/
|
|
36
|
-
export function setUTMs(
|
|
37
|
-
utms: UTMProperties,
|
|
38
|
-
domain: string = DEFAULT_DOMAIN
|
|
39
|
-
): void {
|
|
40
|
-
if (typeof window === "undefined") return;
|
|
41
|
-
|
|
42
|
-
const json = JSON.stringify(utms);
|
|
43
|
-
const encoded = Base64.encode(json);
|
|
44
|
-
|
|
45
|
-
Cookies.set(UTM_COOKIE_KEY, encoded, {
|
|
46
|
-
domain,
|
|
47
|
-
path: "/",
|
|
48
|
-
sameSite: "Lax",
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Removes the UTM cookie.
|
|
54
|
-
* @param domain - Cookie domain (defaults to `.gokinetic.com`).
|
|
55
|
-
*/
|
|
56
|
-
export function removeUTMs(domain: string = DEFAULT_DOMAIN): void {
|
|
57
|
-
Cookies.remove(UTM_COOKIE_KEY, { domain, path: "/" });
|
|
58
|
-
}
|
|
59
|
-
export function getCookie(key: string): string | null {
|
|
60
|
-
if (typeof window === "undefined") return "";
|
|
61
|
-
const encryptedValue = Cookies.get(key);
|
|
62
|
-
|
|
63
|
-
if (encryptedValue) return Base64.decode(encryptedValue);
|
|
64
|
-
|
|
65
|
-
return null;
|
|
66
|
-
}
|
|
67
|
-
export const getParsedCookie = (key: string) => {
|
|
68
|
-
try {
|
|
69
|
-
return JSON.parse(getCookie(key) || "");
|
|
70
|
-
} catch {
|
|
71
|
-
return null;
|
|
72
|
-
}
|
|
73
|
-
};
|
|
74
|
-
export const setCookie = (
|
|
75
|
-
key: string,
|
|
76
|
-
value: any,
|
|
77
|
-
options: Cookies.CookieAttributes
|
|
78
|
-
) => {
|
|
79
|
-
if (typeof window === "undefined") return;
|
|
80
|
-
const stringValue = JSON.stringify(value);
|
|
81
|
-
const encryptedValue = Base64.encode(stringValue);
|
|
82
|
-
|
|
83
|
-
Cookies.set(key, encryptedValue, options);
|
|
84
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* Cookie Helpers for UTM Parameter Storage
|
|
3
|
+
*
|
|
4
|
+
* Provides Base64-encoded JSON cookie storage for UTM parameters.
|
|
5
|
+
*/
|
|
6
|
+
import type { UTMProperties } from "../types/utm";
|
|
7
|
+
import { Base64 } from "js-base64";
|
|
8
|
+
import Cookies from "js-cookie";
|
|
9
|
+
|
|
10
|
+
const UTM_COOKIE_KEY = "utm_parameters";
|
|
11
|
+
const DEFAULT_DOMAIN = ".gokinetic.com";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Reads UTM parameters from the Base64-encoded cookie.
|
|
15
|
+
* @returns Parsed UTMProperties or null if cookie doesn't exist / is invalid.
|
|
16
|
+
*/
|
|
17
|
+
export function getUTMs(): UTMProperties | null {
|
|
18
|
+
if (typeof window === "undefined") return null;
|
|
19
|
+
|
|
20
|
+
const raw = Cookies.get(UTM_COOKIE_KEY);
|
|
21
|
+
if (!raw) return null;
|
|
22
|
+
|
|
23
|
+
try {
|
|
24
|
+
const decoded = Base64.decode(raw);
|
|
25
|
+
return JSON.parse(decoded) as UTMProperties;
|
|
26
|
+
} catch {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Stores UTM parameters as a Base64-encoded JSON cookie.
|
|
33
|
+
* @param utms - The UTM properties to store.
|
|
34
|
+
* @param domain - Cookie domain (defaults to `.gokinetic.com`).
|
|
35
|
+
*/
|
|
36
|
+
export function setUTMs(
|
|
37
|
+
utms: UTMProperties,
|
|
38
|
+
domain: string = DEFAULT_DOMAIN
|
|
39
|
+
): void {
|
|
40
|
+
if (typeof window === "undefined") return;
|
|
41
|
+
|
|
42
|
+
const json = JSON.stringify(utms);
|
|
43
|
+
const encoded = Base64.encode(json);
|
|
44
|
+
|
|
45
|
+
Cookies.set(UTM_COOKIE_KEY, encoded, {
|
|
46
|
+
domain,
|
|
47
|
+
path: "/",
|
|
48
|
+
sameSite: "Lax",
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Removes the UTM cookie.
|
|
54
|
+
* @param domain - Cookie domain (defaults to `.gokinetic.com`).
|
|
55
|
+
*/
|
|
56
|
+
export function removeUTMs(domain: string = DEFAULT_DOMAIN): void {
|
|
57
|
+
Cookies.remove(UTM_COOKIE_KEY, { domain, path: "/" });
|
|
58
|
+
}
|
|
59
|
+
export function getCookie(key: string): string | null {
|
|
60
|
+
if (typeof window === "undefined") return "";
|
|
61
|
+
const encryptedValue = Cookies.get(key);
|
|
62
|
+
|
|
63
|
+
if (encryptedValue) return Base64.decode(encryptedValue);
|
|
64
|
+
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
export const getParsedCookie = (key: string) => {
|
|
68
|
+
try {
|
|
69
|
+
return JSON.parse(getCookie(key) || "");
|
|
70
|
+
} catch {
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
export const setCookie = (
|
|
75
|
+
key: string,
|
|
76
|
+
value: any,
|
|
77
|
+
options: Cookies.CookieAttributes
|
|
78
|
+
) => {
|
|
79
|
+
if (typeof window === "undefined") return;
|
|
80
|
+
const stringValue = JSON.stringify(value);
|
|
81
|
+
const encryptedValue = Base64.encode(stringValue);
|
|
82
|
+
|
|
83
|
+
Cookies.set(key, encryptedValue, options);
|
|
84
|
+
};
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { clsx, cx } from "./cx";
|
|
2
|
+
|
|
3
|
+
describe("cx utility", () => {
|
|
4
|
+
describe("basic class merging", () => {
|
|
5
|
+
it("returns empty string for no arguments", () => {
|
|
6
|
+
expect(cx()).toBe("");
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
it("returns single class unchanged", () => {
|
|
10
|
+
expect(cx("text-red-500")).toBe("text-red-500");
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it("combines multiple classes", () => {
|
|
14
|
+
const result = cx("p-4", "m-2", "bg-white");
|
|
15
|
+
expect(result).toContain("p-4");
|
|
16
|
+
expect(result).toContain("m-2");
|
|
17
|
+
expect(result).toContain("bg-white");
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
describe("Tailwind conflict resolution", () => {
|
|
22
|
+
it("resolves conflicting padding classes (last wins)", () => {
|
|
23
|
+
expect(cx("p-4", "p-8")).toBe("p-8");
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it("resolves conflicting text color classes", () => {
|
|
27
|
+
expect(cx("text-red-500", "text-blue-500")).toBe("text-blue-500");
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it("resolves conflicting margin classes", () => {
|
|
31
|
+
expect(cx("m-2", "m-6")).toBe("m-6");
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
describe("custom font-variants class group", () => {
|
|
36
|
+
it("resolves conflicting font variant classes", () => {
|
|
37
|
+
expect(cx("heading1", "body1")).toBe("body1");
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it("resolves heading vs label variants", () => {
|
|
41
|
+
expect(cx("heading3", "label2")).toBe("label2");
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it("keeps non-conflicting classes alongside font variants", () => {
|
|
45
|
+
const result = cx("heading1", "text-red-500", "body2");
|
|
46
|
+
expect(result).toContain("body2");
|
|
47
|
+
expect(result).toContain("text-red-500");
|
|
48
|
+
expect(result).not.toContain("heading1");
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
describe("custom button-sizes class group", () => {
|
|
53
|
+
it("resolves conflicting button size classes", () => {
|
|
54
|
+
expect(cx("btn-small", "btn-large")).toBe("btn-large");
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it("resolves btn-medium vs btn-x-large", () => {
|
|
58
|
+
expect(cx("btn-medium", "btn-x-large")).toBe("btn-x-large");
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
describe("conditional and falsy values (via clsx)", () => {
|
|
63
|
+
it("filters out falsy values", () => {
|
|
64
|
+
expect(cx("p-4", false, null, undefined, 0, "", "m-2")).toBe("p-4 m-2");
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it("supports conditional object syntax", () => {
|
|
68
|
+
expect(cx({ "bg-red-500": true, "bg-blue-500": false })).toBe(
|
|
69
|
+
"bg-red-500"
|
|
70
|
+
);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it("supports arrays", () => {
|
|
74
|
+
expect(cx(["p-2", "m-4"])).toBe("p-2 m-4");
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it("supports mixed arguments", () => {
|
|
78
|
+
const result = cx("base", ["arr1"], { conditional: true }, undefined);
|
|
79
|
+
expect(result).toContain("base");
|
|
80
|
+
expect(result).toContain("arr1");
|
|
81
|
+
expect(result).toContain("conditional");
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
describe("exports", () => {
|
|
86
|
+
it("exports clsx function", () => {
|
|
87
|
+
expect(typeof clsx).toBe("function");
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
});
|
package/src/utils/cx.ts
CHANGED
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
import { clsx, type ClassValue } from "clsx";
|
|
2
|
-
import { extendTailwindMerge } from "tailwind-merge";
|
|
3
|
-
|
|
4
|
-
const twMerge = extendTailwindMerge({
|
|
5
|
-
// Define class groups so twMerge knows which classes override each other
|
|
6
|
-
extend: {
|
|
7
|
-
classGroups: {
|
|
8
|
-
["font-variants" as any]: [
|
|
9
|
-
"heading1",
|
|
10
|
-
"heading2",
|
|
11
|
-
"heading3",
|
|
12
|
-
"heading4",
|
|
13
|
-
"heading5",
|
|
14
|
-
"heading6",
|
|
15
|
-
"subheading1",
|
|
16
|
-
"subheading2",
|
|
17
|
-
"subheading3",
|
|
18
|
-
"subheading4",
|
|
19
|
-
"subheading5",
|
|
20
|
-
"subheading6",
|
|
21
|
-
"body1",
|
|
22
|
-
"body2",
|
|
23
|
-
"body3",
|
|
24
|
-
"footnote",
|
|
25
|
-
"micro",
|
|
26
|
-
"label1",
|
|
27
|
-
"label2",
|
|
28
|
-
"label3",
|
|
29
|
-
"label4",
|
|
30
|
-
],
|
|
31
|
-
["button-sizes" as any]: [
|
|
32
|
-
"btn-small",
|
|
33
|
-
"btn-medium",
|
|
34
|
-
"btn-large",
|
|
35
|
-
"btn-x-large",
|
|
36
|
-
],
|
|
37
|
-
},
|
|
38
|
-
},
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Utility function to combine class names using clsx
|
|
43
|
-
* @param inputs - Class values to combine
|
|
44
|
-
* @returns Combined class string
|
|
45
|
-
*/
|
|
46
|
-
export const cx = (...val: ClassValue[]) => twMerge(clsx(...val));
|
|
47
|
-
|
|
48
|
-
export { clsx };
|
|
49
|
-
export type { ClassValue };
|
|
1
|
+
import { clsx, type ClassValue } from "clsx";
|
|
2
|
+
import { extendTailwindMerge } from "tailwind-merge";
|
|
3
|
+
|
|
4
|
+
const twMerge = extendTailwindMerge({
|
|
5
|
+
// Define class groups so twMerge knows which classes override each other
|
|
6
|
+
extend: {
|
|
7
|
+
classGroups: {
|
|
8
|
+
["font-variants" as any]: [
|
|
9
|
+
"heading1",
|
|
10
|
+
"heading2",
|
|
11
|
+
"heading3",
|
|
12
|
+
"heading4",
|
|
13
|
+
"heading5",
|
|
14
|
+
"heading6",
|
|
15
|
+
"subheading1",
|
|
16
|
+
"subheading2",
|
|
17
|
+
"subheading3",
|
|
18
|
+
"subheading4",
|
|
19
|
+
"subheading5",
|
|
20
|
+
"subheading6",
|
|
21
|
+
"body1",
|
|
22
|
+
"body2",
|
|
23
|
+
"body3",
|
|
24
|
+
"footnote",
|
|
25
|
+
"micro",
|
|
26
|
+
"label1",
|
|
27
|
+
"label2",
|
|
28
|
+
"label3",
|
|
29
|
+
"label4",
|
|
30
|
+
],
|
|
31
|
+
["button-sizes" as any]: [
|
|
32
|
+
"btn-small",
|
|
33
|
+
"btn-medium",
|
|
34
|
+
"btn-large",
|
|
35
|
+
"btn-x-large",
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Utility function to combine class names using clsx
|
|
43
|
+
* @param inputs - Class values to combine
|
|
44
|
+
* @returns Combined class string
|
|
45
|
+
*/
|
|
46
|
+
export const cx = (...val: ClassValue[]) => twMerge(clsx(...val));
|
|
47
|
+
|
|
48
|
+
export { clsx };
|
|
49
|
+
export type { ClassValue };
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This test ensures all re-exports from the utils barrel file are resolved,
|
|
3
|
+
* which satisfies the function coverage requirement for the barrel module.
|
|
4
|
+
*/
|
|
5
|
+
import {
|
|
6
|
+
buildPreservedQueryHref,
|
|
7
|
+
clsx,
|
|
8
|
+
combineExistingAndNewUTMs,
|
|
9
|
+
cx,
|
|
10
|
+
getCampaignProperties,
|
|
11
|
+
getCookie,
|
|
12
|
+
getOrganicTrafficUtmParameters,
|
|
13
|
+
getParsedCookie,
|
|
14
|
+
getUtmParametersFromURL,
|
|
15
|
+
getUTMs,
|
|
16
|
+
label1BoldOptions,
|
|
17
|
+
removeUTMs,
|
|
18
|
+
renderContentfulRichText,
|
|
19
|
+
renderContentfulRichTextTable,
|
|
20
|
+
setCookie,
|
|
21
|
+
setUTMs,
|
|
22
|
+
SpeedCardBg,
|
|
23
|
+
toDocument,
|
|
24
|
+
useContentfulRichText,
|
|
25
|
+
useProcessedChecklist,
|
|
26
|
+
UTM_PARAM_NAMES,
|
|
27
|
+
} from "./index";
|
|
28
|
+
|
|
29
|
+
describe("utils barrel exports", () => {
|
|
30
|
+
it("exports cx", () => {
|
|
31
|
+
expect(typeof cx).toBe("function");
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it("exports clsx", () => {
|
|
35
|
+
expect(typeof clsx).toBe("function");
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it("exports SpeedCardBg", () => {
|
|
39
|
+
expect(typeof SpeedCardBg).toBe("function");
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it("exports getUTMs", () => {
|
|
43
|
+
expect(typeof getUTMs).toBe("function");
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it("exports setUTMs", () => {
|
|
47
|
+
expect(typeof setUTMs).toBe("function");
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it("exports removeUTMs", () => {
|
|
51
|
+
expect(typeof removeUTMs).toBe("function");
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it("exports getCookie", () => {
|
|
55
|
+
expect(typeof getCookie).toBe("function");
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it("exports getParsedCookie", () => {
|
|
59
|
+
expect(typeof getParsedCookie).toBe("function");
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it("exports setCookie", () => {
|
|
63
|
+
expect(typeof setCookie).toBe("function");
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it("exports getUtmParametersFromURL", () => {
|
|
67
|
+
expect(typeof getUtmParametersFromURL).toBe("function");
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it("exports combineExistingAndNewUTMs", () => {
|
|
71
|
+
expect(typeof combineExistingAndNewUTMs).toBe("function");
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it("exports getOrganicTrafficUtmParameters", () => {
|
|
75
|
+
expect(typeof getOrganicTrafficUtmParameters).toBe("function");
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it("exports getCampaignProperties", () => {
|
|
79
|
+
expect(typeof getCampaignProperties).toBe("function");
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it("exports buildPreservedQueryHref", () => {
|
|
83
|
+
expect(typeof buildPreservedQueryHref).toBe("function");
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it("exports UTM_PARAM_NAMES", () => {
|
|
87
|
+
expect(UTM_PARAM_NAMES).toBeDefined();
|
|
88
|
+
expect(Array.isArray(UTM_PARAM_NAMES)).toBe(true);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it("exports toDocument", () => {
|
|
92
|
+
expect(typeof toDocument).toBe("function");
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it("exports renderContentfulRichText", () => {
|
|
96
|
+
expect(typeof renderContentfulRichText).toBe("function");
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it("exports useContentfulRichText", () => {
|
|
100
|
+
expect(typeof useContentfulRichText).toBe("function");
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it("exports renderContentfulRichTextTable", () => {
|
|
104
|
+
expect(typeof renderContentfulRichTextTable).toBe("function");
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it("exports useProcessedChecklist", () => {
|
|
108
|
+
expect(typeof useProcessedChecklist).toBe("function");
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it("exports label1BoldOptions", () => {
|
|
112
|
+
expect(label1BoldOptions).toBeDefined();
|
|
113
|
+
expect(label1BoldOptions.renderMark).toBeDefined();
|
|
114
|
+
});
|
|
115
|
+
});
|
package/src/utils/index.ts
CHANGED
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
export { cx, clsx } from "./cx";
|
|
2
|
-
export type { ClassValue } from "./cx";
|
|
3
|
-
|
|
4
|
-
// Decorative SVG generators
|
|
5
|
-
export { SpeedCardBg } from "./speed-card-bg";
|
|
6
|
-
|
|
7
|
-
// UTM & Cookie utilities
|
|
8
|
-
export {
|
|
9
|
-
getUTMs,
|
|
10
|
-
setUTMs,
|
|
11
|
-
removeUTMs,
|
|
12
|
-
getCookie,
|
|
13
|
-
getParsedCookie,
|
|
14
|
-
setCookie,
|
|
15
|
-
} from "./cookie";
|
|
16
|
-
export {
|
|
17
|
-
getUtmParametersFromURL,
|
|
18
|
-
combineExistingAndNewUTMs,
|
|
19
|
-
getOrganicTrafficUtmParameters,
|
|
20
|
-
getCampaignProperties,
|
|
21
|
-
buildPreservedQueryHref,
|
|
22
|
-
} from "./utm";
|
|
23
|
-
export type {
|
|
24
|
-
UTMProperty,
|
|
25
|
-
UTMProperties,
|
|
26
|
-
CampaignProperties,
|
|
27
|
-
} from "../types/utm";
|
|
28
|
-
export { UTM_PARAM_NAMES } from "../types/utm";
|
|
29
|
-
|
|
30
|
-
// Contentful utilities (server-safe, no "use client")
|
|
31
|
-
export { toDocument } from "./contentful/to-document";
|
|
32
|
-
export {
|
|
33
|
-
renderContentfulRichText,
|
|
34
|
-
useContentfulRichText,
|
|
35
|
-
renderContentfulRichTextTable,
|
|
36
|
-
} from "../hooks/contentful/use-contentful-rich-text";
|
|
37
|
-
export {
|
|
38
|
-
useProcessedChecklist,
|
|
39
|
-
label1BoldOptions,
|
|
40
|
-
} from "../hooks/contentful/use-processed-check-list";
|
|
41
|
-
export type { ProcessedChecklistItem } from "../hooks/contentful/use-processed-check-list";
|
|
1
|
+
export { cx, clsx } from "./cx";
|
|
2
|
+
export type { ClassValue } from "./cx";
|
|
3
|
+
|
|
4
|
+
// Decorative SVG generators
|
|
5
|
+
export { SpeedCardBg } from "./speed-card-bg";
|
|
6
|
+
|
|
7
|
+
// UTM & Cookie utilities
|
|
8
|
+
export {
|
|
9
|
+
getUTMs,
|
|
10
|
+
setUTMs,
|
|
11
|
+
removeUTMs,
|
|
12
|
+
getCookie,
|
|
13
|
+
getParsedCookie,
|
|
14
|
+
setCookie,
|
|
15
|
+
} from "./cookie";
|
|
16
|
+
export {
|
|
17
|
+
getUtmParametersFromURL,
|
|
18
|
+
combineExistingAndNewUTMs,
|
|
19
|
+
getOrganicTrafficUtmParameters,
|
|
20
|
+
getCampaignProperties,
|
|
21
|
+
buildPreservedQueryHref,
|
|
22
|
+
} from "./utm";
|
|
23
|
+
export type {
|
|
24
|
+
UTMProperty,
|
|
25
|
+
UTMProperties,
|
|
26
|
+
CampaignProperties,
|
|
27
|
+
} from "../types/utm";
|
|
28
|
+
export { UTM_PARAM_NAMES } from "../types/utm";
|
|
29
|
+
|
|
30
|
+
// Contentful utilities (server-safe, no "use client")
|
|
31
|
+
export { toDocument } from "./contentful/to-document";
|
|
32
|
+
export {
|
|
33
|
+
renderContentfulRichText,
|
|
34
|
+
useContentfulRichText,
|
|
35
|
+
renderContentfulRichTextTable,
|
|
36
|
+
} from "../hooks/contentful/use-contentful-rich-text";
|
|
37
|
+
export {
|
|
38
|
+
useProcessedChecklist,
|
|
39
|
+
label1BoldOptions,
|
|
40
|
+
} from "../hooks/contentful/use-processed-check-list";
|
|
41
|
+
export type { ProcessedChecklistItem } from "../hooks/contentful/use-processed-check-list";
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import SpeedCardBg, { SpeedCardBg as namedExport } from "./speed-card-bg";
|
|
2
|
+
|
|
3
|
+
describe("SpeedCardBg", () => {
|
|
4
|
+
it("returns a valid SVG string", () => {
|
|
5
|
+
const svg = SpeedCardBg();
|
|
6
|
+
expect(svg).toContain("<svg");
|
|
7
|
+
expect(svg).toContain("</svg>");
|
|
8
|
+
expect(svg).toContain('xmlns="http://www.w3.org/2000/svg"');
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
it("uses default color #24A76A when no argument provided", () => {
|
|
12
|
+
const svg = SpeedCardBg();
|
|
13
|
+
expect(svg).toContain('fill="#24A76A"');
|
|
14
|
+
expect(svg).not.toContain("${color}");
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it("applies custom color to fill attributes", () => {
|
|
18
|
+
const svg = SpeedCardBg("#FF0000");
|
|
19
|
+
expect(svg).toContain('fill="#FF0000"');
|
|
20
|
+
expect(svg).not.toContain('fill="#24A76A"');
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it("has correct SVG dimensions", () => {
|
|
24
|
+
const svg = SpeedCardBg();
|
|
25
|
+
expect(svg).toContain('width="684"');
|
|
26
|
+
expect(svg).toContain('height="107"');
|
|
27
|
+
expect(svg).toContain('viewBox="0 0 684 107"');
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it("contains two path elements for the pinwheel", () => {
|
|
31
|
+
const svg = SpeedCardBg();
|
|
32
|
+
const pathMatches = svg.match(/<path /g);
|
|
33
|
+
expect(pathMatches).toHaveLength(2);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it("fills both paths with the provided color", () => {
|
|
37
|
+
const color = "#ABCDEF";
|
|
38
|
+
const svg = SpeedCardBg(color);
|
|
39
|
+
const fillMatches = svg.match(new RegExp(`fill="${color}"`, "g"));
|
|
40
|
+
expect(fillMatches).toHaveLength(2);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it("exports the same function as both default and named", () => {
|
|
44
|
+
expect(namedExport).toBe(SpeedCardBg);
|
|
45
|
+
});
|
|
46
|
+
});
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Returns an inline SVG string for the SpeedCard pinwheel decorative
|
|
3
|
-
* background. The two paths are filled with the provided color so callers
|
|
4
|
-
* can theme the background dynamically (used by SimpleCard when
|
|
5
|
-
* `showBackgroundImage` is enabled and a `pinwheelColor` is provided).
|
|
6
|
-
*
|
|
7
|
-
* Output is intended to be embedded as a `data:image/svg+xml;utf8,...`
|
|
8
|
-
* `background-image`. Encode the result with `encodeURIComponent`.
|
|
9
|
-
*/
|
|
10
|
-
export const SpeedCardBg = (color: string = "#24A76A"): string => {
|
|
11
|
-
return `<svg xmlns="http://www.w3.org/2000/svg" width="684" height="107" viewBox="0 0 684 107" fill="none">
|
|
12
|
-
<g clip-path="url(#clip0_12352_9042)">
|
|
13
|
-
<path d="M154.09 -70.5605C173.769 -7.58032 204.79 24.8889 328.202 55.2823C444.619 83.9133 629.479 141.332 667.653 80.7015C691.679 45.2165 678.322 -5.62201 670.537 -46.3554C664.452 -73.1846 658.327 -97.1939 652.913 -123.475C651.135 -132.091 638.766 -131.974 637.067 -123.318C628.136 -77.6888 612.526 -44.9062 577.593 -22.4637C517.962 20.1889 377.954 -6.48361 303.148 -38.287C223.245 -70.7171 200.918 -132.366 195.425 -199.341C193.37 -235.257 198.467 -269.841 208.07 -299.569C210.915 -308.303 199.218 -314.178 193.844 -306.697C151.324 -247.751 137.69 -140.395 154.129 -70.5213" fill="${color}" />
|
|
14
|
-
<path d="M167.605 -417.382C104.062 -397.877 71.302 -367.131 40.6368 -244.813C11.7499 -129.428 -46.182 53.7941 14.9903 91.6292C50.7927 115.443 102.086 102.204 143.183 94.4883C170.253 88.4567 194.476 82.3858 220.992 77.02C229.686 75.2574 229.568 62.9983 220.834 61.3141C174.797 52.4624 141.721 36.9915 119.078 2.36813C76.0441 -56.7345 102.955 -195.502 135.043 -269.645C167.763 -348.84 229.963 -370.969 297.537 -376.414C333.774 -378.45 368.667 -373.398 398.661 -363.88C407.473 -361.06 413.401 -372.654 405.853 -377.98C346.38 -420.124 238.064 -433.636 167.565 -417.343" fill="${color}" />
|
|
15
|
-
</g>
|
|
16
|
-
<defs>
|
|
17
|
-
<clipPath id="clip0_12352_9042">
|
|
18
|
-
<rect width="684" height="107" fill="white" />
|
|
19
|
-
</clipPath>
|
|
20
|
-
</defs>
|
|
21
|
-
</svg>`;
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
export default SpeedCardBg;
|
|
1
|
+
/**
|
|
2
|
+
* Returns an inline SVG string for the SpeedCard pinwheel decorative
|
|
3
|
+
* background. The two paths are filled with the provided color so callers
|
|
4
|
+
* can theme the background dynamically (used by SimpleCard when
|
|
5
|
+
* `showBackgroundImage` is enabled and a `pinwheelColor` is provided).
|
|
6
|
+
*
|
|
7
|
+
* Output is intended to be embedded as a `data:image/svg+xml;utf8,...`
|
|
8
|
+
* `background-image`. Encode the result with `encodeURIComponent`.
|
|
9
|
+
*/
|
|
10
|
+
export const SpeedCardBg = (color: string = "#24A76A"): string => {
|
|
11
|
+
return `<svg xmlns="http://www.w3.org/2000/svg" width="684" height="107" viewBox="0 0 684 107" fill="none">
|
|
12
|
+
<g clip-path="url(#clip0_12352_9042)">
|
|
13
|
+
<path d="M154.09 -70.5605C173.769 -7.58032 204.79 24.8889 328.202 55.2823C444.619 83.9133 629.479 141.332 667.653 80.7015C691.679 45.2165 678.322 -5.62201 670.537 -46.3554C664.452 -73.1846 658.327 -97.1939 652.913 -123.475C651.135 -132.091 638.766 -131.974 637.067 -123.318C628.136 -77.6888 612.526 -44.9062 577.593 -22.4637C517.962 20.1889 377.954 -6.48361 303.148 -38.287C223.245 -70.7171 200.918 -132.366 195.425 -199.341C193.37 -235.257 198.467 -269.841 208.07 -299.569C210.915 -308.303 199.218 -314.178 193.844 -306.697C151.324 -247.751 137.69 -140.395 154.129 -70.5213" fill="${color}" />
|
|
14
|
+
<path d="M167.605 -417.382C104.062 -397.877 71.302 -367.131 40.6368 -244.813C11.7499 -129.428 -46.182 53.7941 14.9903 91.6292C50.7927 115.443 102.086 102.204 143.183 94.4883C170.253 88.4567 194.476 82.3858 220.992 77.02C229.686 75.2574 229.568 62.9983 220.834 61.3141C174.797 52.4624 141.721 36.9915 119.078 2.36813C76.0441 -56.7345 102.955 -195.502 135.043 -269.645C167.763 -348.84 229.963 -370.969 297.537 -376.414C333.774 -378.45 368.667 -373.398 398.661 -363.88C407.473 -361.06 413.401 -372.654 405.853 -377.98C346.38 -420.124 238.064 -433.636 167.565 -417.343" fill="${color}" />
|
|
15
|
+
</g>
|
|
16
|
+
<defs>
|
|
17
|
+
<clipPath id="clip0_12352_9042">
|
|
18
|
+
<rect width="684" height="107" fill="white" />
|
|
19
|
+
</clipPath>
|
|
20
|
+
</defs>
|
|
21
|
+
</svg>`;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export default SpeedCardBg;
|