@windstream/react-shared-components 0.1.37 → 0.1.40
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.d.ts +78 -51
- package/dist/contentful/index.esm.js +4 -2
- package/dist/contentful/index.esm.js.map +1 -1
- package/dist/contentful/index.js +4 -2
- package/dist/contentful/index.js.map +1 -1
- package/dist/core.d.ts +1 -1
- package/dist/index.esm.js +7 -5
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +7 -5
- package/dist/index.js.map +1 -1
- package/dist/next/index.esm.js +3 -1
- package/dist/next/index.esm.js.map +1 -1
- package/dist/next/index.js +3 -1
- package/dist/next/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/utils/index.d.ts +35 -6
- 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 +185 -182
- package/src/components/accordion/Accordion.stories.tsx +230 -230
- 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.tsx +41 -41
- package/src/components/alert-card/types.ts +13 -13
- 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.tsx +114 -114
- package/src/components/brand-button/types.ts +37 -37
- package/src/components/button/Button.stories.tsx +108 -108
- 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.tsx +86 -86
- package/src/components/call-button/types.ts +11 -11
- package/src/components/checkbox/Checkbox.stories.tsx +247 -247
- 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.tsx +61 -61
- package/src/components/checklist/types.ts +17 -17
- package/src/components/collapse/Collapse.stories.tsx +255 -255
- package/src/components/collapse/index.tsx +46 -46
- package/src/components/collapse/types.ts +6 -6
- package/src/components/divider/Divider.stories.tsx +205 -205
- 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.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.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.tsx +109 -109
- package/src/components/link/types.ts +25 -25
- package/src/components/list/List.stories.tsx +272 -272
- 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 +98 -98
- 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.tsx +164 -164
- package/src/components/modal/types.ts +24 -24
- package/src/components/next-image/index.tsx +54 -54
- package/src/components/next-image/types.ts +1 -1
- package/src/components/pagination/index.tsx +100 -100
- package/src/components/pagination/types.ts +6 -6
- package/src/components/radio-button/RadioButton.stories.tsx +307 -307
- 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.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.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.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.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.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.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.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.tsx +42 -42
- package/src/components/view-cart-button/types.ts +5 -5
- package/src/contentful/blocks/accordion/Accordion.stories.tsx +29 -29
- package/src/contentful/blocks/accordion/index.tsx +62 -62
- package/src/contentful/blocks/accordion/types.ts +17 -17
- 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.tsx +70 -70
- package/src/contentful/blocks/anchored-bottom-banner/types.ts +10 -10
- package/src/contentful/blocks/blogs-grid/index.tsx +134 -134
- package/src/contentful/blocks/blogs-grid/types.ts +26 -26
- package/src/contentful/blocks/breadcrumbs/index.tsx +51 -51
- package/src/contentful/blocks/breadcrumbs/types.ts +5 -5
- package/src/contentful/blocks/button/Button.stories.tsx +40 -40
- package/src/contentful/blocks/button/index.tsx +129 -129
- 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.tsx +88 -88
- package/src/contentful/blocks/callout/types.ts +15 -15
- package/src/contentful/blocks/cards/Cards.stories.tsx +23 -23
- package/src/contentful/blocks/cards/blog-card/index.tsx +110 -110
- package/src/contentful/blocks/cards/blog-card/types.ts +18 -18
- package/src/contentful/blocks/cards/index.tsx +13 -13
- 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.tsx +89 -89
- package/src/contentful/blocks/cards/simple-card/types.ts +28 -28
- 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.tsx +440 -440
- package/src/contentful/blocks/carousel/index.tsx +85 -85
- package/src/contentful/blocks/carousel/types.ts +144 -144
- package/src/contentful/blocks/comparison-table/index.tsx +27 -27
- package/src/contentful/blocks/comparison-table/types.ts +6 -6
- 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.tsx +69 -60
- package/src/contentful/blocks/cta-callout/types.ts +26 -26
- package/src/contentful/blocks/dynamic-tabs/index.tsx +204 -204
- package/src/contentful/blocks/dynamic-tabs/types.ts +21 -21
- package/src/contentful/blocks/find-kinetic/FindKinetic.stories.tsx +23 -23
- package/src/contentful/blocks/find-kinetic/index.tsx +130 -130
- package/src/contentful/blocks/find-kinetic/types.ts +19 -19
- package/src/contentful/blocks/floating-banner/FloatingBanner.stories.tsx +34 -34
- 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 +30 -30
- package/src/contentful/blocks/footer/index.tsx +90 -90
- 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.tsx +28 -28
- package/src/contentful/blocks/image-promo-bar/index.tsx +246 -240
- package/src/contentful/blocks/image-promo-bar/types.ts +44 -44
- package/src/contentful/blocks/image-promo-bar/vimeo-embed.tsx +93 -93
- 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.tsx +107 -103
- package/src/contentful/blocks/modal/types.ts +12 -12
- package/src/contentful/blocks/navigation/desktop-link-groups.tsx/index.tsx +113 -113
- package/src/contentful/blocks/navigation/index.tsx +394 -394
- package/src/contentful/blocks/navigation/mobile-link-groups.tsx/index.tsx +82 -82
- package/src/contentful/blocks/navigation/types.ts +41 -41
- package/src/contentful/blocks/primary-hero/PrimaryHero.stories.tsx +23 -23
- package/src/contentful/blocks/primary-hero/index.tsx +234 -234
- package/src/contentful/blocks/primary-hero/types.ts +35 -35
- 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.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.tsx +12 -12
- package/src/contentful/blocks/text/types.ts +1 -1
- package/src/contentful/index.ts +96 -81
- package/src/hooks/contentful/use-contentful-rich-text.tsx +310 -0
- package/src/hooks/contentful/use-processed-check-list.ts +63 -0
- package/src/hooks/use-body-scroll-lock.ts +34 -34
- package/src/hooks/use-carousel-swipe.ts +264 -264
- package/src/hooks/use-outside-click.ts +17 -17
- package/src/index.ts +101 -101
- package/src/next/index.ts +5 -5
- package/src/setupTests.ts +46 -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.ts +24 -0
- package/src/utils/cookie.ts +84 -80
- package/src/utils/cx.ts +49 -0
- package/src/utils/index.ts +38 -65
- package/src/utils/utm.ts +221 -221
package/src/types/global.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
declare module "*.module.css" {
|
|
2
|
-
const classes: { [key: string]: string };
|
|
3
|
-
export default classes;
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
declare module "*.css" {
|
|
7
|
-
const content: string;
|
|
8
|
-
export default content;
|
|
9
|
-
}
|
|
1
|
+
declare module "*.module.css" {
|
|
2
|
+
const classes: { [key: string]: string };
|
|
3
|
+
export default classes;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
declare module "*.css" {
|
|
7
|
+
const content: string;
|
|
8
|
+
export default content;
|
|
9
|
+
}
|
|
@@ -1,99 +1,99 @@
|
|
|
1
|
-
import { ButtonProps } from "@shared/contentful";
|
|
2
|
-
|
|
3
|
-
export interface Asset {
|
|
4
|
-
url?: string | null;
|
|
5
|
-
title?: string | null;
|
|
6
|
-
description?: string | null;
|
|
7
|
-
contentType?: string | null;
|
|
8
|
-
width?: number | null;
|
|
9
|
-
height?: number | null;
|
|
10
|
-
}
|
|
11
|
-
export interface Button {
|
|
12
|
-
anchorId?: string | null;
|
|
13
|
-
showButtonAs?: "solid" | "text" | null;
|
|
14
|
-
buttonLabel: string; // required in your model
|
|
15
|
-
buttonPrefix?: string | null;
|
|
16
|
-
href?: string | null;
|
|
17
|
-
target?: "_blank" | "_self" | null;
|
|
18
|
-
badge?: string | null;
|
|
19
|
-
preserveQueryParameters: boolean; // non-null in your model
|
|
20
|
-
badgeIcon?: Asset | null;
|
|
21
|
-
buttonVariant?: "primary_brand" | "primary_inverse" | "secondary" | null;
|
|
22
|
-
buttonIcon?: Asset | null;
|
|
23
|
-
buttonIconPosition?: boolean | null; // matches EntryFieldTypes.Boolean in your model
|
|
24
|
-
clickToOpen?: "accordion" | "modal" | "tab" | null;
|
|
25
|
-
tabmodalNameToOpen?: string | null;
|
|
26
|
-
preDefinedFunctionExecution?: "check availability" | null;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
export interface ButtonGroup {
|
|
30
|
-
__typename: "ComponentButtonGroup";
|
|
31
|
-
anchorId?: string | null;
|
|
32
|
-
title?: string | null;
|
|
33
|
-
itemsCollection?: {
|
|
34
|
-
items: Button[];
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
export interface Card {
|
|
38
|
-
anchorId?: string;
|
|
39
|
-
title?: string;
|
|
40
|
-
body?: {
|
|
41
|
-
json: any; // Contentful Rich Text
|
|
42
|
-
};
|
|
43
|
-
image?: Asset;
|
|
44
|
-
imageLink?: string;
|
|
45
|
-
imageAlignment?: "Left" | "Right" | "Center" | string;
|
|
46
|
-
imageView?: "Full" | "Inset" | string;
|
|
47
|
-
cta?: Button;
|
|
48
|
-
ctaAlignment?: "Left" | "Right" | "Center" | string;
|
|
49
|
-
textColor?: string;
|
|
50
|
-
backgroundColor?: string;
|
|
51
|
-
showBackgroundImage?: boolean;
|
|
52
|
-
pinwheelColor?: "blue" | "green" | "navy" | "purple" | "white" | "yellow";
|
|
53
|
-
iconToRichTextAlignment?: string;
|
|
54
|
-
phoneNumber?: string;
|
|
55
|
-
workingHours?: string;
|
|
56
|
-
titleLocation?: "Top" | "Bottom" | string;
|
|
57
|
-
ctaBottom?: Button;
|
|
58
|
-
ctaAlignmentBottom?: "Left" | "Right" | "Center" | string;
|
|
59
|
-
imageFloatingType?: boolean;
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export interface VideoLink {
|
|
63
|
-
image?: Asset;
|
|
64
|
-
videoPopup?: boolean;
|
|
65
|
-
link?: string;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
export interface Checklist {
|
|
69
|
-
list?: {
|
|
70
|
-
items: {
|
|
71
|
-
checkListTitle?: { json: any };
|
|
72
|
-
icon?: Asset;
|
|
73
|
-
anchorId?: string;
|
|
74
|
-
}[];
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
export interface RichTextItem {
|
|
79
|
-
title?: string;
|
|
80
|
-
isTargetBlank?: boolean;
|
|
81
|
-
richText?: { json: any };
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
export type CheckPlansProps = {
|
|
85
|
-
className?: string;
|
|
86
|
-
title?: string;
|
|
87
|
-
ctaAlignment?: "new-row" | "same-row";
|
|
88
|
-
ctaText?: string;
|
|
89
|
-
buttonVariant?: "primary_brand" | "secondary" | "primary_inverse";
|
|
90
|
-
showButtonAs?: "solid" | "unstyled" | "text" | undefined;
|
|
91
|
-
cta?: ButtonProps;
|
|
92
|
-
speedCardConfig?: {
|
|
93
|
-
isModalOpen?: boolean;
|
|
94
|
-
setModalOpen?: () => void;
|
|
95
|
-
speed?: string;
|
|
96
|
-
techType?: string;
|
|
97
|
-
isMax?: boolean;
|
|
98
|
-
};
|
|
99
|
-
};
|
|
1
|
+
import { ButtonProps } from "@shared/contentful";
|
|
2
|
+
|
|
3
|
+
export interface Asset {
|
|
4
|
+
url?: string | null;
|
|
5
|
+
title?: string | null;
|
|
6
|
+
description?: string | null;
|
|
7
|
+
contentType?: string | null;
|
|
8
|
+
width?: number | null;
|
|
9
|
+
height?: number | null;
|
|
10
|
+
}
|
|
11
|
+
export interface Button {
|
|
12
|
+
anchorId?: string | null;
|
|
13
|
+
showButtonAs?: "solid" | "text" | null;
|
|
14
|
+
buttonLabel: string; // required in your model
|
|
15
|
+
buttonPrefix?: string | null;
|
|
16
|
+
href?: string | null;
|
|
17
|
+
target?: "_blank" | "_self" | null;
|
|
18
|
+
badge?: string | null;
|
|
19
|
+
preserveQueryParameters: boolean; // non-null in your model
|
|
20
|
+
badgeIcon?: Asset | null;
|
|
21
|
+
buttonVariant?: "primary_brand" | "primary_inverse" | "secondary" | null;
|
|
22
|
+
buttonIcon?: Asset | null;
|
|
23
|
+
buttonIconPosition?: boolean | null; // matches EntryFieldTypes.Boolean in your model
|
|
24
|
+
clickToOpen?: "accordion" | "modal" | "tab" | null;
|
|
25
|
+
tabmodalNameToOpen?: string | null;
|
|
26
|
+
preDefinedFunctionExecution?: "check availability" | null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface ButtonGroup {
|
|
30
|
+
__typename: "ComponentButtonGroup";
|
|
31
|
+
anchorId?: string | null;
|
|
32
|
+
title?: string | null;
|
|
33
|
+
itemsCollection?: {
|
|
34
|
+
items: Button[];
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export interface Card {
|
|
38
|
+
anchorId?: string;
|
|
39
|
+
title?: string;
|
|
40
|
+
body?: {
|
|
41
|
+
json: any; // Contentful Rich Text
|
|
42
|
+
};
|
|
43
|
+
image?: Asset;
|
|
44
|
+
imageLink?: string;
|
|
45
|
+
imageAlignment?: "Left" | "Right" | "Center" | string;
|
|
46
|
+
imageView?: "Full" | "Inset" | string;
|
|
47
|
+
cta?: Button;
|
|
48
|
+
ctaAlignment?: "Left" | "Right" | "Center" | string;
|
|
49
|
+
textColor?: string;
|
|
50
|
+
backgroundColor?: string;
|
|
51
|
+
showBackgroundImage?: boolean;
|
|
52
|
+
pinwheelColor?: "blue" | "green" | "navy" | "purple" | "white" | "yellow";
|
|
53
|
+
iconToRichTextAlignment?: string;
|
|
54
|
+
phoneNumber?: string;
|
|
55
|
+
workingHours?: string;
|
|
56
|
+
titleLocation?: "Top" | "Bottom" | string;
|
|
57
|
+
ctaBottom?: Button;
|
|
58
|
+
ctaAlignmentBottom?: "Left" | "Right" | "Center" | string;
|
|
59
|
+
imageFloatingType?: boolean;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export interface VideoLink {
|
|
63
|
+
image?: Asset;
|
|
64
|
+
videoPopup?: boolean;
|
|
65
|
+
link?: string;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export interface Checklist {
|
|
69
|
+
list?: {
|
|
70
|
+
items: {
|
|
71
|
+
checkListTitle?: { json: any };
|
|
72
|
+
icon?: Asset;
|
|
73
|
+
anchorId?: string;
|
|
74
|
+
}[];
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export interface RichTextItem {
|
|
79
|
+
title?: string;
|
|
80
|
+
isTargetBlank?: boolean;
|
|
81
|
+
richText?: { json: any };
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export type CheckPlansProps = {
|
|
85
|
+
className?: string;
|
|
86
|
+
title?: string;
|
|
87
|
+
ctaAlignment?: "new-row" | "same-row";
|
|
88
|
+
ctaText?: string;
|
|
89
|
+
buttonVariant?: "primary_brand" | "secondary" | "primary_inverse";
|
|
90
|
+
showButtonAs?: "solid" | "unstyled" | "text" | undefined;
|
|
91
|
+
cta?: ButtonProps;
|
|
92
|
+
speedCardConfig?: {
|
|
93
|
+
isModalOpen?: boolean;
|
|
94
|
+
setModalOpen?: () => void;
|
|
95
|
+
speed?: string;
|
|
96
|
+
techType?: string;
|
|
97
|
+
isMax?: boolean;
|
|
98
|
+
};
|
|
99
|
+
};
|
package/src/types/utm.ts
CHANGED
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* UTM Parameter Types
|
|
3
|
-
*
|
|
4
|
-
* Type definitions for UTM tracking parameters used across Kinetic applications.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
/** All tracked UTM and click-ID parameter names */
|
|
8
|
-
export type UTMProperty =
|
|
9
|
-
| "utm_content"
|
|
10
|
-
| "utm_medium"
|
|
11
|
-
| "utm_campaign"
|
|
12
|
-
| "utm_source"
|
|
13
|
-
| "utm_term"
|
|
14
|
-
| "utm_campaign_id"
|
|
15
|
-
| "utm_adgroup_id"
|
|
16
|
-
| "fbclid"
|
|
17
|
-
| "gclid"
|
|
18
|
-
| "msclkid";
|
|
19
|
-
|
|
20
|
-
/** Partial record of UTM parameter values */
|
|
21
|
-
export type UTMProperties = Partial<Record<UTMProperty, string>>;
|
|
22
|
-
|
|
23
|
-
/** Segment campaign context schema */
|
|
24
|
-
export interface CampaignProperties {
|
|
25
|
-
name?: string;
|
|
26
|
-
source?: string;
|
|
27
|
-
medium?: string;
|
|
28
|
-
term?: string;
|
|
29
|
-
content?: string;
|
|
30
|
-
campaign_id?: string;
|
|
31
|
-
adgroup_id?: string;
|
|
32
|
-
gclid?: string;
|
|
33
|
-
fbclid?: string;
|
|
34
|
-
msclkid?: string;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
/** List of all UTM parameter names for filtering */
|
|
38
|
-
export const UTM_PARAM_NAMES: UTMProperty[] = [
|
|
39
|
-
"utm_content",
|
|
40
|
-
"utm_medium",
|
|
41
|
-
"utm_campaign",
|
|
42
|
-
"utm_source",
|
|
43
|
-
"utm_term",
|
|
44
|
-
"utm_campaign_id",
|
|
45
|
-
"utm_adgroup_id",
|
|
46
|
-
"fbclid",
|
|
47
|
-
"gclid",
|
|
48
|
-
"msclkid",
|
|
49
|
-
];
|
|
1
|
+
/**
|
|
2
|
+
* UTM Parameter Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for UTM tracking parameters used across Kinetic applications.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/** All tracked UTM and click-ID parameter names */
|
|
8
|
+
export type UTMProperty =
|
|
9
|
+
| "utm_content"
|
|
10
|
+
| "utm_medium"
|
|
11
|
+
| "utm_campaign"
|
|
12
|
+
| "utm_source"
|
|
13
|
+
| "utm_term"
|
|
14
|
+
| "utm_campaign_id"
|
|
15
|
+
| "utm_adgroup_id"
|
|
16
|
+
| "fbclid"
|
|
17
|
+
| "gclid"
|
|
18
|
+
| "msclkid";
|
|
19
|
+
|
|
20
|
+
/** Partial record of UTM parameter values */
|
|
21
|
+
export type UTMProperties = Partial<Record<UTMProperty, string>>;
|
|
22
|
+
|
|
23
|
+
/** Segment campaign context schema */
|
|
24
|
+
export interface CampaignProperties {
|
|
25
|
+
name?: string;
|
|
26
|
+
source?: string;
|
|
27
|
+
medium?: string;
|
|
28
|
+
term?: string;
|
|
29
|
+
content?: string;
|
|
30
|
+
campaign_id?: string;
|
|
31
|
+
adgroup_id?: string;
|
|
32
|
+
gclid?: string;
|
|
33
|
+
fbclid?: string;
|
|
34
|
+
msclkid?: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** List of all UTM parameter names for filtering */
|
|
38
|
+
export const UTM_PARAM_NAMES: UTMProperty[] = [
|
|
39
|
+
"utm_content",
|
|
40
|
+
"utm_medium",
|
|
41
|
+
"utm_campaign",
|
|
42
|
+
"utm_source",
|
|
43
|
+
"utm_term",
|
|
44
|
+
"utm_campaign_id",
|
|
45
|
+
"utm_adgroup_id",
|
|
46
|
+
"fbclid",
|
|
47
|
+
"gclid",
|
|
48
|
+
"msclkid",
|
|
49
|
+
];
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Document } from "@contentful/rich-text-types";
|
|
2
|
+
|
|
3
|
+
type GraphqlRichText = { json: Document; links?: unknown };
|
|
4
|
+
|
|
5
|
+
const isDocument = (v: unknown): v is Document =>
|
|
6
|
+
!!v &&
|
|
7
|
+
typeof v === "object" &&
|
|
8
|
+
"nodeType" in (v as any) &&
|
|
9
|
+
"content" in (v as any);
|
|
10
|
+
|
|
11
|
+
export const toDocument = (v: unknown | null | undefined): Document | null => {
|
|
12
|
+
if (!v) return null;
|
|
13
|
+
|
|
14
|
+
// REST/CDA Document
|
|
15
|
+
if (isDocument(v)) return v;
|
|
16
|
+
|
|
17
|
+
// GraphQL RichText { json: Document, links? }
|
|
18
|
+
if (typeof v === "object" && v !== null && "json" in (v as any)) {
|
|
19
|
+
const json = (v as GraphqlRichText).json;
|
|
20
|
+
return isDocument(json) ? json : null;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
return null;
|
|
24
|
+
};
|
package/src/utils/cookie.ts
CHANGED
|
@@ -1,80 +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 = ".windstream.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 `.windstream.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 `.windstream.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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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 = ".windstream.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 `.windstream.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 `.windstream.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
|
+
};
|
package/src/utils/cx.ts
ADDED
|
@@ -0,0 +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 };
|
package/src/utils/index.ts
CHANGED
|
@@ -1,65 +1,38 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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 };
|
|
50
|
-
|
|
51
|
-
// UTM & Cookie utilities
|
|
52
|
-
export { getUTMs, setUTMs, removeUTMs, getCookie, getParsedCookie, setCookie } from "./cookie";
|
|
53
|
-
export {
|
|
54
|
-
getUtmParametersFromURL,
|
|
55
|
-
combineExistingAndNewUTMs,
|
|
56
|
-
getOrganicTrafficUtmParameters,
|
|
57
|
-
getCampaignProperties,
|
|
58
|
-
buildPreservedQueryHref,
|
|
59
|
-
} from "./utm";
|
|
60
|
-
export type {
|
|
61
|
-
UTMProperty,
|
|
62
|
-
UTMProperties,
|
|
63
|
-
CampaignProperties,
|
|
64
|
-
} from "../types/utm";
|
|
65
|
-
export { UTM_PARAM_NAMES } from "../types/utm";
|
|
1
|
+
export { cx, clsx } from "./cx";
|
|
2
|
+
export type { ClassValue } from "./cx";
|
|
3
|
+
|
|
4
|
+
// UTM & Cookie utilities
|
|
5
|
+
export {
|
|
6
|
+
getUTMs,
|
|
7
|
+
setUTMs,
|
|
8
|
+
removeUTMs,
|
|
9
|
+
getCookie,
|
|
10
|
+
getParsedCookie,
|
|
11
|
+
setCookie,
|
|
12
|
+
} from "./cookie";
|
|
13
|
+
export {
|
|
14
|
+
getUtmParametersFromURL,
|
|
15
|
+
combineExistingAndNewUTMs,
|
|
16
|
+
getOrganicTrafficUtmParameters,
|
|
17
|
+
getCampaignProperties,
|
|
18
|
+
buildPreservedQueryHref,
|
|
19
|
+
} from "./utm";
|
|
20
|
+
export type {
|
|
21
|
+
UTMProperty,
|
|
22
|
+
UTMProperties,
|
|
23
|
+
CampaignProperties,
|
|
24
|
+
} from "../types/utm";
|
|
25
|
+
export { UTM_PARAM_NAMES } from "../types/utm";
|
|
26
|
+
|
|
27
|
+
// Contentful utilities (server-safe, no "use client")
|
|
28
|
+
export { toDocument } from "./contentful/to-document";
|
|
29
|
+
export {
|
|
30
|
+
renderContentfulRichText,
|
|
31
|
+
useContentfulRichText,
|
|
32
|
+
renderContentfulRichTextTable,
|
|
33
|
+
} from "../hooks/contentful/use-contentful-rich-text";
|
|
34
|
+
export {
|
|
35
|
+
useProcessedChecklist,
|
|
36
|
+
label1BoldOptions,
|
|
37
|
+
} from "../hooks/contentful/use-processed-check-list";
|
|
38
|
+
export type { ProcessedChecklistItem } from "../hooks/contentful/use-processed-check-list";
|