blocks-dusted 0.1.10 → 0.1.12
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 +5 -2
- package/src/cli.js +39 -3
- package/src/commands/shop.js +59 -0
- package/src/commands/warehouse.js +73 -0
- 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 +535 -535
- 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 +140 -140
- 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 +435 -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 +297 -297
- package/templates/blocks/DD-Hero/config.ts +267 -267
- package/templates/blocks/DD-HorizontalScroll/Component.tsx +936 -936
- 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 +133 -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 +545 -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 +2 -5
- package/templates/blocks/DD-Process/Component.tsx +2 -4
- package/templates/blocks/DD-Process/config.ts +150 -150
- package/templates/blocks/DD-Progress/Component.tsx +156 -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 +1 -1
- package/templates/blocks/DD-StackCards/Component.tsx +1 -1
- 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 +174 -174
- 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 +139 -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 +501 -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 +143 -0
- package/templates/blocks/DDHG-LogoMarquee/config.ts +154 -0
- package/templates/blocks/DDHG-LogoMarquee/manifest.json +39 -0
- package/templates/blocks/DDHG-NavCodeGrid/Component.tsx +227 -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 +574 -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 +390 -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 +169 -0
- package/templates/blocks/DDHG-TeamCards/config.ts +48 -0
- package/templates/blocks/DDHG-TeamCards/manifest.json +29 -0
- 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,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"type": "block",
|
|
3
|
+
"name": "DD-Separator",
|
|
4
|
+
"label": "Separator Gradient",
|
|
5
|
+
"sourceName": "SeparatorGradient",
|
|
6
|
+
"portableName": "DD-Separator",
|
|
7
|
+
"slug": "DD-Separator",
|
|
8
|
+
"version": "0.0.1",
|
|
9
|
+
"source": {
|
|
10
|
+
"repo": "Hadizainal/DesignsDustedv3",
|
|
11
|
+
"originalPath": "src/blocks/ROUND-TWO-CONVERSION/SeparatorGradient",
|
|
12
|
+
"originalSlug": "separatorGradient",
|
|
13
|
+
"originalConfigExport": "SeparatorGradient",
|
|
14
|
+
"originalComponentExport": "SeparatorGradient",
|
|
15
|
+
"originalInterfaceName": "DDSeparator"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
{
|
|
19
|
+
"from": "Component.tsx",
|
|
20
|
+
"to": "src/blocks/DD-Separator/Component.tsx"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"from": "config.ts",
|
|
24
|
+
"to": "src/blocks/DD-Separator/config.ts"
|
|
25
|
+
}
|
|
26
|
+
],
|
|
27
|
+
"dependencies": [],
|
|
28
|
+
"sharedFiles": [],
|
|
29
|
+
"requiredProjectFiles": [],
|
|
30
|
+
"optionalProjectFiles": [],
|
|
31
|
+
"collectionRegistration": {
|
|
32
|
+
"enabled": true,
|
|
33
|
+
"collections": [
|
|
34
|
+
"Pages",
|
|
35
|
+
"Posts"
|
|
36
|
+
]
|
|
37
|
+
},
|
|
38
|
+
"renderBlocksRegistration": {
|
|
39
|
+
"enabled": true
|
|
40
|
+
},
|
|
41
|
+
"renderBlocksBehavior": {
|
|
42
|
+
"wrapperless": false
|
|
43
|
+
},
|
|
44
|
+
"pageRouteIntegration": {
|
|
45
|
+
"required": false,
|
|
46
|
+
"manualSteps": []
|
|
47
|
+
},
|
|
48
|
+
"manual": [
|
|
49
|
+
"Register DDSeparator in Pages/Posts blocks arrays if automatic registration was skipped.",
|
|
50
|
+
"Register DD-Separator in RenderBlocks if automatic registration was skipped.",
|
|
51
|
+
"Run payload generate:types after schema changes."
|
|
52
|
+
],
|
|
53
|
+
"manualSteps": [
|
|
54
|
+
"Register DDSeparator in Pages/Posts blocks arrays if automatic registration was skipped.",
|
|
55
|
+
"Register DD-Separator in RenderBlocks if automatic registration was skipped.",
|
|
56
|
+
"Run payload generate:types after schema changes."
|
|
57
|
+
],
|
|
58
|
+
"patchTargets": {
|
|
59
|
+
"blockConfigRegistration": {
|
|
60
|
+
"description": "Installer can add import { DDSeparator } from '@/blocks/DD-Separator/config' and add DDSeparator to clear Pages/Posts block arrays."
|
|
61
|
+
},
|
|
62
|
+
"renderBlocksRegistration": {
|
|
63
|
+
"description": "Installer can register DD-Separator in RenderBlocks."
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
"notes": [
|
|
67
|
+
"Converted from ROUND-TWO-CONVERSION as a portable Dusted template.",
|
|
68
|
+
"Project-specific imports were replaced with local, dependency-light rendering where required."
|
|
69
|
+
],
|
|
70
|
+
"exportName": "DDSeparator",
|
|
71
|
+
"interfaceName": "DDSeparator"
|
|
72
|
+
}
|
|
@@ -1,176 +1,176 @@
|
|
|
1
|
-
'use client'
|
|
2
|
-
import React, { useRef, useState } from 'react'
|
|
3
|
-
import * as LucideIcons from 'lucide-react'
|
|
4
|
-
import { TextFade } from '@/components/ui/anims/fade'
|
|
5
|
-
import { cn } from '@/utilities/ui'
|
|
6
|
-
export type DDServicesProps = Record<string, any>
|
|
7
|
-
type TagItem = { id?: string | null; tag?: string | null }
|
|
8
|
-
type ServiceItem = {
|
|
9
|
-
id?: string | null
|
|
10
|
-
iconName?: string | null
|
|
11
|
-
number?: string | null
|
|
12
|
-
title?: string | null
|
|
13
|
-
description?: string | null
|
|
14
|
-
tags?: TagItem[] | null
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
// ─── Dynamic Icon ─────────────────────────────────────────────────────────────
|
|
18
|
-
function DynamicIcon({
|
|
19
|
-
name,
|
|
20
|
-
size = 20,
|
|
21
|
-
...props
|
|
22
|
-
}: { name?: string | null } & Omit<LucideIcons.LucideProps, 'name'>) {
|
|
23
|
-
if (!name) return null
|
|
24
|
-
const Icon = (LucideIcons as unknown as Record<string, React.FC<LucideIcons.LucideProps>>)[name]
|
|
25
|
-
if (!Icon) return null
|
|
26
|
-
return <Icon size={size} {...props} />
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
// ─── Spotlight Hover Card ─────────────────────────────────────────────────────
|
|
30
|
-
function SpotlightCard({ children, className }: { children: React.ReactNode; className?: string }) {
|
|
31
|
-
const ref = useRef<HTMLDivElement>(null)
|
|
32
|
-
const [pos, setPos] = useState<{ x: number; y: number } | null>(null)
|
|
33
|
-
|
|
34
|
-
const onMove = (e: React.MouseEvent<HTMLDivElement>) => {
|
|
35
|
-
if (!ref.current) return
|
|
36
|
-
const rect = ref.current.getBoundingClientRect()
|
|
37
|
-
setPos({
|
|
38
|
-
x: e.clientX - rect.left,
|
|
39
|
-
y: e.clientY - rect.top,
|
|
40
|
-
})
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const onLeave = () => setPos(null)
|
|
44
|
-
|
|
45
|
-
return (
|
|
46
|
-
<div
|
|
47
|
-
ref={ref}
|
|
48
|
-
onMouseMove={onMove}
|
|
49
|
-
onMouseLeave={onLeave}
|
|
50
|
-
className={cn('relative overflow-hidden transition-all duration-300', className)}
|
|
51
|
-
>
|
|
52
|
-
{/* spotlight */}
|
|
53
|
-
{pos && (
|
|
54
|
-
<div
|
|
55
|
-
className="pointer-events-none absolute inset-0 z-0 transition-opacity duration-300"
|
|
56
|
-
style={{
|
|
57
|
-
background: `radial-gradient(500px circle at ${pos.x}px ${pos.y}px, rgba(132,204,22,0.12), transparent 60%)`,
|
|
58
|
-
}}
|
|
59
|
-
/>
|
|
60
|
-
)}
|
|
61
|
-
|
|
62
|
-
{/* animated border glow */}
|
|
63
|
-
<div className="absolute inset-0 rounded-3xl border border-stone-100 dark:border-stone-800 group-hover:border-lime-500/60 transition-colors duration-300" />
|
|
64
|
-
|
|
65
|
-
{/* subtle noise / sheen */}
|
|
66
|
-
<div className="pointer-events-none absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-500 bg-[linear-gradient(120deg,transparent,rgba(255,255,255,0.05),transparent)]" />
|
|
67
|
-
|
|
68
|
-
<div className="relative z-10">{children}</div>
|
|
69
|
-
</div>
|
|
70
|
-
)
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// ─── Component ────────────────────────────────────────────────────────────────
|
|
74
|
-
export const DDServices: React.FC<DDServicesProps> = ({
|
|
75
|
-
eyebrow,
|
|
76
|
-
headlineMain,
|
|
77
|
-
headlineAccent,
|
|
78
|
-
description,
|
|
79
|
-
services,
|
|
80
|
-
sectionId,
|
|
81
|
-
customCSS,
|
|
82
|
-
}) => {
|
|
83
|
-
const serviceItems = (services ?? []) as ServiceItem[]
|
|
84
|
-
|
|
85
|
-
return (
|
|
86
|
-
<>
|
|
87
|
-
{customCSS && <style dangerouslySetInnerHTML={{ __html: customCSS }} />}
|
|
88
|
-
|
|
89
|
-
<div id={sectionId ?? 'services'} className="py-24">
|
|
90
|
-
<div className="max-w-6xl lg:max-w-7xl mx-auto px-4 md:px-6">
|
|
91
|
-
{/* Header */}#BlockName-DDServices
|
|
92
|
-
<div className="max-w-2xl mb-16">
|
|
93
|
-
<TextFade direction="right" className="text-base" delay={0}>
|
|
94
|
-
{eyebrow && (
|
|
95
|
-
<p className="text-[11.5px] font-semibold text-stone-400 tracking-widest uppercase mb-3 top-caption">
|
|
96
|
-
{eyebrow}
|
|
97
|
-
</p>
|
|
98
|
-
)}
|
|
99
|
-
</TextFade>
|
|
100
|
-
|
|
101
|
-
<TextFade direction="up" className="mt-0" delay={0.3}>
|
|
102
|
-
<h2 className="text-3d text-4xl md:text-5xl font-bold text-stone-900 dark:text-stone-50 leading-tight mb-5">
|
|
103
|
-
{headlineMain}
|
|
104
|
-
</h2>
|
|
105
|
-
</TextFade>
|
|
106
|
-
|
|
107
|
-
<TextFade direction="up" className="-mt-6" delay={0.3}>
|
|
108
|
-
<h2 className="text-3d text-4xl md:text-5xl font-bold text-stone-400 leading-tight mb-5">
|
|
109
|
-
{headlineAccent}
|
|
110
|
-
</h2>
|
|
111
|
-
</TextFade>
|
|
112
|
-
|
|
113
|
-
<TextFade direction="down" className="px-1" delay={0.5}>
|
|
114
|
-
{description && (
|
|
115
|
-
<p className="text-stone-700 dark:text-stone-300 text-base leading-relaxed">
|
|
116
|
-
{description}
|
|
117
|
-
</p>
|
|
118
|
-
)}
|
|
119
|
-
</TextFade>
|
|
120
|
-
</div>
|
|
121
|
-
{/* Services Grid */}
|
|
122
|
-
{serviceItems.length > 0 && (
|
|
123
|
-
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-5">
|
|
124
|
-
{serviceItems.map((svc, i) => (
|
|
125
|
-
<SpotlightCard
|
|
126
|
-
key={svc.id ?? i}
|
|
127
|
-
className="group bg-[#19171ca4] backdrop-blur-md rounded-3xl shadow-md hover:shadow-2xl hover:-translate-y-1 transition-all duration-300"
|
|
128
|
-
>
|
|
129
|
-
<div className="bg-dots h-full w-full shadow-inner brightness-90 absolute p-6 md:p-8">
|
|
130
|
-
{/* Icon Row */}
|
|
131
|
-
<div className="flex items-start justify-between mb-6">
|
|
132
|
-
<div className="w-12 h-12 flex items-center justify-center rounded-xl bg-stone-800/10 bg-lines border border-stone-600 group-hover:bg-stone-700 group-hover:scale-110 transition-all duration-300">
|
|
133
|
-
<DynamicIcon
|
|
134
|
-
className="text-stone-300 group-hover:text-lime-400 transition-colors duration-300"
|
|
135
|
-
name={svc.iconName}
|
|
136
|
-
size={20}
|
|
137
|
-
/>
|
|
138
|
-
</div>
|
|
139
|
-
|
|
140
|
-
{svc.number && (
|
|
141
|
-
<span className="text-xs font-mono text-stone-400 group-hover:text-lime-400 transition-colors duration-300">
|
|
142
|
-
{svc.number}
|
|
143
|
-
</span>
|
|
144
|
-
)}
|
|
145
|
-
</div>
|
|
146
|
-
{/* Title */}
|
|
147
|
-
<h3 className="text-lg font-semibold text-stone-900 dark:text-stone-50 mb-3 group-hover:text-lime-300 transition-colors duration-300">
|
|
148
|
-
{svc.title}
|
|
149
|
-
</h3>
|
|
150
|
-
{/* Description */}
|
|
151
|
-
<p className="text-md text-stone-400 leading-relaxed mb-5 group-hover:text-stone-300 transition-colors duration-300">
|
|
152
|
-
{svc.description}
|
|
153
|
-
</p>
|
|
154
|
-
{/* Tags */}
|
|
155
|
-
{svc.tags && svc.tags.length > 0 && (
|
|
156
|
-
<div className="flex flex-wrap gap-2">
|
|
157
|
-
{svc.tags.map((t, ti) => (
|
|
158
|
-
<span
|
|
159
|
-
key={t.id ?? ti}
|
|
160
|
-
className="text-xs px-2.5 py-1 rounded-full bg-stone-800/10 bg-lines text-stone-400 border border-stone-700 group-hover:border-lime-500/40 group-hover:text-lime-300 transition-all duration-300"
|
|
161
|
-
>
|
|
162
|
-
{t.tag}
|
|
163
|
-
</span>
|
|
164
|
-
))}
|
|
165
|
-
</div>
|
|
166
|
-
)}
|
|
167
|
-
</div>
|
|
168
|
-
</SpotlightCard>
|
|
169
|
-
))}
|
|
170
|
-
</div>
|
|
171
|
-
)}
|
|
172
|
-
</div>
|
|
173
|
-
</div>
|
|
174
|
-
</>
|
|
175
|
-
)
|
|
176
|
-
}
|
|
1
|
+
'use client'
|
|
2
|
+
import React, { useRef, useState } from 'react'
|
|
3
|
+
import * as LucideIcons from 'lucide-react'
|
|
4
|
+
import { TextFade } from '@/components/ui/anims/fade'
|
|
5
|
+
import { cn } from '@/utilities/ui'
|
|
6
|
+
export type DDServicesProps = Record<string, any>
|
|
7
|
+
type TagItem = { id?: string | null; tag?: string | null }
|
|
8
|
+
type ServiceItem = {
|
|
9
|
+
id?: string | null
|
|
10
|
+
iconName?: string | null
|
|
11
|
+
number?: string | null
|
|
12
|
+
title?: string | null
|
|
13
|
+
description?: string | null
|
|
14
|
+
tags?: TagItem[] | null
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// ─── Dynamic Icon ─────────────────────────────────────────────────────────────
|
|
18
|
+
function DynamicIcon({
|
|
19
|
+
name,
|
|
20
|
+
size = 20,
|
|
21
|
+
...props
|
|
22
|
+
}: { name?: string | null } & Omit<LucideIcons.LucideProps, 'name'>) {
|
|
23
|
+
if (!name) return null
|
|
24
|
+
const Icon = (LucideIcons as unknown as Record<string, React.FC<LucideIcons.LucideProps>>)[name]
|
|
25
|
+
if (!Icon) return null
|
|
26
|
+
return <Icon size={size} {...props} />
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// ─── Spotlight Hover Card ─────────────────────────────────────────────────────
|
|
30
|
+
function SpotlightCard({ children, className }: { children: React.ReactNode; className?: string }) {
|
|
31
|
+
const ref = useRef<HTMLDivElement>(null)
|
|
32
|
+
const [pos, setPos] = useState<{ x: number; y: number } | null>(null)
|
|
33
|
+
|
|
34
|
+
const onMove = (e: React.MouseEvent<HTMLDivElement>) => {
|
|
35
|
+
if (!ref.current) return
|
|
36
|
+
const rect = ref.current.getBoundingClientRect()
|
|
37
|
+
setPos({
|
|
38
|
+
x: e.clientX - rect.left,
|
|
39
|
+
y: e.clientY - rect.top,
|
|
40
|
+
})
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const onLeave = () => setPos(null)
|
|
44
|
+
|
|
45
|
+
return (
|
|
46
|
+
<div
|
|
47
|
+
ref={ref}
|
|
48
|
+
onMouseMove={onMove}
|
|
49
|
+
onMouseLeave={onLeave}
|
|
50
|
+
className={cn('relative overflow-hidden transition-all duration-300', className)}
|
|
51
|
+
>
|
|
52
|
+
{/* spotlight */}
|
|
53
|
+
{pos && (
|
|
54
|
+
<div
|
|
55
|
+
className="pointer-events-none absolute inset-0 z-0 transition-opacity duration-300"
|
|
56
|
+
style={{
|
|
57
|
+
background: `radial-gradient(500px circle at ${pos.x}px ${pos.y}px, rgba(132,204,22,0.12), transparent 60%)`,
|
|
58
|
+
}}
|
|
59
|
+
/>
|
|
60
|
+
)}
|
|
61
|
+
|
|
62
|
+
{/* animated border glow */}
|
|
63
|
+
<div className="absolute inset-0 rounded-3xl border border-stone-100 dark:border-stone-800 group-hover:border-lime-500/60 transition-colors duration-300" />
|
|
64
|
+
|
|
65
|
+
{/* subtle noise / sheen */}
|
|
66
|
+
<div className="pointer-events-none absolute inset-0 opacity-0 group-hover:opacity-100 transition-opacity duration-500 bg-[linear-gradient(120deg,transparent,rgba(255,255,255,0.05),transparent)]" />
|
|
67
|
+
|
|
68
|
+
<div className="relative z-10">{children}</div>
|
|
69
|
+
</div>
|
|
70
|
+
)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// ─── Component ────────────────────────────────────────────────────────────────
|
|
74
|
+
export const DDServices: React.FC<DDServicesProps> = ({
|
|
75
|
+
eyebrow,
|
|
76
|
+
headlineMain,
|
|
77
|
+
headlineAccent,
|
|
78
|
+
description,
|
|
79
|
+
services,
|
|
80
|
+
sectionId,
|
|
81
|
+
customCSS,
|
|
82
|
+
}) => {
|
|
83
|
+
const serviceItems = (services ?? []) as ServiceItem[]
|
|
84
|
+
|
|
85
|
+
return (
|
|
86
|
+
<>
|
|
87
|
+
{customCSS && <style dangerouslySetInnerHTML={{ __html: customCSS }} />}
|
|
88
|
+
|
|
89
|
+
<div id={sectionId ?? 'services'} className="py-24">
|
|
90
|
+
<div className="max-w-6xl lg:max-w-7xl mx-auto px-4 md:px-6">
|
|
91
|
+
{/* Header */}#BlockName-DDServices
|
|
92
|
+
<div className="max-w-2xl mb-16">
|
|
93
|
+
<TextFade direction="right" className="text-base" delay={0}>
|
|
94
|
+
{eyebrow && (
|
|
95
|
+
<p className="text-[11.5px] font-semibold text-stone-400 tracking-widest uppercase mb-3 top-caption">
|
|
96
|
+
{eyebrow}
|
|
97
|
+
</p>
|
|
98
|
+
)}
|
|
99
|
+
</TextFade>
|
|
100
|
+
|
|
101
|
+
<TextFade direction="up" className="mt-0" delay={0.3}>
|
|
102
|
+
<h2 className="text-3d text-4xl md:text-5xl font-bold text-stone-900 dark:text-stone-50 leading-tight mb-5">
|
|
103
|
+
{headlineMain}
|
|
104
|
+
</h2>
|
|
105
|
+
</TextFade>
|
|
106
|
+
|
|
107
|
+
<TextFade direction="up" className="-mt-6" delay={0.3}>
|
|
108
|
+
<h2 className="text-3d text-4xl md:text-5xl font-bold text-stone-400 leading-tight mb-5">
|
|
109
|
+
{headlineAccent}
|
|
110
|
+
</h2>
|
|
111
|
+
</TextFade>
|
|
112
|
+
|
|
113
|
+
<TextFade direction="down" className="px-1" delay={0.5}>
|
|
114
|
+
{description && (
|
|
115
|
+
<p className="text-stone-700 dark:text-stone-300 text-base leading-relaxed">
|
|
116
|
+
{description}
|
|
117
|
+
</p>
|
|
118
|
+
)}
|
|
119
|
+
</TextFade>
|
|
120
|
+
</div>
|
|
121
|
+
{/* Services Grid */}
|
|
122
|
+
{serviceItems.length > 0 && (
|
|
123
|
+
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-5">
|
|
124
|
+
{serviceItems.map((svc, i) => (
|
|
125
|
+
<SpotlightCard
|
|
126
|
+
key={svc.id ?? i}
|
|
127
|
+
className="group bg-[#19171ca4] backdrop-blur-md rounded-3xl shadow-md hover:shadow-2xl hover:-translate-y-1 transition-all duration-300"
|
|
128
|
+
>
|
|
129
|
+
<div className="bg-dots h-full w-full shadow-inner brightness-90 absolute p-6 md:p-8">
|
|
130
|
+
{/* Icon Row */}
|
|
131
|
+
<div className="flex items-start justify-between mb-6">
|
|
132
|
+
<div className="w-12 h-12 flex items-center justify-center rounded-xl bg-stone-800/10 bg-lines border border-stone-600 group-hover:bg-stone-700 group-hover:scale-110 transition-all duration-300">
|
|
133
|
+
<DynamicIcon
|
|
134
|
+
className="text-stone-300 group-hover:text-lime-400 transition-colors duration-300"
|
|
135
|
+
name={svc.iconName}
|
|
136
|
+
size={20}
|
|
137
|
+
/>
|
|
138
|
+
</div>
|
|
139
|
+
|
|
140
|
+
{svc.number && (
|
|
141
|
+
<span className="text-xs font-mono text-stone-400 group-hover:text-lime-400 transition-colors duration-300">
|
|
142
|
+
{svc.number}
|
|
143
|
+
</span>
|
|
144
|
+
)}
|
|
145
|
+
</div>
|
|
146
|
+
{/* Title */}
|
|
147
|
+
<h3 className="text-lg font-semibold text-stone-900 dark:text-stone-50 mb-3 group-hover:text-lime-300 transition-colors duration-300">
|
|
148
|
+
{svc.title}
|
|
149
|
+
</h3>
|
|
150
|
+
{/* Description */}
|
|
151
|
+
<p className="text-md text-stone-400 leading-relaxed mb-5 group-hover:text-stone-300 transition-colors duration-300">
|
|
152
|
+
{svc.description}
|
|
153
|
+
</p>
|
|
154
|
+
{/* Tags */}
|
|
155
|
+
{svc.tags && svc.tags.length > 0 && (
|
|
156
|
+
<div className="flex flex-wrap gap-2">
|
|
157
|
+
{svc.tags.map((t, ti) => (
|
|
158
|
+
<span
|
|
159
|
+
key={t.id ?? ti}
|
|
160
|
+
className="text-xs px-2.5 py-1 rounded-full bg-stone-800/10 bg-lines text-stone-400 border border-stone-700 group-hover:border-lime-500/40 group-hover:text-lime-300 transition-all duration-300"
|
|
161
|
+
>
|
|
162
|
+
{t.tag}
|
|
163
|
+
</span>
|
|
164
|
+
))}
|
|
165
|
+
</div>
|
|
166
|
+
)}
|
|
167
|
+
</div>
|
|
168
|
+
</SpotlightCard>
|
|
169
|
+
))}
|
|
170
|
+
</div>
|
|
171
|
+
)}
|
|
172
|
+
</div>
|
|
173
|
+
</div>
|
|
174
|
+
</>
|
|
175
|
+
)
|
|
176
|
+
}
|