blocks-dusted 0.1.10 → 0.1.11

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 (246) hide show
  1. package/README.md +35 -0
  2. package/package.json +1 -1
  3. package/src/utils/paths.js +13 -13
  4. package/templates/blocks/DD-Accordion/Component.tsx +229 -0
  5. package/templates/blocks/DD-Accordion/README.md +3 -0
  6. package/templates/blocks/DD-Accordion/config.ts +73 -0
  7. package/templates/blocks/DD-Accordion/manifest.json +75 -0
  8. package/templates/blocks/DD-AnimText/Component.tsx +788 -0
  9. package/templates/blocks/DD-AnimText/README.md +3 -0
  10. package/templates/blocks/DD-AnimText/config.ts +295 -0
  11. package/templates/blocks/DD-AnimText/manifest.json +85 -0
  12. package/templates/blocks/DD-AsideNav/Component.tsx +321 -0
  13. package/templates/blocks/DD-AsideNav/config.ts +204 -0
  14. package/templates/blocks/DD-AsideNav/manifest.json +80 -0
  15. package/templates/blocks/DD-Banner/Component.tsx +51 -0
  16. package/templates/blocks/DD-Banner/config.ts +57 -0
  17. package/templates/blocks/DD-Banner/manifest.json +72 -0
  18. package/templates/blocks/DD-BgLightning/Component.tsx +44 -0
  19. package/templates/blocks/DD-BgLightning/README.md +3 -0
  20. package/templates/blocks/DD-BgLightning/config.ts +97 -0
  21. package/templates/blocks/DD-BgLightning/manifest.json +79 -0
  22. package/templates/blocks/DD-BookCall/Component.tsx +10 -11
  23. package/templates/blocks/DD-BookCall/config.ts +238 -238
  24. package/templates/blocks/DD-ButtonPop/Component.tsx +117 -0
  25. package/templates/blocks/DD-ButtonPop/config.ts +105 -0
  26. package/templates/blocks/DD-ButtonPop/manifest.json +88 -0
  27. package/templates/blocks/DD-ButtonPop/svg-icons/Dust2.tsx +167 -0
  28. package/templates/blocks/DD-Card/Component.tsx +251 -0
  29. package/templates/blocks/DD-Card/README.md +4 -0
  30. package/templates/blocks/DD-Card/config.ts +154 -0
  31. package/templates/blocks/DD-Card/manifest.json +82 -0
  32. package/templates/blocks/DD-CardTemplate01/Component.tsx +5 -6
  33. package/templates/blocks/DD-CardTemplate01/config.ts +106 -106
  34. package/templates/blocks/DD-Carousel-A/Component.tsx +249 -249
  35. package/templates/blocks/DD-Carousel-B/Component.tsx +403 -403
  36. package/templates/blocks/DD-Chip/Component.tsx +250 -0
  37. package/templates/blocks/DD-Chip/EXAMPLES.md +313 -0
  38. package/templates/blocks/DD-Chip/README.md +202 -0
  39. package/templates/blocks/DD-Chip/config.ts +369 -0
  40. package/templates/blocks/DD-Chip/manifest.json +74 -0
  41. package/templates/blocks/DD-ComparisonTable/Component.tsx +256 -256
  42. package/templates/blocks/DD-Contact/Component.tsx +434 -434
  43. package/templates/blocks/DD-Contact/config.ts +22 -22
  44. package/templates/blocks/DD-Counter/Component.tsx +190 -0
  45. package/templates/blocks/DD-Counter/README.md +4 -0
  46. package/templates/blocks/DD-Counter/config.ts +291 -0
  47. package/templates/blocks/DD-Counter/manifest.json +74 -0
  48. package/templates/blocks/DD-CustomCSS/Component.tsx +8 -0
  49. package/templates/blocks/DD-CustomCSS/README.md +4 -0
  50. package/templates/blocks/DD-CustomCSS/addToLayout.md +5 -0
  51. package/templates/blocks/DD-CustomCSS/config.ts +22 -0
  52. package/templates/blocks/DD-CustomCSS/manifest.json +72 -0
  53. package/templates/blocks/DD-CustomCSS/renderCustomCSS.md +7 -0
  54. package/templates/blocks/DD-FeatCat/Component.tsx +302 -302
  55. package/templates/blocks/DD-FeatCat/config.ts +201 -201
  56. package/templates/blocks/DD-FeatStrip/Component.tsx +585 -585
  57. package/templates/blocks/DD-FeatStrip/config.ts +134 -134
  58. package/templates/blocks/DD-FluidBtn/ButtonsEyeCatching.tsx +628 -0
  59. package/templates/blocks/DD-FluidBtn/Component.tsx +43 -0
  60. package/templates/blocks/DD-FluidBtn/README.md +6 -0
  61. package/templates/blocks/DD-FluidBtn/config.ts +102 -0
  62. package/templates/blocks/DD-FluidBtn/manifest.json +86 -0
  63. package/templates/blocks/DD-GooeyInfo/Component.tsx +149 -0
  64. package/templates/blocks/DD-GooeyInfo/config.ts +135 -0
  65. package/templates/blocks/DD-GooeyInfo/manifest.json +72 -0
  66. package/templates/blocks/DD-Hero/Component.tsx +40 -17
  67. package/templates/blocks/DD-Hero/config.ts +267 -267
  68. package/templates/blocks/DD-HorizontalScroll/Component.tsx +4 -2
  69. package/templates/blocks/DD-HorizontalScroll/config.ts +231 -231
  70. package/templates/blocks/DD-Icon/Component.tsx +287 -0
  71. package/templates/blocks/DD-Icon/README.md +4 -0
  72. package/templates/blocks/DD-Icon/config.ts +258 -0
  73. package/templates/blocks/DD-Icon/hooks/revalidateBlockIds.ts +66 -0
  74. package/templates/blocks/DD-Icon/manifest.json +82 -0
  75. package/templates/blocks/DD-IconButton/Component.tsx +455 -0
  76. package/templates/blocks/DD-IconButton/README.md +326 -0
  77. package/templates/blocks/DD-IconButton/config.ts +239 -0
  78. package/templates/blocks/DD-IconButton/manifest.json +85 -0
  79. package/templates/blocks/DD-IdTag/Component.tsx +21 -0
  80. package/templates/blocks/DD-IdTag/README.md +4 -0
  81. package/templates/blocks/DD-IdTag/config.ts +41 -0
  82. package/templates/blocks/DD-IdTag/manifest.json +72 -0
  83. package/templates/blocks/DD-Iframe/Component.tsx +45 -0
  84. package/templates/blocks/DD-Iframe/README.md +4 -0
  85. package/templates/blocks/DD-Iframe/config.ts +47 -0
  86. package/templates/blocks/DD-Iframe/manifest.json +72 -0
  87. package/templates/blocks/DD-IframeMedia/Component.tsx +129 -0
  88. package/templates/blocks/DD-IframeMedia/README.md +4 -0
  89. package/templates/blocks/DD-IframeMedia/config.ts +79 -0
  90. package/templates/blocks/DD-IframeMedia/manifest.json +72 -0
  91. package/templates/blocks/DD-LineAnim/Component.tsx +36 -0
  92. package/templates/blocks/DD-LineAnim/README.md +4 -0
  93. package/templates/blocks/DD-LineAnim/config.ts +90 -0
  94. package/templates/blocks/DD-LineAnim/manifest.json +80 -0
  95. package/templates/blocks/DD-LinkGrid/Component.tsx +119 -0
  96. package/templates/blocks/DD-LinkGrid/README.md +4 -0
  97. package/templates/blocks/DD-LinkGrid/config.ts +51 -0
  98. package/templates/blocks/DD-LinkGrid/manifest.json +74 -0
  99. package/templates/blocks/DD-LogoMarq/Component.tsx +132 -0
  100. package/templates/blocks/DD-LogoMarq/README.md +4 -0
  101. package/templates/blocks/DD-LogoMarq/config.ts +264 -0
  102. package/templates/blocks/DD-LogoMarq/manifest.json +82 -0
  103. package/templates/blocks/DD-Lottie/Component.tsx +459 -0
  104. package/templates/blocks/DD-Lottie/README.md +4 -0
  105. package/templates/blocks/DD-Lottie/config.ts +379 -0
  106. package/templates/blocks/DD-Lottie/index.tsx +28 -0
  107. package/templates/blocks/DD-Lottie/manifest.json +83 -0
  108. package/templates/blocks/DD-MagicBento/Component.tsx +777 -0
  109. package/templates/blocks/DD-MagicBento/README.md +4 -0
  110. package/templates/blocks/DD-MagicBento/config.ts +264 -0
  111. package/templates/blocks/DD-MagicBento/manifest.json +74 -0
  112. package/templates/blocks/DD-MasonaryMedia/Component.tsx +547 -545
  113. package/templates/blocks/DD-MasonaryMedia/config.ts +2 -2
  114. package/templates/blocks/DD-MasonaryMedia/vendor.d.ts +2 -2
  115. package/templates/blocks/DD-Masonry/Component.tsx +645 -0
  116. package/templates/blocks/DD-Masonry/README.md +4 -0
  117. package/templates/blocks/DD-Masonry/config.ts +475 -0
  118. package/templates/blocks/DD-Masonry/manifest.json +82 -0
  119. package/templates/blocks/DD-Pricing/Component.tsx +372 -372
  120. package/templates/blocks/DD-Process/Component.tsx +149 -149
  121. package/templates/blocks/DD-Process/config.ts +150 -150
  122. package/templates/blocks/DD-Progress/Component.tsx +141 -0
  123. package/templates/blocks/DD-Progress/README.md +4 -0
  124. package/templates/blocks/DD-Progress/config.ts +175 -0
  125. package/templates/blocks/DD-Progress/manifest.json +74 -0
  126. package/templates/blocks/DD-ProjHeader/Component.tsx +91 -0
  127. package/templates/blocks/DD-ProjHeader/README.md +4 -0
  128. package/templates/blocks/DD-ProjHeader/config.ts +96 -0
  129. package/templates/blocks/DD-ProjHeader/manifest.json +72 -0
  130. package/templates/blocks/DD-ProjSlider/Component.tsx +123 -0
  131. package/templates/blocks/DD-ProjSlider/README.md +4 -0
  132. package/templates/blocks/DD-ProjSlider/config.ts +64 -0
  133. package/templates/blocks/DD-ProjSlider/manifest.json +72 -0
  134. package/templates/blocks/DD-ScrollText/Component.tsx +114 -0
  135. package/templates/blocks/DD-ScrollText/README.md +4 -0
  136. package/templates/blocks/DD-ScrollText/config.ts +58 -0
  137. package/templates/blocks/DD-ScrollText/manifest.json +72 -0
  138. package/templates/blocks/DD-Section/Component.tsx +266 -266
  139. package/templates/blocks/DD-Separator/Component.tsx +66 -0
  140. package/templates/blocks/DD-Separator/README.md +4 -0
  141. package/templates/blocks/DD-Separator/config.ts +58 -0
  142. package/templates/blocks/DD-Separator/manifest.json +72 -0
  143. package/templates/blocks/DD-Services/Component.tsx +176 -176
  144. package/templates/blocks/DD-Services/config.ts +149 -149
  145. package/templates/blocks/DD-ShowcaseGrid/Component.tsx +307 -307
  146. package/templates/blocks/DD-Slider-A/Component.tsx +237 -237
  147. package/templates/blocks/DD-StackCards/Component.tsx +473 -473
  148. package/templates/blocks/DD-StackCards/config.ts +399 -399
  149. package/templates/blocks/DD-Team/Component.tsx +247 -247
  150. package/templates/blocks/DD-Team/config.ts +173 -173
  151. package/templates/blocks/DD-TeamCards/Component.tsx +251 -0
  152. package/templates/blocks/DD-TeamCards/README.md +4 -0
  153. package/templates/blocks/DD-TeamCards/config.ts +302 -0
  154. package/templates/blocks/DD-TeamCards/manifest.json +74 -0
  155. package/templates/blocks/DD-TechStack/Component.tsx +168 -162
  156. package/templates/blocks/DD-TechStack/config.ts +153 -153
  157. package/templates/blocks/DD-TestMarq/Component.tsx +132 -0
  158. package/templates/blocks/DD-TestMarq/README.md +4 -0
  159. package/templates/blocks/DD-TestMarq/RowLabel.tsx +9 -0
  160. package/templates/blocks/DD-TestMarq/config.ts +88 -0
  161. package/templates/blocks/DD-TestMarq/manifest.json +72 -0
  162. package/templates/blocks/DD-Testim/Component.tsx +247 -0
  163. package/templates/blocks/DD-Testim/README.md +4 -0
  164. package/templates/blocks/DD-Testim/config.ts +101 -0
  165. package/templates/blocks/DD-Testim/manifest.json +75 -0
  166. package/templates/blocks/DD-Testim2/Component.tsx +256 -0
  167. package/templates/blocks/DD-Testim2/README.md +4 -0
  168. package/templates/blocks/DD-Testim2/config.ts +100 -0
  169. package/templates/blocks/DD-Testim2/manifest.json +74 -0
  170. package/templates/blocks/DD-Testimonials/Component.tsx +147 -147
  171. package/templates/blocks/DD-Testimonials/config.ts +120 -120
  172. package/templates/blocks/DD-TextMarq/Component.tsx +157 -0
  173. package/templates/blocks/DD-TextMarq/README.md +4 -0
  174. package/templates/blocks/DD-TextMarq/config.ts +237 -0
  175. package/templates/blocks/DD-TextMarq/manifest.json +82 -0
  176. package/templates/blocks/DD-Thanks/Component.tsx +500 -0
  177. package/templates/blocks/DD-Thanks/README.md +4 -0
  178. package/templates/blocks/DD-Thanks/config.ts +224 -0
  179. package/templates/blocks/DD-Thanks/manifest.json +72 -0
  180. package/templates/blocks/DD-VertMarq/Component.tsx +154 -0
  181. package/templates/blocks/DD-VertMarq/README.md +4 -0
  182. package/templates/blocks/DD-VertMarq/config.ts +236 -0
  183. package/templates/blocks/DD-VertMarq/dist/index.css +6 -0
  184. package/templates/blocks/DD-VertMarq/dist/index.min.css +1 -0
  185. package/templates/blocks/DD-VertMarq/manifest.json +74 -0
  186. package/templates/blocks/DD-Work/Component.tsx +318 -315
  187. package/templates/blocks/DD-Work/config.ts +165 -165
  188. package/templates/blocks/DD-Work-B/Component.tsx +294 -294
  189. package/templates/blocks/DDHG-CTASection2/Component.tsx +185 -0
  190. package/templates/blocks/DDHG-CTASection2/config.ts +140 -0
  191. package/templates/blocks/DDHG-CTASection2/manifest.json +45 -0
  192. package/templates/blocks/DDHG-HighlightArc/Component.tsx +243 -0
  193. package/templates/blocks/DDHG-HighlightArc/config.ts +85 -0
  194. package/templates/blocks/DDHG-HighlightArc/manifest.json +46 -0
  195. package/templates/blocks/DDHG-LogoMarquee/Component.tsx +93 -0
  196. package/templates/blocks/DDHG-LogoMarquee/config.ts +66 -0
  197. package/templates/blocks/DDHG-LogoMarquee/manifest.json +39 -0
  198. package/templates/blocks/DDHG-NavCodeGrid/Component.tsx +213 -0
  199. package/templates/blocks/DDHG-NavCodeGrid/config.ts +64 -0
  200. package/templates/blocks/DDHG-NavCodeGrid/manifest.json +45 -0
  201. package/templates/blocks/DDHG-ProcessSec/Component.tsx +575 -0
  202. package/templates/blocks/DDHG-ProcessSec/config.ts +170 -0
  203. package/templates/blocks/DDHG-ProcessSec/manifest.json +56 -0
  204. package/templates/blocks/DDHG-ServiceDetails/Component.tsx +164 -0
  205. package/templates/blocks/DDHG-ServiceDetails/ServiceDetailCard.tsx +394 -0
  206. package/templates/blocks/DDHG-ServiceDetails/config.ts +77 -0
  207. package/templates/blocks/DDHG-ServiceDetails/manifest.json +50 -0
  208. package/templates/blocks/DDHG-ServiceHero/Component.tsx +234 -0
  209. package/templates/blocks/DDHG-ServiceHero/config.ts +49 -0
  210. package/templates/blocks/DDHG-ServiceHero/manifest.json +26 -0
  211. package/templates/blocks/DDHG-ServiceOverview/Component.tsx +277 -0
  212. package/templates/blocks/DDHG-ServiceOverview/config.ts +64 -0
  213. package/templates/blocks/DDHG-ServiceOverview/manifest.json +44 -0
  214. package/templates/blocks/DDHG-StatsFAQ/Component.tsx +389 -0
  215. package/templates/blocks/DDHG-StatsFAQ/config.ts +204 -0
  216. package/templates/blocks/DDHG-StatsFAQ/manifest.json +45 -0
  217. package/templates/blocks/DDHG-TeamCards/Component.tsx +131 -0
  218. package/templates/blocks/DDHG-TeamCards/config.ts +48 -0
  219. package/templates/blocks/DDHG-TeamCards/manifest.json +29 -0
  220. package/templates/shared/src/components/BgLightning/index.tsx +242 -0
  221. package/templates/shared/src/components/ui/ShareButton/index.tsx +80 -0
  222. package/templates/shared/src/components/ui/anims/FadeOnScroll.tsx +48 -0
  223. package/templates/shared/src/components/ui/anims/FadeUpOnInView.tsx +63 -0
  224. package/templates/shared/src/components/ui/anims/GlareHover.tsx +111 -0
  225. package/templates/shared/src/components/ui/anims/LineAnims.tsx +81 -0
  226. package/templates/shared/src/components/ui/anims/TitleAnims01.tsx +54 -0
  227. package/templates/shared/src/components/ui/anims/animation-container.tsx +29 -0
  228. package/templates/shared/src/components/ui/anims/blur-in.tsx +26 -0
  229. package/templates/shared/src/components/ui/anims/counter.tsx +53 -0
  230. package/templates/shared/src/components/ui/anims/fade.tsx +83 -0
  231. package/templates/shared/src/components/ui/anims/gradual-spacing.tsx +39 -0
  232. package/templates/shared/src/components/ui/anims/pull-up.tsx +93 -0
  233. package/templates/shared/src/components/ui/anims/reveal-text.tsx +76 -0
  234. package/templates/shared/src/components/ui/anims/rotate-words.tsx +43 -0
  235. package/templates/shared/src/components/ui/anims/shiny-text.tsx +58 -0
  236. package/templates/shared/src/components/ui/anims/shuffle-text.tsx +85 -0
  237. package/templates/shared/src/components/ui/anims/split-text.tsx +211 -0
  238. package/templates/shared/src/components/ui/anims/staggered-fade.tsx +133 -0
  239. package/templates/shared/src/components/ui/anims/text-scroll.tsx +111 -0
  240. package/templates/shared/src/components/ui/anims/typing-effect.tsx +112 -0
  241. package/templates/shared/src/components/ui/button-dusted-fluid/index.tsx +1521 -0
  242. package/templates/shared/src/components/ui/separator.tsx +85 -0
  243. package/templates/shared/src/hooks/useBodyScrollLock.ts +97 -0
  244. package/templates/shared/src/hooks/useClickOutside.ts +28 -0
  245. package/templates/shared/src/utilities/renderCustomCSS.ts +5 -0
  246. package/templates/shared/src/utilities/smoothScroll.ts +65 -0
