blocks-dusted 0.1.12 → 0.1.13
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/package.json +1 -1
- package/src/installers/patchRenderBlocks.js +1 -1
- package/src/registry/validateTemplateManifest.js +2 -1
- package/templates/blocks/BannerDD790432/Component.tsx +63 -0
- package/templates/blocks/BannerDD790432/config.ts +54 -0
- package/templates/blocks/BannerDD790432/manifest.json +80 -0
- package/templates/blocks/Button47/Component.tsx +124 -0
- package/templates/blocks/Button47/config.ts +75 -0
- package/templates/blocks/Button47/link.ts +22 -0
- package/templates/blocks/Button47/manifest.json +105 -0
- package/templates/blocks/Button47/styles.module.scss +75 -0
- package/templates/blocks/DD-Accordion/Component.tsx +55 -36
- package/templates/blocks/DD-Accordion/config.ts +71 -59
- package/templates/blocks/DD-AnimText/Component.tsx +50 -32
- package/templates/blocks/DD-AnimText/config.ts +296 -295
- package/templates/blocks/DD-AsideNav/Component.tsx +323 -319
- package/templates/blocks/DD-Banner/Component.tsx +54 -51
- package/templates/blocks/DD-BookCall/Component.tsx +535 -535
- package/templates/blocks/DD-ButtonPop/Component.tsx +118 -117
- package/templates/blocks/DD-Card/Component.tsx +4 -4
- package/templates/blocks/DD-CardTemplate01/Component.tsx +139 -140
- package/templates/blocks/DD-CardsWithVariantV3/Component.tsx +472 -0
- package/templates/blocks/DD-CardsWithVariantV3/ElectricBorder/index.tsx +203 -0
- package/templates/blocks/DD-CardsWithVariantV3/ElectricBorder/styles.ts +87 -0
- package/templates/blocks/DD-CardsWithVariantV3/ElectricBorder/useInjectStyle.ts +39 -0
- package/templates/blocks/DD-CardsWithVariantV3/config.ts +326 -0
- package/templates/blocks/DD-CardsWithVariantV3/manifest.json +110 -0
- package/templates/blocks/DD-Carousel-A/Component.tsx +251 -249
- package/templates/blocks/DD-Carousel-B/Component.tsx +405 -403
- package/templates/blocks/DD-ComparisonTable/Component.tsx +255 -256
- package/templates/blocks/DD-Contact/Component.tsx +433 -435
- package/templates/blocks/DD-Counter/Component.tsx +11 -6
- package/templates/blocks/DD-DeliCard/Component.tsx +303 -0
- package/templates/blocks/DD-DeliCard/config.ts +186 -0
- package/templates/blocks/DD-DeliCard/manifest.json +94 -0
- package/templates/blocks/DD-FeatCat/Component.tsx +302 -302
- package/templates/blocks/DD-FeatProd/CircularGallery.tsx +1179 -0
- package/templates/blocks/DD-FeatProd/Component.tsx +484 -0
- package/templates/blocks/DD-FeatProd/config.ts +173 -0
- package/templates/blocks/DD-FeatProd/manifest.json +93 -0
- package/templates/blocks/DD-FeatServ/Component.tsx +607 -0
- package/templates/blocks/DD-FeatServ/config.ts +213 -0
- package/templates/blocks/DD-FeatServ/manifest.json +113 -0
- package/templates/blocks/DD-FeatStrip/Component.tsx +584 -585
- package/templates/blocks/DD-FluidBtn/ButtonsEyeCatching.tsx +627 -628
- package/templates/blocks/DD-FluidBtn/Component.tsx +46 -43
- package/templates/blocks/DD-GooeyInfo/Component.tsx +150 -149
- package/templates/blocks/DD-GooeyInfo/config.ts +136 -135
- package/templates/blocks/DD-Hero/Component.tsx +296 -297
- package/templates/blocks/DD-HeroPlas/Component.tsx +50 -0
- package/templates/blocks/DD-HeroPlas/ThreeScene.tsx +109 -0
- package/templates/blocks/DD-HeroPlas/config.ts +33 -0
- package/templates/blocks/DD-HeroPlas/manifest.json +88 -0
- package/templates/blocks/DD-HorizontalScroll/Component.tsx +937 -936
- package/templates/blocks/DD-Icon/Component.tsx +46 -81
- package/templates/blocks/DD-IconButton/Component.tsx +13 -20
- package/templates/blocks/DD-IdTag/Component.tsx +22 -21
- package/templates/blocks/DD-LineAnim/Component.tsx +42 -36
- package/templates/blocks/DD-LogoMarq/Component.tsx +38 -48
- package/templates/blocks/DD-Lottie/Component.tsx +11 -3
- package/templates/blocks/DD-MasonaryMedia/Component.tsx +544 -545
- package/templates/blocks/DD-MasonaryMedia/config.ts +389 -389
- package/templates/blocks/DD-Masonry/Component.tsx +654 -644
- package/templates/blocks/DD-Masonry/config.ts +475 -475
- package/templates/blocks/DD-MaterialSwatches/Component.tsx +85 -0
- package/templates/blocks/DD-MaterialSwatches/config.ts +232 -0
- package/templates/blocks/DD-MaterialSwatches/manifest.json +84 -0
- package/templates/blocks/DD-MaterialSwatches/material.ts +107 -0
- package/templates/blocks/DD-NineCanvas/Component.tsx +129 -0
- package/templates/blocks/DD-NineCanvas/RenderBlocks.tsx +244 -0
- package/templates/blocks/DD-NineCanvas/allowedCanvasBlocks.ts +6 -0
- package/templates/blocks/DD-NineCanvas/blockComponents.tsx +8 -0
- package/templates/blocks/DD-NineCanvas/canvas/CanvasGrid.tsx +316 -0
- package/templates/blocks/DD-NineCanvas/canvas/RadialNav.tsx +432 -0
- package/templates/blocks/DD-NineCanvas/canvas/canvas-panels.css +889 -0
- package/templates/blocks/DD-NineCanvas/canvas/icons/custom-icons.tsx +364 -0
- package/templates/blocks/DD-NineCanvas/config.ts +61 -0
- package/templates/blocks/DD-NineCanvas/manifest.json +165 -0
- package/templates/blocks/DD-NineCanvas/styles.scss +152 -0
- package/templates/blocks/DD-NineCanvas/tooltip/get-strict-context.tsx +26 -0
- package/templates/blocks/DD-NineCanvas/tooltip/primitives.tsx +178 -0
- package/templates/blocks/DD-NineCanvas/tooltip/tooltip.tsx +71 -0
- package/templates/blocks/DD-NineCanvas/tooltip/use-controlled-state.tsx +33 -0
- package/templates/blocks/DD-NineCanvas/utilities/FadeOnScroll.tsx +68 -0
- package/templates/blocks/DD-NineCanvas/utilities/ParallaxWrapper.tsx +157 -0
- package/templates/blocks/DD-NineCanvas/utilities/renderCustomCSS.ts +5 -0
- package/templates/blocks/DD-NineCanvas/utilities/webglCleanup.ts +27 -0
- package/templates/blocks/DD-PayloadAIAssistant/Component.tsx +78 -0
- package/templates/blocks/DD-PayloadAIAssistant/DustedBot.tsx +590 -0
- package/templates/blocks/DD-PayloadAIAssistant/config.ts +37 -0
- package/templates/blocks/DD-PayloadAIAssistant/demo.css +125 -0
- package/templates/blocks/DD-PayloadAIAssistant/manifest.json +93 -0
- package/templates/blocks/DD-PayloadAIAssistant/source-defaults.ts +17 -0
- package/templates/blocks/DD-PayloadAIAssistant/styles.ts +306 -0
- package/templates/blocks/DD-Pricing/Component.tsx +2 -3
- package/templates/blocks/DD-Pricing/config.ts +215 -215
- package/templates/blocks/DD-Process/Component.tsx +2 -2
- package/templates/blocks/DD-ProjHeader/Component.tsx +93 -91
- package/templates/blocks/DD-ProjSlider/Component.tsx +1 -1
- package/templates/blocks/DD-Section/Component.tsx +265 -266
- package/templates/blocks/DD-Separator/Component.tsx +66 -66
- package/templates/blocks/DD-Services/Component.tsx +176 -176
- package/templates/blocks/DD-ShowcaseGrid/Component.tsx +306 -307
- package/templates/blocks/DD-Slider-A/Component.tsx +2 -2
- package/templates/blocks/DD-StackCards/Component.tsx +172 -171
- package/templates/blocks/DD-Team/Component.tsx +247 -247
- package/templates/blocks/DD-TeamCards/Component.tsx +251 -251
- package/templates/blocks/DD-TechStack/Component.tsx +173 -174
- package/templates/blocks/DD-TestMarq/Component.tsx +158 -132
- package/templates/blocks/DD-Testim/Component.tsx +247 -247
- package/templates/blocks/DD-Testim2/Component.tsx +265 -256
- package/templates/blocks/DD-Testimonials/Component.tsx +139 -139
- package/templates/blocks/DD-Thanks/Component.tsx +1 -1
- package/templates/blocks/DD-Work/Component.tsx +318 -318
- package/templates/blocks/DD-Work-B/Component.tsx +294 -294
- package/templates/blocks/DDHG-CTASection2/Component.tsx +183 -184
- package/templates/blocks/DDHG-HighlightArc/Component.tsx +6 -3
- package/templates/blocks/DDHG-LogoMarquee/Component.tsx +45 -8
- package/templates/blocks/DDHG-NavCodeGrid/Component.tsx +1 -3
- package/templates/blocks/DDHG-ServiceDetails/ServiceDetailCard.tsx +9 -22
- package/templates/blocks/DDHG-ServiceHero/Component.tsx +10 -10
- package/templates/blocks/DDHG-TeamCards/Component.tsx +6 -35
- package/templates/blocks/Form/Checkbox/index.tsx +45 -0
- package/templates/blocks/Form/Component.tsx +163 -0
- package/templates/blocks/Form/Country/index.tsx +65 -0
- package/templates/blocks/Form/Country/options.ts +982 -0
- package/templates/blocks/Form/Email/index.tsx +38 -0
- package/templates/blocks/Form/Error/index.tsx +15 -0
- package/templates/blocks/Form/Message/index.tsx +13 -0
- package/templates/blocks/Form/Number/index.tsx +36 -0
- package/templates/blocks/Form/Select/index.tsx +63 -0
- package/templates/blocks/Form/State/index.tsx +64 -0
- package/templates/blocks/Form/State/options.ts +52 -0
- package/templates/blocks/Form/Text/index.tsx +32 -0
- package/templates/blocks/Form/Textarea/index.tsx +40 -0
- package/templates/blocks/Form/Width/index.tsx +13 -0
- package/templates/blocks/Form/config.ts +51 -0
- package/templates/blocks/Form/fields.tsx +21 -0
- package/templates/blocks/Form/manifest.json +168 -0
- package/templates/blocks/MediaBlock/Component.tsx +67 -0
- package/templates/blocks/MediaBlock/config.ts +14 -0
- package/templates/blocks/MediaBlock/manifest.json +92 -0
- package/templates/blocks/TransitionsDustedShowcase/Component.tsx +9 -0
- package/templates/blocks/TransitionsDustedShowcase/config.ts +13 -0
- package/templates/blocks/TransitionsDustedShowcase/manifest.json +80 -0
- package/templates/blocks/rawHtml/Component.tsx +25 -0
- package/templates/blocks/rawHtml/config.ts +56 -0
- package/templates/blocks/rawHtml/manifest.json +80 -0
|
@@ -1,247 +1,247 @@
|
|
|
1
|
-
'use client'
|
|
2
|
-
|
|
3
|
-
import React, { useId, useEffect, useState } from 'react'
|
|
4
|
-
import { motion } from 'framer-motion'
|
|
5
|
-
import { Swiper, SwiperSlide } from 'swiper/react'
|
|
6
|
-
import { Navigation, Pagination } from 'swiper/modules'
|
|
7
|
-
import 'swiper/css'
|
|
8
|
-
import 'swiper/css/navigation'
|
|
9
|
-
import 'swiper/css/pagination'
|
|
10
|
-
import { cn } from '@/utilities/ui'
|
|
11
|
-
import RichText from '@/components/RichText/index'
|
|
12
|
-
// import { Media } from '@/components/Media'
|
|
13
|
-
import Image from 'next/image'
|
|
14
|
-
|
|
15
|
-
export type TestimonialItem = {
|
|
16
|
-
id: string
|
|
17
|
-
clientName: any
|
|
18
|
-
designation: any
|
|
19
|
-
company: any
|
|
20
|
-
content: any
|
|
21
|
-
companyLogo?: any
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export type TestimonialBlockProps = {
|
|
25
|
-
testimonials: TestimonialItem[]
|
|
26
|
-
heading?: any
|
|
27
|
-
testimonialClass?: string
|
|
28
|
-
sectionId?: string
|
|
29
|
-
subHeader?: string
|
|
30
|
-
showPagination?: boolean
|
|
31
|
-
showNavigation?: boolean
|
|
32
|
-
slidesPerViewTablet?: number
|
|
33
|
-
slidesPerViewDesktop?: number
|
|
34
|
-
carouselSpeed?: number
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export const DDTestim: React.FC<TestimonialBlockProps> = ({
|
|
38
|
-
testimonials,
|
|
39
|
-
heading,
|
|
40
|
-
testimonialClass,
|
|
41
|
-
sectionId,
|
|
42
|
-
subHeader,
|
|
43
|
-
showPagination = true,
|
|
44
|
-
showNavigation = true,
|
|
45
|
-
slidesPerViewTablet = 2,
|
|
46
|
-
slidesPerViewDesktop = 3,
|
|
47
|
-
carouselSpeed = 1000
|
|
48
|
-
}) => {
|
|
49
|
-
const uniqueId = useId().replace(/:/g, '')
|
|
50
|
-
const [swiperReady, setSwiperReady] = useState(false)
|
|
51
|
-
|
|
52
|
-
useEffect(() => {
|
|
53
|
-
setSwiperReady(true)
|
|
54
|
-
}, [])
|
|
55
|
-
|
|
56
|
-
if (!testimonials || testimonials.length === 0) return null
|
|
57
|
-
|
|
58
|
-
return (
|
|
59
|
-
<section
|
|
60
|
-
className={cn(
|
|
61
|
-
'testimonialsSwiper relative px-0 pb-16 pt-0',
|
|
62
|
-
'py-16',
|
|
63
|
-
'[--swiper-navigation-top-offset:82%] [--swiper-navigation-size:
|
|
64
|
-
'[&_.swiper]:min-w-[375px] [&_.swiper]:!w-full [&_.swiper]:!pb-8 [&_.swiper]:![perspective:1200px] [&_.swiper]:![transform-style:preserve-3d]',
|
|
65
|
-
'max-md:[&_.swiper]:ml-0 max-md:[&_.swiper]:min-w-[300px] max-md:[&_.swiper]:scale-95',
|
|
66
|
-
'[&_.swiper-wrapper]:
|
|
67
|
-
'[&_.swiper-pagination-fraction]:relative [&_.swiper-pagination-fraction]:top-6 [&_.swiper-pagination-fraction]:mx-auto [&_.swiper-pagination-fraction]:w-fit [&_.swiper-pagination-fraction]:max-w-[90%] [&_.swiper-pagination-fraction]:pt-4',
|
|
68
|
-
'[&_.swiper-pagination-custom]:relative [&_.swiper-pagination-custom]:top-6 [&_.swiper-pagination-custom]:mx-auto [&_.swiper-pagination-custom]:w-fit [&_.swiper-pagination-custom]:max-w-[90%] [&_.swiper-pagination-custom]:pt-4',
|
|
69
|
-
'[&_.swiper-horizontal>.swiper-pagination-bullets]:relative [&_.swiper-horizontal>.swiper-pagination-bullets]:top-6 [&_.swiper-horizontal>.swiper-pagination-bullets]:mx-auto [&_.swiper-horizontal>.swiper-pagination-bullets]:w-fit [&_.swiper-horizontal>.swiper-pagination-bullets]:max-w-[90%] [&_.swiper-horizontal>.swiper-pagination-bullets]:pt-4',
|
|
70
|
-
'[&_.swiper-pagination-bullets.swiper-pagination-horizontal]
|
|
71
|
-
'[html[data-theme="light"]_&_.swiperButtonPrev]:invert [html[data-theme="light"]_&_.swiperButtonPrev]:hue-rotate-[24deg] [html[data-theme="light"]_&_.swiperButtonPrev]:transition-opacity [html[data-theme="light"]_&_.swiperButtonPrev]:duration-300',
|
|
72
|
-
'[html[data-theme="light"]_&_.swiperButtonNext]:invert [html[data-theme="light"]_&_.swiperButtonNext]:hue-rotate-[24deg] [html[data-theme="light"]_&_.swiperButtonNext]:transition-opacity [html[data-theme="light"]_&_.swiperButtonNext]:duration-300',
|
|
73
|
-
testimonialClass
|
|
74
|
-
)}
|
|
75
|
-
id={sectionId || 'testimonials'}
|
|
76
|
-
>
|
|
77
|
-
{(heading || subHeader) && (
|
|
78
|
-
<div className="mb-10 text-center">
|
|
79
|
-
{subHeader && <h6 className="text-lg font-semibold">{subHeader}</h6>}
|
|
80
|
-
{heading && swiperReady && (
|
|
81
|
-
<RichText
|
|
82
|
-
className="mb-6 text-2xl font-bold md:text-3xl"
|
|
83
|
-
data={heading}
|
|
84
|
-
suppressContentEditableWarning
|
|
85
|
-
suppressHydrationWarning
|
|
86
|
-
/>
|
|
87
|
-
)}
|
|
88
|
-
</div>
|
|
89
|
-
)}
|
|
90
|
-
|
|
91
|
-
<div className="relative">
|
|
92
|
-
{swiperReady && (
|
|
93
|
-
<Swiper
|
|
94
|
-
modules={[Navigation, Pagination]}
|
|
95
|
-
pagination={showPagination ? { clickable: true } : undefined}
|
|
96
|
-
navigation={
|
|
97
|
-
showNavigation
|
|
98
|
-
? {
|
|
99
|
-
nextEl: `.next-${uniqueId}`,
|
|
100
|
-
prevEl: `.prev-${uniqueId}
|
|
101
|
-
}
|
|
102
|
-
: undefined
|
|
103
|
-
}
|
|
104
|
-
speed={carouselSpeed}
|
|
105
|
-
spaceBetween={20}
|
|
106
|
-
slidesPerView={1}
|
|
107
|
-
loop={testimonials.length > 1}
|
|
108
|
-
breakpoints={{
|
|
109
|
-
768: {
|
|
110
|
-
slidesPerView: slidesPerViewTablet
|
|
111
|
-
},
|
|
112
|
-
1024: {
|
|
113
|
-
slidesPerView: slidesPerViewDesktop
|
|
114
|
-
}
|
|
115
|
-
}}
|
|
116
|
-
className="swiper-container w-full lg:max-w-full"
|
|
117
|
-
>
|
|
118
|
-
{testimonials.map((testimonial) => (
|
|
119
|
-
<SwiperSlide key={testimonial.id} className="swiper-slide card-bottom-lit">
|
|
120
|
-
<motion.div
|
|
121
|
-
initial={{ opacity: 0, y: 30 }}
|
|
122
|
-
animate={{ opacity: 1, y: 0 }}
|
|
123
|
-
transition={{ duration: 0.4 }}
|
|
124
|
-
className="m-0 mt-8 flex items-center gap-0 rounded-sm bg-card px-0 shadow-xl"
|
|
125
|
-
>
|
|
126
|
-
<div className="flex-1 p-0">
|
|
127
|
-
<div className="relative pb-8 pt-8">
|
|
128
|
-
<svg
|
|
129
|
-
xmlns="http://www.w3.org/2000/svg"
|
|
130
|
-
width="256.721"
|
|
131
|
-
height="208.227"
|
|
132
|
-
viewBox="0 0 256.721 208.227"
|
|
133
|
-
className="absolute -left-2 -top-10 pt-8 opacity-40"
|
|
134
|
-
>
|
|
135
|
-
<path
|
|
136
|
-
d="M-23.723-530.169v97.327H-121.05v-68.7q0-40.076,13.359-73.472T-62.845-639.9l36.259,28.625Q-63.8-570.244-68.57-530.169Zm158.395,0v97.327H37.345v-68.7q0-40.076,13.359-73.472T95.55-639.9l36.259,28.625Q94.6-570.244,89.825-530.169Z"
|
|
137
|
-
transform="translate(121.55 640.568)"
|
|
138
|
-
fill="#fff"
|
|
139
|
-
stroke="#fff"
|
|
140
|
-
strokeWidth="1"
|
|
141
|
-
opacity="0.25"
|
|
142
|
-
/>
|
|
143
|
-
</svg>
|
|
144
|
-
|
|
145
|
-
<div className="container p-4 pt-8">
|
|
146
|
-
{swiperReady && (
|
|
147
|
-
<RichText
|
|
148
|
-
suppressContentEditableWarning
|
|
149
|
-
suppressHydrationWarning
|
|
150
|
-
data={testimonial.content}
|
|
151
|
-
className={cn(
|
|
152
|
-
'testimonialContent min-h-fit max-h-[50vh] text-stone-
|
|
153
|
-
'[&_.customSpan]:text-base [&_.customSpan]:leading-8 [&_.customSpan]:brightness-125',
|
|
154
|
-
'[&_p]:text-base [&_p]:leading-8 [&_p]:brightness-125',
|
|
155
|
-
'max-md:max-h-fit max-md:[&_.customSpan]:text-base max-md:[&_.customSpan]:leading-normal'
|
|
156
|
-
)}
|
|
157
|
-
enableGutter={false}
|
|
158
|
-
enableProse={false}
|
|
159
|
-
/>
|
|
160
|
-
)}
|
|
161
|
-
</div>
|
|
162
|
-
</div>
|
|
163
|
-
|
|
164
|
-
<div className="flex items-center pb-4 shadow-xl">
|
|
165
|
-
<div className="bg-
|
|
166
|
-
<div className="color-base">
|
|
167
|
-
<div className="block">
|
|
168
|
-
{swiperReady && (
|
|
169
|
-
<RichText
|
|
170
|
-
suppressContentEditableWarning
|
|
171
|
-
suppressHydrationWarning
|
|
172
|
-
enableGutter={false}
|
|
173
|
-
enableProse={false}
|
|
174
|
-
className="testimonial-clientname text-lg font-semibold text-white"
|
|
175
|
-
data={testimonial.clientName}
|
|
176
|
-
/>
|
|
177
|
-
)}
|
|
178
|
-
</div>
|
|
179
|
-
</div>
|
|
180
|
-
|
|
181
|
-
<div className="color-base font-semibold">
|
|
182
|
-
<div className="block">
|
|
183
|
-
{swiperReady && (
|
|
184
|
-
<RichText
|
|
185
|
-
suppressContentEditableWarning
|
|
186
|
-
suppressHydrationWarning
|
|
187
|
-
data={testimonial.company}
|
|
188
|
-
enableGutter={false}
|
|
189
|
-
enableProse={false}
|
|
190
|
-
className="testimonial-company mt-1 origin-left scale-90 text-xs text-white/80"
|
|
191
|
-
/>
|
|
192
|
-
)}
|
|
193
|
-
</div>
|
|
194
|
-
</div>
|
|
195
|
-
</div>
|
|
196
|
-
|
|
197
|
-
{testimonial.companyLogo?.url && (
|
|
198
|
-
<div className="testimonialLogo relative left-2 top-2 ml-auto flex h-auto w-40 items-center justify-center pr-8 opacity-90">
|
|
199
|
-
{/* <Media
|
|
200
|
-
resource={testimonial.companyLogo}
|
|
201
|
-
className="max-h-32 max-w-32 object-contain"
|
|
202
|
-
/> */}
|
|
203
|
-
|
|
204
|
-
<Image
|
|
205
|
-
src={testimonial.companyLogo.url}
|
|
206
|
-
alt={''}
|
|
207
|
-
fill
|
|
208
|
-
sizes="40px"
|
|
209
|
-
className="object-cover object-top"
|
|
210
|
-
/>
|
|
211
|
-
</div>
|
|
212
|
-
)}
|
|
213
|
-
</div>
|
|
214
|
-
</div>
|
|
215
|
-
</motion.div>
|
|
216
|
-
</SwiperSlide>
|
|
217
|
-
))}
|
|
218
|
-
</Swiper>
|
|
219
|
-
)}
|
|
220
|
-
</div>
|
|
221
|
-
|
|
222
|
-
{showNavigation && (
|
|
223
|
-
<div className="swiperNavArrows
|
|
224
|
-
<button
|
|
225
|
-
className={cn(
|
|
226
|
-
`swiperButtonPrev swiper-button-prev prev-${uniqueId}`,
|
|
227
|
-
'z-[100] h-8 w-
|
|
228
|
-
'bg-transparent hover:border-white/50 hover:bg-white/5 disabled:cursor-not-allowed disabled:opacity-30'
|
|
229
|
-
)}
|
|
230
|
-
>
|
|
231
|
-
<span className="
|
|
232
|
-
</button>
|
|
233
|
-
|
|
234
|
-
<button
|
|
235
|
-
className={cn(
|
|
236
|
-
`swiperButtonNext swiper-button-next next-${uniqueId}`,
|
|
237
|
-
'z-[100] h-8 w-
|
|
238
|
-
'bg-transparent hover:border-white/50 hover:bg-white/5 disabled:cursor-not-allowed disabled:opacity-30'
|
|
239
|
-
)}
|
|
240
|
-
>
|
|
241
|
-
<span className="
|
|
242
|
-
</button>
|
|
243
|
-
</div>
|
|
244
|
-
)}
|
|
245
|
-
</section>
|
|
246
|
-
)
|
|
247
|
-
}
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import React, { useId, useEffect, useState } from 'react'
|
|
4
|
+
import { motion } from 'framer-motion'
|
|
5
|
+
import { Swiper, SwiperSlide } from 'swiper/react'
|
|
6
|
+
import { Navigation, Pagination } from 'swiper/modules'
|
|
7
|
+
import 'swiper/css'
|
|
8
|
+
import 'swiper/css/navigation'
|
|
9
|
+
import 'swiper/css/pagination'
|
|
10
|
+
import { cn } from '@/utilities/ui'
|
|
11
|
+
import RichText from '@/components/RichText/index'
|
|
12
|
+
// import { Media } from '@/components/Media'
|
|
13
|
+
import Image from 'next/image'
|
|
14
|
+
|
|
15
|
+
export type TestimonialItem = {
|
|
16
|
+
id: string
|
|
17
|
+
clientName: any
|
|
18
|
+
designation: any
|
|
19
|
+
company: any
|
|
20
|
+
content: any
|
|
21
|
+
companyLogo?: any
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export type TestimonialBlockProps = {
|
|
25
|
+
testimonials: TestimonialItem[]
|
|
26
|
+
heading?: any
|
|
27
|
+
testimonialClass?: string
|
|
28
|
+
sectionId?: string
|
|
29
|
+
subHeader?: string
|
|
30
|
+
showPagination?: boolean
|
|
31
|
+
showNavigation?: boolean
|
|
32
|
+
slidesPerViewTablet?: number
|
|
33
|
+
slidesPerViewDesktop?: number
|
|
34
|
+
carouselSpeed?: number
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export const DDTestim: React.FC<TestimonialBlockProps> = ({
|
|
38
|
+
testimonials,
|
|
39
|
+
heading,
|
|
40
|
+
testimonialClass,
|
|
41
|
+
sectionId,
|
|
42
|
+
subHeader,
|
|
43
|
+
showPagination = true,
|
|
44
|
+
showNavigation = true,
|
|
45
|
+
slidesPerViewTablet = 2,
|
|
46
|
+
slidesPerViewDesktop = 3,
|
|
47
|
+
carouselSpeed = 1000,
|
|
48
|
+
}) => {
|
|
49
|
+
const uniqueId = useId().replace(/:/g, '')
|
|
50
|
+
const [swiperReady, setSwiperReady] = useState(false)
|
|
51
|
+
|
|
52
|
+
useEffect(() => {
|
|
53
|
+
setSwiperReady(true)
|
|
54
|
+
}, [])
|
|
55
|
+
|
|
56
|
+
if (!testimonials || testimonials.length === 0) return null
|
|
57
|
+
|
|
58
|
+
return (
|
|
59
|
+
<section
|
|
60
|
+
className={cn(
|
|
61
|
+
'testimonialsSwiper relative left-1/2 w-screen max-w-none -translate-x-1/2 px-0 pb-16 pt-0',
|
|
62
|
+
'py-16',
|
|
63
|
+
'[--swiper-navigation-top-offset:82%] [--swiper-navigation-size:18px] [--swiper-navigation-sides-offset:33rem] [--swiper-navigation-color:var(--color-accent)] [--swiper-pagination-color: #5c4dfd] [--swiper-pagination-bullet-inactive-color:var(--color-alt)]',
|
|
64
|
+
'[&_.swiper]:min-w-[375px] [&_.swiper]:!w-full [&_.swiper]:!pb-8 [&_.swiper]:![perspective:1200px] [&_.swiper]:![transform-style:preserve-3d]',
|
|
65
|
+
'max-md:[&_.swiper]:ml-0 max-md:[&_.swiper]:min-w-[300px] max-md:[&_.swiper]:scale-95',
|
|
66
|
+
'[&_.swiper-wrapper]:scale-95 [&_.swiper-wrapper]:gap-8 [&_.swiper-wrapper]:p-0',
|
|
67
|
+
'[&_.swiper-pagination-fraction]:relative [&_.swiper-pagination-fraction]:top-6 [&_.swiper-pagination-fraction]:mx-auto [&_.swiper-pagination-fraction]:w-fit [&_.swiper-pagination-fraction]:max-w-[90%] [&_.swiper-pagination-fraction]:pt-4',
|
|
68
|
+
'[&_.swiper-pagination-custom]:relative [&_.swiper-pagination-custom]:top-6 [&_.swiper-pagination-custom]:mx-auto [&_.swiper-pagination-custom]:w-fit [&_.swiper-pagination-custom]:max-w-[90%] [&_.swiper-pagination-custom]:pt-4',
|
|
69
|
+
'[&_.swiper-horizontal>.swiper-pagination-bullets]:relative [&_.swiper-horizontal>.swiper-pagination-bullets]:top-6 [&_.swiper-horizontal>.swiper-pagination-bullets]:mx-auto [&_.swiper-horizontal>.swiper-pagination-bullets]:w-fit [&_.swiper-horizontal>.swiper-pagination-bullets]:max-w-[90%] [&_.swiper-horizontal>.swiper-pagination-bullets]:pt-4',
|
|
70
|
+
'[&_.swiper-pagination-bullets.swiper-pagination-horizontal]:!left-1/2 [&_.swiper-pagination-bullets.swiper-pagination-horizontal]:relative [&_.swiper-pagination-bullets.swiper-pagination-horizontal]:top-6 [&_.swiper-pagination-bullets.swiper-pagination-horizontal]:!w-fit [&_.swiper-pagination-bullets.swiper-pagination-horizontal]:max-w-[90%] [&_.swiper-pagination-bullets.swiper-pagination-horizontal]:!-translate-x-1/2 [&_.swiper-pagination-bullets.swiper-pagination-horizontal]:pt-4',
|
|
71
|
+
'[html[data-theme="light"]_&_.swiperButtonPrev]:invert [html[data-theme="light"]_&_.swiperButtonPrev]:hue-rotate-[24deg] [html[data-theme="light"]_&_.swiperButtonPrev]:transition-opacity [html[data-theme="light"]_&_.swiperButtonPrev]:duration-300',
|
|
72
|
+
'[html[data-theme="light"]_&_.swiperButtonNext]:invert [html[data-theme="light"]_&_.swiperButtonNext]:hue-rotate-[24deg] [html[data-theme="light"]_&_.swiperButtonNext]:transition-opacity [html[data-theme="light"]_&_.swiperButtonNext]:duration-300',
|
|
73
|
+
testimonialClass,
|
|
74
|
+
)}
|
|
75
|
+
id={sectionId || 'testimonials'}
|
|
76
|
+
>
|
|
77
|
+
{(heading || subHeader) && (
|
|
78
|
+
<div className="mb-10 text-center">
|
|
79
|
+
{subHeader && <h6 className="text-lg font-semibold">{subHeader}</h6>}
|
|
80
|
+
{heading && swiperReady && (
|
|
81
|
+
<RichText
|
|
82
|
+
className="mb-6 text-2xl font-bold md:text-3xl"
|
|
83
|
+
data={heading}
|
|
84
|
+
suppressContentEditableWarning
|
|
85
|
+
suppressHydrationWarning
|
|
86
|
+
/>
|
|
87
|
+
)}
|
|
88
|
+
</div>
|
|
89
|
+
)}
|
|
90
|
+
|
|
91
|
+
<div className="relative">
|
|
92
|
+
{swiperReady && (
|
|
93
|
+
<Swiper
|
|
94
|
+
modules={[Navigation, Pagination]}
|
|
95
|
+
pagination={showPagination ? { clickable: true } : undefined}
|
|
96
|
+
navigation={
|
|
97
|
+
showNavigation
|
|
98
|
+
? {
|
|
99
|
+
nextEl: `.next-${uniqueId}`,
|
|
100
|
+
prevEl: `.prev-${uniqueId}`,
|
|
101
|
+
}
|
|
102
|
+
: undefined
|
|
103
|
+
}
|
|
104
|
+
speed={carouselSpeed}
|
|
105
|
+
spaceBetween={20}
|
|
106
|
+
slidesPerView={1}
|
|
107
|
+
loop={testimonials.length > 1}
|
|
108
|
+
breakpoints={{
|
|
109
|
+
768: {
|
|
110
|
+
slidesPerView: slidesPerViewTablet,
|
|
111
|
+
},
|
|
112
|
+
1024: {
|
|
113
|
+
slidesPerView: slidesPerViewDesktop,
|
|
114
|
+
},
|
|
115
|
+
}}
|
|
116
|
+
className="swiper-container w-full lg:max-w-full"
|
|
117
|
+
>
|
|
118
|
+
{testimonials.map((testimonial) => (
|
|
119
|
+
<SwiperSlide key={testimonial.id} className="swiper-slide card-bottom-lit">
|
|
120
|
+
<motion.div
|
|
121
|
+
initial={{ opacity: 0, y: 30 }}
|
|
122
|
+
animate={{ opacity: 1, y: 0 }}
|
|
123
|
+
transition={{ duration: 0.4 }}
|
|
124
|
+
className="m-0 mt-8 flex items-center gap-0 rounded-sm bg-card px-0 shadow-xl"
|
|
125
|
+
>
|
|
126
|
+
<div className="flex-1 p-0">
|
|
127
|
+
<div className="relative pb-8 pt-8">
|
|
128
|
+
<svg
|
|
129
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
130
|
+
width="256.721"
|
|
131
|
+
height="208.227"
|
|
132
|
+
viewBox="0 0 256.721 208.227"
|
|
133
|
+
className="absolute -left-2 -top-10 pt-8 opacity-40 invert-[1] dark:invert-[0]"
|
|
134
|
+
>
|
|
135
|
+
<path
|
|
136
|
+
d="M-23.723-530.169v97.327H-121.05v-68.7q0-40.076,13.359-73.472T-62.845-639.9l36.259,28.625Q-63.8-570.244-68.57-530.169Zm158.395,0v97.327H37.345v-68.7q0-40.076,13.359-73.472T95.55-639.9l36.259,28.625Q94.6-570.244,89.825-530.169Z"
|
|
137
|
+
transform="translate(121.55 640.568)"
|
|
138
|
+
fill="#fff"
|
|
139
|
+
stroke="#fff"
|
|
140
|
+
strokeWidth="1"
|
|
141
|
+
opacity="0.25"
|
|
142
|
+
/>
|
|
143
|
+
</svg>
|
|
144
|
+
|
|
145
|
+
<div className="container p-4 pt-8">
|
|
146
|
+
{swiperReady && (
|
|
147
|
+
<RichText
|
|
148
|
+
suppressContentEditableWarning
|
|
149
|
+
suppressHydrationWarning
|
|
150
|
+
data={testimonial.content}
|
|
151
|
+
className={cn(
|
|
152
|
+
'testimonialContent min-h-fit max-h-[50vh] text-stone-800 dark:text-stone-200 max-w-none overflow-hidden px-0 md:px-6',
|
|
153
|
+
'[&_.customSpan]:text-base [&_.customSpan]:leading-8 [&_.customSpan]:brightness-125',
|
|
154
|
+
'[&_p]:text-base [&_p]:leading-8 [&_p]:brightness-125',
|
|
155
|
+
'max-md:max-h-fit max-md:[&_.customSpan]:text-base max-md:[&_.customSpan]:leading-normal',
|
|
156
|
+
)}
|
|
157
|
+
enableGutter={false}
|
|
158
|
+
enableProse={false}
|
|
159
|
+
/>
|
|
160
|
+
)}
|
|
161
|
+
</div>
|
|
162
|
+
</div>
|
|
163
|
+
|
|
164
|
+
<div className="flex items-center pb-4 shadow-xl">
|
|
165
|
+
<div className="bg-stone-300 dark:bg-stone-800 p-4 shadow-xl">
|
|
166
|
+
<div className="color-base">
|
|
167
|
+
<div className="block">
|
|
168
|
+
{swiperReady && (
|
|
169
|
+
<RichText
|
|
170
|
+
suppressContentEditableWarning
|
|
171
|
+
suppressHydrationWarning
|
|
172
|
+
enableGutter={false}
|
|
173
|
+
enableProse={false}
|
|
174
|
+
className="testimonial-clientname text-lg font-semibold text-black dark:text-white"
|
|
175
|
+
data={testimonial.clientName}
|
|
176
|
+
/>
|
|
177
|
+
)}
|
|
178
|
+
</div>
|
|
179
|
+
</div>
|
|
180
|
+
|
|
181
|
+
<div className="color-base font-semibold">
|
|
182
|
+
<div className="block">
|
|
183
|
+
{swiperReady && (
|
|
184
|
+
<RichText
|
|
185
|
+
suppressContentEditableWarning
|
|
186
|
+
suppressHydrationWarning
|
|
187
|
+
data={testimonial.company}
|
|
188
|
+
enableGutter={false}
|
|
189
|
+
enableProse={false}
|
|
190
|
+
className="testimonial-company mt-1 origin-left scale-90 text-xs text-black/80 dark:text-white/80"
|
|
191
|
+
/>
|
|
192
|
+
)}
|
|
193
|
+
</div>
|
|
194
|
+
</div>
|
|
195
|
+
</div>
|
|
196
|
+
|
|
197
|
+
{testimonial.companyLogo?.url && (
|
|
198
|
+
<div className="testimonialLogo relative left-2 top-2 ml-auto flex h-auto w-40 items-center justify-center pr-8 opacity-90">
|
|
199
|
+
{/* <Media
|
|
200
|
+
resource={testimonial.companyLogo}
|
|
201
|
+
className="max-h-32 max-w-32 object-contain"
|
|
202
|
+
/> */}
|
|
203
|
+
|
|
204
|
+
<Image
|
|
205
|
+
src={testimonial.companyLogo.url}
|
|
206
|
+
alt={''}
|
|
207
|
+
fill
|
|
208
|
+
sizes="40px"
|
|
209
|
+
className="object-cover object-top"
|
|
210
|
+
/>
|
|
211
|
+
</div>
|
|
212
|
+
)}
|
|
213
|
+
</div>
|
|
214
|
+
</div>
|
|
215
|
+
</motion.div>
|
|
216
|
+
</SwiperSlide>
|
|
217
|
+
))}
|
|
218
|
+
</Swiper>
|
|
219
|
+
)}
|
|
220
|
+
</div>
|
|
221
|
+
|
|
222
|
+
{showNavigation && (
|
|
223
|
+
<div className="swiperNavArrows pointer-events-none relative flex justify-center gap-24 scale-80">
|
|
224
|
+
<button
|
|
225
|
+
className={cn(
|
|
226
|
+
`swiperButtonPrev swiper-button-prev prev-${uniqueId}`,
|
|
227
|
+
'pointer-events-auto z-[100] !relative !inset-auto !m-0 flex !h-8 !w-8 !translate-y-0 cursor-pointer items-center justify-center rounded-full p-0 opacity-100 transition-all duration-300',
|
|
228
|
+
'bg-transparent hover:border-white/50 hover:bg-white/5 disabled:cursor-not-allowed disabled:opacity-30',
|
|
229
|
+
)}
|
|
230
|
+
>
|
|
231
|
+
<span className="sr-only">Previous testimonial</span>
|
|
232
|
+
</button>
|
|
233
|
+
|
|
234
|
+
<button
|
|
235
|
+
className={cn(
|
|
236
|
+
`swiperButtonNext swiper-button-next next-${uniqueId}`,
|
|
237
|
+
'pointer-events-auto z-[100] !relative !inset-auto !m-0 flex !h-8 !w-8 !translate-y-0 cursor-pointer items-center justify-center rounded-full p-0 opacity-100 transition-all duration-300',
|
|
238
|
+
'bg-transparent hover:border-white/50 hover:bg-white/5 disabled:cursor-not-allowed disabled:opacity-30',
|
|
239
|
+
)}
|
|
240
|
+
>
|
|
241
|
+
<span className="sr-only">Next testimonial</span>
|
|
242
|
+
</button>
|
|
243
|
+
</div>
|
|
244
|
+
)}
|
|
245
|
+
</section>
|
|
246
|
+
)
|
|
247
|
+
}
|