@windstream/react-shared-components 0.1.45 → 0.1.47

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 (200) hide show
  1. package/README.md +635 -635
  2. package/dist/contentful/index.d.ts +2 -2
  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.d.ts +3 -3
  9. package/dist/index.esm.js +5 -7
  10. package/dist/index.esm.js.map +1 -1
  11. package/dist/index.js +5 -7
  12. package/dist/index.js.map +1 -1
  13. package/dist/next/index.esm.js +1 -3
  14. package/dist/next/index.esm.js.map +1 -1
  15. package/dist/next/index.js +1 -3
  16. package/dist/next/index.js.map +1 -1
  17. package/dist/styles.css +1 -1
  18. package/dist/utils/index.d.ts +2 -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 +86 -86
  39. package/src/components/call-button/types.ts +11 -11
  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 +109 -109
  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 +98 -98
  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 +54 -54
  74. package/src/components/next-image/types.ts +1 -1
  75. package/src/components/pagination/index.tsx +100 -100
  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.tsx +34 -34
  105. package/src/contentful/blocks/accordion/index.tsx +112 -112
  106. package/src/contentful/blocks/accordion/types.ts +34 -34
  107. package/src/contentful/blocks/address-input-banner/index.tsx +52 -52
  108. package/src/contentful/blocks/address-input-banner/types.ts +14 -14
  109. package/src/contentful/blocks/anchored-bottom-banner/index.tsx +70 -70
  110. package/src/contentful/blocks/anchored-bottom-banner/types.ts +10 -10
  111. package/src/contentful/blocks/blogs-grid/index.tsx +134 -134
  112. package/src/contentful/blocks/blogs-grid/types.ts +26 -26
  113. package/src/contentful/blocks/breadcrumbs/index.tsx +51 -51
  114. package/src/contentful/blocks/breadcrumbs/types.ts +5 -5
  115. package/src/contentful/blocks/button/Button.stories.tsx +40 -40
  116. package/src/contentful/blocks/button/index.tsx +130 -130
  117. package/src/contentful/blocks/button/types.ts +39 -39
  118. package/src/contentful/blocks/callout/Callout.stories.tsx +23 -23
  119. package/src/contentful/blocks/callout/index.tsx +88 -88
  120. package/src/contentful/blocks/callout/types.ts +15 -15
  121. package/src/contentful/blocks/cards/Cards.stories.tsx +23 -23
  122. package/src/contentful/blocks/cards/blog-card/index.tsx +110 -110
  123. package/src/contentful/blocks/cards/blog-card/types.ts +18 -18
  124. package/src/contentful/blocks/cards/index.tsx +13 -13
  125. package/src/contentful/blocks/cards/product-card/index.tsx +251 -251
  126. package/src/contentful/blocks/cards/product-card/types.ts +28 -28
  127. package/src/contentful/blocks/cards/simple-card/index.tsx +89 -89
  128. package/src/contentful/blocks/cards/simple-card/types.ts +28 -28
  129. package/src/contentful/blocks/cards/testimonial-card/index.tsx +90 -90
  130. package/src/contentful/blocks/cards/testimonial-card/types.tsx +12 -12
  131. package/src/contentful/blocks/cards/types.ts +1 -1
  132. package/src/contentful/blocks/carousel/Carousel.stories.tsx +23 -23
  133. package/src/contentful/blocks/carousel/helper.tsx +440 -440
  134. package/src/contentful/blocks/carousel/index.tsx +85 -85
  135. package/src/contentful/blocks/carousel/types.ts +144 -144
  136. package/src/contentful/blocks/cartretentionbanner/CartRetentionBanner.tsx +99 -0
  137. package/src/contentful/blocks/cartretentionbanner/types.ts +11 -0
  138. package/src/contentful/blocks/comparison-table/index.tsx +27 -27
  139. package/src/contentful/blocks/comparison-table/types.ts +6 -6
  140. package/src/contentful/blocks/cookiebanner/index.tsx +146 -146
  141. package/src/contentful/blocks/cookiebanner/type.ts +7 -7
  142. package/src/contentful/blocks/cta-callout/CtaCallout.stories.tsx +46 -46
  143. package/src/contentful/blocks/cta-callout/index.tsx +71 -71
  144. package/src/contentful/blocks/cta-callout/types.ts +26 -26
  145. package/src/contentful/blocks/dynamic-tabs/index.tsx +204 -204
  146. package/src/contentful/blocks/dynamic-tabs/types.ts +21 -21
  147. package/src/contentful/blocks/email-input-block/index.tsx +117 -117
  148. package/src/contentful/blocks/email-input-block/types.ts +16 -16
  149. package/src/contentful/blocks/find-kinetic/FindKinetic.stories.tsx +23 -23
  150. package/src/contentful/blocks/find-kinetic/index.tsx +130 -130
  151. package/src/contentful/blocks/find-kinetic/types.ts +19 -19
  152. package/src/contentful/blocks/floating-banner/FloatingBanner.stories.tsx +34 -34
  153. package/src/contentful/blocks/floating-banner/index.tsx +97 -97
  154. package/src/contentful/blocks/floating-banner/types.ts +22 -22
  155. package/src/contentful/blocks/footer/Footer.stories.tsx +30 -30
  156. package/src/contentful/blocks/footer/index.tsx +91 -91
  157. package/src/contentful/blocks/footer/types.ts +13 -13
  158. package/src/contentful/blocks/image-promo-bar/ImagePromoBar.stories.tsx +23 -23
  159. package/src/contentful/blocks/image-promo-bar/helper.tsx +28 -28
  160. package/src/contentful/blocks/image-promo-bar/index.tsx +246 -246
  161. package/src/contentful/blocks/image-promo-bar/types.ts +44 -44
  162. package/src/contentful/blocks/image-promo-bar/vimeo-embed.tsx +93 -93
  163. package/src/contentful/blocks/image-promo-bar/youtube-embed.tsx +46 -46
  164. package/src/contentful/blocks/modal/constants.ts +53 -53
  165. package/src/contentful/blocks/modal/index.tsx +107 -107
  166. package/src/contentful/blocks/modal/types.ts +12 -12
  167. package/src/contentful/blocks/navigation/desktop-link-groups.tsx/index.tsx +113 -113
  168. package/src/contentful/blocks/navigation/index.tsx +394 -394
  169. package/src/contentful/blocks/navigation/mobile-link-groups.tsx/index.tsx +82 -82
  170. package/src/contentful/blocks/navigation/types.ts +41 -41
  171. package/src/contentful/blocks/primary-hero/PrimaryHero.stories.tsx +23 -23
  172. package/src/contentful/blocks/primary-hero/index.tsx +236 -236
  173. package/src/contentful/blocks/primary-hero/types.ts +37 -37
  174. package/src/contentful/blocks/search-block/index.tsx +90 -90
  175. package/src/contentful/blocks/search-block/types.ts +15 -15
  176. package/src/contentful/blocks/shape-background-wrapper/ShapeBackgroundWrapper.stories.tsx +26 -26
  177. package/src/contentful/blocks/shape-background-wrapper/index.tsx +124 -124
  178. package/src/contentful/blocks/shape-background-wrapper/types.ts +36 -36
  179. package/src/contentful/blocks/text/Text.stories.tsx +23 -23
  180. package/src/contentful/blocks/text/index.tsx +12 -12
  181. package/src/contentful/blocks/text/types.ts +1 -1
  182. package/src/contentful/index.ts +99 -99
  183. package/src/hooks/contentful/use-contentful-rich-text.tsx +310 -310
  184. package/src/hooks/contentful/use-processed-check-list.ts +63 -63
  185. package/src/hooks/use-body-scroll-lock.ts +34 -34
  186. package/src/hooks/use-carousel-swipe.ts +264 -264
  187. package/src/hooks/use-outside-click.ts +17 -17
  188. package/src/index.ts +101 -101
  189. package/src/next/index.ts +5 -5
  190. package/src/setupTests.ts +46 -46
  191. package/src/stories/DocsTemplate.tsx +24 -24
  192. package/src/styles/globals.css +343 -343
  193. package/src/types/global.d.ts +9 -9
  194. package/src/types/micro-components.ts +99 -99
  195. package/src/types/utm.ts +49 -49
  196. package/src/utils/contentful/to-document.ts +24 -24
  197. package/src/utils/cookie.ts +84 -84
  198. package/src/utils/cx.ts +49 -49
  199. package/src/utils/index.ts +38 -38
  200. package/src/utils/utm.ts +221 -221
