@windstream/react-shared-components 0.1.86 → 0.1.88

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 (198) hide show
  1. package/README.md +635 -635
  2. package/dist/contentful/index.esm.js +2 -2
  3. package/dist/contentful/index.esm.js.map +1 -1
  4. package/dist/contentful/index.js +1 -1
  5. package/dist/contentful/index.js.map +1 -1
  6. package/dist/index.d.ts +4 -4
  7. package/dist/index.js.map +1 -1
  8. package/package.json +185 -185
  9. package/src/components/accordion/Accordion.stories.tsx +230 -230
  10. package/src/components/accordion/index.tsx +70 -70
  11. package/src/components/accordion/types.ts +12 -12
  12. package/src/components/alert-card/AlertCard.stories.tsx +171 -171
  13. package/src/components/alert-card/index.tsx +41 -41
  14. package/src/components/alert-card/types.ts +13 -13
  15. package/src/components/animation-wrapper/index.tsx +129 -129
  16. package/src/components/animation-wrapper/types.ts +11 -11
  17. package/src/components/brand-button/BrandButton.stories.tsx +223 -223
  18. package/src/components/brand-button/helpers.ts +35 -35
  19. package/src/components/brand-button/index.tsx +120 -120
  20. package/src/components/brand-button/types.ts +38 -38
  21. package/src/components/button/Button.stories.tsx +108 -108
  22. package/src/components/button/index.tsx +27 -27
  23. package/src/components/button/types.ts +14 -14
  24. package/src/components/call-button/CallButton.stories.tsx +324 -324
  25. package/src/components/call-button/index.tsx +106 -106
  26. package/src/components/call-button/types.ts +16 -16
  27. package/src/components/checkbox/Checkbox.stories.tsx +247 -247
  28. package/src/components/checkbox/index.tsx +197 -197
  29. package/src/components/checkbox/types.ts +27 -27
  30. package/src/components/checklist/Checklist.stories.tsx +150 -150
  31. package/src/components/checklist/index.tsx +61 -61
  32. package/src/components/checklist/types.ts +17 -17
  33. package/src/components/collapse/Collapse.stories.tsx +255 -255
  34. package/src/components/collapse/index.tsx +46 -46
  35. package/src/components/collapse/types.ts +6 -6
  36. package/src/components/divider/Divider.stories.tsx +205 -205
  37. package/src/components/divider/index.tsx +22 -22
  38. package/src/components/divider/type.ts +3 -3
  39. package/src/components/image/Image.stories.tsx +113 -113
  40. package/src/components/image/index.tsx +25 -25
  41. package/src/components/image/types.ts +40 -40
  42. package/src/components/input/Input.stories.tsx +325 -325
  43. package/src/components/input/index.tsx +177 -177
  44. package/src/components/input/types.ts +37 -37
  45. package/src/components/link/Link.stories.tsx +163 -163
  46. package/src/components/link/index.tsx +116 -116
  47. package/src/components/link/types.ts +25 -25
  48. package/src/components/list/List.stories.tsx +272 -272
  49. package/src/components/list/index.tsx +88 -88
  50. package/src/components/list/list-item/index.tsx +38 -38
  51. package/src/components/list/list-item/types.ts +13 -13
  52. package/src/components/list/types.ts +29 -29
  53. package/src/components/material-icon/MaterialIcon.stories.tsx +322 -322
  54. package/src/components/material-icon/constants.ts +99 -99
  55. package/src/components/material-icon/index.tsx +47 -47
  56. package/src/components/material-icon/types.ts +31 -31
  57. package/src/components/modal/Modal.stories.tsx +171 -171
  58. package/src/components/modal/index.tsx +164 -164
  59. package/src/components/modal/types.ts +24 -24
  60. package/src/components/next-image/index.tsx +74 -74
  61. package/src/components/next-image/types.ts +1 -1
  62. package/src/components/pagination/index.tsx +91 -91
  63. package/src/components/pagination/types.ts +6 -6
  64. package/src/components/radio-button/RadioButton.stories.tsx +307 -307
  65. package/src/components/radio-button/index.tsx +75 -75
  66. package/src/components/radio-button/types.ts +21 -21
  67. package/src/components/see-more/SeeMore.stories.tsx +181 -181
  68. package/src/components/see-more/index.tsx +44 -44
  69. package/src/components/see-more/types.ts +4 -4
  70. package/src/components/select/Select.stories.tsx +411 -411
  71. package/src/components/select/index.tsx +155 -155
  72. package/src/components/select/types.ts +36 -36
  73. package/src/components/select-plan-button/SelectPlanButton.stories.tsx +184 -184
  74. package/src/components/select-plan-button/index.tsx +63 -63
  75. package/src/components/select-plan-button/types.ts +17 -17
  76. package/src/components/skeleton/Skeleton.stories.tsx +179 -179
  77. package/src/components/skeleton/index.tsx +61 -61
  78. package/src/components/skeleton/types.ts +4 -4
  79. package/src/components/spinner/Spinner.stories.tsx +335 -335
  80. package/src/components/spinner/index.tsx +44 -44
  81. package/src/components/spinner/types.ts +5 -5
  82. package/src/components/text/Text.stories.tsx +321 -321
  83. package/src/components/text/index.tsx +25 -25
  84. package/src/components/text/types.ts +45 -45
  85. package/src/components/tooltip/Tooltip.stories.tsx +219 -219
  86. package/src/components/tooltip/index.tsx +74 -74
  87. package/src/components/tooltip/types.ts +7 -7
  88. package/src/components/view-cart-button/ViewCartButton.stories.tsx +252 -252
  89. package/src/components/view-cart-button/index.tsx +42 -42
  90. package/src/components/view-cart-button/types.ts +5 -5
  91. package/src/contentful/blocks/accordion/Accordion.stories.mocks.tsx +128 -128
  92. package/src/contentful/blocks/accordion/Accordion.stories.tsx +98 -98
  93. package/src/contentful/blocks/accordion/index.tsx +112 -112
  94. package/src/contentful/blocks/accordion/types.ts +34 -34
  95. package/src/contentful/blocks/address-input-banner/index.tsx +52 -52
  96. package/src/contentful/blocks/address-input-banner/types.ts +14 -14
  97. package/src/contentful/blocks/anchored-bottom-banner/index.tsx +181 -181
  98. package/src/contentful/blocks/anchored-bottom-banner/types.ts +13 -13
  99. package/src/contentful/blocks/blogs-grid/BlogGrid.stories.mocks.tsx +144 -144
  100. package/src/contentful/blocks/blogs-grid/BlogGrid.stories.tsx +156 -156
  101. package/src/contentful/blocks/blogs-grid/index.tsx +134 -134
  102. package/src/contentful/blocks/blogs-grid/types.ts +26 -26
  103. package/src/contentful/blocks/blogs-grid-base/index.tsx +119 -119
  104. package/src/contentful/blocks/blogs-grid-base/types.ts +36 -36
  105. package/src/contentful/blocks/breadcrumbs/BreadcrumbNavigation.stories.tsx +147 -147
  106. package/src/contentful/blocks/breadcrumbs/index.tsx +95 -95
  107. package/src/contentful/blocks/breadcrumbs/types.ts +8 -8
  108. package/src/contentful/blocks/button/Button.stories.tsx +40 -40
  109. package/src/contentful/blocks/button/index.tsx +131 -131
  110. package/src/contentful/blocks/button/types.ts +39 -39
  111. package/src/contentful/blocks/callout/Callout.stories.tsx +23 -23
  112. package/src/contentful/blocks/callout/index.tsx +279 -279
  113. package/src/contentful/blocks/callout/types.ts +78 -78
  114. package/src/contentful/blocks/cards/Cards.stories.tsx +23 -23
  115. package/src/contentful/blocks/cards/blog-card/index.tsx +129 -129
  116. package/src/contentful/blocks/cards/blog-card/types.ts +34 -34
  117. package/src/contentful/blocks/cards/floating-image-card/index.tsx +119 -119
  118. package/src/contentful/blocks/cards/floating-image-card/types.ts +30 -30
  119. package/src/contentful/blocks/cards/full-image-card/index.tsx +130 -130
  120. package/src/contentful/blocks/cards/full-image-card/types.ts +29 -29
  121. package/src/contentful/blocks/cards/index.tsx +13 -13
  122. package/src/contentful/blocks/cards/product-card/index.tsx +251 -251
  123. package/src/contentful/blocks/cards/product-card/types.ts +28 -28
  124. package/src/contentful/blocks/cards/simple-card/index.tsx +325 -325
  125. package/src/contentful/blocks/cards/simple-card/types.ts +71 -71
  126. package/src/contentful/blocks/cards/testimonial-card/index.tsx +90 -90
  127. package/src/contentful/blocks/cards/testimonial-card/types.tsx +12 -12
  128. package/src/contentful/blocks/cards/types.ts +1 -1
  129. package/src/contentful/blocks/carousel/Carousel.stories.tsx +23 -23
  130. package/src/contentful/blocks/carousel/helper.tsx +494 -494
  131. package/src/contentful/blocks/carousel/index.tsx +87 -87
  132. package/src/contentful/blocks/carousel/types.ts +145 -145
  133. package/src/contentful/blocks/cart-retention-banner/index.tsx +109 -105
  134. package/src/contentful/blocks/cart-retention-banner/types.ts +11 -11
  135. package/src/contentful/blocks/comparison-table/index.tsx +29 -29
  136. package/src/contentful/blocks/comparison-table/types.ts +6 -6
  137. package/src/contentful/blocks/cookiebanner/index.tsx +146 -146
  138. package/src/contentful/blocks/cookiebanner/type.ts +7 -7
  139. package/src/contentful/blocks/cta-callout/CtaCallout.stories.tsx +46 -46
  140. package/src/contentful/blocks/cta-callout/index.tsx +71 -71
  141. package/src/contentful/blocks/cta-callout/types.ts +26 -26
  142. package/src/contentful/blocks/dynamic-tabs/index.tsx +204 -204
  143. package/src/contentful/blocks/dynamic-tabs/types.ts +21 -21
  144. package/src/contentful/blocks/email-input-block/index.tsx +116 -116
  145. package/src/contentful/blocks/email-input-block/types.ts +16 -16
  146. package/src/contentful/blocks/find-kinetic/FindKinetic.stories.tsx +23 -23
  147. package/src/contentful/blocks/find-kinetic/index.tsx +130 -130
  148. package/src/contentful/blocks/find-kinetic/types.ts +19 -19
  149. package/src/contentful/blocks/floating-banner/FloatingBanner.stories.tsx +34 -34
  150. package/src/contentful/blocks/floating-banner/index.tsx +97 -97
  151. package/src/contentful/blocks/floating-banner/types.ts +22 -22
  152. package/src/contentful/blocks/footer/Footer.stories.tsx +317 -317
  153. package/src/contentful/blocks/footer/index.tsx +91 -91
  154. package/src/contentful/blocks/footer/types.ts +13 -13
  155. package/src/contentful/blocks/image-promo-bar/ImagePromoBar.stories.tsx +23 -23
  156. package/src/contentful/blocks/image-promo-bar/helper.tsx +28 -28
  157. package/src/contentful/blocks/image-promo-bar/index.tsx +246 -246
  158. package/src/contentful/blocks/image-promo-bar/types.ts +44 -44
  159. package/src/contentful/blocks/image-promo-bar/vimeo-embed.tsx +93 -93
  160. package/src/contentful/blocks/image-promo-bar/youtube-embed.tsx +46 -46
  161. package/src/contentful/blocks/modal/constants.ts +53 -53
  162. package/src/contentful/blocks/modal/index.tsx +107 -107
  163. package/src/contentful/blocks/modal/types.ts +12 -12
  164. package/src/contentful/blocks/navigation/desktop-link-groups.tsx/index.tsx +139 -139
  165. package/src/contentful/blocks/navigation/index.tsx +568 -568
  166. package/src/contentful/blocks/navigation/mobile-link-groups.tsx/index.tsx +82 -82
  167. package/src/contentful/blocks/navigation/types.ts +71 -71
  168. package/src/contentful/blocks/primary-hero/PrimaryHero.stories.tsx +23 -23
  169. package/src/contentful/blocks/primary-hero/index.tsx +236 -236
  170. package/src/contentful/blocks/primary-hero/types.ts +37 -37
  171. package/src/contentful/blocks/search-block/index.tsx +90 -90
  172. package/src/contentful/blocks/search-block/types.ts +15 -15
  173. package/src/contentful/blocks/shape-background-wrapper/ShapeBackgroundWrapper.stories.tsx +26 -26
  174. package/src/contentful/blocks/shape-background-wrapper/index.tsx +124 -124
  175. package/src/contentful/blocks/shape-background-wrapper/types.ts +36 -36
  176. package/src/contentful/blocks/text/Text.stories.tsx +23 -23
  177. package/src/contentful/blocks/text/index.tsx +12 -12
  178. package/src/contentful/blocks/text/types.ts +1 -1
  179. package/src/contentful/index.ts +105 -105
  180. package/src/hooks/contentful/use-contentful-rich-text.tsx +309 -309
  181. package/src/hooks/contentful/use-processed-check-list.ts +63 -63
  182. package/src/hooks/use-body-scroll-lock.ts +34 -34
  183. package/src/hooks/use-carousel-swipe.ts +264 -264
  184. package/src/hooks/use-outside-click.ts +17 -17
  185. package/src/index.ts +107 -107
  186. package/src/next/index.ts +5 -5
  187. package/src/setupTests.ts +46 -46
  188. package/src/stories/DocsTemplate.tsx +24 -24
  189. package/src/styles/globals.css +343 -343
  190. package/src/types/global.d.ts +9 -9
  191. package/src/types/micro-components.ts +99 -99
  192. package/src/types/utm.ts +49 -49
  193. package/src/utils/contentful/to-document.ts +24 -24
  194. package/src/utils/cookie.ts +84 -84
  195. package/src/utils/cx.ts +49 -49
  196. package/src/utils/index.ts +41 -41
  197. package/src/utils/speed-card-bg.ts +24 -24
  198. package/src/utils/utm.ts +221 -221