@@ -0,0 +1,251 @@
1
+ 'use client'
2
+
3
+ import React, { useState } from 'react'
4
+ import { motion } from 'framer-motion'
5
+ import Link from 'next/link'
6
+ import Image from 'next/image'
7
+ import { cn } from '@/utilities/ui'
8
+ import RichText from '@/components/RichText'
9
+ import { TextFade } from '@/components/ui/anims/fade'
10
+
11
+ // Tailwind equivalent of .card-block SCSS rules.
12
+ // Keep 'card-block' as the identifier class for CSS overrides.
13
+ const CARD_BLOCK_CLS =
14
+ 'flex-col w-full min-h-fit rounded-t-[8px] border-0 !no-underline overflow-visible ' +
15
+ // picture: pulled up -2rem with negative bottom margin compensation
16
+ '[&_picture]:relative [&_picture]:-top-8 [&_picture]:rounded-t-[8px] [&_picture]:pb-4 [&_picture]:!-mb-8 ' +
17
+ '[&_picture_img]:w-full [&_picture_img]:h-auto [&_picture_img]:object-cover [&_picture_img]:!rounded-t-[8px] [&_picture_img]:overflow-hidden ' +
18
+ // heading reset
19
+ '[&_h1]:mt-0 [&_h2]:mt-0 [&_h3]:mt-0 [&_h4]:mt-0 [&_h5]:mt-0 [&_h6]:mt-0 ' +
20
+ // blockquote caption overlay
21
+ '[&_blockquote]:!not-italic [&_blockquote]:flex [&_blockquote]:w-full [&_blockquote]:min-h-[60px] ' +
22
+ '[&_blockquote]:justify-center [&_blockquote]:bg-[#e9e9e9ab] [&_blockquote]:bg-[url(/svg/square-x.svg)] ' +
23
+ '[&_blockquote]:bg-[length:16px_16px] [&_blockquote]:p-4 [&_blockquote]:backdrop-blur-[4px] ' +
24
+ '[&_blockquote]:m-0 [&_blockquote]:-mt-16'
25
+
26
+ type CardItem = {
27
+ cardBlockClass?: string
28
+ image?: {
29
+ url: string
30
+ alt?: string
31
+ width?: number
32
+ height?: number
33
+ }
34
+ customClass?: string
35
+ content: any
36
+ link?: {
37
+ url?: string
38
+ }
39
+ }
40
+
41
+ type CardBlockProps = {
42
+ cards: CardItem[]
43
+ cardScrollSpeed?: string
44
+ priority?: boolean // Add priority control
45
+ aspectRatio?: 'square' | 'video' | 'portrait' | 'auto' // Add aspect ratio options
46
+ }
47
+
48
+ // Fixed Image Component with proper dimensions and aspect ratio
49
+ const CardImage: React.FC<{
50
+ src: string
51
+ alt?: string
52
+ customClass?: string
53
+ priority?: boolean
54
+ aspectRatio?: 'square' | 'video' | 'portrait' | 'auto'
55
+ originalWidth?: number
56
+ originalHeight?: number
57
+ }> = ({
58
+ src,
59
+ alt,
60
+ customClass,
61
+ priority = false,
62
+ aspectRatio = 'video',
63
+ originalWidth,
64
+ originalHeight
65
+ }) => {
66
+ const [imageVisible, setImageVisible] = useState(true)
67
+
68
+ if (!imageVisible) {
69
+ return (
70
+ <div
71
+ className={cn(
72
+ 'fallback-image w-full bg-gray-200 flex items-center justify-center text-gray-500',
73
+ aspectRatio === 'square' && 'aspect-square',
74
+ aspectRatio === 'video' && 'aspect-video',
75
+ aspectRatio === 'portrait' && 'aspect-[3/4]',
76
+ aspectRatio === 'auto' && 'h-auto'
77
+ )}
78
+ >
79
+ <span>Image not available</span>
80
+ </div>
81
+ )
82
+ }
83
+
84
+ // Calculate dimensions based on aspect ratio or use original dimensions
85
+ let width = 400
86
+ let height = 225 // Default 16:9 ratio
87
+
88
+ if (originalWidth && originalHeight) {
89
+ width = originalWidth
90
+ height = originalHeight
91
+ } else {
92
+ switch (aspectRatio) {
93
+ case 'square':
94
+ width = 400
95
+ height = 400
96
+ break
97
+ case 'video':
98
+ width = 400
99
+ height = 225 // 16:9
100
+ break
101
+ case 'portrait':
102
+ width = 400
103
+ height = 533 // 3:4
104
+ break
105
+ case 'auto':
106
+ // Keep default 400x225
107
+ break
108
+ }
109
+ }
110
+
111
+ return (
112
+ <motion.div
113
+ className={cn(
114
+ 'card-image w-full overflow-hidden',
115
+ aspectRatio === 'square' && 'aspect-square',
116
+ aspectRatio === 'video' && 'aspect-video',
117
+ aspectRatio === 'portrait' && 'aspect-[3/4]',
118
+ aspectRatio === 'auto' && 'h-auto'
119
+ )}
120
+ initial={{ opacity: 0, y: -20 }}
121
+ whileInView={{ opacity: 1, y: 0 }}
122
+ transition={{ duration: 0.3 }}
123
+ viewport={{ once: false, amount: 0.2 }}
124
+ >
125
+ <Image
126
+ src={src}
127
+ alt={alt || 'Card Image'}
128
+ width={width}
129
+ height={height}
130
+ priority={priority}
131
+ placeholder="blur"
132
+ blurDataURL="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 400 250'%3E%3Cdefs%3E%3CradialGradient id='grad' cx='50%25' cy='50%25' r='50%25' fx='50%25' fy='50%25'%3E%3Cstop offset='0%25' style='stop-color:%23f3f4f6;stop-opacity:1' /%3E%3Cstop offset='100%25' style='stop-color:%23e5e7eb;stop-opacity:1' /%3E%3C/radialGradient%3E%3C/defs%3E%3Crect width='400' height='250' fill='url(%23grad)'/%3E%3C/svg%3E"
133
+ className={cn('w-full h-full object-cover transition-transform duration-300', customClass)}
134
+ sizes="(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw"
135
+ onError={() => setImageVisible(false)}
136
+ />
137
+ </motion.div>
138
+ )
139
+ }
140
+
141
+ export const DDCard: React.FC<CardBlockProps> = ({
142
+ cards,
143
+ cardScrollSpeed = '0',
144
+ priority = false,
145
+ aspectRatio = 'video'
146
+ }) => {
147
+ if (!cards || cards.length === 0) return null
148
+
149
+ const baseClasses = ['card-block', 'flex', 'flex-wrap', 'justify-center', 'gap-0']
150
+ const customBlockClasses = cards
151
+ .map((card) => card.cardBlockClass || '')
152
+ .join(' ')
153
+ .split(' ')
154
+ .filter(Boolean) // Remove empty strings
155
+
156
+ const filteredBlockClasses = Array.from(
157
+ new Set([
158
+ ...customBlockClasses,
159
+ ...baseClasses.filter((cls) => !customBlockClasses.includes(cls))
160
+ ])
161
+ ).join(' ')
162
+
163
+ return (
164
+ <div className={cn('w-full', CARD_BLOCK_CLS, filteredBlockClasses)}>
165
+ {cards.map((card, index) => {
166
+ const CardContent = (
167
+ <motion.div
168
+ className={cn(
169
+ 'border-0 mt-2 mb-2 shadow-md bg-card hover:cursor-pointer overflow-hidden rounded-lg transition-all duration-300 hover:scale-[1.02] hover:shadow-lg w-full max-w-sm mx-auto',
170
+ card.customClass || card.cardBlockClass
171
+ )}
172
+ initial={{ opacity: 0, y: 40 }}
173
+ whileInView={{ opacity: 1, y: 0 }}
174
+ transition={{ duration: 0.3, delay: index * 0.1 }}
175
+ viewport={{ once: true, amount: 1 }}
176
+ >
177
+ {card.image?.url && (
178
+ <CardImage
179
+ src={card.image.url}
180
+ alt={card.image.alt}
181
+ customClass={card.customClass}
182
+ priority={priority && index < 2} // Only first 2 cards get priority
183
+ aspectRatio={aspectRatio}
184
+ originalWidth={card.image.width}
185
+ originalHeight={card.image.height}
186
+ />
187
+ )}
188
+
189
+ {card.content && (
190
+ <div className="p-4">
191
+ <RichText data={card.content} enableGutter={false} className="w-full" />
192
+ </div>
193
+ )}
194
+ </motion.div>
195
+ )
196
+
197
+ const linkUrl = card.link?.url
198
+
199
+ // No link case
200
+ if (!linkUrl || linkUrl === '#') {
201
+ return (
202
+ <motion.div
203
+ key={`card-${index}`}
204
+ data-scroll
205
+ data-scroll-speed={cardScrollSpeed}
206
+ className="card-wrapper"
207
+ >
208
+ {CardContent}
209
+ </motion.div>
210
+ )
211
+ }
212
+
213
+ // Internal link
214
+ if (linkUrl.startsWith('/')) {
215
+ return (
216
+ <Link
217
+ key={`card-link-${index}`}
218
+ href={linkUrl}
219
+ className="card-block-content block"
220
+ style={{ textDecoration: 'none' }}
221
+ >
222
+ <motion.div data-scroll data-scroll-speed={cardScrollSpeed} className="card-wrapper">
223
+ <TextFade direction="up" className="card-block-anims">
224
+ {CardContent}
225
+ </TextFade>
226
+ </motion.div>
227
+ </Link>
228
+ )
229
+ }
230
+
231
+ // External link
232
+ return (
233
+ <a
234
+ key={`card-external-${index}`}
235
+ href={linkUrl}
236
+ target="_blank"
237
+ rel="noopener noreferrer"
238
+ className="card-external-content block"
239
+ style={{ textDecoration: 'none' }}
240
+ >
241
+ <motion.div data-scroll data-scroll-speed={cardScrollSpeed} className="card-wrapper">
242
+ <TextFade direction="down" className={cn('card-block', CARD_BLOCK_CLS)}>
243
+ {CardContent}
244
+ </TextFade>
245
+ </motion.div>
246
+ </a>
247
+ )
248
+ })}
249
+ </div>
250
+ )
251
+ }
@@ -0,0 +1,4 @@
1
+ # DD-Card
2
+
3
+ Portable first-pass conversion of `CardBlock` from ROUND-TWO-CONVERSION. Project-specific roots and nested unconverted block dependencies were intentionally replaced with local rendering so the template can install into a clean Payload project.
4
+
@@ -0,0 +1,154 @@
1
+ import type { Block } from 'payload'
2
+
3
+ import { defaultLexical } from '@/fields/defaultLexical'
4
+
5
+ export const DDCard: Block = {
6
+ slug: 'DD-Card',
7
+ interfaceName: 'DDCard',
8
+ labels: {
9
+ singular: 'Card Block',
10
+ plural: 'Card Blocks'
11
+ },
12
+ fields: [
13
+ // Block-level settings
14
+ {
15
+ admin: {
16
+ initCollapsed: true,
17
+ className: 'custom-group-class'
18
+ },
19
+ type: 'collapsible',
20
+ label: 'Block Settings',
21
+ fields: [
22
+ {
23
+ type: 'row',
24
+ fields: [
25
+ {
26
+ name: 'priority',
27
+ type: 'checkbox',
28
+ label: 'High Priority Loading',
29
+ defaultValue: false,
30
+ admin: {
31
+ description:
32
+ 'Enable for above-the-fold cards only. Improves LCP but should only be used when this card block appears at the top of the page.',
33
+ width: '50%'
34
+ }
35
+ },
36
+ {
37
+ name: 'aspectRatio',
38
+ type: 'select',
39
+ label: 'Image Aspect Ratio',
40
+ defaultValue: 'video',
41
+ options: [
42
+ { label: '16:9 Video', value: 'video' },
43
+ { label: '1:1 Square', value: 'square' },
44
+ { label: '3:4 Portrait', value: 'portrait' },
45
+ { label: 'Auto (Original)', value: 'auto' }
46
+ ],
47
+ admin: {
48
+ description: 'Set consistent aspect ratio for all card images in this block.',
49
+ width: '50%'
50
+ }
51
+ }
52
+ ]
53
+ },
54
+ {
55
+ name: 'cardScrollSpeed',
56
+ type: 'text',
57
+ label: 'Scroll Animation Speed',
58
+ defaultValue: '0.2',
59
+ admin: {
60
+ description: 'Animation speed for scroll effects. Default: 0.2',
61
+ placeholder: '0.2'
62
+ }
63
+ }
64
+ ]
65
+ },
66
+ // Cards array
67
+ {
68
+ name: 'cards',
69
+ label: 'Cards',
70
+ type: 'array',
71
+ required: false,
72
+ minRows: 1,
73
+ fields: [
74
+ {
75
+ name: 'image',
76
+ label: 'Card Image',
77
+ type: 'upload',
78
+ relationTo: 'media',
79
+ required: false,
80
+ admin: {
81
+ description: 'Image will be displayed according to the aspect ratio setting above.'
82
+ }
83
+ },
84
+ // Custom styling for individual cards
85
+ {
86
+ admin: {
87
+ initCollapsed: true,
88
+ className: 'custom-css-class'
89
+ },
90
+ type: 'collapsible',
91
+ label: 'Card Styling (Optional)',
92
+ fields: [
93
+ {
94
+ type: 'row',
95
+ fields: [
96
+ {
97
+ name: 'customClass',
98
+ label: 'Custom Image Class',
99
+ type: 'text',
100
+ required: false,
101
+ admin: {
102
+ description:
103
+ 'Override default image classes. Use Tailwind classes for styling.',
104
+ placeholder: 'rounded-lg border-2',
105
+ width: '50%'
106
+ }
107
+ },
108
+ {
109
+ name: 'cardBlockClass',
110
+ label: 'Custom Card Class',
111
+ type: 'text',
112
+ required: false,
113
+ admin: {
114
+ description: 'Override default card container classes.',
115
+ placeholder: 'shadow-xl bg-accent',
116
+ width: '50%'
117
+ }
118
+ }
119
+ ]
120
+ }
121
+ ]
122
+ },
123
+ {
124
+ name: 'content',
125
+ label: 'Card Content',
126
+ type: 'richText',
127
+ required: false,
128
+ admin: {
129
+ description: 'Rich text content for the card body.'
130
+ },
131
+ editor: defaultLexical
132
+ },
133
+ {
134
+ name: 'link',
135
+ label: 'Card Link (Optional)',
136
+ type: 'group',
137
+ fields: [
138
+ {
139
+ name: 'url',
140
+ label: 'URL',
141
+ type: 'text',
142
+ required: false,
143
+ admin: {
144
+ description:
145
+ 'Make the entire card clickable. If URL starts with "/", it will be treated as an internal link. Otherwise, it opens in a new tab.',
146
+ placeholder: '/about or https://example.com'
147
+ }
148
+ }
149
+ ]
150
+ }
151
+ ]
152
+ }
153
+ ]
154
+ }
@@ -0,0 +1,82 @@
1
+ {
2
+ "type": "block",
3
+ "name": "DD-Card",
4
+ "label": "Card",
5
+ "sourceName": "CardBlock",
6
+ "portableName": "DD-Card",
7
+ "slug": "DD-Card",
8
+ "version": "0.0.1",
9
+ "source": {
10
+ "repo": "Hadizainal/DesignsDustedv3",
11
+ "originalPath": "src/blocks/ROUND-TWO-CONVERSION/CardBlock",
12
+ "originalSlug": "cardBlock",
13
+ "originalConfigExport": "CardBlock",
14
+ "originalComponentExport": "CardBlock",
15
+ "originalInterfaceName": "DDCard"
16
+ },
17
+ "files": [
18
+ {
19
+ "from": "Component.tsx",
20
+ "to": "src/blocks/DD-Card/Component.tsx"
21
+ },
22
+ {
23
+ "from": "config.ts",
24
+ "to": "src/blocks/DD-Card/config.ts"
25
+ }
26
+ ],
27
+ "dependencies": [
28
+ "framer-motion"
29
+ ],
30
+ "sharedFiles": [
31
+ {
32
+ "from": "templates/shared/src/components/ui/anims",
33
+ "to": "src/components/ui/anims",
34
+ "required": true,
35
+ "safeToCopy": true
36
+ }
37
+ ],
38
+ "requiredProjectFiles": [],
39
+ "optionalProjectFiles": [],
40
+ "collectionRegistration": {
41
+ "enabled": true,
42
+ "collections": [
43
+ "Pages",
44
+ "Posts"
45
+ ]
46
+ },
47
+ "renderBlocksRegistration": {
48
+ "enabled": true
49
+ },
50
+ "renderBlocksBehavior": {
51
+ "wrapperless": false
52
+ },
53
+ "pageRouteIntegration": {
54
+ "required": false,
55
+ "manualSteps": []
56
+ },
57
+ "manual": [
58
+ "Register DDCard in Pages/Posts blocks arrays if automatic registration was skipped.",
59
+ "Register DD-Card in RenderBlocks if automatic registration was skipped.",
60
+ "Run payload generate:types after schema changes."
61
+ ],
62
+ "manualSteps": [
63
+ "Register DDCard in Pages/Posts blocks arrays if automatic registration was skipped.",
64
+ "Register DD-Card in RenderBlocks if automatic registration was skipped.",
65
+ "Run payload generate:types after schema changes."
66
+ ],
67
+ "patchTargets": {
68
+ "blockConfigRegistration": {
69
+ "description": "Installer can add import { DDCard } from '@/blocks/DD-Card/config' and add DDCard to clear Pages/Posts block arrays."
70
+ },
71
+ "renderBlocksRegistration": {
72
+ "description": "Installer can register DD-Card in RenderBlocks."
73
+ }
74
+ },
75
+ "notes": [
76
+ "Converted from ROUND-TWO-CONVERSION as a portable Dusted template.",
77
+ "Project-specific imports were replaced with local, dependency-light rendering where required.",
78
+ "Manifest includes shared local support files required by original DesignsDusted source imports."
79
+ ],
80
+ "exportName": "DDCard",
81
+ "interfaceName": "DDCard"
82
+ }
@@ -18,7 +18,7 @@ function SpotlightCard({
18
18
  className,
19
19
  spotlightColor = 'rgba(214,211,209,0.08)',
20
20
  enableTilt = true,
21
- style,
21
+ style
22
22
  }: SpotlightCardProps) {
23
23
  const cardRef = useRef<HTMLDivElement>(null)
24
24
  const [pos, setPos] = useState<{ x: number; y: number } | null>(null)
@@ -53,7 +53,7 @@ function SpotlightCard({
53
53
  ? {
54
54
  ...style,
55
55
  transform: `perspective(800px) rotateX(${tilt.rx}deg) rotateY(${tilt.ry}deg)`,
56
- transition: 'transform 0.1s ease',
56
+ transition: 'transform 0.1s ease'
57
57
  }
58
58
  : style
59
59
  }
@@ -62,7 +62,7 @@ function SpotlightCard({
62
62
  <div
63
63
  className="pointer-events-none absolute inset-0 z-0 transition-opacity duration-300"
64
64
  style={{
65
- background: `radial-gradient(400px circle at ${pos.x}px ${pos.y}px, ${spotlightColor}, transparent 60%)`,
65
+ background: `radial-gradient(400px circle at ${pos.x}px ${pos.y}px, ${spotlightColor}, transparent 60%)`
66
66
  }}
67
67
  />
68
68
  )}
@@ -93,7 +93,7 @@ export const DDCardTemplate01: React.FC<DDCardTemplate01Props> = ({
93
93
  minHeight = '220px',
94
94
  className,
95
95
  sectionId,
96
- customCSS,
96
+ customCSS
97
97
  }) => {
98
98
  return (
99
99
  <div id={sectionId ?? undefined} className="spotlight-card overflow-clip py-8">
@@ -103,11 +103,10 @@ export const DDCardTemplate01: React.FC<DDCardTemplate01Props> = ({
103
103
  enableTilt={enableTilt ?? true}
104
104
  className={cn(
105
105
  'border border-stone-50 dark:border-stone-950 bg-stone-100 dark:bg-stone-900 hover:shadow-2xl transition-all hover:transition-all duration-900 hover:duration-900 flex flex-col justify-between p-6 max-w-[100rem] mx-auto',
106
- className,
106
+ className
107
107
  )}
108
108
  style={{ minHeight: minHeight ?? '220px' }}
109
109
  >
110
- #BlockName-DDCardTemplate01
111
110
  <div className="w-11 h-11 flex items-center justify-center rounded-xl border border-stone-300 text-stone-300 mb-6">
112
111
  <DynamicIcon
113
112
  className="text-stone-600 dark:text-stone-300"