@@ -1,117 +1,117 @@
1
- "use client";
2
-
3
- import React, { useState } from "react";
4
- import { EmailInputBlockProps } from "./types";
5
-
6
- import { Button } from "@shared/contentful";
7
-
8
- export const EmailInputBlock: React.FC<EmailInputBlockProps> = props => {
9
- const {
10
- anchorId = "email-input",
11
- title,
12
- subTitle,
13
- emailInputDescription,
14
- inputPlaceholder = "Enter your email here",
15
- ctaText = "Sign me up",
16
- caption,
17
- backgroundColor = "green",
18
- successFeedback,
19
- onSubmit,
20
- } = props || {};
21
-
22
- const bgClasses: Record<string, string> = {
23
- navy: "bg-bg-fill-inverse",
24
- green: "bg-bg-fill-success",
25
- blue: "bg-bg-fill-brand",
26
- yellow: "bg-bg-fill-brand-accent",
27
- white: "bg-white",
28
- };
29
-
30
- const currentBgClass =
31
- bgClasses[backgroundColor as keyof typeof bgClasses] || bgClasses.green;
32
-
33
- // Determine if text should be white based on background
34
- const textWhite = ["green", "blue", "navy"].includes(
35
- backgroundColor as string
36
- );
37
- const textColor = textWhite ? "text-white" : "text-text";
38
-
39
- const [email, setEmail] = useState("");
40
- const [formSubmitted, setFormSubmitted] = useState(false);
41
- const [emailError, setEmailError] = useState("");
42
-
43
- const validateEmail = (email: string) => {
44
- const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
45
- return emailRegex.test(email);
46
- };
47
-
48
- const handleOnSubmit = () => {
49
- if (validateEmail(email)) {
50
- onSubmit({ email });
51
- setEmail("");
52
- setFormSubmitted(true);
53
- setEmailError("");
54
- } else {
55
- setEmailError("Please enter a valid email address.");
56
- }
57
- };
58
-
59
- return (
60
- <section id={anchorId} className="w-full px-4 py-8 md:px-0">
61
- <div
62
- className={`mx-auto max-w-[1200px] overflow-hidden rounded-[32px] md:rounded-[20px] ${currentBgClass} flex flex-col items-start p-8 md:p-16`}
63
- >
64
- <div className="lg:w-[548px]">
65
- {title && (
66
- <h1 className={`text-heading1 font-black ${textColor}`}>{title}</h1>
67
- )}
68
- {subTitle && (
69
- <h2 className={`text-heading1 font-black ${textColor}`}>
70
- {subTitle}
71
- </h2>
72
- )}
73
-
74
- {emailInputDescription && (
75
- <p className={`mb-10 text-subheading1 opacity-95 ${textColor}`}>
76
- {emailInputDescription}
77
- </p>
78
- )}
79
-
80
- <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">
81
- <input
82
- type="email"
83
- placeholder={inputPlaceholder}
84
- value={email}
85
- onChange={e => {
86
- setEmail(e.target.value);
87
- if (emailError) setEmailError("");
88
- if (formSubmitted) setFormSubmitted(false);
89
- }}
90
- 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"
91
- />
92
- <Button
93
- buttonLabel={ctaText}
94
- buttonVariant="primary_inverse"
95
- onClick={handleOnSubmit}
96
- />
97
- </div>
98
- {emailError && (
99
- <p className="mt-2 text-label4 font-semibold text-text-critical">
100
- {emailError}
101
- </p>
102
- )}
103
- {successFeedback && formSubmitted && !emailError && (
104
- <p className={`mt-2 text-label4 font-semibold ${textColor}`}>
105
- {successFeedback}
106
- </p>
107
- )}
108
- </div>
109
- </div>
110
- {caption && (
111
- <p className="mx-auto mt-2 max-w-[1200px] px-6 md:px-8">{caption}</p>
112
- )}
113
- </section>
114
- );
115
- };
116
-
117
- export default EmailInputBlock;
1
+ "use client";
2
+
3
+ import React, { useState } from "react";
4
+ import { EmailInputBlockProps } from "./types";
5
+
6
+ import { Button } from "@shared/contentful";
7
+
8
+ export const EmailInputBlock: React.FC<EmailInputBlockProps> = props => {
9
+ const {
10
+ anchorId = "email-input",
11
+ title,
12
+ subTitle,
13
+ emailInputDescription,
14
+ inputPlaceholder = "Enter your email here",
15
+ ctaText = "Sign me up",
16
+ caption,
17
+ backgroundColor = "green",
18
+ successFeedback,
19
+ onSubmit,
20
+ } = props || {};
21
+
22
+ const bgClasses: Record<string, string> = {
23
+ navy: "bg-bg-fill-inverse",
24
+ green: "bg-bg-fill-success",
25
+ blue: "bg-bg-fill-brand",
26
+ yellow: "bg-bg-fill-brand-accent",
27
+ white: "bg-white",
28
+ };
29
+
30
+ const currentBgClass =
31
+ bgClasses[backgroundColor as keyof typeof bgClasses] || bgClasses.green;
32
+
33
+ // Determine if text should be white based on background
34
+ const textWhite = ["green", "blue", "navy"].includes(
35
+ backgroundColor as string
36
+ );
37
+ const textColor = textWhite ? "text-white" : "text-text";
38
+
39
+ const [email, setEmail] = useState("");
40
+ const [formSubmitted, setFormSubmitted] = useState(false);
41
+ const [emailError, setEmailError] = useState("");
42
+
43
+ const validateEmail = (email: string) => {
44
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
45
+ return emailRegex.test(email);
46
+ };
47
+
48
+ const handleOnSubmit = () => {
49
+ if (validateEmail(email)) {
50
+ onSubmit({ email });
51
+ setEmail("");
52
+ setFormSubmitted(true);
53
+ setEmailError("");
54
+ } else {
55
+ setEmailError("Please enter a valid email address.");
56
+ }
57
+ };
58
+
59
+ return (
60
+ <section id={anchorId} className="w-full px-4 py-8 md:px-0">
61
+ <div
62
+ className={`mx-auto max-w-[1200px] overflow-hidden rounded-[32px] md:rounded-[20px] ${currentBgClass} flex flex-col items-start p-8 md:p-16`}
63
+ >
64
+ <div className="lg:w-[548px]">
65
+ {title && (
66
+ <h1 className={`text-heading1 font-black ${textColor}`}>{title}</h1>
67
+ )}
68
+ {subTitle && (
69
+ <h2 className={`text-heading1 font-black ${textColor}`}>
70
+ {subTitle}
71
+ </h2>
72
+ )}
73
+
74
+ {emailInputDescription && (
75
+ <p className={`mb-10 text-subheading1 opacity-95 ${textColor}`}>
76
+ {emailInputDescription}
77
+ </p>
78
+ )}
79
+
80
+ <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">
81
+ <input
82
+ type="email"
83
+ placeholder={inputPlaceholder}
84
+ value={email}
85
+ onChange={e => {
86
+ setEmail(e.target.value);
87
+ if (emailError) setEmailError("");
88
+ if (formSubmitted) setFormSubmitted(false);
89
+ }}
90
+ 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"
91
+ />
92
+ <Button
93
+ buttonLabel={ctaText}
94
+ buttonVariant="primary_inverse"
95
+ onClick={handleOnSubmit}
96
+ />
97
+ </div>
98
+ {emailError && (
99
+ <p className="mt-2 text-label4 font-semibold text-text-critical">
100
+ {emailError}
101
+ </p>
102
+ )}
103
+ {successFeedback && formSubmitted && !emailError && (
104
+ <p className={`mt-2 text-label4 font-semibold ${textColor}`}>
105
+ {successFeedback}
106
+ </p>
107
+ )}
108
+ </div>
109
+ </div>
110
+ {caption && (
111
+ <p className="mx-auto mt-2 max-w-[1200px] px-6 md:px-8">{caption}</p>
112
+ )}
113
+ </section>
114
+ );
115
+ };
116
+
117
+ 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";