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