1
- import React , { useState , useRef , useEffect } from 'react' ;
2
- import { useHistory } from 'react-router-dom' ;
3
- import Link from '@docusaurus/Link' ;
4
- import { useDocsSidebar } from '@docusaurus/plugin-content-docs/client' ;
5
- import useDocusaurusContext from '@docusaurus/useDocusaurusContext' ;
1
+ import React , { useState , useRef , useEffect } from "react" ;
2
+ import { useHistory } from "react-router-dom" ;
3
+ import Link from "@docusaurus/Link" ;
4
+ import { useDocsSidebar } from "@docusaurus/plugin-content-docs/client" ;
5
+ import useDocusaurusContext from "@docusaurus/useDocusaurusContext" ;
6
+ import { translate } from "@docusaurus/Translate" ;
6
7
7
- import styles from ' ./styles.module.css' ;
8
+ import styles from " ./styles.module.css" ;
8
9
9
10
function DocsCategoryDropdown ( { dropdownCategory } ) {
10
11
const [ isOpen , setIsOpen ] = useState ( false ) ;
11
- const [ dropdownStyles , setDropdownStyles ] = useState ( { top : '0px' , left : '0px' } ) ;
12
+ const [ dropdownStyles , setDropdownStyles ] = useState ( {
13
+ top : "0px" ,
14
+ left : "0px" ,
15
+ } ) ;
12
16
const dropdownMenuRef = useRef ( null ) ;
13
17
const triggerRef = useRef ( null ) ; // Reference for the individual menu item trigger
14
18
@@ -36,15 +40,19 @@ function DocsCategoryDropdown({ dropdownCategory }) {
36
40
left = triggerRect . right - dropdownRect . width ;
37
41
} else {
38
42
// Align to center
39
- left = triggerRect . left + ( triggerRect . width / 2 ) - ( dropdownRect . width / 2 ) ;
43
+ left =
44
+ triggerRect . left + triggerRect . width / 2 - dropdownRect . width / 2 ;
40
45
}
41
46
42
47
// Ensure the dropdown doesn't go off-screen
43
- left = Math . max ( 10 , Math . min ( left , viewportWidth - dropdownRect . width - 10 ) ) ;
48
+ left = Math . max (
49
+ 10 ,
50
+ Math . min ( left , viewportWidth - dropdownRect . width - 10 ) ,
51
+ ) ;
44
52
45
53
setDropdownStyles ( {
46
54
top : `${ triggerRect . bottom } px` , // Align the dropdown below the menu item
47
- left : `${ left } px` // Align the dropdown with the menu item
55
+ left : `${ left } px` , // Align the dropdown with the menu item
48
56
} ) ;
49
57
}
50
58
} , [ isOpen ] ) ; // This runs when the dropdown is opened
@@ -54,13 +62,13 @@ function DocsCategoryDropdown({ dropdownCategory }) {
54
62
// Safely call useDocsSidebar
55
63
try {
56
64
sidebar = useDocsSidebar ( ) ;
57
- } catch ( e ) {
58
- }
65
+ } catch ( e ) { }
59
66
60
67
// Guard against undefined sidebar
61
- const isSelected = sidebar && sidebar . name && dropdownCategory
62
- ? sidebar . name === dropdownCategory . customProps . sidebar
63
- : false ;
68
+ const isSelected =
69
+ sidebar && sidebar . name && dropdownCategory
70
+ ? sidebar . name === dropdownCategory . customProps . sidebar
71
+ : false ;
64
72
65
73
return (
66
74
< div
@@ -72,9 +80,18 @@ function DocsCategoryDropdown({ dropdownCategory }) {
72
80
className = { styles . docsNavDropdownToolbarLink }
73
81
ref = { triggerRef } // Attach the ref to the individual link that triggers the dropdown
74
82
>
75
- < Link className = { `${ styles . docsNavDropdownToolbarTopLevelLink } ${
76
- isSelected ? styles . docsNavSelected : ''
77
- } `} href = { dropdownCategory . customProps . href } > { dropdownCategory . label } </ Link > < DropdownCaret />
83
+ < Link
84
+ className = { `${ styles . docsNavDropdownToolbarTopLevelLink } ${
85
+ isSelected ? styles . docsNavSelected : ""
86
+ } `}
87
+ href = { dropdownCategory . customProps . href }
88
+ >
89
+ { translate ( {
90
+ id : `sidebar.dropdownCategories.category.${ dropdownCategory . label } ` ,
91
+ message : dropdownCategory . label ,
92
+ } ) }
93
+ </ Link > { " " }
94
+ < DropdownCaret />
78
95
</ span >
79
96
{ isOpen && (
80
97
< DropdownContent
@@ -91,51 +108,63 @@ function DocsCategoryDropdown({ dropdownCategory }) {
91
108
export const DocsCategoryDropdownLinkOnly = ( { title, link } ) => {
92
109
return (
93
110
< div className = { styles . docsNavDropdownContainer } >
94
- < Link href = { link } className = { styles . docsNavDropdownToolbarTopLevelLink } > < span > { title } </ span > </ Link >
111
+ < Link href = { link } className = { styles . docsNavDropdownToolbarTopLevelLink } >
112
+ < span > { title } </ span >
113
+ </ Link >
95
114
</ div >
96
115
) ;
97
- }
116
+ } ;
98
117
99
- const DropdownContent = ( { dropdownCategory, handleMouseLeave, dropdownStyles, dropdownMenuRef } ) => {
118
+ const DropdownContent = ( {
119
+ dropdownCategory,
120
+ handleMouseLeave,
121
+ dropdownStyles,
122
+ dropdownMenuRef,
123
+ } ) => {
100
124
const [ hovered , setHovered ] = useState ( null ) ;
101
125
102
126
return (
103
127
< div
104
128
ref = { dropdownMenuRef }
105
129
className = { styles . docsNavDropdownMenu }
106
- style = { { position : ' fixed' , ...dropdownStyles } }
130
+ style = { { position : " fixed" , ...dropdownStyles } }
107
131
>
108
- < div key = { 99 }
109
- className = { `${ styles . docsNavMenuItem } ${ hovered === 99 ? styles . docsNavHovered : '' } ` }
110
- onMouseEnter = { ( ) => setHovered ( 99 ) }
111
- onMouseLeave = { ( ) => setHovered ( null ) }
132
+ < div
133
+ key = { 99 }
134
+ className = { `${ styles . docsNavMenuItem } ${ hovered === 99 ? styles . docsNavHovered : "" } ` }
135
+ onMouseEnter = { ( ) => setHovered ( 99 ) }
136
+ onMouseLeave = { ( ) => setHovered ( null ) }
112
137
>
113
138
< Link
114
- to = { dropdownCategory . customProps . href }
139
+ to = { dropdownCategory . customProps . href }
115
140
className = { styles . docsNavMenuHeader }
116
- onClick = { handleMouseLeave }
141
+ onClick = { handleMouseLeave }
117
142
>
118
143
{ dropdownCategory . label }
119
144
</ Link >
120
- < div className = { styles . docsNavMenuDescription } > { dropdownCategory . description } </ div >
145
+ < div className = { styles . docsNavMenuDescription } >
146
+ { dropdownCategory . description }
147
+ </ div >
121
148
</ div >
122
149
< hr className = { styles . docsNavMenuDivider } />
123
150
< div className = { styles . docsNavMenuItems } >
124
151
{ dropdownCategory . items . map ( ( item , index ) => (
125
152
< div
126
153
key = { index }
127
- className = { `${ styles . docsNavMenuItem } ${ hovered === index ? styles . docsNavHovered : '' } ` }
154
+ className = { `${ styles . docsNavMenuItem } ${ hovered === index ? styles . docsNavHovered : "" } ` }
128
155
onMouseEnter = { ( ) => setHovered ( index ) }
129
156
onMouseLeave = { ( ) => setHovered ( null ) }
130
157
>
131
158
< Link
132
- to = { item . href }
159
+ to = { item . href }
133
160
className = { styles . docsNavItemTitle }
134
- onClick = { handleMouseLeave }
161
+ onClick = { handleMouseLeave }
135
162
>
136
163
{ item . label }
137
164
</ Link >
138
- < div className = { styles . docsNavItemDescription } > { item . description } </ div >
165
+ < div className = { styles . docsNavItemDescription } >
166
+ { item . description }
167
+ </ div >
139
168
</ div >
140
169
) ) }
141
170
</ div >
@@ -145,20 +174,20 @@ const DropdownContent = ({ dropdownCategory, handleMouseLeave, dropdownStyles, d
145
174
146
175
const DropdownCaret = ( ) => {
147
176
const commonStyle = {
148
- width : ' 6px' ,
149
- height : ' 10px' ,
150
- fill : ' none' ,
151
- transition : ' all 0.3s ease' ,
152
- color : ' #6B7280' ,
177
+ width : " 6px" ,
178
+ height : " 10px" ,
179
+ fill : " none" ,
180
+ transition : " all 0.3s ease" ,
181
+ color : " #6B7280" ,
153
182
} ;
154
183
155
184
const rotatedIconStyle = {
156
185
...commonStyle ,
157
- transform : ' rotate(90deg)' ,
186
+ transform : " rotate(90deg)" ,
158
187
} ;
159
188
160
189
return (
161
- < span style = { { marginLeft : ' 8px' } } >
190
+ < span style = { { marginLeft : " 8px" } } >
162
191
< svg
163
192
xmlns = "http://www.w3.org/2000/svg"
164
193
width = "6"
0 commit comments