blocks-dusted 0.1.9 → 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.
- package/README.md +35 -0
- package/package.json +1 -1
- package/src/utils/paths.js +13 -13
- package/templates/blocks/DD-Accordion/Component.tsx +229 -0
- package/templates/blocks/DD-Accordion/README.md +3 -0
- package/templates/blocks/DD-Accordion/config.ts +73 -0
- package/templates/blocks/DD-Accordion/manifest.json +75 -0
- package/templates/blocks/DD-AnimText/Component.tsx +788 -0
- package/templates/blocks/DD-AnimText/README.md +3 -0
- package/templates/blocks/DD-AnimText/config.ts +295 -0
- package/templates/blocks/DD-AnimText/manifest.json +85 -0
- package/templates/blocks/DD-AsideNav/Component.tsx +321 -0
- package/templates/blocks/DD-AsideNav/config.ts +204 -0
- package/templates/blocks/DD-AsideNav/manifest.json +80 -0
- package/templates/blocks/DD-Banner/Component.tsx +51 -0
- package/templates/blocks/DD-Banner/config.ts +57 -0
- package/templates/blocks/DD-Banner/manifest.json +72 -0
- package/templates/blocks/DD-BgLightning/Component.tsx +44 -0
- package/templates/blocks/DD-BgLightning/README.md +3 -0
- package/templates/blocks/DD-BgLightning/config.ts +97 -0
- package/templates/blocks/DD-BgLightning/manifest.json +79 -0
- package/templates/blocks/DD-BookCall/Component.tsx +10 -11
- package/templates/blocks/DD-BookCall/config.ts +238 -238
- package/templates/blocks/DD-ButtonPop/Component.tsx +117 -0
- package/templates/blocks/DD-ButtonPop/config.ts +105 -0
- package/templates/blocks/DD-ButtonPop/manifest.json +88 -0
- package/templates/blocks/DD-ButtonPop/svg-icons/Dust2.tsx +167 -0
- package/templates/blocks/DD-Card/Component.tsx +251 -0
- package/templates/blocks/DD-Card/README.md +4 -0
- package/templates/blocks/DD-Card/config.ts +154 -0
- package/templates/blocks/DD-Card/manifest.json +82 -0
- package/templates/blocks/DD-CardTemplate01/Component.tsx +5 -6
- package/templates/blocks/DD-CardTemplate01/config.ts +106 -106
- package/templates/blocks/DD-Carousel-A/Component.tsx +249 -249
- package/templates/blocks/DD-Carousel-B/Component.tsx +403 -403
- package/templates/blocks/DD-Chip/Component.tsx +250 -0
- package/templates/blocks/DD-Chip/EXAMPLES.md +313 -0
- package/templates/blocks/DD-Chip/README.md +202 -0
- package/templates/blocks/DD-Chip/config.ts +369 -0
- package/templates/blocks/DD-Chip/manifest.json +74 -0
- package/templates/blocks/DD-ComparisonTable/Component.tsx +256 -256
- package/templates/blocks/DD-Contact/Component.tsx +434 -434
- package/templates/blocks/DD-Contact/config.ts +22 -22
- package/templates/blocks/DD-Counter/Component.tsx +190 -0
- package/templates/blocks/DD-Counter/README.md +4 -0
- package/templates/blocks/DD-Counter/config.ts +291 -0
- package/templates/blocks/DD-Counter/manifest.json +74 -0
- package/templates/blocks/DD-CustomCSS/Component.tsx +8 -0
- package/templates/blocks/DD-CustomCSS/README.md +4 -0
- package/templates/blocks/DD-CustomCSS/addToLayout.md +5 -0
- package/templates/blocks/DD-CustomCSS/config.ts +22 -0
- package/templates/blocks/DD-CustomCSS/manifest.json +72 -0
- package/templates/blocks/DD-CustomCSS/renderCustomCSS.md +7 -0
- package/templates/blocks/DD-FeatCat/Component.tsx +302 -302
- package/templates/blocks/DD-FeatCat/config.ts +201 -201
- package/templates/blocks/DD-FeatStrip/Component.tsx +585 -585
- package/templates/blocks/DD-FeatStrip/config.ts +134 -134
- package/templates/blocks/DD-FluidBtn/ButtonsEyeCatching.tsx +628 -0
- package/templates/blocks/DD-FluidBtn/Component.tsx +43 -0
- package/templates/blocks/DD-FluidBtn/README.md +6 -0
- package/templates/blocks/DD-FluidBtn/config.ts +102 -0
- package/templates/blocks/DD-FluidBtn/manifest.json +86 -0
- package/templates/blocks/DD-GooeyInfo/Component.tsx +149 -0
- package/templates/blocks/DD-GooeyInfo/config.ts +135 -0
- package/templates/blocks/DD-GooeyInfo/manifest.json +72 -0
- package/templates/blocks/DD-Hero/Component.tsx +40 -17
- package/templates/blocks/DD-Hero/config.ts +267 -267
- package/templates/blocks/DD-HorizontalScroll/Component.tsx +4 -2
- package/templates/blocks/DD-HorizontalScroll/config.ts +231 -231
- package/templates/blocks/DD-Icon/Component.tsx +287 -0
- package/templates/blocks/DD-Icon/README.md +4 -0
- package/templates/blocks/DD-Icon/config.ts +258 -0
- package/templates/blocks/DD-Icon/hooks/revalidateBlockIds.ts +66 -0
- package/templates/blocks/DD-Icon/manifest.json +82 -0
- package/templates/blocks/DD-IconButton/Component.tsx +455 -0
- package/templates/blocks/DD-IconButton/README.md +326 -0
- package/templates/blocks/DD-IconButton/config.ts +239 -0
- package/templates/blocks/DD-IconButton/manifest.json +85 -0
- package/templates/blocks/DD-IdTag/Component.tsx +21 -0
- package/templates/blocks/DD-IdTag/README.md +4 -0
- package/templates/blocks/DD-IdTag/config.ts +41 -0
- package/templates/blocks/DD-IdTag/manifest.json +72 -0
- package/templates/blocks/DD-Iframe/Component.tsx +45 -0
- package/templates/blocks/DD-Iframe/README.md +4 -0
- package/templates/blocks/DD-Iframe/config.ts +47 -0
- package/templates/blocks/DD-Iframe/manifest.json +72 -0
- package/templates/blocks/DD-IframeMedia/Component.tsx +129 -0
- package/templates/blocks/DD-IframeMedia/README.md +4 -0
- package/templates/blocks/DD-IframeMedia/config.ts +79 -0
- package/templates/blocks/DD-IframeMedia/manifest.json +72 -0
- package/templates/blocks/DD-LineAnim/Component.tsx +36 -0
- package/templates/blocks/DD-LineAnim/README.md +4 -0
- package/templates/blocks/DD-LineAnim/config.ts +90 -0
- package/templates/blocks/DD-LineAnim/manifest.json +80 -0
- package/templates/blocks/DD-LinkGrid/Component.tsx +119 -0
- package/templates/blocks/DD-LinkGrid/README.md +4 -0
- package/templates/blocks/DD-LinkGrid/config.ts +51 -0
- package/templates/blocks/DD-LinkGrid/manifest.json +74 -0
- package/templates/blocks/DD-LogoMarq/Component.tsx +132 -0
- package/templates/blocks/DD-LogoMarq/README.md +4 -0
- package/templates/blocks/DD-LogoMarq/config.ts +264 -0
- package/templates/blocks/DD-LogoMarq/manifest.json +82 -0
- package/templates/blocks/DD-Lottie/Component.tsx +459 -0
- package/templates/blocks/DD-Lottie/README.md +4 -0
- package/templates/blocks/DD-Lottie/config.ts +379 -0
- package/templates/blocks/DD-Lottie/index.tsx +28 -0
- package/templates/blocks/DD-Lottie/manifest.json +83 -0
- package/templates/blocks/DD-MagicBento/Component.tsx +777 -0
- package/templates/blocks/DD-MagicBento/README.md +4 -0
- package/templates/blocks/DD-MagicBento/config.ts +264 -0
- package/templates/blocks/DD-MagicBento/manifest.json +74 -0
- package/templates/blocks/DD-MasonaryMedia/Component.tsx +547 -545
- package/templates/blocks/DD-MasonaryMedia/config.ts +2 -2
- package/templates/blocks/DD-MasonaryMedia/vendor.d.ts +2 -2
- package/templates/blocks/DD-Masonry/Component.tsx +645 -0
- package/templates/blocks/DD-Masonry/README.md +4 -0
- package/templates/blocks/DD-Masonry/config.ts +475 -0
- package/templates/blocks/DD-Masonry/manifest.json +82 -0
- package/templates/blocks/DD-Pricing/Component.tsx +372 -372
- package/templates/blocks/DD-Process/Component.tsx +149 -149
- package/templates/blocks/DD-Process/config.ts +150 -150
- package/templates/blocks/DD-Progress/Component.tsx +141 -0
- package/templates/blocks/DD-Progress/README.md +4 -0
- package/templates/blocks/DD-Progress/config.ts +175 -0
- package/templates/blocks/DD-Progress/manifest.json +74 -0
- package/templates/blocks/DD-ProjHeader/Component.tsx +91 -0
- package/templates/blocks/DD-ProjHeader/README.md +4 -0
- package/templates/blocks/DD-ProjHeader/config.ts +96 -0
- package/templates/blocks/DD-ProjHeader/manifest.json +72 -0
- package/templates/blocks/DD-ProjSlider/Component.tsx +123 -0
- package/templates/blocks/DD-ProjSlider/README.md +4 -0
- package/templates/blocks/DD-ProjSlider/config.ts +64 -0
- package/templates/blocks/DD-ProjSlider/manifest.json +72 -0
- package/templates/blocks/DD-ScrollText/Component.tsx +114 -0
- package/templates/blocks/DD-ScrollText/README.md +4 -0
- package/templates/blocks/DD-ScrollText/config.ts +58 -0
- package/templates/blocks/DD-ScrollText/manifest.json +72 -0
- package/templates/blocks/DD-Section/Component.tsx +266 -266
- package/templates/blocks/DD-Separator/Component.tsx +66 -0
- package/templates/blocks/DD-Separator/README.md +4 -0
- package/templates/blocks/DD-Separator/config.ts +58 -0
- package/templates/blocks/DD-Separator/manifest.json +72 -0
- package/templates/blocks/DD-Services/Component.tsx +176 -176
- package/templates/blocks/DD-Services/config.ts +149 -149
- package/templates/blocks/DD-ShowcaseGrid/Component.tsx +307 -307
- package/templates/blocks/DD-Slider-A/Component.tsx +237 -237
- package/templates/blocks/DD-StackCards/Component.tsx +473 -473
- package/templates/blocks/DD-StackCards/config.ts +399 -399
- package/templates/blocks/DD-Team/Component.tsx +247 -247
- package/templates/blocks/DD-Team/config.ts +173 -173
- package/templates/blocks/DD-TeamCards/Component.tsx +251 -0
- package/templates/blocks/DD-TeamCards/README.md +4 -0
- package/templates/blocks/DD-TeamCards/config.ts +302 -0
- package/templates/blocks/DD-TeamCards/manifest.json +74 -0
- package/templates/blocks/DD-TechStack/Component.tsx +168 -162
- package/templates/blocks/DD-TechStack/config.ts +153 -153
- package/templates/blocks/DD-TestMarq/Component.tsx +132 -0
- package/templates/blocks/DD-TestMarq/README.md +4 -0
- package/templates/blocks/DD-TestMarq/RowLabel.tsx +9 -0
- package/templates/blocks/DD-TestMarq/config.ts +88 -0
- package/templates/blocks/DD-TestMarq/manifest.json +72 -0
- package/templates/blocks/DD-Testim/Component.tsx +247 -0
- package/templates/blocks/DD-Testim/README.md +4 -0
- package/templates/blocks/DD-Testim/config.ts +101 -0
- package/templates/blocks/DD-Testim/manifest.json +75 -0
- package/templates/blocks/DD-Testim2/Component.tsx +256 -0
- package/templates/blocks/DD-Testim2/README.md +4 -0
- package/templates/blocks/DD-Testim2/config.ts +100 -0
- package/templates/blocks/DD-Testim2/manifest.json +74 -0
- package/templates/blocks/DD-Testimonials/Component.tsx +147 -147
- package/templates/blocks/DD-Testimonials/config.ts +120 -120
- package/templates/blocks/DD-TextMarq/Component.tsx +157 -0
- package/templates/blocks/DD-TextMarq/README.md +4 -0
- package/templates/blocks/DD-TextMarq/config.ts +237 -0
- package/templates/blocks/DD-TextMarq/manifest.json +82 -0
- package/templates/blocks/DD-Thanks/Component.tsx +500 -0
- package/templates/blocks/DD-Thanks/README.md +4 -0
- package/templates/blocks/DD-Thanks/config.ts +224 -0
- package/templates/blocks/DD-Thanks/manifest.json +72 -0
- package/templates/blocks/DD-VertMarq/Component.tsx +154 -0
- package/templates/blocks/DD-VertMarq/README.md +4 -0
- package/templates/blocks/DD-VertMarq/config.ts +236 -0
- package/templates/blocks/DD-VertMarq/dist/index.css +6 -0
- package/templates/blocks/DD-VertMarq/dist/index.min.css +1 -0
- package/templates/blocks/DD-VertMarq/manifest.json +74 -0
- package/templates/blocks/DD-Work/Component.tsx +318 -315
- package/templates/blocks/DD-Work/config.ts +165 -165
- package/templates/blocks/DD-Work-B/Component.tsx +294 -294
- package/templates/blocks/DDHG-CTASection2/Component.tsx +185 -0
- package/templates/blocks/DDHG-CTASection2/config.ts +140 -0
- package/templates/blocks/DDHG-CTASection2/manifest.json +45 -0
- package/templates/blocks/DDHG-HighlightArc/Component.tsx +243 -0
- package/templates/blocks/DDHG-HighlightArc/config.ts +85 -0
- package/templates/blocks/DDHG-HighlightArc/manifest.json +46 -0
- package/templates/blocks/DDHG-LogoMarquee/Component.tsx +93 -0
- package/templates/blocks/DDHG-LogoMarquee/config.ts +66 -0
- package/templates/blocks/DDHG-LogoMarquee/manifest.json +39 -0
- package/templates/blocks/DDHG-NavCodeGrid/Component.tsx +213 -0
- package/templates/blocks/DDHG-NavCodeGrid/config.ts +64 -0
- package/templates/blocks/DDHG-NavCodeGrid/manifest.json +45 -0
- package/templates/blocks/DDHG-ProcessSec/Component.tsx +575 -0
- package/templates/blocks/DDHG-ProcessSec/config.ts +170 -0
- package/templates/blocks/DDHG-ProcessSec/manifest.json +56 -0
- package/templates/blocks/DDHG-ServiceDetails/Component.tsx +164 -0
- package/templates/blocks/DDHG-ServiceDetails/ServiceDetailCard.tsx +394 -0
- package/templates/blocks/DDHG-ServiceDetails/config.ts +77 -0
- package/templates/blocks/DDHG-ServiceDetails/manifest.json +50 -0
- package/templates/blocks/DDHG-ServiceHero/Component.tsx +234 -0
- package/templates/blocks/DDHG-ServiceHero/config.ts +49 -0
- package/templates/blocks/DDHG-ServiceHero/manifest.json +26 -0
- package/templates/blocks/DDHG-ServiceOverview/Component.tsx +277 -0
- package/templates/blocks/DDHG-ServiceOverview/config.ts +64 -0
- package/templates/blocks/DDHG-ServiceOverview/manifest.json +44 -0
- package/templates/blocks/DDHG-StatsFAQ/Component.tsx +389 -0
- package/templates/blocks/DDHG-StatsFAQ/config.ts +204 -0
- package/templates/blocks/DDHG-StatsFAQ/manifest.json +45 -0
- package/templates/blocks/DDHG-TeamCards/Component.tsx +131 -0
- package/templates/blocks/DDHG-TeamCards/config.ts +48 -0
- package/templates/blocks/DDHG-TeamCards/manifest.json +29 -0
- package/templates/components/HeaderDD02/MobileBottomNav/index.tsx +352 -257
- package/templates/components/HeaderDD02/index.tsx +313 -229
- package/templates/shared/src/components/BgLightning/index.tsx +242 -0
- package/templates/shared/src/components/ui/ShareButton/index.tsx +80 -0
- package/templates/shared/src/components/ui/anims/FadeOnScroll.tsx +48 -0
- package/templates/shared/src/components/ui/anims/FadeUpOnInView.tsx +63 -0
- package/templates/shared/src/components/ui/anims/GlareHover.tsx +111 -0
- package/templates/shared/src/components/ui/anims/LineAnims.tsx +81 -0
- package/templates/shared/src/components/ui/anims/TitleAnims01.tsx +54 -0
- package/templates/shared/src/components/ui/anims/animation-container.tsx +29 -0
- package/templates/shared/src/components/ui/anims/blur-in.tsx +26 -0
- package/templates/shared/src/components/ui/anims/counter.tsx +53 -0
- package/templates/shared/src/components/ui/anims/fade.tsx +83 -0
- package/templates/shared/src/components/ui/anims/gradual-spacing.tsx +39 -0
- package/templates/shared/src/components/ui/anims/pull-up.tsx +93 -0
- package/templates/shared/src/components/ui/anims/reveal-text.tsx +76 -0
- package/templates/shared/src/components/ui/anims/rotate-words.tsx +43 -0
- package/templates/shared/src/components/ui/anims/shiny-text.tsx +58 -0
- package/templates/shared/src/components/ui/anims/shuffle-text.tsx +85 -0
- package/templates/shared/src/components/ui/anims/split-text.tsx +211 -0
- package/templates/shared/src/components/ui/anims/staggered-fade.tsx +133 -0
- package/templates/shared/src/components/ui/anims/text-scroll.tsx +111 -0
- package/templates/shared/src/components/ui/anims/typing-effect.tsx +112 -0
- package/templates/shared/src/components/ui/button-dusted-fluid/index.tsx +1521 -0
- package/templates/shared/src/components/ui/separator.tsx +85 -0
- package/templates/shared/src/hooks/useBodyScrollLock.ts +97 -0
- package/templates/shared/src/hooks/useClickOutside.ts +28 -0
- package/templates/shared/src/utilities/renderCustomCSS.ts +5 -0
- 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,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"
|