@@ -10,29 +10,19 @@ import styles from "./styles.module.css";
10
10
11
11
function DocsCategoryDropdown ( { dropdownCategory } ) {
12
12
const [ isOpen , setIsOpen ] = useState ( false ) ;
13
- const [ isVisible , setIsVisible ] = useState ( false ) ;
14
13
const [ dropdownStyles , setDropdownStyles ] = useState ( {
15
14
top : "0px" ,
16
15
left : "0px" ,
17
16
} ) ;
18
17
const dropdownMenuRef = useRef ( null ) ;
19
18
const triggerRef = useRef ( null ) ; // Reference for the individual menu item trigger
20
- const hideTimeoutRef = useRef ( null ) ;
21
19
22
20
const handleMouseEnter = ( ) => {
23
- if ( hideTimeoutRef . current ) {
24
- clearTimeout ( hideTimeoutRef . current ) ;
25
- hideTimeoutRef . current = null ;
26
- }
27
21
setIsOpen ( true ) ;
28
- setTimeout ( ( ) => setIsVisible ( true ) , 10 ) ;
29
22
} ;
30
23
31
24
const handleMouseLeave = ( ) => {
32
- setIsVisible ( false ) ;
33
- hideTimeoutRef . current = setTimeout ( ( ) => {
34
- setIsOpen ( false ) ;
35
- } , 150 ) ;
25
+ setIsOpen ( false ) ;
36
26
} ;
37
27
38
28
// Use useEffect to update the dropdown position when isOpen changes
@@ -52,17 +42,17 @@ function DocsCategoryDropdown({ dropdownCategory }) {
52
42
} else {
53
43
// Align to center
54
44
left =
55
- triggerRect . left + triggerRect . width / 2 - dropdownRect . width / 2 ;
45
+ triggerRect . left + triggerRect . width / 2 - dropdownRect . width / 2 ;
56
46
}
57
47
58
48
// Ensure the dropdown doesn't go off-screen
59
49
left = Math . max (
60
- 10 ,
61
- Math . min ( left , viewportWidth - dropdownRect . width - 10 ) ,
50
+ 10 ,
51
+ Math . min ( left , viewportWidth - dropdownRect . width - 10 ) ,
62
52
) ;
63
53
64
54
setDropdownStyles ( {
65
- top : `${ triggerRect . bottom } px` , // Back to original positioning
55
+ top : `${ triggerRect . bottom } px` , // Align the dropdown below the menu item
66
56
left : `${ left } px` , // Align the dropdown with the menu item
67
57
} ) ;
68
58
}
@@ -77,130 +67,132 @@ function DocsCategoryDropdown({ dropdownCategory }) {
77
67
78
68
// Guard against undefined sidebar
79
69
const isSelected =
80
- sidebar && sidebar . name && dropdownCategory
81
- ? sidebar . name === dropdownCategory . customProps . sidebar
82
- : false ;
70
+ sidebar && sidebar . name && dropdownCategory
71
+ ? sidebar . name === dropdownCategory . customProps . sidebar
72
+ : false ;
83
73
84
74
return (
85
- < div
86
- className = { styles . docsNavDropdownContainer }
87
- onMouseEnter = { handleMouseEnter }
88
- onMouseLeave = { handleMouseLeave }
89
- >
75
+ < div
76
+ className = { styles . docsNavDropdownContainer }
77
+ onMouseEnter = { handleMouseEnter }
78
+ onMouseLeave = { handleMouseLeave }
79
+ >
90
80
< span
91
- className = { styles . docsNavDropdownToolbarLink }
92
- ref = { triggerRef } // Attach the ref to the individual link that triggers the dropdown
81
+ className = { styles . docsNavDropdownToolbarLink }
82
+ ref = { triggerRef } // Attach the ref to the individual link that triggers the dropdown
93
83
>
94
84
< Link
95
- className = { `${ styles . docsNavDropdownToolbarTopLevelLink } ${ isSelected ? styles . docsNavSelected : ""
85
+ className = { `${ styles . docsNavDropdownToolbarTopLevelLink } ${ isSelected ? styles . docsNavSelected : ""
96
86
} `}
97
- href = { dropdownCategory . customProps . href }
87
+ href = { dropdownCategory . customProps . href }
98
88
>
99
89
< Translate
100
- id = { `sidebar.dropdownCategories.category.${ dropdownCategory . label } ` }
101
- description = { `Translation for ${ dropdownCategory . label } ` }
90
+ id = { `sidebar.dropdownCategories.category.${ dropdownCategory . label } ` }
91
+ description = { `Translation for ${ dropdownCategory . label } ` }
102
92
>
103
93
{ dropdownCategory . label }
104
94
</ Translate >
105
95
</ Link > { " " }
106
96
< DropdownCaret />
107
97
</ span >
108
- { isOpen && (
109
- < DropdownContent
110
- dropdownCategory = { dropdownCategory }
111
- handleMouseLeave = { handleMouseLeave }
112
- dropdownStyles = { dropdownStyles } // Pass the dynamic styles to position the dropdown
113
- dropdownMenuRef = { dropdownMenuRef } // Pass the ref to the dropdown content
114
- isVisible = { isVisible }
115
- />
116
- ) }
117
- </ div >
98
+ { isOpen && (
99
+ < DropdownContent
100
+ dropdownCategory = { dropdownCategory }
101
+ handleMouseLeave = { handleMouseLeave }
102
+ dropdownStyles = { dropdownStyles } // Pass the dynamic styles to position the dropdown
103
+ dropdownMenuRef = { dropdownMenuRef } // Pass the ref to the dropdown content
104
+ />
105
+ ) }
106
+ </ div >
118
107
) ;
119
108
}
120
109
121
110
export const DocsCategoryDropdownLinkOnly = ( { title, link } ) => {
122
111
return (
123
- < div className = { styles . docsNavDropdownContainer } >
124
- < Link href = { link } className = { styles . docsNavDropdownToolbarTopLevelLink } >
125
- < span > { title } </ span >
126
- </ Link >
127
- </ div >
112
+ < div className = { styles . docsNavDropdownContainer } >
113
+ < Link href = { link } className = { styles . docsNavDropdownToolbarTopLevelLink } >
114
+ < span > { title } </ span >
115
+ </ Link >
116
+ </ div >
128
117
) ;
129
118
} ;
130
119
131
120
const DropdownContent = ( {
132
- dropdownCategory,
133
- handleMouseLeave,
134
- dropdownStyles,
135
- dropdownMenuRef,
136
- isVisible,
137
- } ) => {
121
+ dropdownCategory,
122
+ handleMouseLeave,
123
+ dropdownStyles,
124
+ dropdownMenuRef,
125
+ } ) => {
138
126
const [ hovered , setHovered ] = useState ( null ) ;
139
127
140
128
return (
129
+ < div
130
+ ref = { dropdownMenuRef }
131
+ className = { styles . docsNavDropdownMenu }
132
+ style = { { position : "fixed" , ...dropdownStyles } }
133
+ >
141
134
< div
142
- ref = { dropdownMenuRef }
143
- className = { `${ styles . docsNavDropdownMenu } ${ isVisible ? styles . visible : '' } ` }
144
- style = { { position : "fixed" , ...dropdownStyles } }
135
+ key = { 99 }
136
+ className = { `${ styles . docsNavMenuItem } ${ hovered === 99 ? styles . docsNavHovered : "" } ` }
137
+ onMouseEnter = { ( ) => setHovered ( 99 ) }
138
+ onMouseLeave = { ( ) => setHovered ( null ) }
145
139
>
146
140
< Link
147
- key = { 99 }
148
- to = { dropdownCategory . customProps . href }
149
- className = { `${ styles . docsNavMenuItem } ${ hovered === 99 ? styles . docsNavHovered : "" } ` }
150
- onMouseEnter = { ( ) => setHovered ( 99 ) }
151
- onMouseLeave = { ( ) => setHovered ( null ) }
152
- onClick = { handleMouseLeave }
153
- style = { { textDecoration : 'none' , display : 'block' } }
141
+ to = { dropdownCategory . customProps . href }
142
+ className = { styles . docsNavMenuHeader }
143
+ onClick = { handleMouseLeave }
154
144
>
155
- < div className = { styles . docsNavMenuHeader } >
156
- < Translate
157
- id = { `sidebar.dropdownCategories.category.${ dropdownCategory . label } ` }
158
- description = { `Translation for ${ dropdownCategory . label } ` }
159
- >
160
- { dropdownCategory . label }
161
- </ Translate >
162
- </ div >
163
- < div className = { styles . docsNavMenuDescription } >
164
- < Translate
165
- id = { `sidebar.dropdownCategories.category.description.${ dropdownCategory . label } ` }
166
- description = { `Translation for ${ dropdownCategory . label } description` }
167
- >
168
- { dropdownCategory . description }
169
- </ Translate >
170
- </ div >
145
+ < Translate
146
+ id = { `sidebar.dropdownCategories.category.${ dropdownCategory . label } ` }
147
+ description = { `Translation for ${ dropdownCategory . label } ` }
148
+ >
149
+ { dropdownCategory . label }
150
+ </ Translate >
171
151
</ Link >
172
- < hr className = { styles . docsNavMenuDivider } />
173
- < div className = { styles . docsNavMenuItems } >
174
- { dropdownCategory . items . map ( ( item , index ) => (
175
- < Link
176
- key = { index }
177
- to = { item . href }
178
- className = { `${ styles . docsNavMenuItem } ${ hovered === index ? styles . docsNavHovered : "" } ` }
179
- onMouseEnter = { ( ) => setHovered ( index ) }
180
- onMouseLeave = { ( ) => setHovered ( null ) }
181
- onClick = { handleMouseLeave }
182
- style = { { textDecoration : 'none' , display : 'block' } }
183
- >
184
- < div className = { styles . docsNavItemTitle } >
185
- < Translate
186
- id = { `sidebar.dropdownCategories.category.${ dropdownCategory . label } .${ item . label } ` }
187
- description = { `Translation for ${ dropdownCategory . label } .${ item . label } ` }
188
- >
189
- { item . label }
190
- </ Translate >
191
- </ div >
192
- < div className = { styles . docsNavItemDescription } >
193
- < Translate
194
- id = { `sidebar.dropdownCategories.category.${ dropdownCategory . label } .${ item . label } .description` }
195
- description = { `Translation for ${ dropdownCategory . label } .${ item . label } description` }
196
- >
197
- { item . description }
198
- </ Translate >
199
- </ div >
200
- </ Link >
201
- ) ) }
152
+ < div className = { styles . docsNavMenuDescription } >
153
+ < Translate
154
+ id = { `sidebar.dropdownCategories.category.description.${ dropdownCategory . label } ` }
155
+ description = { `Translation for ${ dropdownCategory . label } description` }
156
+ >
157
+ { dropdownCategory . description }
158
+ </ Translate >
202
159
</ div >
203
160
</ div >
161
+ < hr className = { styles . docsNavMenuDivider } />
162
+ < div className = { styles . docsNavMenuItems } >
163
+ { dropdownCategory . items . map ( ( item , index ) => (
164
+ < div
165
+ key = { index }
166
+ className = { `${ styles . docsNavMenuItem } ${ hovered === index ? styles . docsNavHovered : "" } ` }
167
+ onMouseEnter = { ( ) => setHovered ( index ) }
168
+ onMouseLeave = { ( ) => setHovered ( null ) }
169
+ >
170
+ < Link
171
+ to = { item . href }
172
+ className = { styles . docsNavItemTitle }
173
+ onClick = { handleMouseLeave }
174
+ >
175
+ < Translate
176
+ id = { `sidebar.dropdownCategories.category.${ dropdownCategory . label } .${ item . label } ` }
177
+ description = { `Translation for ${ dropdownCategory . label } .${ item . label } ` }
178
+ >
179
+ { item . label }
180
+ </ Translate >
181
+
182
+ </ Link >
183
+ < div className = { styles . docsNavItemDescription } >
184
+ < Translate
185
+ id = { `sidebar.dropdownCategories.category.${ dropdownCategory . label } .${ item . label } .description` }
186
+ description = { `Translation for ${ dropdownCategory . label } .${ item . label } description` }
187
+ >
188
+ { item . description }
189
+ </ Translate >
190
+
191
+ </ div >
192
+ </ div >
193
+ ) ) }
194
+ </ div >
195
+ </ div >
204
196
) ;
205
197
} ;
206
198
@@ -219,24 +211,24 @@ const DropdownCaret = () => {
219
211
} ;
220
212
221
213
return (
222
- < span style = { { marginLeft : "8px" } } >
214
+ < span style = { { marginLeft : "8px" } } >
223
215
< svg
224
- xmlns = "http://www.w3.org/2000/svg"
225
- width = "6"
226
- height = "10"
227
- viewBox = "0 0 6 10"
228
- style = { rotatedIconStyle }
216
+ xmlns = "http://www.w3.org/2000/svg"
217
+ width = "6"
218
+ height = "10"
219
+ viewBox = "0 0 6 10"
220
+ style = { rotatedIconStyle }
229
221
>
230
222
< path
231
- stroke = "currentColor"
232
- strokeLinecap = "round"
233
- strokeLinejoin = "round"
234
- strokeWidth = "1.5"
235
- d = "M1 9L5 5 1 1"
223
+ stroke = "currentColor"
224
+ strokeLinecap = "round"
225
+ strokeLinejoin = "round"
226
+ strokeWidth = "1.5"
227
+ d = "M1 9L5 5 1 1"
236
228
/>
237
229
</ svg >
238
230
</ span >
239
231
) ;
240
232
} ;
241
233
242
- export default DocsCategoryDropdown ;
234
+ export default DocsCategoryDropdown ;
0 commit comments