@windstream/react-shared-components 0.1.28 → 0.1.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/contentful/index.d.ts +21 -4
- package/dist/contentful/index.esm.js +3 -3
- package/dist/contentful/index.esm.js.map +1 -1
- package/dist/contentful/index.js +3 -3
- package/dist/contentful/index.js.map +1 -1
- package/dist/core.d.ts +2 -0
- package/dist/index.d.ts +7 -5
- package/dist/index.esm.js +1 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/src/components/checklist/index.tsx +4 -2
- package/src/components/checklist/types.ts +1 -0
- package/src/components/select-plan-button/index.tsx +4 -2
- package/src/components/select-plan-button/types.ts +3 -0
- package/src/contentful/blocks/accordion/index.tsx +1 -1
- package/src/contentful/blocks/anchored-bottom-banner/index.tsx +65 -0
- package/src/contentful/blocks/anchored-bottom-banner/types.ts +9 -0
- package/src/contentful/blocks/button/index.tsx +9 -1
- package/src/contentful/blocks/button/types.ts +3 -0
- package/src/contentful/blocks/callout/index.tsx +4 -2
- package/src/contentful/blocks/cards/blog-card/index.tsx +23 -22
- package/src/contentful/blocks/cards/blog-card/types.ts +2 -0
- package/src/contentful/blocks/cards/product-card/index.tsx +79 -35
- package/src/contentful/blocks/cards/simple-card/index.tsx +5 -4
- package/src/contentful/blocks/cards/testimonial-card/index.tsx +34 -32
- package/src/contentful/blocks/carousel/helper.tsx +2 -2
- package/src/contentful/blocks/carousel/index.tsx +31 -25
- package/src/contentful/blocks/floating-banner/index.tsx +5 -1
- package/src/contentful/blocks/modal/index.tsx +4 -4
- package/src/contentful/index.ts +3 -0
|
@@ -3,7 +3,7 @@ import { BlogCardProps } from "./types";
|
|
|
3
3
|
import Image from "next/image";
|
|
4
4
|
import Link from "next/link";
|
|
5
5
|
|
|
6
|
-
import { Button } from "@shared/components/button";
|
|
6
|
+
// import { Button } from "@shared/components/button";
|
|
7
7
|
import { MaterialIcon } from "@shared/components/material-icon";
|
|
8
8
|
import { Text } from "@shared/components/text";
|
|
9
9
|
|
|
@@ -16,11 +16,14 @@ export const BlogCard: React.FC<BlogCardProps> = ({
|
|
|
16
16
|
image,
|
|
17
17
|
readMoreText = "Read more",
|
|
18
18
|
asGrid = true,
|
|
19
|
+
lgWidth,
|
|
20
|
+
mdWidth,
|
|
19
21
|
index,
|
|
20
22
|
}: BlogCardProps) => {
|
|
23
|
+
const basehwClass = "lg:w-[calc(33.3333%-1rem)] md:w-[calc(50%-1rem)]";
|
|
21
24
|
const parentClassName = asGrid
|
|
22
|
-
? "flex h-full flex-col overflow-hidden rounded-
|
|
23
|
-
:
|
|
25
|
+
? "flex h-full flex-col overflow-hidden rounded-card-lg bg-white shadow-drop transition-all duration-200 hover:-translate-y-0.5 hover:shadow-cardDrop"
|
|
26
|
+
: `callout-card ${basehwClass} ${lgWidth} ${mdWidth} w-full overflow-hidden rounded-card-lg bg-white shadow-drop transition-all duration-200 hover:-translate-y-0.5 hover:shadow-cardDrop`;
|
|
24
27
|
|
|
25
28
|
return (
|
|
26
29
|
<article
|
|
@@ -30,7 +33,7 @@ export const BlogCard: React.FC<BlogCardProps> = ({
|
|
|
30
33
|
>
|
|
31
34
|
{/* Image */}
|
|
32
35
|
<Link href={href} tabIndex={-1} aria-hidden="true" className="block">
|
|
33
|
-
<div className="
|
|
36
|
+
<div className="h-[232px] w-full flex-shrink-0 overflow-hidden bg-gray-100">
|
|
34
37
|
{image ? (
|
|
35
38
|
<Image
|
|
36
39
|
src={image.src}
|
|
@@ -50,18 +53,16 @@ export const BlogCard: React.FC<BlogCardProps> = ({
|
|
|
50
53
|
</Link>
|
|
51
54
|
|
|
52
55
|
{/* Body */}
|
|
53
|
-
<div className="flex flex-1 flex-col gap-5 p-
|
|
56
|
+
<div className="flex flex-1 flex-col gap-5 p-6 md:p-8">
|
|
54
57
|
{/* Meta: category + date */}
|
|
55
58
|
<div className="flex items-center gap-2 text-[13px]">
|
|
56
|
-
<span className="
|
|
57
|
-
{category}
|
|
58
|
-
</span>
|
|
59
|
+
<span className="body2 text-text-brand">{category}</span>
|
|
59
60
|
{date && (
|
|
60
61
|
<>
|
|
61
|
-
<span className="
|
|
62
|
+
<span className="footnote text-text" aria-hidden="true">
|
|
62
63
|
•
|
|
63
64
|
</span>
|
|
64
|
-
<time className="
|
|
65
|
+
<time className="body2 text-text">{date}</time>
|
|
65
66
|
</>
|
|
66
67
|
)}
|
|
67
68
|
</div>
|
|
@@ -70,7 +71,7 @@ export const BlogCard: React.FC<BlogCardProps> = ({
|
|
|
70
71
|
{title && (
|
|
71
72
|
<Link
|
|
72
73
|
href={href}
|
|
73
|
-
className="m-0 line-clamp-3
|
|
74
|
+
className="heading6 m-0 line-clamp-3 font-black transition-colors duration-150 hover:text-text-brand"
|
|
74
75
|
>
|
|
75
76
|
{title}
|
|
76
77
|
</Link>
|
|
@@ -78,7 +79,7 @@ export const BlogCard: React.FC<BlogCardProps> = ({
|
|
|
78
79
|
|
|
79
80
|
{/* Excerpt */}
|
|
80
81
|
{description && (
|
|
81
|
-
<Text className="m-0 line-clamp-3 flex-1 text-
|
|
82
|
+
<Text className="body1 m-0 line-clamp-3 flex-1 text-text">
|
|
82
83
|
{description}
|
|
83
84
|
</Text>
|
|
84
85
|
)}
|
|
@@ -86,21 +87,21 @@ export const BlogCard: React.FC<BlogCardProps> = ({
|
|
|
86
87
|
{/* Read more */}
|
|
87
88
|
<Link
|
|
88
89
|
href={href}
|
|
89
|
-
className="group mt-auto inline-flex justify-
|
|
90
|
+
className="group mt-auto inline-flex items-center justify-start gap-2 pt-3 text-sm text-text-brand no-underline"
|
|
90
91
|
aria-label={`${readMoreText} about ${title || "this article"}`}
|
|
91
92
|
>
|
|
92
|
-
<
|
|
93
|
+
<Text
|
|
93
94
|
aria-label={`${readMoreText} about ${title || "this article"}`}
|
|
94
|
-
className="
|
|
95
|
+
className="label1 text-nowrap"
|
|
95
96
|
>
|
|
96
97
|
{readMoreText}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
98
|
+
</Text>
|
|
99
|
+
<MaterialIcon
|
|
100
|
+
name="expand_circle_right"
|
|
101
|
+
fill={1}
|
|
102
|
+
size={24}
|
|
103
|
+
weight="200"
|
|
104
|
+
/>
|
|
104
105
|
</Link>
|
|
105
106
|
</div>
|
|
106
107
|
</article>
|
|
@@ -51,12 +51,12 @@ export const ProductCard: React.FC<ProductCardProps> = ({
|
|
|
51
51
|
<article
|
|
52
52
|
className={cx(
|
|
53
53
|
"relative flex h-full w-full max-w-[392px] flex-col",
|
|
54
|
-
!bestValue && "pt-[
|
|
54
|
+
!bestValue && "md:pt-[38px]"
|
|
55
55
|
)}
|
|
56
56
|
>
|
|
57
57
|
{/* Best Value Banner */}
|
|
58
58
|
{bestValue && (
|
|
59
|
-
<div className="rounded-t-[20px] bg-bg-fill-brand-accent px-
|
|
59
|
+
<div className="label3 rounded-t-[20px] bg-bg-fill-brand-accent px-6 py-2 text-center text-text">
|
|
60
60
|
{bestValueText}
|
|
61
61
|
</div>
|
|
62
62
|
)}
|
|
@@ -64,72 +64,103 @@ export const ProductCard: React.FC<ProductCardProps> = ({
|
|
|
64
64
|
{/* Main Card */}
|
|
65
65
|
<div
|
|
66
66
|
className={cx(
|
|
67
|
-
"flex flex-grow flex-col gap-
|
|
68
|
-
isDark
|
|
69
|
-
|
|
67
|
+
"flex flex-grow flex-col gap-5 rounded-card px-5 py-7 shadow-cardDrop",
|
|
68
|
+
isDark
|
|
69
|
+
? "text-inverse border-2 border-border-accent bg-bg-fill-inverse"
|
|
70
|
+
: "bg-bg text-text",
|
|
71
|
+
bestValue ? "rounded-t-none border-t-0" : ""
|
|
70
72
|
)}
|
|
71
73
|
>
|
|
72
74
|
{/* Plan Name & Price */}
|
|
73
|
-
<header className="overflow-none flex items-start justify-between gap-4
|
|
75
|
+
<header className="overflow-none flex items-start justify-between gap-4">
|
|
74
76
|
<div className="flex flex-col">
|
|
75
77
|
<Text
|
|
76
78
|
as="h3"
|
|
77
79
|
className={cx(
|
|
78
|
-
"subheading2
|
|
79
|
-
isDark ? "text-
|
|
80
|
+
"subheading2",
|
|
81
|
+
isDark ? "text-text-accent-on-bg-inverse" : "text-text-brand"
|
|
80
82
|
)}
|
|
81
83
|
>
|
|
82
84
|
{planName}
|
|
83
85
|
</Text>
|
|
84
86
|
<Text
|
|
85
87
|
as="p"
|
|
86
|
-
className={`
|
|
88
|
+
className={`label3 text-wrap ${isDark ? "text-text-accent-on-bg-inverse" : "text-text-brand"}`}
|
|
87
89
|
>
|
|
88
90
|
{planSubtext}
|
|
89
91
|
</Text>
|
|
90
92
|
</div>
|
|
91
93
|
<div className="flex items-start">
|
|
92
|
-
<
|
|
93
|
-
|
|
94
|
+
<Text
|
|
95
|
+
as="span"
|
|
96
|
+
className={cx(
|
|
97
|
+
"label2 mr-1 mt-[2px]",
|
|
98
|
+
isDark ? "text-text-inverse" : "text-text"
|
|
99
|
+
)}
|
|
100
|
+
>
|
|
101
|
+
$
|
|
102
|
+
</Text>
|
|
103
|
+
<Text
|
|
104
|
+
as="span"
|
|
105
|
+
className={cx(
|
|
106
|
+
"subheading6",
|
|
107
|
+
isDark ? "text-text-inverse" : "text-text"
|
|
108
|
+
)}
|
|
109
|
+
>
|
|
94
110
|
{price.split(".")[0]}
|
|
95
|
-
</
|
|
96
|
-
<
|
|
111
|
+
</Text>
|
|
112
|
+
<Text
|
|
113
|
+
as="span"
|
|
114
|
+
className={cx(
|
|
115
|
+
"label2",
|
|
116
|
+
isDark ? "text-text-inverse" : "text-text"
|
|
117
|
+
)}
|
|
118
|
+
>
|
|
119
|
+
{price.split(".")[1]}/mo
|
|
120
|
+
</Text>
|
|
97
121
|
</div>
|
|
98
122
|
</header>
|
|
99
123
|
|
|
100
124
|
{/* Description */}
|
|
101
125
|
<section>
|
|
102
126
|
<Text
|
|
103
|
-
className={cx("
|
|
127
|
+
className={cx("body2", isDark ? "text-text-inverse" : "text-text")}
|
|
104
128
|
>
|
|
105
129
|
{description}
|
|
106
130
|
</Text>
|
|
107
131
|
</section>
|
|
108
132
|
|
|
109
133
|
{/* Gift Badge */}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
giftBadge?.map((badge: any) => {
|
|
134
|
+
{giftBadge?.length ? (
|
|
135
|
+
<div
|
|
136
|
+
className={cx(
|
|
137
|
+
"flex-col items-center rounded-surface-sm p-2",
|
|
138
|
+
isDark ? "bg-bg-surface-inverse" : "bg-bg-surface-info"
|
|
139
|
+
)}
|
|
140
|
+
>
|
|
141
|
+
{giftBadge?.map((badge: any) => {
|
|
118
142
|
return (
|
|
119
|
-
<div key={badge.title} className="flex items-center gap-2
|
|
143
|
+
<div key={badge.title} className="flex items-center gap-2">
|
|
120
144
|
<Image
|
|
121
145
|
src={badge.icon}
|
|
122
146
|
alt={badge.title}
|
|
123
147
|
width={24}
|
|
124
148
|
height={24}
|
|
125
149
|
/>
|
|
126
|
-
<Text
|
|
150
|
+
<Text
|
|
151
|
+
as="div"
|
|
152
|
+
className={cx(
|
|
153
|
+
"body3",
|
|
154
|
+
isDark ? "text-text-inverse" : "text-text"
|
|
155
|
+
)}
|
|
156
|
+
>
|
|
127
157
|
{badge.title}
|
|
128
158
|
</Text>
|
|
129
159
|
</div>
|
|
130
160
|
);
|
|
131
161
|
})}
|
|
132
|
-
|
|
162
|
+
</div>
|
|
163
|
+
) : null}
|
|
133
164
|
|
|
134
165
|
{/* CTA */}
|
|
135
166
|
<SelectPlanButton
|
|
@@ -138,40 +169,53 @@ export const ProductCard: React.FC<ProductCardProps> = ({
|
|
|
138
169
|
isSelected={isDark}
|
|
139
170
|
renderCheckPlans={renderCheckPlans}
|
|
140
171
|
cta={cta}
|
|
172
|
+
iconSize={32}
|
|
173
|
+
iconClassName="!h-8 !w-8"
|
|
141
174
|
techType={techType}
|
|
142
175
|
isMax={ismaxSpeed}
|
|
143
176
|
/>
|
|
144
177
|
{/* Features */}
|
|
145
178
|
{features.length > 0 && (
|
|
146
|
-
<section className="flex flex-col gap-
|
|
179
|
+
<section className="flex flex-col gap-3">
|
|
147
180
|
<Button
|
|
148
181
|
onClick={handleToggle}
|
|
149
|
-
className="group flex w-full items-center
|
|
182
|
+
className="group flex w-full items-center gap-2 text-left"
|
|
150
183
|
>
|
|
151
|
-
<Text
|
|
184
|
+
<Text
|
|
185
|
+
as="h4"
|
|
186
|
+
className={cx(
|
|
187
|
+
"label3",
|
|
188
|
+
isDark ? "text-text-inverse" : "text-text"
|
|
189
|
+
)}
|
|
190
|
+
>
|
|
152
191
|
{featuresTitle}
|
|
153
192
|
</Text>
|
|
154
193
|
<MaterialIcon
|
|
155
|
-
name="
|
|
194
|
+
name="keyboard_arrow_down"
|
|
156
195
|
fill={1}
|
|
157
196
|
size={24}
|
|
158
197
|
className={cx(
|
|
159
198
|
"transition-transform duration-300",
|
|
160
|
-
isExpanded && "rotate-180"
|
|
199
|
+
isExpanded && "rotate-180",
|
|
200
|
+
isDark ? "text-text-inverse" : "text-text"
|
|
161
201
|
)}
|
|
162
202
|
/>
|
|
163
203
|
</Button>
|
|
164
204
|
<div
|
|
165
205
|
className={cx(
|
|
166
|
-
"overflow-hidden transition-all duration-
|
|
167
|
-
isExpanded ? "
|
|
206
|
+
"overflow-hidden transition-all duration-200 ease-in-out",
|
|
207
|
+
isExpanded ? "opacity-100" : "max-h-0 opacity-0"
|
|
168
208
|
)}
|
|
169
209
|
>
|
|
170
|
-
<div className="flex flex-col
|
|
210
|
+
<div className="flex flex-col">
|
|
171
211
|
<Checklist
|
|
172
212
|
items={features}
|
|
213
|
+
iconSize={24}
|
|
214
|
+
iconPosition="top"
|
|
215
|
+
iconClassName="mt-0"
|
|
173
216
|
iconColor={isDark ? "yellow" : "green"}
|
|
174
|
-
|
|
217
|
+
listContainerClassName="mt-0 space-y-0 flex flex-col gap-3"
|
|
218
|
+
listItemClassName={`${isDark ? "text-text-inverse" : "text-text"}`}
|
|
175
219
|
/>
|
|
176
220
|
</div>
|
|
177
221
|
{innerBadge?.badgeIcon ? (
|
|
@@ -182,7 +226,7 @@ export const ProductCard: React.FC<ProductCardProps> = ({
|
|
|
182
226
|
width={12}
|
|
183
227
|
height={12}
|
|
184
228
|
/>
|
|
185
|
-
<span className="text-
|
|
229
|
+
<span className="footnote text-text">
|
|
186
230
|
{innerBadge.badgeText.includes("|") ? (
|
|
187
231
|
<>
|
|
188
232
|
<span className="font-bold">
|
|
@@ -54,18 +54,18 @@ export const SimpleCard: React.FC<SimpleCardProps> = ({
|
|
|
54
54
|
className={`callout-card ${mdWidth} ${lgWidth} w-full ${backgroundColorMap[card.backgroundColor ?? ""] ?? ""}`}
|
|
55
55
|
>
|
|
56
56
|
<div
|
|
57
|
-
className={`card-template flex h-full flex-col
|
|
57
|
+
className={`card-template flex h-full flex-col gap-6 p-6 text-center md:gap-8 md:p-8 ${imageAlignClass}`}
|
|
58
58
|
>
|
|
59
59
|
<div className="card-header">{imageRenderer(card)}</div>
|
|
60
60
|
|
|
61
|
-
<div className="card-body flex flex-col gap-3 text-start">
|
|
61
|
+
<div className="card-body flex flex-col gap-3 text-start md:gap-4">
|
|
62
62
|
{card.title && (
|
|
63
|
-
<Text as="h5" className="
|
|
63
|
+
<Text as="h5" className="heading5 text-text">
|
|
64
64
|
{card.title}
|
|
65
65
|
</Text>
|
|
66
66
|
)}
|
|
67
67
|
{card.body && (
|
|
68
|
-
<Text as="div" className="body1">
|
|
68
|
+
<Text as="div" className="body1 text-text">
|
|
69
69
|
{card.body}
|
|
70
70
|
</Text>
|
|
71
71
|
)}
|
|
@@ -77,6 +77,7 @@ export const SimpleCard: React.FC<SimpleCardProps> = ({
|
|
|
77
77
|
linkClassName="label1 flex items-center text-text gap-2"
|
|
78
78
|
{...card.cta}
|
|
79
79
|
iconName={"expand_circle_right"}
|
|
80
|
+
iconFill={1}
|
|
80
81
|
/>
|
|
81
82
|
</div>
|
|
82
83
|
)}
|
|
@@ -19,43 +19,45 @@ export const TestimonialCard: React.FC<TestimonialCardProps> = ({
|
|
|
19
19
|
return (
|
|
20
20
|
<figure
|
|
21
21
|
className={clsx(
|
|
22
|
-
"flex
|
|
23
|
-
isActive
|
|
22
|
+
"flex w-full flex-col gap-6 rounded-card-lg p-6 transition-all duration-300 md:gap-10 md:p-14",
|
|
23
|
+
isActive
|
|
24
|
+
? "bg-bg-surface-secondary shadow-drop"
|
|
25
|
+
: "bg-gray-50 opacity-40", // Active vs Inactive styles
|
|
24
26
|
className
|
|
25
27
|
)}
|
|
26
28
|
>
|
|
27
|
-
<
|
|
28
|
-
<
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
{quote}
|
|
34
|
-
</blockquote>
|
|
29
|
+
<div className="flex flex-col justify-start gap-3 md:gap-5">
|
|
30
|
+
<header>
|
|
31
|
+
<Text as="h3" className="label1 text-text">
|
|
32
|
+
{title}
|
|
33
|
+
</Text>
|
|
34
|
+
</header>
|
|
35
|
+
<blockquote className="body1 text-text">{quote}</blockquote>
|
|
35
36
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
37
|
+
{/* Rating Stars */}
|
|
38
|
+
{rating ? (
|
|
39
|
+
<div className="flex" aria-label={`Rating: ${rating} out of 5`}>
|
|
40
|
+
{[...Array(5)].map((_, i) => (
|
|
41
|
+
<MaterialIcon
|
|
42
|
+
key={i}
|
|
43
|
+
size={24}
|
|
44
|
+
name="star"
|
|
45
|
+
fill={1}
|
|
46
|
+
className={clsx(
|
|
47
|
+
"h-[21px] w-[21px]",
|
|
48
|
+
i < rating ? "text-text" : "text-gray-300"
|
|
49
|
+
)}
|
|
50
|
+
aria-hidden="true"
|
|
51
|
+
/>
|
|
52
|
+
))}
|
|
53
|
+
</div>
|
|
54
|
+
) : null}
|
|
55
|
+
</div>
|
|
54
56
|
|
|
55
57
|
{/* Author Block */}
|
|
56
58
|
{author && (
|
|
57
|
-
<figcaption className="flex
|
|
58
|
-
<div className="relative h-
|
|
59
|
+
<figcaption className="flex gap-3 md:gap-5">
|
|
60
|
+
<div className="relative h-12 w-12 shrink-0 overflow-hidden rounded-full bg-gray-300">
|
|
59
61
|
{avatarUrl ? (
|
|
60
62
|
<Image
|
|
61
63
|
src={avatarUrl}
|
|
@@ -72,10 +74,10 @@ export const TestimonialCard: React.FC<TestimonialCardProps> = ({
|
|
|
72
74
|
</div>
|
|
73
75
|
|
|
74
76
|
<div className="flex flex-col">
|
|
75
|
-
<cite className="
|
|
77
|
+
<cite className="label3 font-bold not-italic text-text">
|
|
76
78
|
{author}
|
|
77
79
|
</cite>
|
|
78
|
-
<Text as="p" className="
|
|
80
|
+
<Text as="p" className="body3 text-text">
|
|
79
81
|
{role}
|
|
80
82
|
</Text>
|
|
81
83
|
</div>
|
|
@@ -129,7 +129,7 @@ export function ProductCardCarousel({
|
|
|
129
129
|
className={cx(
|
|
130
130
|
isMobileView
|
|
131
131
|
? "mx-auto w-full max-w-[392px]"
|
|
132
|
-
: "w-[392px]
|
|
132
|
+
: "flex-shrink-1 w-[392px]"
|
|
133
133
|
)}
|
|
134
134
|
>
|
|
135
135
|
<ProductCard
|
|
@@ -164,7 +164,7 @@ export function ProductCardCarousel({
|
|
|
164
164
|
const offset = items.length * 2;
|
|
165
165
|
|
|
166
166
|
return !isCarousel ? (
|
|
167
|
-
<div className="flex w-full max-w-[1280px] flex-wrap justify-center gap-
|
|
167
|
+
<div className="flex w-full max-w-[1280px] flex-wrap justify-center gap-4">
|
|
168
168
|
{items.map((item, index) => renderCard(item, index))}
|
|
169
169
|
</div>
|
|
170
170
|
) : (
|
|
@@ -23,10 +23,13 @@ export const Carousel: React.FC<CarouselProps> = ({
|
|
|
23
23
|
testimonialAutoScroll = true,
|
|
24
24
|
showSwitch = false,
|
|
25
25
|
}) => {
|
|
26
|
+
const baseClass = hasProductCards
|
|
27
|
+
? "px-3 py-9 md:py-20"
|
|
28
|
+
: hasTestimonialCards
|
|
29
|
+
? "px-3 py-12 md:pt-20 md:pb-16"
|
|
30
|
+
: "";
|
|
26
31
|
return (
|
|
27
|
-
<div
|
|
28
|
-
className={`${backgroundColor} mx-auto overflow-hidden px-5 py-12 md:pb-16 md:pt-20`}
|
|
29
|
-
>
|
|
32
|
+
<div className={`${backgroundColor} ${baseClass} mx-auto overflow-hidden`}>
|
|
30
33
|
<div className="relative mx-auto flex max-w-[1280px] flex-col gap-8 overflow-visible md:gap-12">
|
|
31
34
|
<div>
|
|
32
35
|
<Text
|
|
@@ -41,13 +44,23 @@ export const Carousel: React.FC<CarouselProps> = ({
|
|
|
41
44
|
</Text>
|
|
42
45
|
)}
|
|
43
46
|
</div>
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
47
|
+
{showSwitch && hasProductCards && (
|
|
48
|
+
<div className="flex flex-col gap-8">
|
|
49
|
+
{showSwitch && hasProductCards && tabs.length > 1 && (
|
|
50
|
+
<TabSwitch
|
|
51
|
+
tabs={tabs}
|
|
52
|
+
activeTab={activeTab}
|
|
53
|
+
onChange={setActiveTab}
|
|
54
|
+
/>
|
|
55
|
+
)}
|
|
56
|
+
{hasProductCards && (
|
|
57
|
+
<ProductCardCarousel
|
|
58
|
+
onModalButtonClick={onModalButtonClick}
|
|
59
|
+
renderCheckPlans={renderCheckPlans}
|
|
60
|
+
fields={fields as CarouselWithProductCards}
|
|
61
|
+
/>
|
|
62
|
+
)}
|
|
63
|
+
</div>
|
|
51
64
|
)}
|
|
52
65
|
{hasTestimonialCards && (
|
|
53
66
|
<TestimonialCarousel
|
|
@@ -56,22 +69,15 @@ export const Carousel: React.FC<CarouselProps> = ({
|
|
|
56
69
|
autoScrollInterval={8000}
|
|
57
70
|
/>
|
|
58
71
|
)}
|
|
59
|
-
{hasProductCards && (
|
|
60
|
-
<ProductCardCarousel
|
|
61
|
-
onModalButtonClick={onModalButtonClick}
|
|
62
|
-
renderCheckPlans={renderCheckPlans}
|
|
63
|
-
fields={fields as CarouselWithProductCards}
|
|
64
|
-
/>
|
|
65
|
-
)}
|
|
66
|
-
{disclaimerText && (
|
|
67
|
-
<Text
|
|
68
|
-
as="div"
|
|
69
|
-
className="body1 mt-8 px-4 text-center text-neutral-600"
|
|
70
|
-
>
|
|
71
|
-
{disclaimerText}
|
|
72
|
-
</Text>
|
|
73
|
-
)}
|
|
74
72
|
</div>
|
|
73
|
+
{disclaimerText && (
|
|
74
|
+
<Text
|
|
75
|
+
as="div"
|
|
76
|
+
className="footnote mt-8 px-4 text-center text-text-secondary"
|
|
77
|
+
>
|
|
78
|
+
{disclaimerText}
|
|
79
|
+
</Text>
|
|
80
|
+
)}
|
|
75
81
|
</div>
|
|
76
82
|
);
|
|
77
83
|
};
|
|
@@ -74,7 +74,11 @@ export const FloatingBanner: React.FC<FloatingBannerProps> = ({
|
|
|
74
74
|
</div>
|
|
75
75
|
{cta && (
|
|
76
76
|
<div className="mt-5 flex flex-shrink-0 justify-center lg:mt-0 lg:items-center">
|
|
77
|
-
<Button
|
|
77
|
+
<Button
|
|
78
|
+
{...cta}
|
|
79
|
+
buttonVariant="secondary"
|
|
80
|
+
size={{ base: "medium", md: "large" }}
|
|
81
|
+
></Button>
|
|
78
82
|
</div>
|
|
79
83
|
)}
|
|
80
84
|
</div>
|
|
@@ -16,8 +16,8 @@ import { Button } from "@shared/contentful/blocks/button";
|
|
|
16
16
|
import { cx } from "@shared/utils";
|
|
17
17
|
|
|
18
18
|
type ExtendedModalProps = ModalProps & {
|
|
19
|
-
type?:
|
|
20
|
-
index?:
|
|
19
|
+
type?: string;
|
|
20
|
+
index?: number;
|
|
21
21
|
};
|
|
22
22
|
export const Modal: React.FC<ExtendedModalProps> = props => {
|
|
23
23
|
const {
|
|
@@ -29,8 +29,8 @@ export const Modal: React.FC<ExtendedModalProps> = props => {
|
|
|
29
29
|
description,
|
|
30
30
|
children,
|
|
31
31
|
bodyClassName,
|
|
32
|
-
type,
|
|
33
|
-
index,
|
|
32
|
+
type = "modal",
|
|
33
|
+
index = 0,
|
|
34
34
|
} = props;
|
|
35
35
|
|
|
36
36
|
return (
|
package/src/contentful/index.ts
CHANGED
|
@@ -73,3 +73,6 @@ export type { AddressInputBannerProps } from "./blocks/address-input-banner/type
|
|
|
73
73
|
|
|
74
74
|
export { DynamicTabs } from "./blocks/dynamic-tabs";
|
|
75
75
|
export type { DynamicTabsT } from "./blocks/dynamic-tabs/types";
|
|
76
|
+
|
|
77
|
+
export { AnchoredBottomBanner } from "./blocks/anchored-bottom-banner";
|
|
78
|
+
export type { AnchoredBottomBannerProps } from "./blocks/anchored-bottom-banner/types";
|