@windstream/react-shared-components 0.1.71 → 0.1.72

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 (208) hide show
  1. package/README.md +635 -635
  2. package/dist/contentful/index.d.ts +106 -30
  3. package/dist/contentful/index.esm.js +4 -2
  4. package/dist/contentful/index.esm.js.map +1 -1
  5. package/dist/contentful/index.js +4 -2
  6. package/dist/contentful/index.js.map +1 -1
  7. package/dist/core.d.ts +5 -5
  8. package/dist/index.d.ts +4 -4
  9. package/dist/index.esm.js +7 -5
  10. package/dist/index.esm.js.map +1 -1
  11. package/dist/index.js +7 -5
  12. package/dist/index.js.map +1 -1
  13. package/dist/next/index.esm.js +3 -1
  14. package/dist/next/index.esm.js.map +1 -1
  15. package/dist/next/index.js +3 -1
  16. package/dist/next/index.js.map +1 -1
  17. package/dist/styles.css +1 -1
  18. package/dist/utils/index.d.ts +15 -3
  19. package/dist/utils/index.esm.js +1 -1
  20. package/dist/utils/index.esm.js.map +1 -1
  21. package/dist/utils/index.js +1 -1
  22. package/dist/utils/index.js.map +1 -1
  23. package/package.json +185 -185
  24. package/src/components/accordion/Accordion.stories.tsx +230 -230
  25. package/src/components/accordion/index.tsx +70 -70
  26. package/src/components/accordion/types.ts +12 -12
  27. package/src/components/alert-card/AlertCard.stories.tsx +171 -171
  28. package/src/components/alert-card/index.tsx +41 -41
  29. package/src/components/alert-card/types.ts +13 -13
  30. package/src/components/brand-button/BrandButton.stories.tsx +223 -223
  31. package/src/components/brand-button/helpers.ts +35 -35
  32. package/src/components/brand-button/index.tsx +120 -120
  33. package/src/components/brand-button/types.ts +38 -38
  34. package/src/components/button/Button.stories.tsx +108 -108
  35. package/src/components/button/index.tsx +27 -27
  36. package/src/components/button/types.ts +14 -14
  37. package/src/components/call-button/CallButton.stories.tsx +324 -324
  38. package/src/components/call-button/index.tsx +106 -106
  39. package/src/components/call-button/types.ts +16 -16
  40. package/src/components/checkbox/Checkbox.stories.tsx +247 -247
  41. package/src/components/checkbox/index.tsx +197 -197
  42. package/src/components/checkbox/types.ts +27 -27
  43. package/src/components/checklist/Checklist.stories.tsx +150 -150
  44. package/src/components/checklist/index.tsx +61 -61
  45. package/src/components/checklist/types.ts +17 -17
  46. package/src/components/collapse/Collapse.stories.tsx +255 -255
  47. package/src/components/collapse/index.tsx +46 -46
  48. package/src/components/collapse/types.ts +6 -6
  49. package/src/components/divider/Divider.stories.tsx +205 -205
  50. package/src/components/divider/index.tsx +22 -22
  51. package/src/components/divider/type.ts +3 -3
  52. package/src/components/image/Image.stories.tsx +113 -113
  53. package/src/components/image/index.tsx +25 -25
  54. package/src/components/image/types.ts +40 -40
  55. package/src/components/input/Input.stories.tsx +325 -325
  56. package/src/components/input/index.tsx +177 -177
  57. package/src/components/input/types.ts +37 -37
  58. package/src/components/link/Link.stories.tsx +163 -163
  59. package/src/components/link/index.tsx +116 -116
  60. package/src/components/link/types.ts +25 -25
  61. package/src/components/list/List.stories.tsx +272 -272
  62. package/src/components/list/index.tsx +88 -88
  63. package/src/components/list/list-item/index.tsx +38 -38
  64. package/src/components/list/list-item/types.ts +13 -13
  65. package/src/components/list/types.ts +29 -29
  66. package/src/components/material-icon/MaterialIcon.stories.tsx +322 -322
  67. package/src/components/material-icon/constants.ts +99 -99
  68. package/src/components/material-icon/index.tsx +47 -47
  69. package/src/components/material-icon/types.ts +31 -31
  70. package/src/components/modal/Modal.stories.tsx +171 -171
  71. package/src/components/modal/index.tsx +164 -164
  72. package/src/components/modal/types.ts +24 -24
  73. package/src/components/next-image/index.tsx +74 -72
  74. package/src/components/next-image/types.ts +1 -1
  75. package/src/components/pagination/index.tsx +91 -91
  76. package/src/components/pagination/types.ts +6 -6
  77. package/src/components/radio-button/RadioButton.stories.tsx +307 -307
  78. package/src/components/radio-button/index.tsx +75 -75
  79. package/src/components/radio-button/types.ts +21 -21
  80. package/src/components/see-more/SeeMore.stories.tsx +181 -181
  81. package/src/components/see-more/index.tsx +44 -44
  82. package/src/components/see-more/types.ts +4 -4
  83. package/src/components/select/Select.stories.tsx +411 -411
  84. package/src/components/select/index.tsx +155 -155
  85. package/src/components/select/types.ts +36 -36
  86. package/src/components/select-plan-button/SelectPlanButton.stories.tsx +184 -184
  87. package/src/components/select-plan-button/index.tsx +63 -63
  88. package/src/components/select-plan-button/types.ts +17 -17
  89. package/src/components/skeleton/Skeleton.stories.tsx +179 -179
  90. package/src/components/skeleton/index.tsx +61 -61
  91. package/src/components/skeleton/types.ts +4 -4
  92. package/src/components/spinner/Spinner.stories.tsx +335 -335
  93. package/src/components/spinner/index.tsx +44 -44
  94. package/src/components/spinner/types.ts +5 -5
  95. package/src/components/text/Text.stories.tsx +321 -321
  96. package/src/components/text/index.tsx +25 -25
  97. package/src/components/text/types.ts +45 -45
  98. package/src/components/tooltip/Tooltip.stories.tsx +219 -219
  99. package/src/components/tooltip/index.tsx +74 -74
  100. package/src/components/tooltip/types.ts +7 -7
  101. package/src/components/view-cart-button/ViewCartButton.stories.tsx +252 -252
  102. package/src/components/view-cart-button/index.tsx +42 -42
  103. package/src/components/view-cart-button/types.ts +5 -5
  104. package/src/contentful/blocks/accordion/Accordion.stories.mocks.tsx +128 -128
  105. package/src/contentful/blocks/accordion/Accordion.stories.tsx +98 -106
  106. package/src/contentful/blocks/accordion/index.tsx +112 -112
  107. package/src/contentful/blocks/accordion/types.ts +34 -34
  108. package/src/contentful/blocks/address-input-banner/index.tsx +52 -52
  109. package/src/contentful/blocks/address-input-banner/types.ts +14 -14
  110. package/src/contentful/blocks/anchored-bottom-banner/index.tsx +181 -70
  111. package/src/contentful/blocks/anchored-bottom-banner/types.ts +13 -10
  112. package/src/contentful/blocks/blogs-grid/index.tsx +134 -134
  113. package/src/contentful/blocks/blogs-grid/types.ts +26 -26
  114. package/src/contentful/blocks/blogs-grid-base/index.tsx +119 -119
  115. package/src/contentful/blocks/blogs-grid-base/types.ts +36 -36
  116. package/src/contentful/blocks/breadcrumbs/index.tsx +81 -81
  117. package/src/contentful/blocks/breadcrumbs/types.ts +6 -6
  118. package/src/contentful/blocks/button/Button.stories.tsx +40 -40
  119. package/src/contentful/blocks/button/index.tsx +131 -131
  120. package/src/contentful/blocks/button/types.ts +39 -39
  121. package/src/contentful/blocks/callout/Callout.stories.tsx +23 -23
  122. package/src/contentful/blocks/callout/index.tsx +252 -88
  123. package/src/contentful/blocks/callout/types.ts +68 -15
  124. package/src/contentful/blocks/cards/Cards.stories.tsx +23 -23
  125. package/src/contentful/blocks/cards/blog-card/index.tsx +129 -129
  126. package/src/contentful/blocks/cards/blog-card/types.ts +34 -34
  127. package/src/contentful/blocks/cards/floating-image-card/index.tsx +119 -0
  128. package/src/contentful/blocks/cards/floating-image-card/types.ts +30 -0
  129. package/src/contentful/blocks/cards/full-image-card/index.tsx +130 -0
  130. package/src/contentful/blocks/cards/full-image-card/types.ts +29 -0
  131. package/src/contentful/blocks/cards/index.tsx +13 -13
  132. package/src/contentful/blocks/cards/product-card/index.tsx +251 -251
  133. package/src/contentful/blocks/cards/product-card/types.ts +28 -28
  134. package/src/contentful/blocks/cards/simple-card/index.tsx +325 -89
  135. package/src/contentful/blocks/cards/simple-card/types.ts +71 -28
  136. package/src/contentful/blocks/cards/testimonial-card/index.tsx +90 -90
  137. package/src/contentful/blocks/cards/testimonial-card/types.tsx +12 -12
  138. package/src/contentful/blocks/cards/types.ts +1 -1
  139. package/src/contentful/blocks/carousel/Carousel.stories.tsx +23 -23
  140. package/src/contentful/blocks/carousel/helper.tsx +440 -440
  141. package/src/contentful/blocks/carousel/index.tsx +85 -85
  142. package/src/contentful/blocks/carousel/types.ts +144 -144
  143. package/src/contentful/blocks/cart-retention-banner/index.tsx +105 -105
  144. package/src/contentful/blocks/cart-retention-banner/types.ts +11 -11
  145. package/src/contentful/blocks/comparison-table/index.tsx +29 -27
  146. package/src/contentful/blocks/comparison-table/types.ts +6 -6
  147. package/src/contentful/blocks/cookiebanner/index.tsx +146 -146
  148. package/src/contentful/blocks/cookiebanner/type.ts +7 -7
  149. package/src/contentful/blocks/cta-callout/CtaCallout.stories.tsx +46 -46
  150. package/src/contentful/blocks/cta-callout/index.tsx +71 -71
  151. package/src/contentful/blocks/cta-callout/types.ts +26 -26
  152. package/src/contentful/blocks/dynamic-tabs/index.tsx +204 -204
  153. package/src/contentful/blocks/dynamic-tabs/types.ts +21 -21
  154. package/src/contentful/blocks/email-input-block/index.tsx +116 -116
  155. package/src/contentful/blocks/email-input-block/types.ts +16 -16
  156. package/src/contentful/blocks/find-kinetic/FindKinetic.stories.tsx +23 -23
  157. package/src/contentful/blocks/find-kinetic/index.tsx +130 -130
  158. package/src/contentful/blocks/find-kinetic/types.ts +19 -19
  159. package/src/contentful/blocks/floating-banner/FloatingBanner.stories.tsx +34 -34
  160. package/src/contentful/blocks/floating-banner/index.tsx +97 -97
  161. package/src/contentful/blocks/floating-banner/types.ts +22 -22
  162. package/src/contentful/blocks/footer/Footer.stories.tsx +317 -204
  163. package/src/contentful/blocks/footer/index.tsx +91 -91
  164. package/src/contentful/blocks/footer/types.ts +13 -13
  165. package/src/contentful/blocks/image-promo-bar/ImagePromoBar.stories.tsx +23 -23
  166. package/src/contentful/blocks/image-promo-bar/helper.tsx +28 -28
  167. package/src/contentful/blocks/image-promo-bar/index.tsx +246 -246
  168. package/src/contentful/blocks/image-promo-bar/types.ts +44 -44
  169. package/src/contentful/blocks/image-promo-bar/vimeo-embed.tsx +93 -93
  170. package/src/contentful/blocks/image-promo-bar/youtube-embed.tsx +46 -46
  171. package/src/contentful/blocks/modal/constants.ts +53 -53
  172. package/src/contentful/blocks/modal/index.tsx +107 -107
  173. package/src/contentful/blocks/modal/types.ts +12 -12
  174. package/src/contentful/blocks/navigation/desktop-link-groups.tsx/index.tsx +124 -124
  175. package/src/contentful/blocks/navigation/index.tsx +462 -462
  176. package/src/contentful/blocks/navigation/mobile-link-groups.tsx/index.tsx +82 -82
  177. package/src/contentful/blocks/navigation/types.ts +64 -64
  178. package/src/contentful/blocks/primary-hero/PrimaryHero.stories.tsx +23 -23
  179. package/src/contentful/blocks/primary-hero/index.tsx +236 -236
  180. package/src/contentful/blocks/primary-hero/types.ts +37 -37
  181. package/src/contentful/blocks/search-block/index.tsx +90 -90
  182. package/src/contentful/blocks/search-block/types.ts +15 -15
  183. package/src/contentful/blocks/shape-background-wrapper/ShapeBackgroundWrapper.stories.tsx +26 -26
  184. package/src/contentful/blocks/shape-background-wrapper/index.tsx +124 -124
  185. package/src/contentful/blocks/shape-background-wrapper/types.ts +36 -36
  186. package/src/contentful/blocks/text/Text.stories.tsx +23 -23
  187. package/src/contentful/blocks/text/index.tsx +12 -12
  188. package/src/contentful/blocks/text/types.ts +1 -1
  189. package/src/contentful/index.ts +105 -105
  190. package/src/hooks/contentful/use-contentful-rich-text.tsx +309 -307
  191. package/src/hooks/contentful/use-processed-check-list.ts +63 -63
  192. package/src/hooks/use-body-scroll-lock.ts +34 -34
  193. package/src/hooks/use-carousel-swipe.ts +264 -264
  194. package/src/hooks/use-outside-click.ts +17 -17
  195. package/src/index.ts +101 -101
  196. package/src/next/index.ts +5 -5
  197. package/src/setupTests.ts +46 -46
  198. package/src/stories/DocsTemplate.tsx +24 -24
  199. package/src/styles/globals.css +343 -343
  200. package/src/types/global.d.ts +9 -9
  201. package/src/types/micro-components.ts +99 -99
  202. package/src/types/utm.ts +49 -49
  203. package/src/utils/contentful/to-document.ts +24 -24
  204. package/src/utils/cookie.ts +84 -84
  205. package/src/utils/cx.ts +49 -49
  206. package/src/utils/index.ts +41 -38
  207. package/src/utils/speed-card-bg.ts +24 -0
  208. package/src/utils/utm.ts +221 -221