@@ -1,119 +1,119 @@
1
- import React from "react";
2
- import { Button } from "../../button";
3
- import { FloatingImageCardProps } from "./types";
4
-
5
- import { NextImage } from "@shared/components/next-image";
6
- import { Text } from "@shared/components/text";
7
- import { cx } from "@shared/utils";
8
-
9
- const alignmentClasses: Record<string, string> = {
10
- left: "flex w-full justify-start",
11
- right: "flex w-full justify-end",
12
- center: "flex w-full justify-center",
13
- };
14
-
15
- export const FloatingImageCard: React.FC<FloatingImageCardProps> = ({
16
- card,
17
- lgWidth,
18
- mdWidth,
19
- }) => {
20
- const {
21
- image,
22
- title,
23
- header,
24
- body,
25
- cta,
26
- ctaAlignment,
27
- imageLink,
28
- imageClassName,
29
- className,
30
- isPromoBarImg = false,
31
- shadow = false,
32
- } = card;
33
-
34
- const ctaAlignmentClass = ctaAlignment
35
- ? alignmentClasses[ctaAlignment]
36
- : alignmentClasses.left;
37
- const imageLinkAvailableClass = imageLink ? "cursor-pointer" : "";
38
-
39
- const handleImageClick = imageLink
40
- ? () => {
41
- if (typeof window !== "undefined") {
42
- window.open(imageLink, "_blank");
43
- }
44
- }
45
- : undefined;
46
-
47
- if (isPromoBarImg) {
48
- return image?.href ? (
49
- <NextImage
50
- src={image.href}
51
- alt={image.title ?? title ?? "promo-bar-image"}
52
- width={148}
53
- height={40}
54
- onClick={handleImageClick}
55
- className={imageLinkAvailableClass}
56
- />
57
- ) : null;
58
- }
59
-
60
- return (
61
- <section
62
- aria-labelledby="Image Card"
63
- className={cx(
64
- "callout-card relative flex h-full w-full flex-col gap-4 p-0 md:items-start lg:gap-6",
65
- shadow && "rounded-3xl shadow-card",
66
- mdWidth,
67
- lgWidth,
68
- className
69
- )}
70
- >
71
- {image?.href ? (
72
- <div
73
- className={cx(
74
- "relative aspect-video w-full overflow-hidden rounded-[40px] sm:mb-1 md:flex-none lg:mb-0",
75
- imageClassName
76
- )}
77
- >
78
- <NextImage
79
- src={image.href}
80
- alt={image.title ?? title ?? "card-image"}
81
- width={image.width || 400}
82
- height={image.height || 285}
83
- onClick={handleImageClick}
84
- className={cx(
85
- "h-full max-h-[285px] w-full object-cover",
86
- imageLinkAvailableClass
87
- )}
88
- />
89
- </div>
90
- ) : null}
91
-
92
- {header ? (
93
- <Text as="h6" className="heading6 font-black text-text lg:pb-2">
94
- {header}
95
- </Text>
96
- ) : null}
97
-
98
- {body ? (
99
- <Text as="div" className="body2 mb-0 flex-1 text-text">
100
- {body}
101
- </Text>
102
- ) : null}
103
-
104
- <div className={cx(ctaAlignmentClass, "mt-auto")}>
105
- {cta ? (
106
- <Button
107
- linkVariant="unstyled"
108
- linkClassName="label1 flex items-center gap-2 text-text"
109
- {...cta}
110
- iconName="expand_circle_right"
111
- iconFill={1}
112
- />
113
- ) : null}
114
- </div>
115
- </section>
116
- );
117
- };
118
-
119
- export default FloatingImageCard;
1
+ import React from "react";
2
+ import { Button } from "../../button";
3
+ import { FloatingImageCardProps } from "./types";
4
+
5
+ import { NextImage } from "@shared/components/next-image";
6
+ import { Text } from "@shared/components/text";
7
+ import { cx } from "@shared/utils";
8
+
9
+ const alignmentClasses: Record<string, string> = {
10
+ left: "flex w-full justify-start",
11
+ right: "flex w-full justify-end",
12
+ center: "flex w-full justify-center",
13
+ };
14
+
15
+ export const FloatingImageCard: React.FC<FloatingImageCardProps> = ({
16
+ card,
17
+ lgWidth,
18
+ mdWidth,
19
+ }) => {
20
+ const {
21
+ image,
22
+ title,
23
+ header,
24
+ body,
25
+ cta,
26
+ ctaAlignment,
27
+ imageLink,
28
+ imageClassName,
29
+ className,
30
+ isPromoBarImg = false,
31
+ shadow = false,
32
+ } = card;
33
+
34
+ const ctaAlignmentClass = ctaAlignment
35
+ ? alignmentClasses[ctaAlignment]
36
+ : alignmentClasses.left;
37
+ const imageLinkAvailableClass = imageLink ? "cursor-pointer" : "";
38
+
39
+ const handleImageClick = imageLink
40
+ ? () => {
41
+ if (typeof window !== "undefined") {
42
+ window.open(imageLink, "_blank");
43
+ }
44
+ }
45
+ : undefined;
46
+
47
+ if (isPromoBarImg) {
48
+ return image?.href ? (
49
+ <NextImage
50
+ src={image.href}
51
+ alt={image.title ?? title ?? "promo-bar-image"}
52
+ width={148}
53
+ height={40}
54
+ onClick={handleImageClick}
55
+ className={imageLinkAvailableClass}
56
+ />
57
+ ) : null;
58
+ }
59
+
60
+ return (
61
+ <section
62
+ aria-labelledby="Image Card"
63
+ className={cx(
64
+ "callout-card relative flex h-full w-full flex-col gap-4 p-0 md:items-start lg:gap-6",
65
+ shadow && "rounded-3xl shadow-card",
66
+ mdWidth,
67
+ lgWidth,
68
+ className
69
+ )}
70
+ >
71
+ {image?.href ? (
72
+ <div
73
+ className={cx(
74
+ "relative aspect-video w-full overflow-hidden rounded-[40px] sm:mb-1 md:flex-none lg:mb-0",
75
+ imageClassName
76
+ )}
77
+ >
78
+ <NextImage
79
+ src={image.href}
80
+ alt={image.title ?? title ?? "card-image"}
81
+ width={image.width || 400}
82
+ height={image.height || 285}
83
+ onClick={handleImageClick}
84
+ className={cx(
85
+ "h-full max-h-[285px] w-full object-cover",
86
+ imageLinkAvailableClass
87
+ )}
88
+ />
89
+ </div>
90
+ ) : null}
91
+
92
+ {header ? (
93
+ <Text as="h6" className="heading6 font-black text-text lg:pb-2">
94
+ {header}
95
+ </Text>
96
+ ) : null}
97
+
98
+ {body ? (
99
+ <Text as="div" className="body2 mb-0 flex-1 text-text">
100
+ {body}
101
+ </Text>
102
+ ) : null}
103
+
104
+ <div className={cx(ctaAlignmentClass, "mt-auto")}>
105
+ {cta ? (
106
+ <Button
107
+ linkVariant="unstyled"
108
+ linkClassName="label1 flex items-center gap-2 text-text"
109
+ {...cta}
110
+ iconName="expand_circle_right"
111
+ iconFill={1}
112
+ />
113
+ ) : null}
114
+ </div>
115
+ </section>
116
+ );
117
+ };
118
+
119
+ export default FloatingImageCard;
@@ -1,30 +1,30 @@
1
- import type { ReactNode } from "react";
2
- import type { ButtonProps } from "../../button/types";
3
-
4
- export type FloatingImageAsset = {
5
- href: string;
6
- title?: string;
7
- width?: number;
8
- height?: number;
9
- };
10
-
11
- export type FloatingImageCardItem = {
12
- title?: string;
13
- header?: string;
14
- body?: ReactNode;
15
- cta?: ButtonProps;
16
- ctaAlignment?: "left" | "right" | "center";
17
- image?: FloatingImageAsset;
18
- imageLink?: string;
19
- imageClassName?: string;
20
- className?: string;
21
- isPromoBarImg?: boolean;
22
- /** Applies `shadow-card` to the outer card element. */
23
- shadow?: boolean;
24
- };
25
-
26
- export type FloatingImageCardProps = {
27
- card: FloatingImageCardItem;
28
- lgWidth?: string;
29
- mdWidth?: string;
30
- };
1
+ import type { ReactNode } from "react";
2
+ import type { ButtonProps } from "../../button/types";
3
+
4
+ export type FloatingImageAsset = {
5
+ href: string;
6
+ title?: string;
7
+ width?: number;
8
+ height?: number;
9
+ };
10
+
11
+ export type FloatingImageCardItem = {
12
+ title?: string;
13
+ header?: string;
14
+ body?: ReactNode;
15
+ cta?: ButtonProps;
16
+ ctaAlignment?: "left" | "right" | "center";
17
+ image?: FloatingImageAsset;
18
+ imageLink?: string;
19
+ imageClassName?: string;
20
+ className?: string;
21
+ isPromoBarImg?: boolean;
22
+ /** Applies `shadow-card` to the outer card element. */
23
+ shadow?: boolean;
24
+ };
25
+
26
+ export type FloatingImageCardProps = {
27
+ card: FloatingImageCardItem;
28
+ lgWidth?: string;
29
+ mdWidth?: string;
30
+ };
@@ -1,130 +1,130 @@
1
- import React from "react";
2
- import { Button } from "../../button";
3
- import { FullImageCardProps } from "./types";
4
-
5
- import { Link } from "@shared/components/link";
6
- import { NextImage } from "@shared/components/next-image";
7
- import { Text } from "@shared/components/text";
8
- import { cx } from "@shared/utils";
9
-
10
- export const FullImageCard: React.FC<FullImageCardProps> = ({
11
- card,
12
- lgWidth,
13
- mdWidth,
14
- }) => {
15
- const {
16
- anchorId = "FullImageCard",
17
- title,
18
- description,
19
- caption,
20
- image,
21
- cta,
22
- link,
23
- className,
24
- contentClassName,
25
- imageClassName,
26
- shadow = true,
27
- } = card;
28
-
29
- const target = cta || link;
30
- const href = target?.href;
31
-
32
- const renderImage = () => {
33
- if (!image?.href) return null;
34
-
35
- const img = (
36
- <NextImage
37
- src={image.href}
38
- alt={image.title ?? title ?? "card-image"}
39
- width={image.width || 400}
40
- height={image.height || 280}
41
- className="w-full"
42
- />
43
- );
44
-
45
- return href ? (
46
- <Link href={href} tabIndex={-1} target={target?.target}>
47
- {img}
48
- </Link>
49
- ) : (
50
- img
51
- );
52
- };
53
-
54
- const titleNode = title ? (
55
- <Text as="h3" className="body1 text-text xl:heading6">
56
- {title}
57
- </Text>
58
- ) : null;
59
-
60
- return (
61
- <section
62
- id={anchorId}
63
- className={cx(
64
- "callout-card relative flex flex-col rounded-3xl bg-white p-0",
65
- shadow && "shadow-card",
66
- mdWidth,
67
- lgWidth,
68
- "w-full",
69
- className
70
- )}
71
- aria-labelledby={`card-title-${anchorId}`}
72
- >
73
- {image?.href ? (
74
- <div
75
- className={cx(
76
- "relative aspect-video overflow-hidden rounded-tl-3xl rounded-tr-3xl",
77
- imageClassName
78
- )}
79
- >
80
- {renderImage()}
81
- </div>
82
- ) : null}
83
- <div
84
- className={cx(
85
- "flex h-full flex-col gap-4 p-6 md:p-8",
86
- contentClassName
87
- )}
88
- >
89
- <div className="flex flex-1 flex-col justify-between">
90
- <div>
91
- {href && titleNode ? (
92
- <Link
93
- href={href}
94
- target={target?.target}
95
- className="no-underline hover:underline"
96
- >
97
- {titleNode}
98
- </Link>
99
- ) : (
100
- titleNode
101
- )}
102
- {description ? (
103
- <Text as="p" className="body2 mt-4 text-text md:body1">
104
- {description}
105
- </Text>
106
- ) : null}
107
- </div>
108
- {caption ? (
109
- <Text as="p" className="footnote mt-5 text-text-secondary">
110
- {caption}
111
- </Text>
112
- ) : null}
113
- </div>
114
- {cta ? (
115
- <div className="mt-2 flex items-end">
116
- <Button
117
- linkVariant="unstyled"
118
- linkClassName="label1 flex items-center gap-2 text-text"
119
- {...cta}
120
- iconName="expand_circle_right"
121
- iconFill={1}
122
- />
123
- </div>
124
- ) : null}
125
- </div>
126
- </section>
127
- );
128
- };
129
-
130
- export default FullImageCard;
1
+ import React from "react";
2
+ import { Button } from "../../button";
3
+ import { FullImageCardProps } from "./types";
4
+
5
+ import { Link } from "@shared/components/link";
6
+ import { NextImage } from "@shared/components/next-image";
7
+ import { Text } from "@shared/components/text";
8
+ import { cx } from "@shared/utils";
9
+
10
+ export const FullImageCard: React.FC<FullImageCardProps> = ({
11
+ card,
12
+ lgWidth,
13
+ mdWidth,
14
+ }) => {
15
+ const {
16
+ anchorId = "FullImageCard",
17
+ title,
18
+ description,
19
+ caption,
20
+ image,
21
+ cta,
22
+ link,
23
+ className,
24
+ contentClassName,
25
+ imageClassName,
26
+ shadow = true,
27
+ } = card;
28
+
29
+ const target = cta || link;
30
+ const href = target?.href;
31
+
32
+ const renderImage = () => {
33
+ if (!image?.href) return null;
34
+
35
+ const img = (
36
+ <NextImage
37
+ src={image.href}
38
+ alt={image.title ?? title ?? "card-image"}
39
+ width={image.width || 400}
40
+ height={image.height || 280}
41
+ className="w-full"
42
+ />
43
+ );
44
+
45
+ return href ? (
46
+ <Link href={href} tabIndex={-1} target={target?.target}>
47
+ {img}
48
+ </Link>
49
+ ) : (
50
+ img
51
+ );
52
+ };
53
+
54
+ const titleNode = title ? (
55
+ <Text as="h3" className="body1 text-text xl:heading6">
56
+ {title}
57
+ </Text>
58
+ ) : null;
59
+
60
+ return (
61
+ <section
62
+ id={anchorId}
63
+ className={cx(
64
+ "callout-card relative flex flex-col rounded-3xl bg-white p-0",
65
+ shadow && "shadow-card",
66
+ mdWidth,
67
+ lgWidth,
68
+ "w-full",
69
+ className
70
+ )}
71
+ aria-labelledby={`card-title-${anchorId}`}
72
+ >
73
+ {image?.href ? (
74
+ <div
75
+ className={cx(
76
+ "relative aspect-video overflow-hidden rounded-tl-3xl rounded-tr-3xl",
77
+ imageClassName
78
+ )}
79
+ >
80
+ {renderImage()}
81
+ </div>
82
+ ) : null}
83
+ <div
84
+ className={cx(
85
+ "flex h-full flex-col gap-4 p-6 md:p-8",
86
+ contentClassName
87
+ )}
88
+ >
89
+ <div className="flex flex-1 flex-col justify-between">
90
+ <div>
91
+ {href && titleNode ? (
92
+ <Link
93
+ href={href}
94
+ target={target?.target}
95
+ className="no-underline hover:underline"
96
+ >
97
+ {titleNode}
98
+ </Link>
99
+ ) : (
100
+ titleNode
101
+ )}
102
+ {description ? (
103
+ <Text as="p" className="body2 mt-4 text-text md:body1">
104
+ {description}
105
+ </Text>
106
+ ) : null}
107
+ </div>
108
+ {caption ? (
109
+ <Text as="p" className="footnote mt-5 text-text-secondary">
110
+ {caption}
111
+ </Text>
112
+ ) : null}
113
+ </div>
114
+ {cta ? (
115
+ <div className="mt-2 flex items-end">
116
+ <Button
117
+ linkVariant="unstyled"
118
+ linkClassName="label1 flex items-center gap-2 text-text"
119
+ {...cta}
120
+ iconName="expand_circle_right"
121
+ iconFill={1}
122
+ />
123
+ </div>
124
+ ) : null}
125
+ </div>
126
+ </section>
127
+ );
128
+ };
129
+
130
+ export default FullImageCard;
@@ -1,29 +1,29 @@
1
- import type { ButtonProps } from "../../button/types";
2
-
3
- export type FullImageAsset = {
4
- href: string;
5
- title?: string;
6
- width?: number;
7
- height?: number;
8
- };
9
-
10
- export type FullImageCardItem = {
11
- anchorId?: string;
12
- title?: string;
13
- description?: string;
14
- caption?: string;
15
- cta?: ButtonProps;
16
- link?: ButtonProps;
17
- image?: FullImageAsset;
18
- className?: string;
19
- contentClassName?: string;
20
- imageClassName?: string;
21
- /** Applies `shadow-card` to the outer card element. */
22
- shadow?: boolean;
23
- };
24
-
25
- export type FullImageCardProps = {
26
- card: FullImageCardItem;
27
- lgWidth?: string;
28
- mdWidth?: string;
29
- };
1
+ import type { ButtonProps } from "../../button/types";
2
+
3
+ export type FullImageAsset = {
4
+ href: string;
5
+ title?: string;
6
+ width?: number;
7
+ height?: number;
8
+ };
9
+
10
+ export type FullImageCardItem = {
11
+ anchorId?: string;
12
+ title?: string;
13
+ description?: string;
14
+ caption?: string;
15
+ cta?: ButtonProps;
16
+ link?: ButtonProps;
17
+ image?: FullImageAsset;
18
+ className?: string;
19
+ contentClassName?: string;
20
+ imageClassName?: string;
21
+ /** Applies `shadow-card` to the outer card element. */
22
+ shadow?: boolean;
23
+ };
24
+
25
+ export type FullImageCardProps = {
26
+ card: FullImageCardItem;
27
+ lgWidth?: string;
28
+ mdWidth?: string;
29
+ };
@@ -1,13 +1,13 @@
1
- import { CardsProps } from "./types";
2
-
3
- import { Text } from "@shared/components/text";
4
-
5
- export const Cards: React.FC<{ fields: CardsProps }> = ({ fields }) => {
6
- return (
7
- <div>
8
- <Text>Cards</Text>
9
- </div>
10
- );
11
- };
12
-
13
- export default Cards;
1
+ import { CardsProps } from "./types";
2
+
3
+ import { Text } from "@shared/components/text";
4
+
5
+ export const Cards: React.FC<{ fields: CardsProps }> = ({ fields }) => {
6
+ return (
7
+ <div>
8
+ <Text>Cards</Text>
9
+ </div>
10
+ );
11
+ };
12
+
13
+ export default Cards;