@windstream/react-shared-components 0.1.35 → 0.1.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/README.md +635 -635
  2. package/dist/contentful/index.d.ts +1 -0
  3. package/dist/contentful/index.esm.js +2 -4
  4. package/dist/contentful/index.esm.js.map +1 -1
  5. package/dist/contentful/index.js +2 -4
  6. package/dist/contentful/index.js.map +1 -1
  7. package/dist/core.d.ts +1 -1
  8. package/dist/index.esm.js +5 -7
  9. package/dist/index.esm.js.map +1 -1
  10. package/dist/index.js +5 -7
  11. package/dist/index.js.map +1 -1
  12. package/dist/next/index.esm.js +1 -3
  13. package/dist/next/index.esm.js.map +1 -1
  14. package/dist/next/index.js +1 -3
  15. package/dist/next/index.js.map +1 -1
  16. package/dist/utils/index.d.ts +0 -1
  17. package/package.json +182 -182
  18. package/src/components/accordion/Accordion.stories.tsx +230 -230
  19. package/src/components/accordion/index.tsx +70 -70
  20. package/src/components/accordion/types.ts +12 -12
  21. package/src/components/alert-card/AlertCard.stories.tsx +171 -171
  22. package/src/components/alert-card/index.tsx +41 -41
  23. package/src/components/alert-card/types.ts +13 -13
  24. package/src/components/brand-button/BrandButton.stories.tsx +223 -223
  25. package/src/components/brand-button/helpers.ts +35 -35
  26. package/src/components/brand-button/index.tsx +114 -114
  27. package/src/components/brand-button/types.ts +37 -37
  28. package/src/components/button/Button.stories.tsx +108 -108
  29. package/src/components/button/index.tsx +27 -27
  30. package/src/components/button/types.ts +14 -14
  31. package/src/components/call-button/CallButton.stories.tsx +324 -324
  32. package/src/components/call-button/index.tsx +86 -86
  33. package/src/components/call-button/types.ts +11 -11
  34. package/src/components/checkbox/Checkbox.stories.tsx +247 -247
  35. package/src/components/checkbox/index.tsx +197 -197
  36. package/src/components/checkbox/types.ts +27 -27
  37. package/src/components/checklist/Checklist.stories.tsx +150 -150
  38. package/src/components/checklist/index.tsx +61 -61
  39. package/src/components/checklist/types.ts +17 -17
  40. package/src/components/collapse/Collapse.stories.tsx +255 -255
  41. package/src/components/collapse/index.tsx +46 -46
  42. package/src/components/collapse/types.ts +6 -6
  43. package/src/components/divider/Divider.stories.tsx +205 -205
  44. package/src/components/divider/index.tsx +22 -22
  45. package/src/components/divider/type.ts +3 -3
  46. package/src/components/image/Image.stories.tsx +113 -113
  47. package/src/components/image/index.tsx +25 -25
  48. package/src/components/image/types.ts +40 -40
  49. package/src/components/input/Input.stories.tsx +325 -325
  50. package/src/components/input/index.tsx +177 -177
  51. package/src/components/input/types.ts +37 -37
  52. package/src/components/link/Link.stories.tsx +163 -163
  53. package/src/components/link/index.tsx +109 -109
  54. package/src/components/link/types.ts +25 -25
  55. package/src/components/list/List.stories.tsx +272 -272
  56. package/src/components/list/index.tsx +88 -88
  57. package/src/components/list/list-item/index.tsx +38 -38
  58. package/src/components/list/list-item/types.ts +13 -13
  59. package/src/components/list/types.ts +29 -29
  60. package/src/components/material-icon/MaterialIcon.stories.tsx +322 -322
  61. package/src/components/material-icon/constants.ts +98 -98
  62. package/src/components/material-icon/index.tsx +47 -47
  63. package/src/components/material-icon/types.ts +31 -31
  64. package/src/components/modal/Modal.stories.tsx +171 -171
  65. package/src/components/modal/index.tsx +164 -164
  66. package/src/components/modal/types.ts +24 -24
  67. package/src/components/next-image/index.tsx +54 -54
  68. package/src/components/next-image/types.ts +1 -1
  69. package/src/components/pagination/index.tsx +100 -100
  70. package/src/components/pagination/types.ts +6 -6
  71. package/src/components/radio-button/RadioButton.stories.tsx +307 -307
  72. package/src/components/radio-button/index.tsx +75 -75
  73. package/src/components/radio-button/types.ts +21 -21
  74. package/src/components/see-more/SeeMore.stories.tsx +181 -181
  75. package/src/components/see-more/index.tsx +44 -44
  76. package/src/components/see-more/types.ts +4 -4
  77. package/src/components/select/Select.stories.tsx +411 -411
  78. package/src/components/select/index.tsx +155 -155
  79. package/src/components/select/types.ts +36 -36
  80. package/src/components/select-plan-button/SelectPlanButton.stories.tsx +184 -184
  81. package/src/components/select-plan-button/index.tsx +63 -63
  82. package/src/components/select-plan-button/types.ts +17 -17
  83. package/src/components/skeleton/Skeleton.stories.tsx +179 -179
  84. package/src/components/skeleton/index.tsx +61 -61
  85. package/src/components/skeleton/types.ts +4 -4
  86. package/src/components/spinner/Spinner.stories.tsx +335 -335
  87. package/src/components/spinner/index.tsx +44 -44
  88. package/src/components/spinner/types.ts +5 -5
  89. package/src/components/text/Text.stories.tsx +321 -321
  90. package/src/components/text/index.tsx +25 -25
  91. package/src/components/text/types.ts +45 -45
  92. package/src/components/tooltip/Tooltip.stories.tsx +219 -219
  93. package/src/components/tooltip/index.tsx +74 -74
  94. package/src/components/tooltip/types.ts +7 -7
  95. package/src/components/view-cart-button/ViewCartButton.stories.tsx +252 -252
  96. package/src/components/view-cart-button/index.tsx +42 -42
  97. package/src/components/view-cart-button/types.ts +5 -5
  98. package/src/contentful/blocks/accordion/Accordion.stories.tsx +29 -29
  99. package/src/contentful/blocks/accordion/index.tsx +62 -62
  100. package/src/contentful/blocks/accordion/types.ts +17 -17
  101. package/src/contentful/blocks/address-input-banner/index.tsx +52 -52
  102. package/src/contentful/blocks/address-input-banner/types.ts +14 -14
  103. package/src/contentful/blocks/anchored-bottom-banner/index.tsx +70 -65
  104. package/src/contentful/blocks/anchored-bottom-banner/types.ts +10 -9
  105. package/src/contentful/blocks/blogs-grid/index.tsx +134 -134
  106. package/src/contentful/blocks/blogs-grid/types.ts +26 -26
  107. package/src/contentful/blocks/breadcrumbs/index.tsx +51 -51
  108. package/src/contentful/blocks/breadcrumbs/types.ts +5 -5
  109. package/src/contentful/blocks/button/Button.stories.tsx +40 -40
  110. package/src/contentful/blocks/button/index.tsx +129 -129
  111. package/src/contentful/blocks/button/types.ts +39 -39
  112. package/src/contentful/blocks/callout/Callout.stories.tsx +23 -23
  113. package/src/contentful/blocks/callout/index.tsx +88 -88
  114. package/src/contentful/blocks/callout/types.ts +15 -15
  115. package/src/contentful/blocks/cards/Cards.stories.tsx +23 -23
  116. package/src/contentful/blocks/cards/blog-card/index.tsx +110 -110
  117. package/src/contentful/blocks/cards/blog-card/types.ts +18 -18
  118. package/src/contentful/blocks/cards/index.tsx +13 -13
  119. package/src/contentful/blocks/cards/product-card/index.tsx +251 -251
  120. package/src/contentful/blocks/cards/product-card/types.ts +28 -28
  121. package/src/contentful/blocks/cards/simple-card/index.tsx +89 -89
  122. package/src/contentful/blocks/cards/simple-card/types.ts +28 -28
  123. package/src/contentful/blocks/cards/testimonial-card/index.tsx +90 -90
  124. package/src/contentful/blocks/cards/testimonial-card/types.tsx +12 -12
  125. package/src/contentful/blocks/cards/types.ts +1 -1
  126. package/src/contentful/blocks/carousel/Carousel.stories.tsx +23 -23
  127. package/src/contentful/blocks/carousel/helper.tsx +440 -440
  128. package/src/contentful/blocks/carousel/index.tsx +85 -85
  129. package/src/contentful/blocks/carousel/types.ts +144 -144
  130. package/src/contentful/blocks/comparison-table/index.tsx +27 -27
  131. package/src/contentful/blocks/comparison-table/types.ts +6 -6
  132. package/src/contentful/blocks/cookiebanner/index.tsx +146 -146
  133. package/src/contentful/blocks/cookiebanner/type.ts +7 -7
  134. package/src/contentful/blocks/cta-callout/CtaCallout.stories.tsx +46 -46
  135. package/src/contentful/blocks/cta-callout/index.tsx +60 -60
  136. package/src/contentful/blocks/cta-callout/types.ts +26 -26
  137. package/src/contentful/blocks/dynamic-tabs/index.tsx +204 -204
  138. package/src/contentful/blocks/dynamic-tabs/types.ts +21 -21
  139. package/src/contentful/blocks/find-kinetic/FindKinetic.stories.tsx +23 -23
  140. package/src/contentful/blocks/find-kinetic/index.tsx +130 -130
  141. package/src/contentful/blocks/find-kinetic/types.ts +19 -19
  142. package/src/contentful/blocks/floating-banner/FloatingBanner.stories.tsx +34 -34
  143. package/src/contentful/blocks/floating-banner/index.tsx +97 -97
  144. package/src/contentful/blocks/floating-banner/types.ts +22 -22
  145. package/src/contentful/blocks/footer/Footer.stories.tsx +30 -30
  146. package/src/contentful/blocks/footer/index.tsx +90 -90
  147. package/src/contentful/blocks/footer/types.ts +13 -13
  148. package/src/contentful/blocks/image-promo-bar/ImagePromoBar.stories.tsx +23 -23
  149. package/src/contentful/blocks/image-promo-bar/helper.tsx +28 -28
  150. package/src/contentful/blocks/image-promo-bar/index.tsx +240 -240
  151. package/src/contentful/blocks/image-promo-bar/types.ts +44 -44
  152. package/src/contentful/blocks/image-promo-bar/vimeo-embed.tsx +93 -93
  153. package/src/contentful/blocks/image-promo-bar/youtube-embed.tsx +46 -46
  154. package/src/contentful/blocks/modal/constants.ts +53 -53
  155. package/src/contentful/blocks/modal/index.tsx +103 -103
  156. package/src/contentful/blocks/modal/types.ts +12 -12
  157. package/src/contentful/blocks/navigation/desktop-link-groups.tsx/index.tsx +113 -113
  158. package/src/contentful/blocks/navigation/index.tsx +394 -394
  159. package/src/contentful/blocks/navigation/mobile-link-groups.tsx/index.tsx +82 -82
  160. package/src/contentful/blocks/navigation/types.ts +41 -41
  161. package/src/contentful/blocks/primary-hero/PrimaryHero.stories.tsx +23 -23
  162. package/src/contentful/blocks/primary-hero/index.tsx +234 -234
  163. package/src/contentful/blocks/primary-hero/types.ts +35 -35
  164. package/src/contentful/blocks/search-block/index.tsx +90 -90
  165. package/src/contentful/blocks/search-block/types.ts +15 -15
  166. package/src/contentful/blocks/shape-background-wrapper/ShapeBackgroundWrapper.stories.tsx +26 -26
  167. package/src/contentful/blocks/shape-background-wrapper/index.tsx +124 -124
  168. package/src/contentful/blocks/shape-background-wrapper/types.ts +36 -36
  169. package/src/contentful/blocks/text/Text.stories.tsx +23 -23
  170. package/src/contentful/blocks/text/index.tsx +12 -12
  171. package/src/contentful/blocks/text/types.ts +1 -1
  172. package/src/contentful/index.ts +81 -81
  173. package/src/hooks/use-body-scroll-lock.ts +34 -34
  174. package/src/hooks/use-carousel-swipe.ts +264 -264
  175. package/src/hooks/use-outside-click.ts +17 -17
  176. package/src/index.ts +101 -101
  177. package/src/next/index.ts +5 -5
  178. package/src/setupTests.ts +46 -46
  179. package/src/stories/DocsTemplate.tsx +24 -24
  180. package/src/styles/globals.css +343 -343
  181. package/src/types/global.d.ts +9 -9
  182. package/src/types/micro-components.ts +99 -99
  183. package/src/types/utm.ts +49 -49
  184. package/src/utils/cookie.ts +80 -80
  185. package/src/utils/index.ts +65 -65
  186. package/src/utils/utm.ts +221 -221
@@ -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
+ ];
@@ -1,80 +1,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 = (key: string, value: any, options: Cookies.CookieAttributes) => {
75
- if (typeof window === "undefined") return;
76
- const stringValue = JSON.stringify(value);
77
- const encryptedValue = Base64.encode(stringValue);
78
-
79
- Cookies.set(key, encryptedValue, options);
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 = (key: string, value: any, options: Cookies.CookieAttributes) => {
75
+ if (typeof window === "undefined") return;
76
+ const stringValue = JSON.stringify(value);
77
+ const encryptedValue = Base64.encode(stringValue);
78
+
79
+ Cookies.set(key, encryptedValue, options);
80
+ };
@@ -1,65 +1,65 @@
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 };
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
+ 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 };
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";