@@ -1,116 +1,116 @@
1
- "use client";
2
-
3
- import React, { useState } from "react";
4
- import { Button } from "../button";
5
- import { EmailInputBlockProps } from "./types";
6
-
7
- export const EmailInputBlock: React.FC<EmailInputBlockProps> = props => {
8
- const {
9
- anchorId = "email-input",
10
- title,
11
- subTitle,
12
- emailInputDescription,
13
- inputPlaceholder = "Enter your email here",
14
- ctaText = "Sign me up",
15
- caption,
16
- backgroundColor = "green",
17
- successFeedback,
18
- onSubmit,
19
- } = props || {};
20
-
21
- const bgClasses: Record<string, string> = {
22
- navy: "bg-bg-fill-inverse",
23
- green: "bg-bg-fill-success",
24
- blue: "bg-bg-fill-brand",
25
- yellow: "bg-bg-fill-brand-accent",
26
- white: "bg-white",
27
- };
28
-
29
- const currentBgClass =
30
- bgClasses[backgroundColor as keyof typeof bgClasses] || bgClasses.green;
31
-
32
- // Determine if text should be white based on background
33
- const textWhite = ["green", "blue", "navy"].includes(
34
- backgroundColor as string
35
- );
36
- const textColor = textWhite ? "text-white" : "text-text";
37
-
38
- const [email, setEmail] = useState("");
39
- const [formSubmitted, setFormSubmitted] = useState(false);
40
- const [emailError, setEmailError] = useState("");
41
-
42
- const validateEmail = (email: string) => {
43
- const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
44
- return emailRegex.test(email);
45
- };
46
-
47
- const handleOnSubmit = () => {
48
- if (validateEmail(email)) {
49
- onSubmit({ email });
50
- setEmail("");
51
- setFormSubmitted(true);
52
- setEmailError("");
53
- } else {
54
- setEmailError("Please enter a valid email address.");
55
- }
56
- };
57
-
58
- return (
59
- <section id={anchorId} className="w-full px-4 py-8 md:px-0">
60
- <div
61
- className={`mx-auto max-w-[1200px] overflow-hidden rounded-[32px] md:rounded-[20px] ${currentBgClass} flex flex-col items-start p-8 md:p-16`}
62
- >
63
- <div className="lg:w-[548px]">
64
- {title && (
65
- <h1 className={`text-heading1 font-black ${textColor}`}>{title}</h1>
66
- )}
67
- {subTitle && (
68
- <h2 className={`text-heading1 font-black ${textColor}`}>
69
- {subTitle}
70
- </h2>
71
- )}
72
-
73
- {emailInputDescription && (
74
- <p className={`mb-10 text-subheading1 opacity-95 ${textColor}`}>
75
- {emailInputDescription}
76
- </p>
77
- )}
78
-
79
- <div className="max-w-2xl flex w-full items-center overflow-hidden rounded-3xl border border-transparent bg-white p-1.5 shadow-xl transition-all md:p-2">
80
- <input
81
- type="email"
82
- placeholder={inputPlaceholder}
83
- value={email}
84
- onChange={e => {
85
- setEmail(e.target.value);
86
- if (emailError) setEmailError("");
87
- if (formSubmitted) setFormSubmitted(false);
88
- }}
89
- className="w-full flex-grow bg-transparent px-6 py-3 text-lg font-medium text-text outline-none placeholder:text-input-icon-placeholder md:py-4"
90
- />
91
- <Button
92
- buttonLabel={ctaText}
93
- buttonVariant="primary_inverse"
94
- onClick={handleOnSubmit}
95
- />
96
- </div>
97
- {emailError && (
98
- <p className="mt-2 text-label4 font-semibold text-text-critical">
99
- {emailError}
100
- </p>
101
- )}
102
- {successFeedback && formSubmitted && !emailError && (
103
- <p className={`mt-2 text-label4 font-semibold ${textColor}`}>
104
- {successFeedback}
105
- </p>
106
- )}
107
- </div>
108
- </div>
109
- {caption && (
110
- <p className="mx-auto mt-2 max-w-[1200px] px-6 md:px-8">{caption}</p>
111
- )}
112
- </section>
113
- );
114
- };
115
-
116
- export default EmailInputBlock;
1
+ "use client";
2
+
3
+ import React, { useState } from "react";
4
+ import { Button } from "../button";
5
+ import { EmailInputBlockProps } from "./types";
6
+
7
+ export const EmailInputBlock: React.FC<EmailInputBlockProps> = props => {
8
+ const {
9
+ anchorId = "email-input",
10
+ title,
11
+ subTitle,
12
+ emailInputDescription,
13
+ inputPlaceholder = "Enter your email here",
14
+ ctaText = "Sign me up",
15
+ caption,
16
+ backgroundColor = "green",
17
+ successFeedback,
18
+ onSubmit,
19
+ } = props || {};
20
+
21
+ const bgClasses: Record<string, string> = {
22
+ navy: "bg-bg-fill-inverse",
23
+ green: "bg-bg-fill-success",
24
+ blue: "bg-bg-fill-brand",
25
+ yellow: "bg-bg-fill-brand-accent",
26
+ white: "bg-white",
27
+ };
28
+
29
+ const currentBgClass =
30
+ bgClasses[backgroundColor as keyof typeof bgClasses] || bgClasses.green;
31
+
32
+ // Determine if text should be white based on background
33
+ const textWhite = ["green", "blue", "navy"].includes(
34
+ backgroundColor as string
35
+ );
36
+ const textColor = textWhite ? "text-white" : "text-text";
37
+
38
+ const [email, setEmail] = useState("");
39
+ const [formSubmitted, setFormSubmitted] = useState(false);
40
+ const [emailError, setEmailError] = useState("");
41
+
42
+ const validateEmail = (email: string) => {
43
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
44
+ return emailRegex.test(email);
45
+ };
46
+
47
+ const handleOnSubmit = () => {
48
+ if (validateEmail(email)) {
49
+ onSubmit({ email });
50
+ setEmail("");
51
+ setFormSubmitted(true);
52
+ setEmailError("");
53
+ } else {
54
+ setEmailError("Please enter a valid email address.");
55
+ }
56
+ };
57
+
58
+ return (
59
+ <section id={anchorId} className="w-full px-4 py-8 md:px-0">
60
+ <div
61
+ className={`mx-auto max-w-[1200px] overflow-hidden rounded-[32px] md:rounded-[20px] ${currentBgClass} flex flex-col items-start p-8 md:p-16`}
62
+ >
63
+ <div className="lg:w-[548px]">
64
+ {title && (
65
+ <h1 className={`text-heading1 font-black ${textColor}`}>{title}</h1>
66
+ )}
67
+ {subTitle && (
68
+ <h2 className={`text-heading1 font-black ${textColor}`}>
69
+ {subTitle}
70
+ </h2>
71
+ )}
72
+
73
+ {emailInputDescription && (
74
+ <p className={`mb-10 text-subheading1 opacity-95 ${textColor}`}>
75
+ {emailInputDescription}
76
+ </p>
77
+ )}
78
+
79
+ <div className="max-w-2xl flex w-full items-center overflow-hidden rounded-3xl border border-transparent bg-white p-1.5 shadow-xl transition-all md:p-2">
80
+ <input
81
+ type="email"
82
+ placeholder={inputPlaceholder}
83
+ value={email}
84
+ onChange={e => {
85
+ setEmail(e.target.value);
86
+ if (emailError) setEmailError("");
87
+ if (formSubmitted) setFormSubmitted(false);
88
+ }}
89
+ className="w-full flex-grow bg-transparent px-6 py-3 text-lg font-medium text-text outline-none placeholder:text-input-icon-placeholder md:py-4"
90
+ />
91
+ <Button
92
+ buttonLabel={ctaText}
93
+ buttonVariant="primary_inverse"
94
+ onClick={handleOnSubmit}
95
+ />
96
+ </div>
97
+ {emailError && (
98
+ <p className="mt-2 text-label4 font-semibold text-text-critical">
99
+ {emailError}
100
+ </p>
101
+ )}
102
+ {successFeedback && formSubmitted && !emailError && (
103
+ <p className={`mt-2 text-label4 font-semibold ${textColor}`}>
104
+ {successFeedback}
105
+ </p>
106
+ )}
107
+ </div>
108
+ </div>
109
+ {caption && (
110
+ <p className="mx-auto mt-2 max-w-[1200px] px-6 md:px-8">{caption}</p>
111
+ )}
112
+ </section>
113
+ );
114
+ };
115
+
116
+ export default EmailInputBlock;
@@ -1,16 +1,16 @@
1
- export interface EmailInputBlockProps {
2
- anchorId?: string;
3
- title?: string;
4
- subTitle?: string;
5
- emailInputDescription?: string;
6
- inputPlaceholder?: string;
7
- successFeedback?: string;
8
- ctaText?: string;
9
- caption?: string;
10
- backgroundColor?: "green" | "white" | "yellow" | "blue" | "navy";
11
- onSubmit: (values: EmailInputFormValues) => void;
12
- }
13
-
14
- export interface EmailInputFormValues {
15
- email: string;
16
- }
1
+ export interface EmailInputBlockProps {
2
+ anchorId?: string;
3
+ title?: string;
4
+ subTitle?: string;
5
+ emailInputDescription?: string;
6
+ inputPlaceholder?: string;
7
+ successFeedback?: string;
8
+ ctaText?: string;
9
+ caption?: string;
10
+ backgroundColor?: "green" | "white" | "yellow" | "blue" | "navy";
11
+ onSubmit: (values: EmailInputFormValues) => void;
12
+ }
13
+
14
+ export interface EmailInputFormValues {
15
+ email: string;
16
+ }
@@ -1,23 +1,23 @@
1
- import { FindKinetic } from "./index";
2
-
3
- import { DocsPage } from "@shared/stories/DocsTemplate";
4
- import type { Meta, StoryObj } from "@storybook/react";
5
-
6
- const meta: Meta<typeof FindKinetic> = {
7
- title: "Contentful Blocks/FindKinetic",
8
- component: FindKinetic,
9
- tags: ["autodocs"],
10
- parameters: {
11
- layout: "centered",
12
- docs: {
13
- page: DocsPage,
14
- description: {
15
- component: "Contentful FindKinetic block.",
16
- },
17
- },
18
- },
19
- args: {},
20
- };
21
- export default meta;
22
- type Story = StoryObj<typeof meta>;
23
- export const Default: Story = {};
1
+ import { FindKinetic } from "./index";
2
+
3
+ import { DocsPage } from "@shared/stories/DocsTemplate";
4
+ import type { Meta, StoryObj } from "@storybook/react";
5
+
6
+ const meta: Meta<typeof FindKinetic> = {
7
+ title: "Contentful Blocks/FindKinetic",
8
+ component: FindKinetic,
9
+ tags: ["autodocs"],
10
+ parameters: {
11
+ layout: "centered",
12
+ docs: {
13
+ page: DocsPage,
14
+ description: {
15
+ component: "Contentful FindKinetic block.",
16
+ },
17
+ },
18
+ },
19
+ args: {},
20
+ };
21
+ export default meta;
22
+ type Story = StoryObj<typeof meta>;
23
+ export const Default: Story = {};
@@ -1,130 +1,130 @@
1
- import React from "react";
2
- import { FindKineticProps, ThemeKey } from "./types";
3
-
4
- import { Link } from "@shared/components/link";
5
- import { Text } from "@shared/components/text";
6
- import { NextImage } from "@shared/next";
7
-
8
- export const FindKinetic: React.FC<FindKineticProps> = ({
9
- background = "white",
10
- description,
11
- enableHeading,
12
- image,
13
- list = [],
14
- subTitle,
15
- title,
16
- color = "dark",
17
- maxWidth = true,
18
- }) => {
19
- const bgColorClasses: Record<ThemeKey, string> = {
20
- blue: "bg-[#07B2E2]",
21
- green: "bg-[#26B170]",
22
- yellow: "bg-[#F5FF1E]",
23
- purple: "bg-[#931D69]",
24
- white: "bg-white",
25
- navy: "bg-[#00002D]",
26
- };
27
- return (
28
- <div
29
- className={`${bgColorClasses[background]} component-container overflow-hidden ${color == "dark" ? "text-text" : "text-white"}`}
30
- >
31
- <div
32
- className={`${maxWidth ? "max-w-120 xl:mx-auto" : ""} mx-5 mb-5 mt-12 xl:my-20`}
33
- >
34
- {title && (
35
- <Text
36
- as={enableHeading ? "h1" : "h2"}
37
- className="heading2 md:heading1 md:text-center"
38
- >
39
- {title}
40
- </Text>
41
- )}
42
- {subTitle && (
43
- <Text
44
- as={enableHeading ? "h2" : "h3"}
45
- className="heading3 mt-4 text-center"
46
- >
47
- {subTitle}
48
- </Text>
49
- )}
50
-
51
- <div className="mt-8 flex items-center xl:mt-16 xl:gap-10">
52
- <div className="flex flex-col items-start gap-10 self-stretch xl:flex-[1_0_0]">
53
- {description && (
54
- <Text as="p" className="body1">
55
- {description}
56
- </Text>
57
- )}
58
- {list.length > 0 && (
59
- <>
60
- <ul className="grid w-full grid-cols-2 gap-x-6 gap-y-5 md:hidden">
61
- {(() => {
62
- const sortedList = [...list].sort((a, b) =>
63
- a.name.localeCompare(b.name)
64
- );
65
- const numColumns = 2;
66
- const numRows = Math.ceil(sortedList.length / numColumns);
67
- const rearranged = [];
68
- for (let row = 0; row < numRows; row++) {
69
- for (let col = 0; col < numColumns; col++) {
70
- const index = col * numRows + row;
71
- if (index < sortedList.length) {
72
- rearranged.push(sortedList[index]);
73
- }
74
- }
75
- }
76
- return rearranged.map((item, index: number) => (
77
- <li key={`item-list-2-${index}`}>
78
- <Link
79
- href={`/local/${item.code.toLowerCase()}`}
80
- className="label1"
81
- >
82
- {item.name}
83
- </Link>
84
- </li>
85
- ));
86
- })()}
87
- </ul>
88
- <ul className="hidden gap-x-6 gap-y-5 md:grid md:grid-cols-3">
89
- {(() => {
90
- const sortedList = [...list].sort((a, b) =>
91
- a.name.localeCompare(b.name)
92
- );
93
- const numColumns = 3;
94
- const numRows = Math.ceil(sortedList.length / numColumns);
95
- const rearranged = [];
96
- for (let row = 0; row < numRows; row++) {
97
- for (let col = 0; col < numColumns; col++) {
98
- const index = col * numRows + row;
99
- if (index < sortedList.length) {
100
- rearranged.push(sortedList[index]);
101
- }
102
- }
103
- }
104
- return rearranged.map((item, index: number) => (
105
- <li key={`item-list-3-${index}`}>
106
- <Link
107
- href={`/local/${item.code.toLowerCase()}`}
108
- className="label1"
109
- >
110
- {item.name}
111
- </Link>
112
- </li>
113
- ));
114
- })()}
115
- </ul>
116
- </>
117
- )}
118
- </div>
119
- {image && (
120
- <aside className="hidden xl:block">
121
- <NextImage width={472} height={100} src={image} alt="image" />
122
- </aside>
123
- )}
124
- </div>
125
- </div>
126
- </div>
127
- );
128
- };
129
-
130
- export default FindKinetic;
1
+ import React from "react";
2
+ import { FindKineticProps, ThemeKey } from "./types";
3
+
4
+ import { Link } from "@shared/components/link";
5
+ import { Text } from "@shared/components/text";
6
+ import { NextImage } from "@shared/next";
7
+
8
+ export const FindKinetic: React.FC<FindKineticProps> = ({
9
+ background = "white",
10
+ description,
11
+ enableHeading,
12
+ image,
13
+ list = [],
14
+ subTitle,
15
+ title,
16
+ color = "dark",
17
+ maxWidth = true,
18
+ }) => {
19
+ const bgColorClasses: Record<ThemeKey, string> = {
20
+ blue: "bg-[#07B2E2]",
21
+ green: "bg-[#26B170]",
22
+ yellow: "bg-[#F5FF1E]",
23
+ purple: "bg-[#931D69]",
24
+ white: "bg-white",
25
+ navy: "bg-[#00002D]",
26
+ };
27
+ return (
28
+ <div
29
+ className={`${bgColorClasses[background]} component-container overflow-hidden ${color == "dark" ? "text-text" : "text-white"}`}
30
+ >
31
+ <div
32
+ className={`${maxWidth ? "max-w-120 xl:mx-auto" : ""} mx-5 mb-5 mt-12 xl:my-20`}
33
+ >
34
+ {title && (
35
+ <Text
36
+ as={enableHeading ? "h1" : "h2"}
37
+ className="heading2 md:heading1 md:text-center"
38
+ >
39
+ {title}
40
+ </Text>
41
+ )}
42
+ {subTitle && (
43
+ <Text
44
+ as={enableHeading ? "h2" : "h3"}
45
+ className="heading3 mt-4 text-center"
46
+ >
47
+ {subTitle}
48
+ </Text>
49
+ )}
50
+
51
+ <div className="mt-8 flex items-center xl:mt-16 xl:gap-10">
52
+ <div className="flex flex-col items-start gap-10 self-stretch xl:flex-[1_0_0]">
53
+ {description && (
54
+ <Text as="p" className="body1">
55
+ {description}
56
+ </Text>
57
+ )}
58
+ {list.length > 0 && (
59
+ <>
60
+ <ul className="grid w-full grid-cols-2 gap-x-6 gap-y-5 md:hidden">
61
+ {(() => {
62
+ const sortedList = [...list].sort((a, b) =>
63
+ a.name.localeCompare(b.name)
64
+ );
65
+ const numColumns = 2;
66
+ const numRows = Math.ceil(sortedList.length / numColumns);
67
+ const rearranged = [];
68
+ for (let row = 0; row < numRows; row++) {
69
+ for (let col = 0; col < numColumns; col++) {
70
+ const index = col * numRows + row;
71
+ if (index < sortedList.length) {
72
+ rearranged.push(sortedList[index]);
73
+ }
74
+ }
75
+ }
76
+ return rearranged.map((item, index: number) => (
77
+ <li key={`item-list-2-${index}`}>
78
+ <Link
79
+ href={`/local/${item.code.toLowerCase()}`}
80
+ className="label1"
81
+ >
82
+ {item.name}
83
+ </Link>
84
+ </li>
85
+ ));
86
+ })()}
87
+ </ul>
88
+ <ul className="hidden gap-x-6 gap-y-5 md:grid md:grid-cols-3">
89
+ {(() => {
90
+ const sortedList = [...list].sort((a, b) =>
91
+ a.name.localeCompare(b.name)
92
+ );
93
+ const numColumns = 3;
94
+ const numRows = Math.ceil(sortedList.length / numColumns);
95
+ const rearranged = [];
96
+ for (let row = 0; row < numRows; row++) {
97
+ for (let col = 0; col < numColumns; col++) {
98
+ const index = col * numRows + row;
99
+ if (index < sortedList.length) {
100
+ rearranged.push(sortedList[index]);
101
+ }
102
+ }
103
+ }
104
+ return rearranged.map((item, index: number) => (
105
+ <li key={`item-list-3-${index}`}>
106
+ <Link
107
+ href={`/local/${item.code.toLowerCase()}`}
108
+ className="label1"
109
+ >
110
+ {item.name}
111
+ </Link>
112
+ </li>
113
+ ));
114
+ })()}
115
+ </ul>
116
+ </>
117
+ )}
118
+ </div>
119
+ {image && (
120
+ <aside className="hidden xl:block">
121
+ <NextImage width={472} height={100} src={image} alt="image" />
122
+ </aside>
123
+ )}
124
+ </div>
125
+ </div>
126
+ </div>
127
+ );
128
+ };
129
+
130
+ export default FindKinetic;
@@ -1,19 +1,19 @@
1
- export type FindKineticProps = {
2
- title?: string;
3
- enableHeading?: boolean;
4
- subTitle?: string;
5
- description?: string;
6
- background?: "blue" | "green" | "navy" | "purple" | "white" | "yellow";
7
- image?: string;
8
- list?: { name: string; code: string }[];
9
- maxWidth?: boolean;
10
- color?: "dark" | "light";
11
- };
12
-
13
- export type ThemeKey =
14
- | "blue"
15
- | "green"
16
- | "yellow"
17
- | "purple"
18
- | "white"
19
- | "navy";
1
+ export type FindKineticProps = {
2
+ title?: string;
3
+ enableHeading?: boolean;
4
+ subTitle?: string;
5
+ description?: string;
6
+ background?: "blue" | "green" | "navy" | "purple" | "white" | "yellow";
7
+ image?: string;
8
+ list?: { name: string; code: string }[];
9
+ maxWidth?: boolean;
10
+ color?: "dark" | "light";
11
+ };
12
+
13
+ export type ThemeKey =
14
+ | "blue"
15
+ | "green"
16
+ | "yellow"
17
+ | "purple"
18
+ | "white"
19
+ | "navy";