blocks-dusted 0.1.11 → 0.1.13

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 (161) hide show
  1. package/package.json +5 -2
  2. package/src/cli.js +39 -3
  3. package/src/commands/shop.js +59 -0
  4. package/src/commands/warehouse.js +73 -0
  5. package/src/installers/patchRenderBlocks.js +1 -1
  6. package/src/registry/validateTemplateManifest.js +2 -1
  7. package/templates/blocks/BannerDD790432/Component.tsx +63 -0
  8. package/templates/blocks/BannerDD790432/config.ts +54 -0
  9. package/templates/blocks/BannerDD790432/manifest.json +80 -0
  10. package/templates/blocks/Button47/Component.tsx +124 -0
  11. package/templates/blocks/Button47/config.ts +75 -0
  12. package/templates/blocks/Button47/link.ts +22 -0
  13. package/templates/blocks/Button47/manifest.json +105 -0
  14. package/templates/blocks/Button47/styles.module.scss +75 -0
  15. package/templates/blocks/DD-Accordion/Component.tsx +55 -36
  16. package/templates/blocks/DD-Accordion/config.ts +71 -59
  17. package/templates/blocks/DD-AnimText/Component.tsx +50 -32
  18. package/templates/blocks/DD-AnimText/config.ts +296 -295
  19. package/templates/blocks/DD-AsideNav/Component.tsx +323 -319
  20. package/templates/blocks/DD-Banner/Component.tsx +54 -51
  21. package/templates/blocks/DD-BookCall/Component.tsx +10 -9
  22. package/templates/blocks/DD-ButtonPop/Component.tsx +118 -117
  23. package/templates/blocks/DD-Card/Component.tsx +4 -4
  24. package/templates/blocks/DD-CardTemplate01/Component.tsx +5 -5
  25. package/templates/blocks/DD-CardsWithVariantV3/Component.tsx +472 -0
  26. package/templates/blocks/DD-CardsWithVariantV3/ElectricBorder/index.tsx +203 -0
  27. package/templates/blocks/DD-CardsWithVariantV3/ElectricBorder/styles.ts +87 -0
  28. package/templates/blocks/DD-CardsWithVariantV3/ElectricBorder/useInjectStyle.ts +39 -0
  29. package/templates/blocks/DD-CardsWithVariantV3/config.ts +326 -0
  30. package/templates/blocks/DD-CardsWithVariantV3/manifest.json +110 -0
  31. package/templates/blocks/DD-Carousel-A/Component.tsx +251 -249
  32. package/templates/blocks/DD-Carousel-B/Component.tsx +405 -403
  33. package/templates/blocks/DD-Chip/Component.tsx +14 -14
  34. package/templates/blocks/DD-ComparisonTable/Component.tsx +255 -256
  35. package/templates/blocks/DD-Contact/Component.tsx +433 -434
  36. package/templates/blocks/DD-Counter/Component.tsx +18 -13
  37. package/templates/blocks/DD-DeliCard/Component.tsx +303 -0
  38. package/templates/blocks/DD-DeliCard/config.ts +186 -0
  39. package/templates/blocks/DD-DeliCard/manifest.json +94 -0
  40. package/templates/blocks/DD-FeatCat/Component.tsx +302 -302
  41. package/templates/blocks/DD-FeatProd/CircularGallery.tsx +1179 -0
  42. package/templates/blocks/DD-FeatProd/Component.tsx +484 -0
  43. package/templates/blocks/DD-FeatProd/config.ts +173 -0
  44. package/templates/blocks/DD-FeatProd/manifest.json +93 -0
  45. package/templates/blocks/DD-FeatServ/Component.tsx +607 -0
  46. package/templates/blocks/DD-FeatServ/config.ts +213 -0
  47. package/templates/blocks/DD-FeatServ/manifest.json +113 -0
  48. package/templates/blocks/DD-FeatStrip/Component.tsx +584 -585
  49. package/templates/blocks/DD-FluidBtn/ButtonsEyeCatching.tsx +627 -628
  50. package/templates/blocks/DD-FluidBtn/Component.tsx +46 -43
  51. package/templates/blocks/DD-GooeyInfo/Component.tsx +150 -149
  52. package/templates/blocks/DD-GooeyInfo/config.ts +136 -135
  53. package/templates/blocks/DD-Hero/Component.tsx +16 -40
  54. package/templates/blocks/DD-HeroPlas/Component.tsx +50 -0
  55. package/templates/blocks/DD-HeroPlas/ThreeScene.tsx +109 -0
  56. package/templates/blocks/DD-HeroPlas/config.ts +33 -0
  57. package/templates/blocks/DD-HeroPlas/manifest.json +88 -0
  58. package/templates/blocks/DD-HorizontalScroll/Component.tsx +4 -5
  59. package/templates/blocks/DD-Icon/Component.tsx +46 -81
  60. package/templates/blocks/DD-IconButton/Component.tsx +13 -20
  61. package/templates/blocks/DD-IdTag/Component.tsx +22 -21
  62. package/templates/blocks/DD-IframeMedia/Component.tsx +14 -10
  63. package/templates/blocks/DD-LineAnim/Component.tsx +42 -36
  64. package/templates/blocks/DD-LogoMarq/Component.tsx +38 -48
  65. package/templates/blocks/DD-Lottie/Component.tsx +11 -3
  66. package/templates/blocks/DD-MasonaryMedia/Component.tsx +544 -547
  67. package/templates/blocks/DD-MasonaryMedia/config.ts +389 -389
  68. package/templates/blocks/DD-Masonry/Component.tsx +654 -644
  69. package/templates/blocks/DD-Masonry/config.ts +475 -475
  70. package/templates/blocks/DD-MaterialSwatches/Component.tsx +85 -0
  71. package/templates/blocks/DD-MaterialSwatches/config.ts +232 -0
  72. package/templates/blocks/DD-MaterialSwatches/manifest.json +84 -0
  73. package/templates/blocks/DD-MaterialSwatches/material.ts +107 -0
  74. package/templates/blocks/DD-NineCanvas/Component.tsx +129 -0
  75. package/templates/blocks/DD-NineCanvas/RenderBlocks.tsx +244 -0
  76. package/templates/blocks/DD-NineCanvas/allowedCanvasBlocks.ts +6 -0
  77. package/templates/blocks/DD-NineCanvas/blockComponents.tsx +8 -0
  78. package/templates/blocks/DD-NineCanvas/canvas/CanvasGrid.tsx +316 -0
  79. package/templates/blocks/DD-NineCanvas/canvas/RadialNav.tsx +432 -0
  80. package/templates/blocks/DD-NineCanvas/canvas/canvas-panels.css +889 -0
  81. package/templates/blocks/DD-NineCanvas/canvas/icons/custom-icons.tsx +364 -0
  82. package/templates/blocks/DD-NineCanvas/config.ts +61 -0
  83. package/templates/blocks/DD-NineCanvas/manifest.json +165 -0
  84. package/templates/blocks/DD-NineCanvas/styles.scss +152 -0
  85. package/templates/blocks/DD-NineCanvas/tooltip/get-strict-context.tsx +26 -0
  86. package/templates/blocks/DD-NineCanvas/tooltip/primitives.tsx +178 -0
  87. package/templates/blocks/DD-NineCanvas/tooltip/tooltip.tsx +71 -0
  88. package/templates/blocks/DD-NineCanvas/tooltip/use-controlled-state.tsx +33 -0
  89. package/templates/blocks/DD-NineCanvas/utilities/FadeOnScroll.tsx +68 -0
  90. package/templates/blocks/DD-NineCanvas/utilities/ParallaxWrapper.tsx +157 -0
  91. package/templates/blocks/DD-NineCanvas/utilities/renderCustomCSS.ts +5 -0
  92. package/templates/blocks/DD-NineCanvas/utilities/webglCleanup.ts +27 -0
  93. package/templates/blocks/DD-PayloadAIAssistant/Component.tsx +78 -0
  94. package/templates/blocks/DD-PayloadAIAssistant/DustedBot.tsx +590 -0
  95. package/templates/blocks/DD-PayloadAIAssistant/config.ts +37 -0
  96. package/templates/blocks/DD-PayloadAIAssistant/demo.css +125 -0
  97. package/templates/blocks/DD-PayloadAIAssistant/manifest.json +93 -0
  98. package/templates/blocks/DD-PayloadAIAssistant/source-defaults.ts +17 -0
  99. package/templates/blocks/DD-PayloadAIAssistant/styles.ts +306 -0
  100. package/templates/blocks/DD-Pricing/Component.tsx +368 -372
  101. package/templates/blocks/DD-Pricing/config.ts +215 -215
  102. package/templates/blocks/DD-Process/Component.tsx +147 -149
  103. package/templates/blocks/DD-Progress/Component.tsx +156 -141
  104. package/templates/blocks/DD-ProjHeader/Component.tsx +93 -91
  105. package/templates/blocks/DD-ProjSlider/Component.tsx +1 -1
  106. package/templates/blocks/DD-ProjSlider/config.ts +2 -2
  107. package/templates/blocks/DD-Section/Component.tsx +265 -266
  108. package/templates/blocks/DD-Separator/Component.tsx +66 -66
  109. package/templates/blocks/DD-Services/Component.tsx +176 -176
  110. package/templates/blocks/DD-ShowcaseGrid/Component.tsx +306 -307
  111. package/templates/blocks/DD-Slider-A/Component.tsx +237 -237
  112. package/templates/blocks/DD-StackCards/Component.tsx +474 -473
  113. package/templates/blocks/DD-Team/Component.tsx +247 -247
  114. package/templates/blocks/DD-TeamCards/Component.tsx +251 -251
  115. package/templates/blocks/DD-TechStack/Component.tsx +161 -168
  116. package/templates/blocks/DD-TestMarq/Component.tsx +158 -132
  117. package/templates/blocks/DD-Testim/Component.tsx +247 -247
  118. package/templates/blocks/DD-Testim2/Component.tsx +265 -256
  119. package/templates/blocks/DD-Testimonials/Component.tsx +139 -147
  120. package/templates/blocks/DD-TextMarq/Component.tsx +157 -157
  121. package/templates/blocks/DD-Thanks/Component.tsx +501 -500
  122. package/templates/blocks/DD-Work/Component.tsx +315 -315
  123. package/templates/blocks/DD-Work-B/Component.tsx +294 -294
  124. package/templates/blocks/DDHG-CTASection2/Component.tsx +183 -184
  125. package/templates/blocks/DDHG-HighlightArc/Component.tsx +246 -243
  126. package/templates/blocks/DDHG-LogoMarquee/Component.tsx +180 -93
  127. package/templates/blocks/DDHG-LogoMarquee/config.ts +154 -66
  128. package/templates/blocks/DDHG-NavCodeGrid/Component.tsx +225 -213
  129. package/templates/blocks/DDHG-ProcessSec/Component.tsx +38 -39
  130. package/templates/blocks/DDHG-ServiceDetails/Component.tsx +11 -11
  131. package/templates/blocks/DDHG-ServiceDetails/ServiceDetailCard.tsx +30 -47
  132. package/templates/blocks/DDHG-ServiceHero/Component.tsx +10 -10
  133. package/templates/blocks/DDHG-ServiceOverview/Component.tsx +23 -23
  134. package/templates/blocks/DDHG-StatsFAQ/Component.tsx +40 -40
  135. package/templates/blocks/DDHG-TeamCards/Component.tsx +140 -131
  136. package/templates/blocks/Form/Checkbox/index.tsx +45 -0
  137. package/templates/blocks/Form/Component.tsx +163 -0
  138. package/templates/blocks/Form/Country/index.tsx +65 -0
  139. package/templates/blocks/Form/Country/options.ts +982 -0
  140. package/templates/blocks/Form/Email/index.tsx +38 -0
  141. package/templates/blocks/Form/Error/index.tsx +15 -0
  142. package/templates/blocks/Form/Message/index.tsx +13 -0
  143. package/templates/blocks/Form/Number/index.tsx +36 -0
  144. package/templates/blocks/Form/Select/index.tsx +63 -0
  145. package/templates/blocks/Form/State/index.tsx +64 -0
  146. package/templates/blocks/Form/State/options.ts +52 -0
  147. package/templates/blocks/Form/Text/index.tsx +32 -0
  148. package/templates/blocks/Form/Textarea/index.tsx +40 -0
  149. package/templates/blocks/Form/Width/index.tsx +13 -0
  150. package/templates/blocks/Form/config.ts +51 -0
  151. package/templates/blocks/Form/fields.tsx +21 -0
  152. package/templates/blocks/Form/manifest.json +168 -0
  153. package/templates/blocks/MediaBlock/Component.tsx +67 -0
  154. package/templates/blocks/MediaBlock/config.ts +14 -0
  155. package/templates/blocks/MediaBlock/manifest.json +92 -0
  156. package/templates/blocks/TransitionsDustedShowcase/Component.tsx +9 -0
  157. package/templates/blocks/TransitionsDustedShowcase/config.ts +13 -0
  158. package/templates/blocks/TransitionsDustedShowcase/manifest.json +80 -0
  159. package/templates/blocks/rawHtml/Component.tsx +25 -0
  160. package/templates/blocks/rawHtml/config.ts +56 -0
  161. package/templates/blocks/rawHtml/manifest.json +80 -0
