@windstream/react-shared-components 0.1.94 → 0.1.95
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 +4 -4
- package/dist/index.esm.js +5 -13
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +5 -13
- 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 -191
- package/src/components/accordion/Accordion.stories.tsx +230 -230
- package/src/components/accordion/index.test.tsx +270 -270
- 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 -152
- 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 -424
- 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 -292
- 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 -91
- 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 -260
- 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 -252
- 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 -231
- package/src/components/checklist/index.tsx +96 -96
- package/src/components/checklist/types.ts +23 -23
- package/src/components/collapse/Collapse.stories.tsx +255 -255
- package/src/components/collapse/index.test.tsx +277 -277
- package/src/components/collapse/index.tsx +47 -47
- 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 -53
- 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 -174
- 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 -348
- 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 -199
- 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 -166
- 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 -130
- 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 -310
- 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 -406
- 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 -521
- 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 -151
- 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 -96
- 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 -256
- 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 -173
- 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 -74
- 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 -76
- 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 -65
- 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 -50
- 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 -57
- 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 -218
- package/src/contentful/blocks/accordion/index.tsx +114 -114
- package/src/contentful/blocks/accordion/types.ts +34 -34
- package/src/contentful/blocks/address-input-banner/index.test.tsx +132 -132
- 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 -287
- 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 -157
- package/src/contentful/blocks/blogs-grid/index.test.tsx +355 -355
- 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 -274
- 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 -281
- 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 -339
- 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 -539
- 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 -218
- 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 -201
- 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 -216
- 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 -39
- package/src/contentful/blocks/cards/index.tsx +13 -13
- package/src/contentful/blocks/cards/product-card/index.test.tsx +263 -263
- 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 -364
- 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 -180
- 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 -539
- package/src/contentful/blocks/carousel/helper.tsx +494 -494
- package/src/contentful/blocks/carousel/index.test.tsx +308 -308
- package/src/contentful/blocks/carousel/index.tsx +87 -87
- package/src/contentful/blocks/carousel/types.test.ts +16 -16
- package/src/contentful/blocks/carousel/types.ts +145 -145
- package/src/contentful/blocks/cart-retention-banner/index.test.tsx +409 -409
- 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 -114
- 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 -277
- 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 -244
- 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 -240
- 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 -213
- package/src/contentful/blocks/email-input-block/index.tsx +121 -121
- 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 -269
- 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 -246
- 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 -302
- 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 -61
- package/src/contentful/blocks/image-promo-bar/helper.tsx +28 -28
- package/src/contentful/blocks/image-promo-bar/index.test.tsx +467 -467
- package/src/contentful/blocks/image-promo-bar/index.tsx +8 -6
- package/src/contentful/blocks/image-promo-bar/types.ts +44 -44
- package/src/contentful/blocks/image-promo-bar/vimeo-embed.test.tsx +142 -142
- package/src/contentful/blocks/image-promo-bar/vimeo-embed.tsx +93 -93
- package/src/contentful/blocks/image-promo-bar/youtube-embed.test.tsx +104 -104
- 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 -209
- 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 -208
- package/src/contentful/blocks/navigation/desktop-link-groups.tsx/index.tsx +141 -141
- package/src/contentful/blocks/navigation/index.test.tsx +924 -924
- package/src/contentful/blocks/navigation/index.tsx +569 -569
- package/src/contentful/blocks/navigation/mobile-link-groups.tsx/index.test.tsx +131 -131
- 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 -286
- package/src/contentful/blocks/primary-hero/index.tsx +239 -239
- package/src/contentful/blocks/primary-hero/types.ts +37 -37
- package/src/contentful/blocks/search-block/index.test.tsx +268 -268
- 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 -284
- 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 -36
- 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 -45
- package/src/contentful/index.ts +105 -105
- package/src/global-mocks/contentful/to-document.ts +25 -25
- package/src/global-mocks/cookie.ts +48 -48
- package/src/global-mocks/cx.ts +37 -37
- package/src/global-mocks/index.ts +89 -89
- package/src/global-mocks/speed-card-bg.ts +27 -27
- package/src/global-mocks/utm.ts +49 -49
- package/src/hooks/contentful/use-contentful-rich-text.test.tsx +1758 -1758
- package/src/hooks/contentful/use-contentful-rich-text.tsx +309 -309
- package/src/hooks/contentful/use-processed-check-list.test.tsx +277 -277
- package/src/hooks/contentful/use-processed-check-list.ts +63 -63
- package/src/hooks/use-body-scroll-lock.test.ts +134 -134
- package/src/hooks/use-body-scroll-lock.ts +34 -34
- package/src/hooks/use-carousel-swipe.test.ts +393 -393
- package/src/hooks/use-carousel-swipe.ts +264 -264
- package/src/hooks/use-outside-click.test.ts +142 -142
- package/src/hooks/use-outside-click.ts +17 -17
- package/src/index.ts +107 -107
- package/src/next/index.test.ts +7 -7
- package/src/next/index.ts +5 -5
- package/src/setupTests.ts +52 -52
- 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 -85
- package/src/utils/contentful/to-document.ts +24 -24
- package/src/utils/cookie.test.ts +180 -180
- package/src/utils/cookie.ts +84 -84
- package/src/utils/cx.test.ts +90 -90
- package/src/utils/cx.ts +49 -49
- package/src/utils/index.test.ts +115 -115
- package/src/utils/index.ts +41 -41
- package/src/utils/speed-card-bg.test.ts +46 -46
- package/src/utils/speed-card-bg.ts +24 -24
- package/src/utils/utm.test.ts +359 -359
- package/src/utils/utm.ts +221 -221
package/src/utils/cx.test.ts
CHANGED
|
@@ -1,90 +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
|
-
});
|
|
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 };
|
package/src/utils/index.test.ts
CHANGED
|
@@ -1,115 +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
|
-
});
|
|
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";
|