@@ -3,16 +3,23 @@ import { Handle, Position } from "@xyflow/react";
3
3
import { Icons } from "components/core" ;
4
4
import { Button , Card } from "components/ui" ;
5
5
6
- const BaseNode = ( {
7
- data,
8
- children,
9
- } : {
10
- data : any ;
11
- children : React . ReactNode ;
12
- } ) => < Card className = "w-[200px] border-2 shadow-lg" > { children } </ Card > ;
6
+ interface NodeData {
7
+ label : string ;
8
+ description ?: string ;
9
+ icon : keyof typeof Icons ;
10
+ icon_color ?: string ;
11
+ image ?: string ;
12
+ expandable ?: boolean ;
13
+ version ?: string ;
14
+ url ?: string ;
15
+ cta ?: {
16
+ primary : { label : string ; url : string } ;
17
+ secondary ?: { label : string ; url : string } ;
18
+ } ;
19
+ }
13
20
14
- const GardenNode = ( { data } : { data : any } ) => (
15
- < BaseNode data = { data } >
21
+ const GardenNode = ( { data } : { data : NodeData } ) => (
22
+ < Card className = "w-[200px] border-2 shadow-lg" >
16
23
< div className = "flex flex-col items-center justify-center gap-2 rounded-md bg-primary p-4 text-center text-primary-foreground" >
17
24
< Icons . Sprout className = "h-8 w-8" />
18
25
< h2 className = "font-semibold text-2xl" > { data . label } </ h2 >
@@ -21,14 +28,14 @@ const GardenNode = ({ data }: { data: any }) => (
21
28
</ div >
22
29
< Handle type = "target" position = { Position . Top } />
23
30
< Handle type = "source" position = { Position . Bottom } />
24
- </ BaseNode >
31
+ </ Card >
25
32
) ;
26
33
27
- const CategoryNode = ( { data } : { data : any } ) => {
34
+ const CategoryNode = ( { data } : { data : NodeData } ) => {
28
35
const Icon = Icons [ data . icon ] ;
29
36
30
37
return (
31
- < BaseNode data = { data } >
38
+ < Card className = "w-[200px] border-2 shadow-lg" >
32
39
< Handle type = "target" position = { Position . Top } />
33
40
< Handle type = "source" position = { Position . Bottom } />
34
41
< div className = "p-4" >
@@ -45,12 +52,12 @@ const CategoryNode = ({ data }: { data: any }) => {
45
52
</ p >
46
53
) }
47
54
</ div >
48
- </ BaseNode >
55
+ </ Card >
49
56
) ;
50
57
} ;
51
58
52
- const ItemNode = ( { data } : { data : any } ) => (
53
- < BaseNode data = { data } >
59
+ const ItemNode = ( { data } : { data : NodeData } ) => (
60
+ < Card className = "w-[200px] border-2 shadow-lg" >
54
61
< div className = "space-y-3" >
55
62
< div className = "aspect-video w-full overflow-hidden rounded-t-lg" >
56
63
< img
@@ -72,16 +79,17 @@ const ItemNode = ({ data }: { data: any }) => (
72
79
variant = "default"
73
80
size = "sm"
74
81
className = "w-full"
75
- onClick = { ( ) => window . open ( data . cta . primary . url , "_blank" ) }
82
+ onClick = { ( ) => window . open ( data . cta ? .primary . url , "_blank" ) }
76
83
>
77
84
< Icons . ExternalLink className = "mr-1 h-4 w-4" />
78
- { data . cta . primary . label }
85
+ { data . cta ? .primary . label }
79
86
</ Button >
80
- { data . cta . secondary && (
87
+
88
+ { data . cta ?. secondary && (
81
89
< Button
82
90
variant = "outline"
83
91
size = "sm"
84
- onClick = { ( ) => window . open ( data . cta . secondary . url , "_blank" ) }
92
+ onClick = { ( ) => window . open ( data . cta ? .secondary ? .url , "_blank" ) }
85
93
>
86
94
< Icons . Git className = "h-4 w-4" />
87
95
</ Button >
@@ -90,11 +98,11 @@ const ItemNode = ({ data }: { data: any }) => (
90
98
</ div >
91
99
< Handle type = "target" position = { Position . Top } />
92
100
< Handle type = "source" position = { Position . Bottom } />
93
- </ BaseNode >
101
+ </ Card >
94
102
) ;
95
103
96
- const GardenRefNode = ( { data } : { data : any } ) => (
97
- < BaseNode data = { data } >
104
+ const GardenRefNode = ( { data } : { data : NodeData } ) => (
105
+ < Card className = "w-[200px] border-2 shadow-lg" >
98
106
< Handle type = "target" position = { Position . Top } />
99
107
< Handle type = "target" position = { Position . Left } />
100
108
< div className = "relative flex cursor-pointer flex-col items-center rounded-md border-2 border-primary/50 border-dashed p-4 text-center transition-colors hover:bg-primary-foreground/10" >
@@ -127,11 +135,11 @@ const GardenRefNode = ({ data }: { data: any }) => (
127
135
</ Button >
128
136
</ div >
129
137
</ div >
130
- </ BaseNode >
138
+ </ Card >
131
139
) ;
132
140
133
- const SupergardenNode = ( { data } : { data : any } ) => (
134
- < BaseNode data = { data } >
141
+ const SupergardenNode = ( { data } : { data : NodeData } ) => (
142
+ < Card className = "w-[200px] border-2 shadow-lg" >
135
143
< Handle type = "source" position = { Position . Bottom } />
136
144
< div
137
145
className = "relative flex cursor-pointer flex-col items-center border-2 border-white/70 border-dashed p-4 text-center transition-transform hover:scale-105"
@@ -164,11 +172,11 @@ const SupergardenNode = ({ data }: { data: any }) => (
164
172
</ Button >
165
173
</ div >
166
174
</ div >
167
- </ BaseNode >
175
+ </ Card >
168
176
) ;
169
177
170
- const SubgardenNode = ( { data } : { data : any } ) => (
171
- < BaseNode data = { data } >
178
+ const SubgardenNode = ( { data } : { data : NodeData } ) => (
179
+ < Card className = "w-[200px] border-2 shadow-lg" >
172
180
< Handle type = "target" position = { Position . Bottom } />
173
181
< div
174
182
className = "relative flex cursor-pointer flex-col items-center p-4 text-center transition-transform hover:scale-105"
@@ -207,7 +215,7 @@ const SubgardenNode = ({ data }: { data: any }) => (
207
215
</ Button >
208
216
</ div >
209
217
</ div >
210
- </ BaseNode >
218
+ </ Card >
211
219
) ;
212
220
213
221
export const nodeTypes = {
@@ -217,7 +225,7 @@ export const nodeTypes = {
217
225
garden_ref : GardenRefNode ,
218
226
supergarden : SupergardenNode ,
219
227
subgarden : SubgardenNode ,
220
- default : ( { data } : { data : any } ) => (
228
+ default : ( { data } : { data : NodeData } ) => (
221
229
< >
222
230
< Handle type = "source" position = { Position . Top } />
223
231
< Handle type = "source" position = { Position . Bottom } />
0 commit comments