@@ -1,43 +1,46 @@
1
- 'use client'
2
-
3
- import * as React from 'react'
4
- import ButtonDustedFluid, {
5
- type ButtonDustedFluidLinkType
6
- } from '@/components/ui/button-dusted-fluid'
7
- import { cn } from '@/utilities/ui'
8
-
9
- export type ButtonECDustedFluidProps = {
10
- variant?: 'v1' | 'v2' | 'v3' | 'v4' | 'v5'
11
- label?: string
12
- className?: string
13
- wrapperClassName?: string
14
- displayMode?: 'iconWithLabel' | 'iconOnly' | 'labelOnly'
15
- iconPosition?: 'before' | 'after'
16
- iconName?: string
17
- link?: ButtonDustedFluidLinkType | null
18
- }
19
-
20
- export function DDFluidBtn({
21
- variant = 'v1',
22
- label = 'BUTTON',
23
- className,
24
- wrapperClassName,
25
- displayMode,
26
- iconPosition,
27
- iconName,
28
- link
29
- }: ButtonECDustedFluidProps) {
30
- return (
31
- <div className={wrapperClassName}>
32
- <ButtonDustedFluid
33
- variant={variant}
34
- label={label}
35
- className={cn('dustedfluid-button', className)}
36
- displayMode={displayMode}
37
- iconPosition={iconPosition}
38
- iconName={iconName}
39
- link={link}
40
- />
41
- </div>
42
- )
43
- }
1
+ 'use client'
2
+
3
+ import * as React from 'react'
4
+ import ButtonDustedFluid, {
5
+ type ButtonDustedFluidLinkType,
6
+ } from '@/components/ui/button-dusted-fluid'
7
+ import { cn } from '@/utilities/ui'
8
+
9
+ export type ButtonECDustedFluidProps = {
10
+ variant?: 'v1' | 'v2' | 'v3' | 'v4' | 'v5'
11
+ label?: string
12
+ className?: string
13
+ wrapperClassName?: string
14
+ displayMode?: 'iconWithLabel' | 'iconOnly' | 'labelOnly'
15
+ iconPosition?: 'before' | 'after'
16
+ iconName?: string
17
+ link?: ButtonDustedFluidLinkType | null
18
+ }
19
+
20
+ export function DDFluidBtn({
21
+ variant = 'v1',
22
+ label = 'BUTTON',
23
+ className,
24
+ wrapperClassName,
25
+ displayMode,
26
+ iconPosition,
27
+ iconName,
28
+ link,
29
+ }: ButtonECDustedFluidProps) {
30
+ return (
31
+ <div className={cn('flex justify-center', wrapperClassName)}>
32
+ <ButtonDustedFluid
33
+ variant={variant}
34
+ label={label}
35
+ className={cn(
36
+ 'dustedfluid-button !rounded-full font-semibold text-stone-900 dark:text-stone-100',
37
+ className,
38
+ )}
39
+ displayMode={displayMode}
40
+ iconPosition={iconPosition}
41
+ iconName={iconName}
42
+ link={link}
43
+ />
44
+ </div>
45
+ )
46
+ }
@@ -1,149 +1,150 @@
1
- 'use client'
2
-
3
- import React, { useState, useEffect, useRef } from 'react'
4
- import { motion } from 'framer-motion'
5
- import RichText from '@/components/RichText'
6
-
7
- export interface ButtonGooeyInfoProps {
8
- buttonLabel?: string
9
- buttonIcon?: string
10
- richTextData?: any
11
- panelWidth?: string
12
- panelBgColor?: string
13
- buttonBgColor?: string
14
- buttonTextColor?: string
15
- panelTextColor?: string
16
- xOffset?: number
17
- className?: string
18
- panelClassName?: string
19
- }
20
-
21
- export const DDGooeyInfo: React.FC<ButtonGooeyInfoProps> = ({
22
- buttonLabel = 'i',
23
- buttonIcon,
24
- richTextData,
25
- panelWidth = '16rem',
26
- panelBgColor = 'black',
27
- buttonBgColor = 'black',
28
- buttonTextColor = 'white',
29
- panelTextColor = 'white',
30
- xOffset = 48,
31
- className = '',
32
- panelClassName = ''
33
- }) => {
34
- const [open, setOpen] = useState(false)
35
- const buttonRef = useRef<HTMLButtonElement | null>(null)
36
- const panelRef = useRef<HTMLDivElement | null>(null)
37
-
38
- // Close on outside tap/click (helps on touch devices)
39
- useEffect(() => {
40
- function handlePointerDown(e: PointerEvent) {
41
- if (!buttonRef.current || !panelRef.current) return
42
- if (
43
- !buttonRef.current.contains(e.target as Node) &&
44
- !panelRef.current.contains(e.target as Node)
45
- ) {
46
- setOpen(false)
47
- }
48
- }
49
-
50
- window.addEventListener('pointerdown', handlePointerDown)
51
- return () => window.removeEventListener('pointerdown', handlePointerDown)
52
- }, [])
53
-
54
- const handleToggle = () => {
55
- setOpen((prev) => !prev)
56
- }
57
-
58
- return (
59
- <div className={`gooey-info-container relative w-auto h-auto block ${className}`}>
60
- {/* Gooey Filter */}
61
- <svg className="absolute w-0 h-0">
62
- <filter id="gooey">
63
- {/* // Subtle gooey effect - best color merge */}
64
- <feGaussianBlur in="SourceGraphic" stdDeviation="8" result="blur" />
65
- <feColorMatrix
66
- in="blur"
67
- mode="matrix"
68
- values="1 0 0 0 0
69
- 0 1 0 0 0
70
- 0 0 1 0 0
71
- 0 0 0 18 -5"
72
- result="gooey"
73
- />
74
- {/* // Strong gooey effect */}
75
- {/* <feGaussianBlur in="SourceGraphic" stdDeviation="12" result="blur" />
76
- <feColorMatrix
77
- in="blur"
78
- mode="matrix"
79
- values="1 0 0 0 0
80
- 0 1 0 0 0
81
- 0 0 1 0 0
82
- 0 0 0 24 -8"
83
- result="gooey"
84
- /> */}
85
- {/* // Extreme gooey effect */}
86
- {/* <feGaussianBlur in="SourceGraphic" stdDeviation="16" result="blur" />
87
- <feColorMatrix
88
- in="blur"
89
- mode="matrix"
90
- values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0
91
- 0 0 0 30 -10"
92
- result="gooey"
93
- /> */}
94
- <feBlend in="SourceGraphic" in2="gooey" />
95
- </filter>
96
- </svg>
97
- <div
98
- className="relative flex items-center justify-center my-16"
99
- style={{ filter: 'url(#gooey)' }}
100
- >
101
- {/* Floating Button */}
102
- <motion.button
103
- ref={buttonRef}
104
- onHoverStart={() => setOpen(true)}
105
- onHoverEnd={() => setOpen(false)}
106
- onClick={handleToggle} // supports mouse + touch tap
107
- className="w-14 h-14 rounded-full flex items-center justify-center cursor-pointer shadow-lg touch-manipulation select-none"
108
- style={{
109
- backgroundColor: buttonBgColor,
110
- color: buttonTextColor
111
- }}
112
- >
113
- <span className="text-xl font-bold">{buttonIcon || buttonLabel}</span>
114
- </motion.button>
115
-
116
- {/* Panel */}
117
- <motion.div
118
- ref={panelRef}
119
- initial={{
120
- opacity: 0,
121
- scale: 0.85,
122
- x: xOffset - 8
123
- }}
124
- animate={{
125
- opacity: open ? 1 : 0,
126
- scale: open ? 1 : 0.85,
127
- x: open ? xOffset : xOffset - 8
128
- }}
129
- transition={{ type: 'spring', stiffness: 250, damping: 22 }}
130
- onHoverStart={() => setOpen(true)}
131
- onHoverEnd={() => setOpen(false)}
132
- className={`absolute left-0 top-1/2 -translate-y-1/2 origin-left rounded-3xl px-6 py-5 flex flex-col gap-3 ${panelClassName}`}
133
- style={{
134
- width: panelWidth,
135
- backgroundColor: panelBgColor,
136
- color: panelTextColor,
137
- pointerEvents: open ? 'auto' : 'none'
138
- }}
139
- >
140
- {richTextData && (
141
- <RichText data={richTextData} className="gooey-info-richtext" enableGutter={false} />
142
- )}
143
- </motion.div>
144
- </div>
145
- </div>
146
- )
147
- }
148
-
149
- export default DDGooeyInfo
1
+ 'use client'
2
+
3
+ import React, { useState, useEffect, useRef } from 'react'
4
+ import { motion } from 'framer-motion'
5
+ import RichText from '@/components/RichText'
6
+
7
+ export interface ButtonGooeyInfoProps {
8
+ buttonLabel?: string
9
+ buttonIcon?: string
10
+ richTextData?: any
11
+ panelWidth?: string
12
+ panelBgColor?: string
13
+ buttonBgColor?: string
14
+ buttonTextColor?: string
15
+ panelTextColor?: string
16
+ xOffset?: number
17
+ className?: string
18
+ panelClassName?: string
19
+ }
20
+
21
+ export const DDGooeyInfo: React.FC<ButtonGooeyInfoProps> = ({
22
+ buttonLabel = 'i',
23
+ buttonIcon,
24
+ richTextData,
25
+ panelWidth = '16rem',
26
+ panelBgColor = 'black',
27
+ buttonBgColor = 'black',
28
+ buttonTextColor = 'white',
29
+ panelTextColor = 'white',
30
+ xOffset = 48,
31
+ className = '',
32
+ panelClassName = '',
33
+ }) => {
34
+ const [open, setOpen] = useState(false)
35
+ const buttonRef = useRef<HTMLButtonElement | null>(null)
36
+ const panelRef = useRef<HTMLDivElement | null>(null)
37
+ const connectedXOffset = Math.min(xOffset, 48)
38
+
39
+ // Close on outside tap/click (helps on touch devices)
40
+ useEffect(() => {
41
+ function handlePointerDown(e: PointerEvent) {
42
+ if (!buttonRef.current || !panelRef.current) return
43
+ if (
44
+ !buttonRef.current.contains(e.target as Node) &&
45
+ !panelRef.current.contains(e.target as Node)
46
+ ) {
47
+ setOpen(false)
48
+ }
49
+ }
50
+
51
+ window.addEventListener('pointerdown', handlePointerDown)
52
+ return () => window.removeEventListener('pointerdown', handlePointerDown)
53
+ }, [])
54
+
55
+ const handleToggle = () => {
56
+ setOpen((prev) => !prev)
57
+ }
58
+
59
+ return (
60
+ <div className={`gooey-info-container relative flex w-full justify-center ${className}`}>
61
+ {/* Gooey Filter */}
62
+ <svg className="absolute w-0 h-0">
63
+ <filter id="gooey">
64
+ {/* // Subtle gooey effect - best color merge */}
65
+ <feGaussianBlur in="SourceGraphic" stdDeviation="8" result="blur" />
66
+ <feColorMatrix
67
+ in="blur"
68
+ mode="matrix"
69
+ values="1 0 0 0 0
70
+ 0 1 0 0 0
71
+ 0 0 1 0 0
72
+ 0 0 0 18 -5"
73
+ result="gooey"
74
+ />
75
+ {/* // Strong gooey effect */}
76
+ {/* <feGaussianBlur in="SourceGraphic" stdDeviation="12" result="blur" />
77
+ <feColorMatrix
78
+ in="blur"
79
+ mode="matrix"
80
+ values="1 0 0 0 0
81
+ 0 1 0 0 0
82
+ 0 0 1 0 0
83
+ 0 0 0 24 -8"
84
+ result="gooey"
85
+ /> */}
86
+ {/* // Extreme gooey effect */}
87
+ {/* <feGaussianBlur in="SourceGraphic" stdDeviation="16" result="blur" />
88
+ <feColorMatrix
89
+ in="blur"
90
+ mode="matrix"
91
+ values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0
92
+ 0 0 0 30 -10"
93
+ result="gooey"
94
+ /> */}
95
+ <feBlend in="SourceGraphic" in2="gooey" />
96
+ </filter>
97
+ </svg>
98
+ <div
99
+ className="gooey-info-stage relative my-16 inline-flex items-center justify-center"
100
+ style={{ filter: 'url(#gooey)' }}
101
+ >
102
+ {/* Floating Button */}
103
+ <motion.button
104
+ ref={buttonRef}
105
+ onHoverStart={() => setOpen(true)}
106
+ onHoverEnd={() => setOpen(false)}
107
+ onClick={handleToggle} // supports mouse + touch tap
108
+ className="w-14 h-14 rounded-full flex items-center justify-center cursor-pointer shadow-lg touch-manipulation select-none"
109
+ style={{
110
+ backgroundColor: buttonBgColor,
111
+ color: buttonTextColor,
112
+ }}
113
+ >
114
+ <span className="text-xl font-bold">{buttonIcon || buttonLabel}</span>
115
+ </motion.button>
116
+
117
+ {/* Panel */}
118
+ <motion.div
119
+ ref={panelRef}
120
+ initial={{
121
+ opacity: 0,
122
+ scale: 0.85,
123
+ x: connectedXOffset - 8,
124
+ }}
125
+ animate={{
126
+ opacity: open ? 1 : 0,
127
+ scale: open ? 1 : 0.85,
128
+ x: open ? connectedXOffset : connectedXOffset - 8,
129
+ }}
130
+ transition={{ type: 'spring', stiffness: 250, damping: 22 }}
131
+ onHoverStart={() => setOpen(true)}
132
+ onHoverEnd={() => setOpen(false)}
133
+ className={`gooey-info-panel absolute left-0 top-1/2 -translate-y-1/2 origin-left rounded-3xl px-6 py-5 flex flex-col gap-3 ${panelClassName}`}
134
+ style={{
135
+ width: panelWidth,
136
+ backgroundColor: panelBgColor,
137
+ color: panelTextColor,
138
+ pointerEvents: open ? 'auto' : 'none',
139
+ }}
140
+ >
141
+ {richTextData && (
142
+ <RichText data={richTextData} className="gooey-info-richtext" enableGutter={false} />
143
+ )}
144
+ </motion.div>
145
+ </div>
146
+ </div>
147
+ )
148
+ }
149
+
150
+ export default DDGooeyInfo