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.
Files changed (148) hide show
  1. package/package.json +1 -1
  2. package/src/installers/patchRenderBlocks.js +1 -1
  3. package/src/registry/validateTemplateManifest.js +2 -1
  4. package/templates/blocks/BannerDD790432/Component.tsx +63 -0
  5. package/templates/blocks/BannerDD790432/config.ts +54 -0
  6. package/templates/blocks/BannerDD790432/manifest.json +80 -0
  7. package/templates/blocks/Button47/Component.tsx +124 -0
  8. package/templates/blocks/Button47/config.ts +75 -0
  9. package/templates/blocks/Button47/link.ts +22 -0
  10. package/templates/blocks/Button47/manifest.json +105 -0
  11. package/templates/blocks/Button47/styles.module.scss +75 -0
  12. package/templates/blocks/DD-Accordion/Component.tsx +55 -36
  13. package/templates/blocks/DD-Accordion/config.ts +71 -59
  14. package/templates/blocks/DD-AnimText/Component.tsx +50 -32
  15. package/templates/blocks/DD-AnimText/config.ts +296 -295
  16. package/templates/blocks/DD-AsideNav/Component.tsx +323 -319
  17. package/templates/blocks/DD-Banner/Component.tsx +54 -51
  18. package/templates/blocks/DD-BookCall/Component.tsx +535 -535
  19. package/templates/blocks/DD-ButtonPop/Component.tsx +118 -117
  20. package/templates/blocks/DD-Card/Component.tsx +4 -4
  21. package/templates/blocks/DD-CardTemplate01/Component.tsx +139 -140
  22. package/templates/blocks/DD-CardsWithVariantV3/Component.tsx +472 -0
  23. package/templates/blocks/DD-CardsWithVariantV3/ElectricBorder/index.tsx +203 -0
  24. package/templates/blocks/DD-CardsWithVariantV3/ElectricBorder/styles.ts +87 -0
  25. package/templates/blocks/DD-CardsWithVariantV3/ElectricBorder/useInjectStyle.ts +39 -0
  26. package/templates/blocks/DD-CardsWithVariantV3/config.ts +326 -0
  27. package/templates/blocks/DD-CardsWithVariantV3/manifest.json +110 -0
  28. package/templates/blocks/DD-Carousel-A/Component.tsx +251 -249
  29. package/templates/blocks/DD-Carousel-B/Component.tsx +405 -403
  30. package/templates/blocks/DD-ComparisonTable/Component.tsx +255 -256
  31. package/templates/blocks/DD-Contact/Component.tsx +433 -435
  32. package/templates/blocks/DD-Counter/Component.tsx +11 -6
  33. package/templates/blocks/DD-DeliCard/Component.tsx +303 -0
  34. package/templates/blocks/DD-DeliCard/config.ts +186 -0
  35. package/templates/blocks/DD-DeliCard/manifest.json +94 -0
  36. package/templates/blocks/DD-FeatCat/Component.tsx +302 -302
  37. package/templates/blocks/DD-FeatProd/CircularGallery.tsx +1179 -0
  38. package/templates/blocks/DD-FeatProd/Component.tsx +484 -0
  39. package/templates/blocks/DD-FeatProd/config.ts +173 -0
  40. package/templates/blocks/DD-FeatProd/manifest.json +93 -0
  41. package/templates/blocks/DD-FeatServ/Component.tsx +607 -0
  42. package/templates/blocks/DD-FeatServ/config.ts +213 -0
  43. package/templates/blocks/DD-FeatServ/manifest.json +113 -0
  44. package/templates/blocks/DD-FeatStrip/Component.tsx +584 -585
  45. package/templates/blocks/DD-FluidBtn/ButtonsEyeCatching.tsx +627 -628
  46. package/templates/blocks/DD-FluidBtn/Component.tsx +46 -43
  47. package/templates/blocks/DD-GooeyInfo/Component.tsx +150 -149
  48. package/templates/blocks/DD-GooeyInfo/config.ts +136 -135
  49. package/templates/blocks/DD-Hero/Component.tsx +296 -297
  50. package/templates/blocks/DD-HeroPlas/Component.tsx +50 -0
  51. package/templates/blocks/DD-HeroPlas/ThreeScene.tsx +109 -0
  52. package/templates/blocks/DD-HeroPlas/config.ts +33 -0
  53. package/templates/blocks/DD-HeroPlas/manifest.json +88 -0
  54. package/templates/blocks/DD-HorizontalScroll/Component.tsx +937 -936
  55. package/templates/blocks/DD-Icon/Component.tsx +46 -81
  56. package/templates/blocks/DD-IconButton/Component.tsx +13 -20
  57. package/templates/blocks/DD-IdTag/Component.tsx +22 -21
  58. package/templates/blocks/DD-LineAnim/Component.tsx +42 -36
  59. package/templates/blocks/DD-LogoMarq/Component.tsx +38 -48
  60. package/templates/blocks/DD-Lottie/Component.tsx +11 -3
  61. package/templates/blocks/DD-MasonaryMedia/Component.tsx +544 -545
  62. package/templates/blocks/DD-MasonaryMedia/config.ts +389 -389
  63. package/templates/blocks/DD-Masonry/Component.tsx +654 -644
  64. package/templates/blocks/DD-Masonry/config.ts +475 -475
  65. package/templates/blocks/DD-MaterialSwatches/Component.tsx +85 -0
  66. package/templates/blocks/DD-MaterialSwatches/config.ts +232 -0
  67. package/templates/blocks/DD-MaterialSwatches/manifest.json +84 -0
  68. package/templates/blocks/DD-MaterialSwatches/material.ts +107 -0
  69. package/templates/blocks/DD-NineCanvas/Component.tsx +129 -0
  70. package/templates/blocks/DD-NineCanvas/RenderBlocks.tsx +244 -0
  71. package/templates/blocks/DD-NineCanvas/allowedCanvasBlocks.ts +6 -0
  72. package/templates/blocks/DD-NineCanvas/blockComponents.tsx +8 -0
  73. package/templates/blocks/DD-NineCanvas/canvas/CanvasGrid.tsx +316 -0
  74. package/templates/blocks/DD-NineCanvas/canvas/RadialNav.tsx +432 -0
  75. package/templates/blocks/DD-NineCanvas/canvas/canvas-panels.css +889 -0
  76. package/templates/blocks/DD-NineCanvas/canvas/icons/custom-icons.tsx +364 -0
  77. package/templates/blocks/DD-NineCanvas/config.ts +61 -0
  78. package/templates/blocks/DD-NineCanvas/manifest.json +165 -0
  79. package/templates/blocks/DD-NineCanvas/styles.scss +152 -0
  80. package/templates/blocks/DD-NineCanvas/tooltip/get-strict-context.tsx +26 -0
  81. package/templates/blocks/DD-NineCanvas/tooltip/primitives.tsx +178 -0
  82. package/templates/blocks/DD-NineCanvas/tooltip/tooltip.tsx +71 -0
  83. package/templates/blocks/DD-NineCanvas/tooltip/use-controlled-state.tsx +33 -0
  84. package/templates/blocks/DD-NineCanvas/utilities/FadeOnScroll.tsx +68 -0
  85. package/templates/blocks/DD-NineCanvas/utilities/ParallaxWrapper.tsx +157 -0
  86. package/templates/blocks/DD-NineCanvas/utilities/renderCustomCSS.ts +5 -0
  87. package/templates/blocks/DD-NineCanvas/utilities/webglCleanup.ts +27 -0
  88. package/templates/blocks/DD-PayloadAIAssistant/Component.tsx +78 -0
  89. package/templates/blocks/DD-PayloadAIAssistant/DustedBot.tsx +590 -0
  90. package/templates/blocks/DD-PayloadAIAssistant/config.ts +37 -0
  91. package/templates/blocks/DD-PayloadAIAssistant/demo.css +125 -0
  92. package/templates/blocks/DD-PayloadAIAssistant/manifest.json +93 -0
  93. package/templates/blocks/DD-PayloadAIAssistant/source-defaults.ts +17 -0
  94. package/templates/blocks/DD-PayloadAIAssistant/styles.ts +306 -0
  95. package/templates/blocks/DD-Pricing/Component.tsx +2 -3
  96. package/templates/blocks/DD-Pricing/config.ts +215 -215
  97. package/templates/blocks/DD-Process/Component.tsx +2 -2
  98. package/templates/blocks/DD-ProjHeader/Component.tsx +93 -91
  99. package/templates/blocks/DD-ProjSlider/Component.tsx +1 -1
  100. package/templates/blocks/DD-Section/Component.tsx +265 -266
  101. package/templates/blocks/DD-Separator/Component.tsx +66 -66
  102. package/templates/blocks/DD-Services/Component.tsx +176 -176
  103. package/templates/blocks/DD-ShowcaseGrid/Component.tsx +306 -307
  104. package/templates/blocks/DD-Slider-A/Component.tsx +2 -2
  105. package/templates/blocks/DD-StackCards/Component.tsx +172 -171
  106. package/templates/blocks/DD-Team/Component.tsx +247 -247
  107. package/templates/blocks/DD-TeamCards/Component.tsx +251 -251
  108. package/templates/blocks/DD-TechStack/Component.tsx +173 -174
  109. package/templates/blocks/DD-TestMarq/Component.tsx +158 -132
  110. package/templates/blocks/DD-Testim/Component.tsx +247 -247
  111. package/templates/blocks/DD-Testim2/Component.tsx +265 -256
  112. package/templates/blocks/DD-Testimonials/Component.tsx +139 -139
  113. package/templates/blocks/DD-Thanks/Component.tsx +1 -1
  114. package/templates/blocks/DD-Work/Component.tsx +318 -318
  115. package/templates/blocks/DD-Work-B/Component.tsx +294 -294
  116. package/templates/blocks/DDHG-CTASection2/Component.tsx +183 -184
  117. package/templates/blocks/DDHG-HighlightArc/Component.tsx +6 -3
  118. package/templates/blocks/DDHG-LogoMarquee/Component.tsx +45 -8
  119. package/templates/blocks/DDHG-NavCodeGrid/Component.tsx +1 -3
  120. package/templates/blocks/DDHG-ServiceDetails/ServiceDetailCard.tsx +9 -22
  121. package/templates/blocks/DDHG-ServiceHero/Component.tsx +10 -10
  122. package/templates/blocks/DDHG-TeamCards/Component.tsx +6 -35
  123. package/templates/blocks/Form/Checkbox/index.tsx +45 -0
  124. package/templates/blocks/Form/Component.tsx +163 -0
  125. package/templates/blocks/Form/Country/index.tsx +65 -0
  126. package/templates/blocks/Form/Country/options.ts +982 -0
  127. package/templates/blocks/Form/Email/index.tsx +38 -0
  128. package/templates/blocks/Form/Error/index.tsx +15 -0
  129. package/templates/blocks/Form/Message/index.tsx +13 -0
  130. package/templates/blocks/Form/Number/index.tsx +36 -0
  131. package/templates/blocks/Form/Select/index.tsx +63 -0
  132. package/templates/blocks/Form/State/index.tsx +64 -0
  133. package/templates/blocks/Form/State/options.ts +52 -0
  134. package/templates/blocks/Form/Text/index.tsx +32 -0
  135. package/templates/blocks/Form/Textarea/index.tsx +40 -0
  136. package/templates/blocks/Form/Width/index.tsx +13 -0
  137. package/templates/blocks/Form/config.ts +51 -0
  138. package/templates/blocks/Form/fields.tsx +21 -0
  139. package/templates/blocks/Form/manifest.json +168 -0
  140. package/templates/blocks/MediaBlock/Component.tsx +67 -0
  141. package/templates/blocks/MediaBlock/config.ts +14 -0
  142. package/templates/blocks/MediaBlock/manifest.json +92 -0
  143. package/templates/blocks/TransitionsDustedShowcase/Component.tsx +9 -0
  144. package/templates/blocks/TransitionsDustedShowcase/config.ts +13 -0
  145. package/templates/blocks/TransitionsDustedShowcase/manifest.json +80 -0
  146. package/templates/blocks/rawHtml/Component.tsx +25 -0
  147. package/templates/blocks/rawHtml/config.ts +56 -0
  148. 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:24px] [--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]:ml-[-4rem] [&_.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]:relative [&_.swiper-pagination-bullets.swiper-pagination-horizontal]:top-6 [&_.swiper-pagination-bullets.swiper-pagination-horizontal]:mx-auto [&_.swiper-pagination-bullets.swiper-pagination-horizontal]:w-fit [&_.swiper-pagination-bullets.swiper-pagination-horizontal]:max-w-[90%] [&_.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"
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
- s
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-200 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-4 dark:bg-1 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-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 relative top-[-50px] flex justify-center">
224
- <button
225
- className={cn(
226
- `swiperButtonPrev swiper-button-prev prev-${uniqueId}`,
227
- 'z-[100] h-8 w-10 translate-y-[80%] rotate-[180deg] cursor-pointer rounded-none p-2 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="ti-arrow-left relative left-2" />
232
- </button>
233
-
234
- <button
235
- className={cn(
236
- `swiperButtonNext swiper-button-next next-${uniqueId}`,
237
- 'z-[100] h-8 w-10 translate-y-[80%] rotate-[180deg] cursor-pointer rounded-none p-2 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="ti-arrow-right relative right-2" />
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
+ }