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,85 @@
|
|
|
1
|
+
import { cn } from '@/utilities/ui'
|
|
2
|
+
//import { FaPlus } from 'react-icons/fa';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
*
|
|
6
|
+
* USAGE EXAMPLES
|
|
7
|
+
*
|
|
8
|
+
* const Usage = () => (
|
|
9
|
+
<div>
|
|
10
|
+
<Separator gradient />
|
|
11
|
+
<Separator />
|
|
12
|
+
<Separator label={<span className="px-2">Section</span>} gradient />
|
|
13
|
+
<Separator label={<span className="px-2">Section</span>} />
|
|
14
|
+
<Separator
|
|
15
|
+
label={
|
|
16
|
+
<div className="border px-4 py-1 rounded-full border-dashed">
|
|
17
|
+
Section
|
|
18
|
+
</div>
|
|
19
|
+
}
|
|
20
|
+
gradient
|
|
21
|
+
/>
|
|
22
|
+
<Separator
|
|
23
|
+
label={<div className="border px-4 py-1 rounded-full">Section</div>}
|
|
24
|
+
/>
|
|
25
|
+
<Separator
|
|
26
|
+
label={
|
|
27
|
+
<div className="border px-12 py-2 rounded-full">
|
|
28
|
+
<FaPlus />
|
|
29
|
+
</div>
|
|
30
|
+
}
|
|
31
|
+
gradient
|
|
32
|
+
/>
|
|
33
|
+
</div>
|
|
34
|
+
);
|
|
35
|
+
*/
|
|
36
|
+
type SeparatorProps = {
|
|
37
|
+
/**
|
|
38
|
+
* @default ""
|
|
39
|
+
*/
|
|
40
|
+
label?: React.ReactNode
|
|
41
|
+
/**
|
|
42
|
+
* @default false
|
|
43
|
+
*/
|
|
44
|
+
gradient?: boolean
|
|
45
|
+
className?: string
|
|
46
|
+
}
|
|
47
|
+
//======================================
|
|
48
|
+
export const Separator = ({ label, gradient = false, className = '' }: SeparatorProps) => {
|
|
49
|
+
if (label) {
|
|
50
|
+
return (
|
|
51
|
+
<div className="separator-container flex items-center w-full">
|
|
52
|
+
<div
|
|
53
|
+
className={cn(
|
|
54
|
+
'rounded-full w-full h-[0.3px]',
|
|
55
|
+
gradient
|
|
56
|
+
? 'bg-gradient-to-r from-transparent dark:from-zinc-800 dark:to-zinc-400 to-zinc-500'
|
|
57
|
+
: 'bg-white dark:bg-gradient ',
|
|
58
|
+
className
|
|
59
|
+
)}
|
|
60
|
+
></div>
|
|
61
|
+
<div className="text-gray-600 uppercase w-fit dark:text-gray-300 text-nowrap">{label}</div>
|
|
62
|
+
<div
|
|
63
|
+
className={cn(
|
|
64
|
+
'rounded-full w-full h-[1px]',
|
|
65
|
+
gradient
|
|
66
|
+
? 'bg-gradient-to-r from-zinc-500 dark:from-zinc-200 to-transparent dark:to-zinc-500'
|
|
67
|
+
: 'bg-white dark:bg-gradient ',
|
|
68
|
+
className
|
|
69
|
+
)}
|
|
70
|
+
></div>
|
|
71
|
+
</div>
|
|
72
|
+
)
|
|
73
|
+
}
|
|
74
|
+
return (
|
|
75
|
+
<div
|
|
76
|
+
className={cn(
|
|
77
|
+
'rounded-full w-full h-[1px]',
|
|
78
|
+
gradient
|
|
79
|
+
? 'bg-gradient-to-r from-transparent via-zinc-500 dark:via-zinc-200 to-transparent dark:from-zinc-800 dark:to-zinc-700'
|
|
80
|
+
: 'bg-white/10 dark:bg-white/10',
|
|
81
|
+
className
|
|
82
|
+
)}
|
|
83
|
+
/>
|
|
84
|
+
)
|
|
85
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import { useEffect } from 'react'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Hook to lock body scroll when a modal is open
|
|
7
|
+
* Handles both standard scrolling and Locomotive Scroll
|
|
8
|
+
* Applies to both html and body elements for maximum compatibility
|
|
9
|
+
*
|
|
10
|
+
* @param isLocked - Whether the body scroll should be locked
|
|
11
|
+
* @param scrollYDataKey - Optional key for storing scroll position in dataset (default: 'modalScrollY')
|
|
12
|
+
*/
|
|
13
|
+
export function useBodyScrollLock(isLocked: boolean, scrollYDataKey: string = 'modalScrollY') {
|
|
14
|
+
useEffect(() => {
|
|
15
|
+
if (typeof window === 'undefined') return
|
|
16
|
+
|
|
17
|
+
const html = document.documentElement
|
|
18
|
+
const body = document.body
|
|
19
|
+
|
|
20
|
+
if (!isLocked) {
|
|
21
|
+
// Restore scroll
|
|
22
|
+
const scrollYRaw = body.dataset[scrollYDataKey]
|
|
23
|
+
const scrollY = scrollYRaw ? Number(scrollYRaw) : 0
|
|
24
|
+
|
|
25
|
+
// Remove lock styles from html
|
|
26
|
+
html.style.overflow = ''
|
|
27
|
+
html.style.height = ''
|
|
28
|
+
|
|
29
|
+
// Remove lock styles from body
|
|
30
|
+
body.style.overflow = ''
|
|
31
|
+
body.style.position = ''
|
|
32
|
+
body.style.top = ''
|
|
33
|
+
body.style.width = ''
|
|
34
|
+
body.style.height = ''
|
|
35
|
+
delete body.dataset[scrollYDataKey]
|
|
36
|
+
|
|
37
|
+
window.scrollTo(0, scrollY)
|
|
38
|
+
|
|
39
|
+
// Resume Locomotive Scroll if available
|
|
40
|
+
const locoScroll = (window as any).locoScroll
|
|
41
|
+
if (locoScroll && typeof locoScroll.start === 'function') {
|
|
42
|
+
locoScroll.start()
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Lock scroll
|
|
49
|
+
const scrollY = window.scrollY
|
|
50
|
+
const locoScroll = (window as any).locoScroll
|
|
51
|
+
|
|
52
|
+
// Stop Locomotive Scroll if available
|
|
53
|
+
if (locoScroll && typeof locoScroll.stop === 'function') {
|
|
54
|
+
locoScroll.stop()
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Save scroll position and lock both html and body
|
|
58
|
+
body.dataset[scrollYDataKey] = String(scrollY)
|
|
59
|
+
|
|
60
|
+
// Lock html element
|
|
61
|
+
html.style.overflow = 'hidden'
|
|
62
|
+
html.style.height = '100%'
|
|
63
|
+
|
|
64
|
+
// Lock body element with fixed positioning
|
|
65
|
+
body.style.overflow = 'hidden'
|
|
66
|
+
body.style.position = 'fixed'
|
|
67
|
+
body.style.top = `-${scrollY}px`
|
|
68
|
+
body.style.width = '100%'
|
|
69
|
+
body.style.height = '100%'
|
|
70
|
+
|
|
71
|
+
// Cleanup on unmount
|
|
72
|
+
return () => {
|
|
73
|
+
const scrollYRaw = body.dataset[scrollYDataKey]
|
|
74
|
+
const scrollY = scrollYRaw ? Number(scrollYRaw) : 0
|
|
75
|
+
|
|
76
|
+
// Remove lock styles from html
|
|
77
|
+
html.style.overflow = ''
|
|
78
|
+
html.style.height = ''
|
|
79
|
+
|
|
80
|
+
// Remove lock styles from body
|
|
81
|
+
body.style.overflow = ''
|
|
82
|
+
body.style.position = ''
|
|
83
|
+
body.style.top = ''
|
|
84
|
+
body.style.width = ''
|
|
85
|
+
body.style.height = ''
|
|
86
|
+
delete body.dataset[scrollYDataKey]
|
|
87
|
+
|
|
88
|
+
window.scrollTo(0, scrollY)
|
|
89
|
+
|
|
90
|
+
// Resume Locomotive Scroll if available
|
|
91
|
+
const locoScroll = (window as any).locoScroll
|
|
92
|
+
if (locoScroll && typeof locoScroll.start === 'function') {
|
|
93
|
+
locoScroll.start()
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}, [isLocked, scrollYDataKey])
|
|
97
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
'use client'
|
|
2
|
+
|
|
3
|
+
import { useEffect, RefObject } from 'react'
|
|
4
|
+
|
|
5
|
+
export function useClickOutside<T extends HTMLElement = HTMLElement>(
|
|
6
|
+
ref: RefObject<T>,
|
|
7
|
+
handler: (event: MouseEvent | TouchEvent) => void,
|
|
8
|
+
) {
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
const listener = (event: MouseEvent | TouchEvent) => {
|
|
11
|
+
const el = ref?.current
|
|
12
|
+
if (!el || el.contains(event.target as Node)) {
|
|
13
|
+
return
|
|
14
|
+
}
|
|
15
|
+
handler(event)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
document.addEventListener('mousedown', listener)
|
|
19
|
+
document.addEventListener('touchstart', listener)
|
|
20
|
+
|
|
21
|
+
return () => {
|
|
22
|
+
document.removeEventListener('mousedown', listener)
|
|
23
|
+
document.removeEventListener('touchstart', listener)
|
|
24
|
+
}
|
|
25
|
+
}, [ref, handler])
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export default useClickOutside
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { gsap } from 'gsap'
|
|
2
|
+
import { ScrollToPlugin } from 'gsap/ScrollToPlugin'
|
|
3
|
+
|
|
4
|
+
// Register the ScrollToPlugin
|
|
5
|
+
gsap.registerPlugin(ScrollToPlugin)
|
|
6
|
+
|
|
7
|
+
export interface SmoothScrollOptions {
|
|
8
|
+
duration?: number
|
|
9
|
+
offsetY?: number
|
|
10
|
+
ease?: string
|
|
11
|
+
onComplete?: () => void
|
|
12
|
+
onStart?: () => void
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Smooth scroll to an element using GSAP
|
|
17
|
+
* @param targetId - The ID of the target element (with or without #)
|
|
18
|
+
* @param options - Scroll options
|
|
19
|
+
*/
|
|
20
|
+
export const smoothScrollTo = (targetId: string, options: SmoothScrollOptions = {}): void => {
|
|
21
|
+
const { duration = 1, offsetY = 80, ease = 'power2.out', onComplete, onStart } = options
|
|
22
|
+
|
|
23
|
+
// Remove the # from the beginning of the targetId if it exists
|
|
24
|
+
const cleanTargetId = targetId.startsWith('#') ? targetId.slice(1) : targetId
|
|
25
|
+
|
|
26
|
+
// Check if the target element exists
|
|
27
|
+
const targetElement = document.getElementById(cleanTargetId)
|
|
28
|
+
if (!targetElement) {
|
|
29
|
+
console.warn(`Element with id "${cleanTargetId}" not found`)
|
|
30
|
+
return
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Call onStart callback if provided
|
|
34
|
+
onStart?.()
|
|
35
|
+
|
|
36
|
+
gsap.to(window, {
|
|
37
|
+
duration,
|
|
38
|
+
scrollTo: { y: `#${cleanTargetId}`, offsetY },
|
|
39
|
+
ease,
|
|
40
|
+
onComplete,
|
|
41
|
+
})
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Check if a URL is an anchor link
|
|
46
|
+
*/
|
|
47
|
+
export const isAnchorLink = (url: string): boolean => {
|
|
48
|
+
return url.startsWith('#')
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Handle click event for smooth scrolling anchor links
|
|
53
|
+
*/
|
|
54
|
+
export const handleAnchorClick = (
|
|
55
|
+
href: string,
|
|
56
|
+
event?: React.MouseEvent,
|
|
57
|
+
options?: SmoothScrollOptions,
|
|
58
|
+
): boolean => {
|
|
59
|
+
if (isAnchorLink(href)) {
|
|
60
|
+
event?.preventDefault()
|
|
61
|
+
smoothScrollTo(href, options)
|
|
62
|
+
return true // Indicates that smooth scroll was handled
|
|
63
|
+
}
|
|
64
|
+
return false // Indicates that this is not an anchor link
|
|
65
|
+
}
|