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.
Files changed (248) hide show
  1. package/README.md +35 -0
  2. package/package.json +1 -1
  3. package/src/utils/paths.js +13 -13
  4. package/templates/blocks/DD-Accordion/Component.tsx +229 -0
  5. package/templates/blocks/DD-Accordion/README.md +3 -0
  6. package/templates/blocks/DD-Accordion/config.ts +73 -0
  7. package/templates/blocks/DD-Accordion/manifest.json +75 -0
  8. package/templates/blocks/DD-AnimText/Component.tsx +788 -0
  9. package/templates/blocks/DD-AnimText/README.md +3 -0
  10. package/templates/blocks/DD-AnimText/config.ts +295 -0
  11. package/templates/blocks/DD-AnimText/manifest.json +85 -0
  12. package/templates/blocks/DD-AsideNav/Component.tsx +321 -0
  13. package/templates/blocks/DD-AsideNav/config.ts +204 -0
  14. package/templates/blocks/DD-AsideNav/manifest.json +80 -0
  15. package/templates/blocks/DD-Banner/Component.tsx +51 -0
  16. package/templates/blocks/DD-Banner/config.ts +57 -0
  17. package/templates/blocks/DD-Banner/manifest.json +72 -0
  18. package/templates/blocks/DD-BgLightning/Component.tsx +44 -0
  19. package/templates/blocks/DD-BgLightning/README.md +3 -0
  20. package/templates/blocks/DD-BgLightning/config.ts +97 -0
  21. package/templates/blocks/DD-BgLightning/manifest.json +79 -0
  22. package/templates/blocks/DD-BookCall/Component.tsx +10 -11
  23. package/templates/blocks/DD-BookCall/config.ts +238 -238
  24. package/templates/blocks/DD-ButtonPop/Component.tsx +117 -0
  25. package/templates/blocks/DD-ButtonPop/config.ts +105 -0
  26. package/templates/blocks/DD-ButtonPop/manifest.json +88 -0
  27. package/templates/blocks/DD-ButtonPop/svg-icons/Dust2.tsx +167 -0
  28. package/templates/blocks/DD-Card/Component.tsx +251 -0
  29. package/templates/blocks/DD-Card/README.md +4 -0
  30. package/templates/blocks/DD-Card/config.ts +154 -0
  31. package/templates/blocks/DD-Card/manifest.json +82 -0
  32. package/templates/blocks/DD-CardTemplate01/Component.tsx +5 -6
  33. package/templates/blocks/DD-CardTemplate01/config.ts +106 -106
  34. package/templates/blocks/DD-Carousel-A/Component.tsx +249 -249
  35. package/templates/blocks/DD-Carousel-B/Component.tsx +403 -403
  36. package/templates/blocks/DD-Chip/Component.tsx +250 -0
  37. package/templates/blocks/DD-Chip/EXAMPLES.md +313 -0
  38. package/templates/blocks/DD-Chip/README.md +202 -0
  39. package/templates/blocks/DD-Chip/config.ts +369 -0
  40. package/templates/blocks/DD-Chip/manifest.json +74 -0
  41. package/templates/blocks/DD-ComparisonTable/Component.tsx +256 -256
  42. package/templates/blocks/DD-Contact/Component.tsx +434 -434
  43. package/templates/blocks/DD-Contact/config.ts +22 -22
  44. package/templates/blocks/DD-Counter/Component.tsx +190 -0
  45. package/templates/blocks/DD-Counter/README.md +4 -0
  46. package/templates/blocks/DD-Counter/config.ts +291 -0
  47. package/templates/blocks/DD-Counter/manifest.json +74 -0
  48. package/templates/blocks/DD-CustomCSS/Component.tsx +8 -0
  49. package/templates/blocks/DD-CustomCSS/README.md +4 -0
  50. package/templates/blocks/DD-CustomCSS/addToLayout.md +5 -0
  51. package/templates/blocks/DD-CustomCSS/config.ts +22 -0
  52. package/templates/blocks/DD-CustomCSS/manifest.json +72 -0
  53. package/templates/blocks/DD-CustomCSS/renderCustomCSS.md +7 -0
  54. package/templates/blocks/DD-FeatCat/Component.tsx +302 -302
  55. package/templates/blocks/DD-FeatCat/config.ts +201 -201
  56. package/templates/blocks/DD-FeatStrip/Component.tsx +585 -585
  57. package/templates/blocks/DD-FeatStrip/config.ts +134 -134
  58. package/templates/blocks/DD-FluidBtn/ButtonsEyeCatching.tsx +628 -0
  59. package/templates/blocks/DD-FluidBtn/Component.tsx +43 -0
  60. package/templates/blocks/DD-FluidBtn/README.md +6 -0
  61. package/templates/blocks/DD-FluidBtn/config.ts +102 -0
  62. package/templates/blocks/DD-FluidBtn/manifest.json +86 -0
  63. package/templates/blocks/DD-GooeyInfo/Component.tsx +149 -0
  64. package/templates/blocks/DD-GooeyInfo/config.ts +135 -0
  65. package/templates/blocks/DD-GooeyInfo/manifest.json +72 -0
  66. package/templates/blocks/DD-Hero/Component.tsx +40 -17
  67. package/templates/blocks/DD-Hero/config.ts +267 -267
  68. package/templates/blocks/DD-HorizontalScroll/Component.tsx +4 -2
  69. package/templates/blocks/DD-HorizontalScroll/config.ts +231 -231
  70. package/templates/blocks/DD-Icon/Component.tsx +287 -0
  71. package/templates/blocks/DD-Icon/README.md +4 -0
  72. package/templates/blocks/DD-Icon/config.ts +258 -0
  73. package/templates/blocks/DD-Icon/hooks/revalidateBlockIds.ts +66 -0
  74. package/templates/blocks/DD-Icon/manifest.json +82 -0
  75. package/templates/blocks/DD-IconButton/Component.tsx +455 -0
  76. package/templates/blocks/DD-IconButton/README.md +326 -0
  77. package/templates/blocks/DD-IconButton/config.ts +239 -0
  78. package/templates/blocks/DD-IconButton/manifest.json +85 -0
  79. package/templates/blocks/DD-IdTag/Component.tsx +21 -0
  80. package/templates/blocks/DD-IdTag/README.md +4 -0
  81. package/templates/blocks/DD-IdTag/config.ts +41 -0
  82. package/templates/blocks/DD-IdTag/manifest.json +72 -0
  83. package/templates/blocks/DD-Iframe/Component.tsx +45 -0
  84. package/templates/blocks/DD-Iframe/README.md +4 -0
  85. package/templates/blocks/DD-Iframe/config.ts +47 -0
  86. package/templates/blocks/DD-Iframe/manifest.json +72 -0
  87. package/templates/blocks/DD-IframeMedia/Component.tsx +129 -0
  88. package/templates/blocks/DD-IframeMedia/README.md +4 -0
  89. package/templates/blocks/DD-IframeMedia/config.ts +79 -0
  90. package/templates/blocks/DD-IframeMedia/manifest.json +72 -0
  91. package/templates/blocks/DD-LineAnim/Component.tsx +36 -0
  92. package/templates/blocks/DD-LineAnim/README.md +4 -0
  93. package/templates/blocks/DD-LineAnim/config.ts +90 -0
  94. package/templates/blocks/DD-LineAnim/manifest.json +80 -0
  95. package/templates/blocks/DD-LinkGrid/Component.tsx +119 -0
  96. package/templates/blocks/DD-LinkGrid/README.md +4 -0
  97. package/templates/blocks/DD-LinkGrid/config.ts +51 -0
  98. package/templates/blocks/DD-LinkGrid/manifest.json +74 -0
  99. package/templates/blocks/DD-LogoMarq/Component.tsx +132 -0
  100. package/templates/blocks/DD-LogoMarq/README.md +4 -0
  101. package/templates/blocks/DD-LogoMarq/config.ts +264 -0
  102. package/templates/blocks/DD-LogoMarq/manifest.json +82 -0
  103. package/templates/blocks/DD-Lottie/Component.tsx +459 -0
  104. package/templates/blocks/DD-Lottie/README.md +4 -0
  105. package/templates/blocks/DD-Lottie/config.ts +379 -0
  106. package/templates/blocks/DD-Lottie/index.tsx +28 -0
  107. package/templates/blocks/DD-Lottie/manifest.json +83 -0
  108. package/templates/blocks/DD-MagicBento/Component.tsx +777 -0
  109. package/templates/blocks/DD-MagicBento/README.md +4 -0
  110. package/templates/blocks/DD-MagicBento/config.ts +264 -0
  111. package/templates/blocks/DD-MagicBento/manifest.json +74 -0
  112. package/templates/blocks/DD-MasonaryMedia/Component.tsx +547 -545
  113. package/templates/blocks/DD-MasonaryMedia/config.ts +2 -2
  114. package/templates/blocks/DD-MasonaryMedia/vendor.d.ts +2 -2
  115. package/templates/blocks/DD-Masonry/Component.tsx +645 -0
  116. package/templates/blocks/DD-Masonry/README.md +4 -0
  117. package/templates/blocks/DD-Masonry/config.ts +475 -0
  118. package/templates/blocks/DD-Masonry/manifest.json +82 -0
  119. package/templates/blocks/DD-Pricing/Component.tsx +372 -372
  120. package/templates/blocks/DD-Process/Component.tsx +149 -149
  121. package/templates/blocks/DD-Process/config.ts +150 -150
  122. package/templates/blocks/DD-Progress/Component.tsx +141 -0
  123. package/templates/blocks/DD-Progress/README.md +4 -0
  124. package/templates/blocks/DD-Progress/config.ts +175 -0
  125. package/templates/blocks/DD-Progress/manifest.json +74 -0
  126. package/templates/blocks/DD-ProjHeader/Component.tsx +91 -0
  127. package/templates/blocks/DD-ProjHeader/README.md +4 -0
  128. package/templates/blocks/DD-ProjHeader/config.ts +96 -0
  129. package/templates/blocks/DD-ProjHeader/manifest.json +72 -0
  130. package/templates/blocks/DD-ProjSlider/Component.tsx +123 -0
  131. package/templates/blocks/DD-ProjSlider/README.md +4 -0
  132. package/templates/blocks/DD-ProjSlider/config.ts +64 -0
  133. package/templates/blocks/DD-ProjSlider/manifest.json +72 -0
  134. package/templates/blocks/DD-ScrollText/Component.tsx +114 -0
  135. package/templates/blocks/DD-ScrollText/README.md +4 -0
  136. package/templates/blocks/DD-ScrollText/config.ts +58 -0
  137. package/templates/blocks/DD-ScrollText/manifest.json +72 -0
  138. package/templates/blocks/DD-Section/Component.tsx +266 -266
  139. package/templates/blocks/DD-Separator/Component.tsx +66 -0
  140. package/templates/blocks/DD-Separator/README.md +4 -0
  141. package/templates/blocks/DD-Separator/config.ts +58 -0
  142. package/templates/blocks/DD-Separator/manifest.json +72 -0
  143. package/templates/blocks/DD-Services/Component.tsx +176 -176
  144. package/templates/blocks/DD-Services/config.ts +149 -149
  145. package/templates/blocks/DD-ShowcaseGrid/Component.tsx +307 -307
  146. package/templates/blocks/DD-Slider-A/Component.tsx +237 -237
  147. package/templates/blocks/DD-StackCards/Component.tsx +473 -473
  148. package/templates/blocks/DD-StackCards/config.ts +399 -399
  149. package/templates/blocks/DD-Team/Component.tsx +247 -247
  150. package/templates/blocks/DD-Team/config.ts +173 -173
  151. package/templates/blocks/DD-TeamCards/Component.tsx +251 -0
  152. package/templates/blocks/DD-TeamCards/README.md +4 -0
  153. package/templates/blocks/DD-TeamCards/config.ts +302 -0
  154. package/templates/blocks/DD-TeamCards/manifest.json +74 -0
  155. package/templates/blocks/DD-TechStack/Component.tsx +168 -162
  156. package/templates/blocks/DD-TechStack/config.ts +153 -153
  157. package/templates/blocks/DD-TestMarq/Component.tsx +132 -0
  158. package/templates/blocks/DD-TestMarq/README.md +4 -0
  159. package/templates/blocks/DD-TestMarq/RowLabel.tsx +9 -0
  160. package/templates/blocks/DD-TestMarq/config.ts +88 -0
  161. package/templates/blocks/DD-TestMarq/manifest.json +72 -0
  162. package/templates/blocks/DD-Testim/Component.tsx +247 -0
  163. package/templates/blocks/DD-Testim/README.md +4 -0
  164. package/templates/blocks/DD-Testim/config.ts +101 -0
  165. package/templates/blocks/DD-Testim/manifest.json +75 -0
  166. package/templates/blocks/DD-Testim2/Component.tsx +256 -0
  167. package/templates/blocks/DD-Testim2/README.md +4 -0
  168. package/templates/blocks/DD-Testim2/config.ts +100 -0
  169. package/templates/blocks/DD-Testim2/manifest.json +74 -0
  170. package/templates/blocks/DD-Testimonials/Component.tsx +147 -147
  171. package/templates/blocks/DD-Testimonials/config.ts +120 -120
  172. package/templates/blocks/DD-TextMarq/Component.tsx +157 -0
  173. package/templates/blocks/DD-TextMarq/README.md +4 -0
  174. package/templates/blocks/DD-TextMarq/config.ts +237 -0
  175. package/templates/blocks/DD-TextMarq/manifest.json +82 -0
  176. package/templates/blocks/DD-Thanks/Component.tsx +500 -0
  177. package/templates/blocks/DD-Thanks/README.md +4 -0
  178. package/templates/blocks/DD-Thanks/config.ts +224 -0
  179. package/templates/blocks/DD-Thanks/manifest.json +72 -0
  180. package/templates/blocks/DD-VertMarq/Component.tsx +154 -0
  181. package/templates/blocks/DD-VertMarq/README.md +4 -0
  182. package/templates/blocks/DD-VertMarq/config.ts +236 -0
  183. package/templates/blocks/DD-VertMarq/dist/index.css +6 -0
  184. package/templates/blocks/DD-VertMarq/dist/index.min.css +1 -0
  185. package/templates/blocks/DD-VertMarq/manifest.json +74 -0
  186. package/templates/blocks/DD-Work/Component.tsx +318 -315
  187. package/templates/blocks/DD-Work/config.ts +165 -165
  188. package/templates/blocks/DD-Work-B/Component.tsx +294 -294
  189. package/templates/blocks/DDHG-CTASection2/Component.tsx +185 -0
  190. package/templates/blocks/DDHG-CTASection2/config.ts +140 -0
  191. package/templates/blocks/DDHG-CTASection2/manifest.json +45 -0
  192. package/templates/blocks/DDHG-HighlightArc/Component.tsx +243 -0
  193. package/templates/blocks/DDHG-HighlightArc/config.ts +85 -0
  194. package/templates/blocks/DDHG-HighlightArc/manifest.json +46 -0
  195. package/templates/blocks/DDHG-LogoMarquee/Component.tsx +93 -0
  196. package/templates/blocks/DDHG-LogoMarquee/config.ts +66 -0
  197. package/templates/blocks/DDHG-LogoMarquee/manifest.json +39 -0
  198. package/templates/blocks/DDHG-NavCodeGrid/Component.tsx +213 -0
  199. package/templates/blocks/DDHG-NavCodeGrid/config.ts +64 -0
  200. package/templates/blocks/DDHG-NavCodeGrid/manifest.json +45 -0
  201. package/templates/blocks/DDHG-ProcessSec/Component.tsx +575 -0
  202. package/templates/blocks/DDHG-ProcessSec/config.ts +170 -0
  203. package/templates/blocks/DDHG-ProcessSec/manifest.json +56 -0
  204. package/templates/blocks/DDHG-ServiceDetails/Component.tsx +164 -0
  205. package/templates/blocks/DDHG-ServiceDetails/ServiceDetailCard.tsx +394 -0
  206. package/templates/blocks/DDHG-ServiceDetails/config.ts +77 -0
  207. package/templates/blocks/DDHG-ServiceDetails/manifest.json +50 -0
  208. package/templates/blocks/DDHG-ServiceHero/Component.tsx +234 -0
  209. package/templates/blocks/DDHG-ServiceHero/config.ts +49 -0
  210. package/templates/blocks/DDHG-ServiceHero/manifest.json +26 -0
  211. package/templates/blocks/DDHG-ServiceOverview/Component.tsx +277 -0
  212. package/templates/blocks/DDHG-ServiceOverview/config.ts +64 -0
  213. package/templates/blocks/DDHG-ServiceOverview/manifest.json +44 -0
  214. package/templates/blocks/DDHG-StatsFAQ/Component.tsx +389 -0
  215. package/templates/blocks/DDHG-StatsFAQ/config.ts +204 -0
  216. package/templates/blocks/DDHG-StatsFAQ/manifest.json +45 -0
  217. package/templates/blocks/DDHG-TeamCards/Component.tsx +131 -0
  218. package/templates/blocks/DDHG-TeamCards/config.ts +48 -0
  219. package/templates/blocks/DDHG-TeamCards/manifest.json +29 -0
  220. package/templates/components/HeaderDD02/MobileBottomNav/index.tsx +352 -257
  221. package/templates/components/HeaderDD02/index.tsx +313 -229
  222. package/templates/shared/src/components/BgLightning/index.tsx +242 -0
  223. package/templates/shared/src/components/ui/ShareButton/index.tsx +80 -0
  224. package/templates/shared/src/components/ui/anims/FadeOnScroll.tsx +48 -0
  225. package/templates/shared/src/components/ui/anims/FadeUpOnInView.tsx +63 -0
  226. package/templates/shared/src/components/ui/anims/GlareHover.tsx +111 -0
  227. package/templates/shared/src/components/ui/anims/LineAnims.tsx +81 -0
  228. package/templates/shared/src/components/ui/anims/TitleAnims01.tsx +54 -0
  229. package/templates/shared/src/components/ui/anims/animation-container.tsx +29 -0
  230. package/templates/shared/src/components/ui/anims/blur-in.tsx +26 -0
  231. package/templates/shared/src/components/ui/anims/counter.tsx +53 -0
  232. package/templates/shared/src/components/ui/anims/fade.tsx +83 -0
  233. package/templates/shared/src/components/ui/anims/gradual-spacing.tsx +39 -0
  234. package/templates/shared/src/components/ui/anims/pull-up.tsx +93 -0
  235. package/templates/shared/src/components/ui/anims/reveal-text.tsx +76 -0
  236. package/templates/shared/src/components/ui/anims/rotate-words.tsx +43 -0
  237. package/templates/shared/src/components/ui/anims/shiny-text.tsx +58 -0
  238. package/templates/shared/src/components/ui/anims/shuffle-text.tsx +85 -0
  239. package/templates/shared/src/components/ui/anims/split-text.tsx +211 -0
  240. package/templates/shared/src/components/ui/anims/staggered-fade.tsx +133 -0
  241. package/templates/shared/src/components/ui/anims/text-scroll.tsx +111 -0
  242. package/templates/shared/src/components/ui/anims/typing-effect.tsx +112 -0
  243. package/templates/shared/src/components/ui/button-dusted-fluid/index.tsx +1521 -0
  244. package/templates/shared/src/components/ui/separator.tsx +85 -0
  245. package/templates/shared/src/hooks/useBodyScrollLock.ts +97 -0
  246. package/templates/shared/src/hooks/useClickOutside.ts +28 -0
  247. package/templates/shared/src/utilities/renderCustomCSS.ts +5 -0
  248. 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,5 @@
1
+ export const extractCustomCSS = (blocks: any[]) =>
2
+ (Array.isArray(blocks) ? blocks : [])
3
+ ?.filter((block) => block.blockType === 'customCSS')
4
+ .map((block) => block.css)
5
+ .join('\n')
@@ -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
+ }