blocks-dusted 0.1.11 → 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 (161) hide show
  1. package/package.json +5 -2
  2. package/src/cli.js +39 -3
  3. package/src/commands/shop.js +59 -0
  4. package/src/commands/warehouse.js +73 -0
  5. package/src/installers/patchRenderBlocks.js +1 -1
  6. package/src/registry/validateTemplateManifest.js +2 -1
  7. package/templates/blocks/BannerDD790432/Component.tsx +63 -0
  8. package/templates/blocks/BannerDD790432/config.ts +54 -0
  9. package/templates/blocks/BannerDD790432/manifest.json +80 -0
  10. package/templates/blocks/Button47/Component.tsx +124 -0
  11. package/templates/blocks/Button47/config.ts +75 -0
  12. package/templates/blocks/Button47/link.ts +22 -0
  13. package/templates/blocks/Button47/manifest.json +105 -0
  14. package/templates/blocks/Button47/styles.module.scss +75 -0
  15. package/templates/blocks/DD-Accordion/Component.tsx +55 -36
  16. package/templates/blocks/DD-Accordion/config.ts +71 -59
  17. package/templates/blocks/DD-AnimText/Component.tsx +50 -32
  18. package/templates/blocks/DD-AnimText/config.ts +296 -295
  19. package/templates/blocks/DD-AsideNav/Component.tsx +323 -319
  20. package/templates/blocks/DD-Banner/Component.tsx +54 -51
  21. package/templates/blocks/DD-BookCall/Component.tsx +10 -9
  22. package/templates/blocks/DD-ButtonPop/Component.tsx +118 -117
  23. package/templates/blocks/DD-Card/Component.tsx +4 -4
  24. package/templates/blocks/DD-CardTemplate01/Component.tsx +5 -5
  25. package/templates/blocks/DD-CardsWithVariantV3/Component.tsx +472 -0
  26. package/templates/blocks/DD-CardsWithVariantV3/ElectricBorder/index.tsx +203 -0
  27. package/templates/blocks/DD-CardsWithVariantV3/ElectricBorder/styles.ts +87 -0
  28. package/templates/blocks/DD-CardsWithVariantV3/ElectricBorder/useInjectStyle.ts +39 -0
  29. package/templates/blocks/DD-CardsWithVariantV3/config.ts +326 -0
  30. package/templates/blocks/DD-CardsWithVariantV3/manifest.json +110 -0
  31. package/templates/blocks/DD-Carousel-A/Component.tsx +251 -249
  32. package/templates/blocks/DD-Carousel-B/Component.tsx +405 -403
  33. package/templates/blocks/DD-Chip/Component.tsx +14 -14
  34. package/templates/blocks/DD-ComparisonTable/Component.tsx +255 -256
  35. package/templates/blocks/DD-Contact/Component.tsx +433 -434
  36. package/templates/blocks/DD-Counter/Component.tsx +18 -13
  37. package/templates/blocks/DD-DeliCard/Component.tsx +303 -0
  38. package/templates/blocks/DD-DeliCard/config.ts +186 -0
  39. package/templates/blocks/DD-DeliCard/manifest.json +94 -0
  40. package/templates/blocks/DD-FeatCat/Component.tsx +302 -302
  41. package/templates/blocks/DD-FeatProd/CircularGallery.tsx +1179 -0
  42. package/templates/blocks/DD-FeatProd/Component.tsx +484 -0
  43. package/templates/blocks/DD-FeatProd/config.ts +173 -0
  44. package/templates/blocks/DD-FeatProd/manifest.json +93 -0
  45. package/templates/blocks/DD-FeatServ/Component.tsx +607 -0
  46. package/templates/blocks/DD-FeatServ/config.ts +213 -0
  47. package/templates/blocks/DD-FeatServ/manifest.json +113 -0
  48. package/templates/blocks/DD-FeatStrip/Component.tsx +584 -585
  49. package/templates/blocks/DD-FluidBtn/ButtonsEyeCatching.tsx +627 -628
  50. package/templates/blocks/DD-FluidBtn/Component.tsx +46 -43
  51. package/templates/blocks/DD-GooeyInfo/Component.tsx +150 -149
  52. package/templates/blocks/DD-GooeyInfo/config.ts +136 -135
  53. package/templates/blocks/DD-Hero/Component.tsx +16 -40
  54. package/templates/blocks/DD-HeroPlas/Component.tsx +50 -0
  55. package/templates/blocks/DD-HeroPlas/ThreeScene.tsx +109 -0
  56. package/templates/blocks/DD-HeroPlas/config.ts +33 -0
  57. package/templates/blocks/DD-HeroPlas/manifest.json +88 -0
  58. package/templates/blocks/DD-HorizontalScroll/Component.tsx +4 -5
  59. package/templates/blocks/DD-Icon/Component.tsx +46 -81
  60. package/templates/blocks/DD-IconButton/Component.tsx +13 -20
  61. package/templates/blocks/DD-IdTag/Component.tsx +22 -21
  62. package/templates/blocks/DD-IframeMedia/Component.tsx +14 -10
  63. package/templates/blocks/DD-LineAnim/Component.tsx +42 -36
  64. package/templates/blocks/DD-LogoMarq/Component.tsx +38 -48
  65. package/templates/blocks/DD-Lottie/Component.tsx +11 -3
  66. package/templates/blocks/DD-MasonaryMedia/Component.tsx +544 -547
  67. package/templates/blocks/DD-MasonaryMedia/config.ts +389 -389
  68. package/templates/blocks/DD-Masonry/Component.tsx +654 -644
  69. package/templates/blocks/DD-Masonry/config.ts +475 -475
  70. package/templates/blocks/DD-MaterialSwatches/Component.tsx +85 -0
  71. package/templates/blocks/DD-MaterialSwatches/config.ts +232 -0
  72. package/templates/blocks/DD-MaterialSwatches/manifest.json +84 -0
  73. package/templates/blocks/DD-MaterialSwatches/material.ts +107 -0
  74. package/templates/blocks/DD-NineCanvas/Component.tsx +129 -0
  75. package/templates/blocks/DD-NineCanvas/RenderBlocks.tsx +244 -0
  76. package/templates/blocks/DD-NineCanvas/allowedCanvasBlocks.ts +6 -0
  77. package/templates/blocks/DD-NineCanvas/blockComponents.tsx +8 -0
  78. package/templates/blocks/DD-NineCanvas/canvas/CanvasGrid.tsx +316 -0
  79. package/templates/blocks/DD-NineCanvas/canvas/RadialNav.tsx +432 -0
  80. package/templates/blocks/DD-NineCanvas/canvas/canvas-panels.css +889 -0
  81. package/templates/blocks/DD-NineCanvas/canvas/icons/custom-icons.tsx +364 -0
  82. package/templates/blocks/DD-NineCanvas/config.ts +61 -0
  83. package/templates/blocks/DD-NineCanvas/manifest.json +165 -0
  84. package/templates/blocks/DD-NineCanvas/styles.scss +152 -0
  85. package/templates/blocks/DD-NineCanvas/tooltip/get-strict-context.tsx +26 -0
  86. package/templates/blocks/DD-NineCanvas/tooltip/primitives.tsx +178 -0
  87. package/templates/blocks/DD-NineCanvas/tooltip/tooltip.tsx +71 -0
  88. package/templates/blocks/DD-NineCanvas/tooltip/use-controlled-state.tsx +33 -0
  89. package/templates/blocks/DD-NineCanvas/utilities/FadeOnScroll.tsx +68 -0
  90. package/templates/blocks/DD-NineCanvas/utilities/ParallaxWrapper.tsx +157 -0
  91. package/templates/blocks/DD-NineCanvas/utilities/renderCustomCSS.ts +5 -0
  92. package/templates/blocks/DD-NineCanvas/utilities/webglCleanup.ts +27 -0
  93. package/templates/blocks/DD-PayloadAIAssistant/Component.tsx +78 -0
  94. package/templates/blocks/DD-PayloadAIAssistant/DustedBot.tsx +590 -0
  95. package/templates/blocks/DD-PayloadAIAssistant/config.ts +37 -0
  96. package/templates/blocks/DD-PayloadAIAssistant/demo.css +125 -0
  97. package/templates/blocks/DD-PayloadAIAssistant/manifest.json +93 -0
  98. package/templates/blocks/DD-PayloadAIAssistant/source-defaults.ts +17 -0
  99. package/templates/blocks/DD-PayloadAIAssistant/styles.ts +306 -0
  100. package/templates/blocks/DD-Pricing/Component.tsx +368 -372
  101. package/templates/blocks/DD-Pricing/config.ts +215 -215
  102. package/templates/blocks/DD-Process/Component.tsx +147 -149
  103. package/templates/blocks/DD-Progress/Component.tsx +156 -141
  104. package/templates/blocks/DD-ProjHeader/Component.tsx +93 -91
  105. package/templates/blocks/DD-ProjSlider/Component.tsx +1 -1
  106. package/templates/blocks/DD-ProjSlider/config.ts +2 -2
  107. package/templates/blocks/DD-Section/Component.tsx +265 -266
  108. package/templates/blocks/DD-Separator/Component.tsx +66 -66
  109. package/templates/blocks/DD-Services/Component.tsx +176 -176
  110. package/templates/blocks/DD-ShowcaseGrid/Component.tsx +306 -307
  111. package/templates/blocks/DD-Slider-A/Component.tsx +237 -237
  112. package/templates/blocks/DD-StackCards/Component.tsx +474 -473
  113. package/templates/blocks/DD-Team/Component.tsx +247 -247
  114. package/templates/blocks/DD-TeamCards/Component.tsx +251 -251
  115. package/templates/blocks/DD-TechStack/Component.tsx +161 -168
  116. package/templates/blocks/DD-TestMarq/Component.tsx +158 -132
  117. package/templates/blocks/DD-Testim/Component.tsx +247 -247
  118. package/templates/blocks/DD-Testim2/Component.tsx +265 -256
  119. package/templates/blocks/DD-Testimonials/Component.tsx +139 -147
  120. package/templates/blocks/DD-TextMarq/Component.tsx +157 -157
  121. package/templates/blocks/DD-Thanks/Component.tsx +501 -500
  122. package/templates/blocks/DD-Work/Component.tsx +315 -315
  123. package/templates/blocks/DD-Work-B/Component.tsx +294 -294
  124. package/templates/blocks/DDHG-CTASection2/Component.tsx +183 -184
  125. package/templates/blocks/DDHG-HighlightArc/Component.tsx +246 -243
  126. package/templates/blocks/DDHG-LogoMarquee/Component.tsx +180 -93
  127. package/templates/blocks/DDHG-LogoMarquee/config.ts +154 -66
  128. package/templates/blocks/DDHG-NavCodeGrid/Component.tsx +225 -213
  129. package/templates/blocks/DDHG-ProcessSec/Component.tsx +38 -39
  130. package/templates/blocks/DDHG-ServiceDetails/Component.tsx +11 -11
  131. package/templates/blocks/DDHG-ServiceDetails/ServiceDetailCard.tsx +30 -47
  132. package/templates/blocks/DDHG-ServiceHero/Component.tsx +10 -10
  133. package/templates/blocks/DDHG-ServiceOverview/Component.tsx +23 -23
  134. package/templates/blocks/DDHG-StatsFAQ/Component.tsx +40 -40
  135. package/templates/blocks/DDHG-TeamCards/Component.tsx +140 -131
  136. package/templates/blocks/Form/Checkbox/index.tsx +45 -0
  137. package/templates/blocks/Form/Component.tsx +163 -0
  138. package/templates/blocks/Form/Country/index.tsx +65 -0
  139. package/templates/blocks/Form/Country/options.ts +982 -0
  140. package/templates/blocks/Form/Email/index.tsx +38 -0
  141. package/templates/blocks/Form/Error/index.tsx +15 -0
  142. package/templates/blocks/Form/Message/index.tsx +13 -0
  143. package/templates/blocks/Form/Number/index.tsx +36 -0
  144. package/templates/blocks/Form/Select/index.tsx +63 -0
  145. package/templates/blocks/Form/State/index.tsx +64 -0
  146. package/templates/blocks/Form/State/options.ts +52 -0
  147. package/templates/blocks/Form/Text/index.tsx +32 -0
  148. package/templates/blocks/Form/Textarea/index.tsx +40 -0
  149. package/templates/blocks/Form/Width/index.tsx +13 -0
  150. package/templates/blocks/Form/config.ts +51 -0
  151. package/templates/blocks/Form/fields.tsx +21 -0
  152. package/templates/blocks/Form/manifest.json +168 -0
  153. package/templates/blocks/MediaBlock/Component.tsx +67 -0
  154. package/templates/blocks/MediaBlock/config.ts +14 -0
  155. package/templates/blocks/MediaBlock/manifest.json +92 -0
  156. package/templates/blocks/TransitionsDustedShowcase/Component.tsx +9 -0
  157. package/templates/blocks/TransitionsDustedShowcase/config.ts +13 -0
  158. package/templates/blocks/TransitionsDustedShowcase/manifest.json +80 -0
  159. package/templates/blocks/rawHtml/Component.tsx +25 -0
  160. package/templates/blocks/rawHtml/config.ts +56 -0
  161. 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
+ }